วันนี้ผมมาแบบงง จริงๆมาเปลี่ยนที่ทำ Thesis และก็ฟังหัวข้อที่สนใจครับ ผมเลยอาจจะเก็บรายละเอียดมาไม่ครบนะครับ โดยสำหรับสถานที่จัดงานอยู่ที่ Launchpad ในถนนปั้น หรือ ซอยปั้น ห่างจาก BTS สุรศักดิ์ ไม่เกิน 500 เมตรครับ
หลังจากเดินเลยไปไกลครับ ก็เจอแล้วครับ สำหรับที่จัดงานครับ โดยหัวข้อมี ดังนี้ครับ
09:30-10:20| What's coming to C#
Speaker: Will Fuqua
A look in the future: Nullable reference types, recursive patterns, asynchronous streams and more.
C# / TypeScript จากแนวโน้มของ stackoverflow insight 2017 ยังเป็นที่นิยมครับ
dotnet strategy 2017 (WIN - WIN ครับ) โดยจะเป็นการ
- Keep growing C#
- Innovate aggressively
- Benefit for all developer
- Ecosystem - ทุก Platform ไม่ต้องเรียนรู้อะไรมาก มี C# เป็นพื้นฐาน
C# 7.x Feature
- ref keyword - จริงๆ ผมไม่ค่อยชอบนะ มัน maintain ยาก แต่ช่วยประหยัด Memory เพราะ มัน Pass by Reference
- this ref keyword - เป็น extension method
- in keyword ส่ง param เข้าไปแล้วมันถูก immutable ห้ามแก้ข้อมูลข้างในครับ
- readonly keyword เหมือน in ครับ แต่เพิ่ม Scope ไปห้ามแก้ output
- span<T> และ readonlyspan<T> keyword เน้น perf เพราะตัวแปรถูกประกาศใน memory stack ส่วนตัวผมมองความสามารถของ span ออกไปทาวพวก slicing ของ python นะ เพราะทำได้เหมือนกันเลย
C# 8.0 Feature
- Class Attribute [module:NonNullType] ใช้ complier ตรวจสอบ null ได้เลย และแสดง warning แต่ถ้าต้องการใช้จริงๆ ก็เติม Type มันจะดูแปลกๆหน่อย แต่ไม่ต้องจำเยอะครับ จากเดิมที่ String ปกติสามารถเก็บ Null ได้ครับ แต่คราวนี้ ถ้าจะใช้ String เก็บค่า Null ต้องประกาศเป็น String? แทนครับ
- Default Interface - ใส่การทำงานพื้นฐานลงไปใน Interface เลย มันจะขัดกับตำรา OOP ที่เคยเรียนกันมาเลย
- มาดู Code กันเลย จะว่า Class WHTaxCalcA ไม่มี Logic อะไรเลยนะ ใช้จาก IWHTaxCalc เตรียมมาให้แล้ว
public interface IWHTaxCalc { Decimal DefaultWHTaxCalc(int pAmount, int pWHTaxRate) { //Default Logic return (pAmount * (pWHTaxRate / 100)) + pAmount; } } public class WHTaxCalcA : IWHTaxCalc { } public class Program { static void Main() { IWHTaxCalc whTaxCalcClass = new WHTaxCalcA(); whTaxCalcClass.DefaultWHTaxCalc(1000, 2); } }
สำหรับผมนะครับตัว Default Interface
ไม่จำเป็นอย่าใช้ เพราะ มันมีโอกาศเกิด diamond inheritance problem ได้ครับ
- Interface A มี Method TestX() ซึ่ง Interface B และ C เป็นลูก
- แล้วที่นี้ Class D ใช้ Interface B/ C คำถาม คือ ว่า จะใช้ Default Method ของ Interface B หรือ C หละ ?
- Async streams and disposables จริง async มาใน c# 5 แล้ว แต่ใน c# 8 เพิ่มการจัดการ resource มาด้วย และสามารถใช้พวก await yield
- Pattern ชอบภาพตัวอย่างนะ เจ๋งดี มันมีประโยชน์ใข้ลดพวก If ซ้อนกันเยอะๆ และเพิ่ม Readability ด้วยนะ พวก Tuple Pattern นี่สามารถเอามาชนกับ UML อย่าง State Machine ได้เลยครับ
- Github csharplang https://github.com/dotnet/csharplang อันนี้เราสามารถเพิ่ม issue เข้าใจใน repo นี้ได้ เพื่อขอ Feature เพื่อให้ทีมพัฒนาภาษาเข้ามาเลือก ถ้าสนใจจริงจะถูกติด tag propasal champion
10:40-11:30| Build Great Libraries using .NET Standard
Speaker: Aaron Amm Theeranit
- .NET Standard - เป็น Base API สำหรับ .NET อื่นๆ เช่น .NET Core .NET Framework
- ตอนนี้ .NET Standard จะสร้างได้แต่ Class Library เท่านั้น ต้องมี
- .NET Framework มาครอบ ถ้าต้องการใช้บน Windows Only
- .์Net Core มาครอบ ถ้าต้องการใช้งานแบบ Cross Platform (.NET Core 3 Support WinForm ด้วยนะ)
- สำหรับกลไลที่ชวย่ให้ .NET Standard ทำงานร่วมได้กับ .NET แบบอื่นๆ คือ แนวคิดของ Type forwarding มันจะช่วย Map DLL ของ .NET Standard ไปยัง Platform อื่นๆ
- ปัญหา Unit Test กับ .NET Standard Library
- ตอนนี้ยัง Test ตรงๆไม่ได้ ต้องเรียกครอบผ่าน Net Framework / .Net Core ก่อน
- สำหรับผมจากที่ได้ลองทำงานที่ใช้ .NET Standard การออกแบบระบบมีความท้าทายอยู่พอสมควรครับ อย่างระบบที่ผมทำ ผมเลือกใช้ PoEAA กับ Layer แยกส่วน
- Presentation - .NET Core และ .NET Framework สำหรับตัวที่ใช้ WindowsAPI เช่น Registry ผมแยกไว้ในส่วนนี้
- Business - .NET Standard
- Data Access - .NET Standard
- DTO - .NET Standard
- การทดสอบ .NET Framework 4.X ใช้ความพยายาม + Unit Test ครับ จากนั้นแก้ Reference ให้ถูกต้อง
11:30-12:20| Code at scale
Speaker: Joel Dickson
Agoda ใช้ Flow ตาม Git เลยครับ แต่ Branch จากนั้นทำเสร็จ Pull Request
Good Code - Good Example / Good thing => Good Code Quality
ในทางกลับกันถ้าคุณภาพ Code ไม่นี้ มันเหมิอนเรือที่กำลังจมแหละ เรากำลังวิดน้ำออก (ต้นฉบับใช่คำว่า Burning Ship)
Code Quality
- Client - https://github.com/DotNetAnalyzers/DotNetAnalyzers / TypeScript(TSLint)
- Server
- SonarQube เอามาใช้ในส่วนของ CI & CD Process
- Agoda Analyzer - https://github.com/agoda-com/AgodaAnalyzers
Coding Standard - https://github.com/agoda-com/standards-c-sharp
Plugin - Webpack Analysis
Clean your Codebase
- เราจะจัดการกับสิ่งที่อาจจะเป็นขยะยังไง Agoda ใช้ Agile เลยกำหนดตามรอบของ Sprints ทำได้ที่ละนิด
- SONGKRAN Refactor - เพราะคนลาเยอะ ไม่มีใครมายุ่งกับ Code เราบ่อยๆด้วย
14:00-14:50| 5 Azure Services Every .NET Developer Needs to Know
Speaker: Jose Barbosa
Basic AZURE Terminology
- Account - ชื่อที่จะเข้าไปจัดการ Azure
- Hosting vs Service
- Hosting - เอา Code + Data ไป Deploy เพื่อให้ทำงาน
- Service - ข้อแค่มี Data พอ Azure เตรียม Service ไว้ให้แล้ว เช่น BLOB Storage
5 Azure Services Every .NET Developer Needs to Know
- Azure App Service - พร้อมรับการ Deploy Code ของเรา พร้อม Tools สำหรับจัดการครบครัน
- SQL Database - ยกจาก MSSQL ที่เป็น RDBMS ที่ใช้ๆกันไปบน Cloud ครับ
- Azure Storage - BLOB / NoSQL (Table) / Queue / File
- Azure Function - เป็น Service เราแค่เตรียม Data กำหนด Event Trigger แล้ว Function (Code ที่จัดการมัน เช่น ใช้ ML สำหรับวิเคราะห์รูปภาพ เมื่อมีการ Upload เป็นต้น)
- Azure Monitoring - ตรวจสอบ และช่วยวิเคราะห์ Instance ครับ เรียกว่าครบวงจรเลย
ยุคนี้เป็นยุคของ JSON กับ Infrastructure as a Code(IaC) ครับ
สำหรับผม ถ้าอิงจากงานที่ทำอยู่โอกาศที่จะได้ใช้ Azure หรือ Cloud Service น้อยมาก ดันเรื่อง Docker กับ Automate CI Test ได้ก็สุดยอดแล้วครับ
แอบสงสัยว่า Visual Studio ถ้าไม่ใช้พวก Azure สามารถเอาออกได้ไหม
14:50-15:40| Blazor: Modern Web development with .NET and WebAssembly
Speaker: Guide Vorapat
Web Assembly - สิ่งที่ช่วยให้สามารถ Reuse Library ได้มากขึ้น จากเดิมที่ต้องมี Hepler นี้ใน C# ใน JavaScript ปัญหา ที่ตามมา อยากเน้น Performance แต่การ Maintain ยากตามไปด้วยครับ
.wasm - byte code for web โดยตอนนี้ Web Browser ค่ายใหญ่ๆเปิดรับกันแล้ว
สำหรับ Blazor WebAssembly
- Browser + Razor ไม่ต้องลง Plugin ใดเพิ่ม
- เป็น SPA เหมือน Angular / React
- Component Model - แยกชิ้น เอามาต่อได้
- มีทั้ง Client + Server-Side (Signal R - Web Socket ของ MS เค้า)
- Dependency Injection
- Suppport Java Script - ถ้าทำไม่ทัน ก็เอา Blazor เรียก JavaScript ได้
- สามารถรันได้ใน Browser ที่ไม่รองรับ โดยใช้ asm.js แทน
- Requre .NET Core 2.x ++ แต่ใน .NET Core 3.X ถูก Build in เข้ามาแล้ว
- มาลองดู Code จาก Tutorial ของ MS จาก https://blogs.msdn.microsoft.com/webdev/2018/03/22/get-started-building-net-web-apps-in-the-browser-with-blazor/ ครับ
- Syntax คล้าย Razor ใช้ @ อ้างถึง Keyword โดยใน @function สามารถเขียน Code C# ได้เลย เท่ากับว่ารู้ HTML5 + C# พร้อมลุยแล้ว
- ถ้าจะแก้จาก Client Side เป็น Server Side ลองดูอย่างจากตัวอย่างนี้ได้ครับ ลอง Get มาเล่นแล้วเจ๋งดีเหมือนกัน Chrome เข้าไปดูใน Network มีแต่ดึง .DLL เข้ามา
@page "/counter" <h1>Counter</h1> <p>Current count: @currentCount</p> <button @onclick(IncrementCount)>Click me</button> @functions { int currentCount = 0; void IncrementCount() { currentCount++; } }
- จาก Web Assembly จุดที่ชอบของผมนะครับ เราสามารถ Debugging Web ได้นะครับ
Resource ASPNET Blazor: https://github.com/aspnet/Blazor / https://blazor.net/
15:40-16:30| Complete Awesomeness for Mobile .NET Developers
Speaker: Teerasej Jiraphatchandej
- Xamarin - Cross Platform for mobile development
- สามารถ Share Logic จริงๆ ใช้ .NET Standard และ ตัว Xamarin ไปเรียกอีกที
- จาก Session นี้เจ๋งดีนะ เหมือนตัว View จอตามรูปแบบของ Native แต่ Logic เป็น C#
- UI Android - Logic C#
- UI IOS - Logic C#
- Windows Phone is dead - เลยต้องเข้าหาค่ายอื่นๆ ฮ่าๆ
- ถ้าอยากสร้าง 1 ได้ n platform และประหยัดเวลา ใช้ตัว Xamarin Form
- Tools - เหมือนช่วยให้ทำงานได้ง่ายนะ UI ที่ Mock เอามาใช้ต่อกับ App จริงได้เลย
- Xamarin Essentials
- Basic API ในรูปแบบ NuGet Package และ Tutorial เตรียมไว้ให้ สำหรับ Cross-Platform
- https://docs.microsoft.com/en-us/xamarin/essentials/
16:50-17:40| What's new of ASP.NET Core and Entity Framework Core 2.2
Speaker: Suthep Sangvirotjanaphat
- ตอนนี้ ASP.NET Core 2.2 Preview 3
- dotnet-httprepl - tools เอาไว้ Test API แบบ Command line
- FiraCode - Programming Font
- Transform URL เช่น ..../blogs/2017/test-api มันจะไปหา Method ของ Controller testapi() //ผมว่าน่าจะคล้ายของ Reverse Proxy ของ Apache / Nginx
- Swagger - Tool สำหรับทำ API Spec น่าจะเอาไปใช้งานในองค์กร โดยตัว ASP.NetCore
- มี Nuget ช่วยทำ Spec ด้วยนะ Microsoft.AspNetCore.Mvc.Api.Analyzers ครับ มันช่วยเตือนแสดง Warning ให่ครับ
- ถ้าขี้เกียจใส่ [assembly:ApiConventionType( typeof (DefaultApiConventions))] เอาครับ มันจะใส่ค่า Default มาให้ ถ้าทำ API ตามมาตรฐาน
- ถ้ามีครบแล้ว API Spec จาก Swagger จะสมบูรณ์ครับ
- EF Core Owned Entity - มี Class Payment ที่มี Class Address เป็น Property ข้างใน ตัว EF จะสร้าง Table แยกไป และเมื่อ Fetch ดึงข้อมูลตัวแม่ Payment ตัว EF น่าจะดึง Address เข้ามาด้วย //ผมนึกถึงตอนเรียน Software Design เลย จากเดิมที่ต้องทำเอง รอบนึง Framework เข้ามาช่วยในการ Convert OOP - RDBMS ครับ
ปิดท้ายแล้ว
- อาหารการกินเยอะดีครับ นั่งฟังไป แว๊บไปทำ Thesis ไป
- Trust me - we are software engineer //หลังจากมาพักงานนี้ เพราะ มันเกี่ยวกับงานที่ทำอยู่ได้เปิดหูเปิดตา หลายเรื่องเลย หลังจากมุ่งมันเรียนมาหลายปี และเจอมรสุมงานรุมเร้าครับ
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.