สรุปงาน .NET Conf 2018! BKK

วันนี้ผมมาแบบงง จริงๆมาเปลี่ยนที่ทำ 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);
    }
}
Diamond inheritance
Diamond inheritance

สำหรับผมนะครับตัว 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

Coding Standardhttps://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

  1. Azure App Service - พร้อมรับการ Deploy Code ของเรา พร้อม Tools สำหรับจัดการครบครัน
  2. SQL Database - ยกจาก MSSQL ที่เป็น RDBMS ที่ใช้ๆกันไปบน Cloud ครับ
  3. Azure Storage - BLOB / NoSQL (Table) / Queue / File
  4. Azure Function - เป็น Service เราแค่เตรียม Data กำหนด Event Trigger แล้ว Function (Code ที่จัดการมัน เช่น ใช้ ML สำหรับวิเคราะห์รูปภาพ เมื่อมีการ Upload เป็นต้น)
  5. 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

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.