ข้าม​ไป​ยัง​เนื้อหา

Kaen — เรียน​วิศวกรรม​ซอฟต์แวร์​เป็น​ภาษา​คน

เรียน​เรื่อง​ยาก​ของ​ซอฟต์แวร์ เป็น​ภาษา​คน

คอร์ส​เชิง​ลึก​ภาษา​ไทย พร้อม​ไดอะแกรม​โต้ตอบ​และ​แบบ​ฝึกหัด เลือก​เส้น​ทาง​ที่​ใช่ — DDD, .NET, AI Engineering หรือ Rust

เส้น​ทาง DDD — หลัก​การ​และ​กลยุทธ์

10 คอร์ส

ออกแบบ​ซอฟต์แวร์​รอบ domain ธุรกิจ ตั้งแต่​แนวคิด​หลัก​จนถึง​การ​ค้น domain ทั้ง​ทีม แล้ว​ปิด​ท้าย​ด้วย​สอง​คอร์ส​ที่​คอม​ไพล์​ได้ คือ​คอร์ส​ที่​ถาม​ว่า​อะไร​บังคับ​โครงสร้าง​นั้น และ​คอร์ส​ที่​ถาม​ว่า​ความ​ถูก​ต้อง​ข้าง​ใน​เดิน​ทางออก​ไป​ถึง​ผู้​เรียก​หรือ​เปล่า

  • ระดับ​กลาง

    Domain-Driven Design ฉบับ​ภาษา​คน

    ออกแบบ​ซอฟต์แวร์​รอบ domain ธุรกิจ​จริง ไม่ใช่​รอบ​ฐาน​ข้อมูล

    6 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    DDD Distilled — กลั่น​จาก​ตำรา

    แปล​พร้อม​สรุป​ความ​เข้าใจ​จาก​หนังสือ Domain-Driven Design Distilled ของ Vaughn Vernon (2016)

    7 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​สูง

    Patterns, Principles & Practices of DDD

    แปล​ไทย​ครบ​ทั้ง​เล่ม​จาก​ตำรา​ของ Scott Millett & Nick Tune — ตั้งแต่​หลัก​การ กลยุทธ์ ยุทธวิธี จนถึง​สถาปัตยกรรม app (26 บท)

    26 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​เริ่ม​ต้น

    Event Storming

    ค้น domain ทั้ง​ทีม​ด้วย Post-it สี​ส้ม​ภายใน​ไม่​กี่​ชั่วโมง

    6 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    Kotlin + Spring Boot + Clean Architecture — กฎ​ทิศทาง​ที่ compiler บังคับ​ให้

    คอร์ส​ที่​ถาม​ว่า​อะไร​บังคับ​โครงสร้าง​หลัง​จาก​ออกแบบ​เสร็จ​แล้ว — สร้าง​ระบบ​จอง​คิว​คลินิก​ด้วย Kotlin 2.4.10, Spring Boot 4.1.1 และ Gradle multi-module แล้ว​พิสูจน์​ที​ละ​ข้อ​ว่า​กฎ​ทิศทาง​บังคับ​ด้วย build ได้​จริง ไม่ใช่​ข้อ​ตกลง​ใน​เอกสาร ไล่​จาก​การ​แยก​โมดูล​ที่​ทำให้ import Spring ใน domain แปล​ไม่​ผ่าน ผ่าน @Entity ที่​แปล​เขียว​และ​ส​ตาร์ต​ขึ้น​แล้วไป​ตาย​ที่ save ครั้ง​แรก ราคา​ของ persistence model ตัว​ที่​สอง​ที่​นับ​เป็น​บรรทัด ขอบ transaction ที่ use case จนถึง​สอง​บท​ที่​คอร์ส​นี้​มี​อยู่​เพื่อ​มัน คือ invariant ที่​กว้าง​กว่า aggregate จน​โดเมน​บังคับ​เอง​ไม่​ได้ และ optimistic locking ที่​ทิ้ง​ผู้​แพ้ ไม่ใช่​รวม​ของ​สอง​ฝั่ง ทุก​ข้อ​อ้าง​มา​จาก probe ที่​รัน​ได้ ไม่มี​หน่วย​เวลา​สัก​ตัว 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    ขอบ HTTP ของ​คลินิก — สัญญา​ที่​ผู้​เรียก​ปลาย​สาย​อ่าน​ออก

    คอร์ส​ต่อ​จาก clinic-clean-arch-kotlin ที่​ถาม​คำถาม​เดียว คือ​ความ​ถูก​ต้อง​ทั้งหมด​ที่​สร้าง​ไว้​ข้าง​ใน เดิน​ทางออก​ไป​ถึง​ผู้​เรียก​ปลาย​สาย​หรือ​เปล่า คำ​ตอบ​ที่​วัด​ได้​คือ​ไม่ เพราะ​คำขอ​ที่​ผิด​กับ​ระบบ​ที่​พัง​จริง​ตอบ​กลับ​ด้วย body รูป​เดีย​วกันเป๊ะ ต่าง​กัน​แค่​ตัวเลข และ​ความ​ขัด​แย้ง​ของ​ข้อมูล​ที่​ฐาน​ข้อมูล​กัน​ไว้​ได้ กลาย​เป็น 500 ที่​แปล​ว่า​เรา​พัง ผู้​เรียก​จึง​ลอง​ใหม่​ทั้ง​ที่​ลอง​กี่​ครั้ง​ก็​ชน​เหมือน​เดิม ไล่​จาก body ที่​ไม่มี​ใคร​ใช้ได้ ผ่าน problemdetails ที่​แก้​ครึ่ง​เดียว ตัว​จัดการ​ที่​ไม่​เคย​รัน​สัก​ครั้ง​โดย​ไม่มี​อะไร​เตือน การ​แปลง 23P01 เป็น 409 คีย์​ที่​แยก​คำขอ​เดิม​ออก​จาก​คำขอ​ใหม่​ที่​บังเอิญ​เหมือน​กัน จนถึง​สัญญา​ของ​ขอบ​ที่​เขียน​เป็น​ตาราง​แล้ว​บังคับ​ด้วย​เทสต์ ทุก​ข้อ​อ้าง​มา​จาก probe ที่​รัน​ได้ วัด​ด้วย​รหัส HTTP ชื่อ​คีย์​และ​จำนวน​แถว ไม่มี​หน่วย​เวลา​สัก​ตัว 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    คัด​กรอง​ผู้​เรียก​ของ​คลินิก — ใคร​เรียก​ได้ และ​เห็น​ข้อมูล​ของ​ใคร

    คอร์ส​ที่​สาม​ของ​ซี​รีส์​คลินิก ต่อ​จาก clinic-http-boundary โดยตรง คอร์ส​ก่อน​จบ​ด้วย​สัญญา​ที่​ผู้​เรียก​อ่าน​ออก body รูป​เดียว​ทั้ง​ระบบ บังคับ​ด้วย​เทสต์​แล้ว คอร์ส​นี้​เพิ่ม dependency หนึ่ง​บรรทัด​แล้ว​ถาม​ว่า​สัญญา​นั้น​เหลือ​อะไร คำ​ตอบ​ที่​วัด​ได้​คือ body ของ​คำ​ตอบ​ที่​ปฏิเสธ​ผู้​เรียก​ว่าง​เปล่า​สนิท ไม่มี​คีย์​สัก​ตัว และ​ไม่มี​เทสต์​ไหน​แดง เพราะ​เรื่อง​เกิด​ใน filter chain ซึ่ง​อยู่​ก่อน DispatcherServlet ตัว​จัดการ​ที่​คอร์ส​ก่อน​สร้าง​ไว้​จึง​ไม่มี​ทาง​เห็น ไล่​จาก​หนึ่ง​บรรทัด​ที่​ทำ​สัญญา​พัง ผ่าน config รูป​เก่า​ที่​ไม่​คอม​ไพล์​แล้ว คำถาม​ว่า​ใคร​เลือก​ระหว่าง 401 กับ 403 ซึ่ง​คำ​ตอบ​ไม่ใช่​กฎ​ที่​เรา​เขียน chain ที่​ถูก​กลืน​จน​กฎ​ข้าง​ใน​ไม่มี​ผล การ​เอา body กลับ​เข้า​สัญญา​เดิม จนถึง​การ​รั่ว​ข้าม tenantที่​ไม่มี​รหัส​ข้อ​ผิด​พลาด​ให้​ดู มี​แต่​จำนวน​แถว ทุก​ข้อ​อ้าง​มา​จาก probe ที่​รัน​ได้ วัด​ด้วย​รหัส HTTP ชื่อ​คีย์ ชื่อ filter และ​จำนวน​แถว ไม่มี​หน่วย​เวลา​สัก​ตัว 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    คำ​ตอบ​ที่​คลินิก​จำ​ไว้ — cache ที่​จำ​คำ​ตอบ แต่​ลืม​ว่า​ใคร​ถาม

    คอร์ส​ที่​สี่​ของ​ซี​รีส์​คลินิก ต่อ​จาก clinic-security โดยตรง คอร์ส​ก่อน​ปิด​รู​ข้าม​ผู้​เช่า​ไว้​ที่​บท​สุดท้าย รู​ที่​ไม่มี​รหัส HTTP ให้​ดู เห็น​ได้​ทาง​เดียว​คือ​จำนวน​แถว​ที่​คืน​กลับ​ไป คอร์ส​นี้​เพิ่ม​ชั้น​ที่​จำ​คำ​ตอบ​ไว้ แล้ว​ถาม​คำถาม​ถัด​ไป​ของ​สัญญา​เดียวกัน คือ​รู​นั้น​กลับ​มา​ไหม และ​ถ้า​กลับ​มา มี​อะไร​แดง​บ้าง คำ​ตอบ​ที่​วัด​ได้​คือ​กลับ​มา​เต็ม​รูป clinic-b ได้​สอง​แถว​ของ clinic-a พร้อม​รหัส 200 และ​สาม​คำขอ​ทำให้​ฐาน​ข้อมูล​ถูก​ถาม​ครั้ง​เดียว ส่วน​ความ​แดง​ไม่​ได้​ขึ้น​กับ code ของ​แอป มัน​ขึ้น​กับ​หนึ่ง​บรรทัด​ใน config ของ​เทสต์ ไล่​จาก​คำ​ตอบ​ที่​เป็น​ของ​คน​อื่น ผ่าน annotation ที่​ครบ​แล้ว​แอป​ยัง​ไม่​ส​ตาร์ต คำถาม​ว่า​ใคร​เป็น​คน​สร้าง​กุญแจ คำ​เรียก​ใน class เดียวกัน​ที่​ไม่​เคย​ถึง​ตัว​ห่อ อ็อบเจ็กต์​ที่​ยื่น​ออก​ไป​แล้ว​ถูก​แก้ แถว​ที่​ไม่​เคย commit แต่​ยัง​ถูก​คืน บรรทัด​เดียว​ที่​ทำให้​เทสต์​ไม่​ได้​ทดสอบ​อะไร จนถึง​สัญญา​ของ​ชั้น​ที่​จำ​คำ​ตอบ ทุก​ข้อ​อ้าง​มา​จาก probe ที่​รัน​ได้ วัด​ด้วย​จำนวน​แถว จำนวน query ชื่อ​กุญแจ และ​รหัส HTTP ไม่มี​หน่วย​เวลา​สัก​ตัว 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    คำขอ​ข้าม​ต้นทาง​ของ​คลินิก — เบราว์เซอร์​บล็อก​คำ​ตอบ แต่​แถว​ลง​ไป​แล้ว

    คอร์ส​ที่​ห้า​ของ​ซี​รีส์​คลินิก และ​เป็น​คำ​ตอบ​ของ​บรรทัด​เดียว​ที่​คอร์ส clinic-security ประกาศ​ไว้​เอง​ว่า​ใหญ่​เกิน​กว่า​แปดบท​ของ​มัน​จะ​รับ​ไหว คอร์ส​นั้น​ปิด CSRF ทิ้ง​ด้วย​หนึ่ง​บรรทัด ใน​กฎ​ขั้น​ต่ำ​ที่ 10 จาก 12 ทรง​ของ​คอร์ส​นั้น​ตั้ง​อยู่​บน และ​ไม่มี​บท​ไหน​บอก​ว่า​มัน​ปิด​อะไร​ไป คำถาม​ของ​คอร์ส​นี้​คือ​เบราว์เซอร์​บอก​ว่า​คำขอ​ถูก​บล็อก​ด้วย CORS แล้ว​ฐาน​ข้อมูล​ได้​แถว​เพิ่ม​กี่​แถว คำ​ตอบ​ที่​วัด​ได้​คือ​หนึ่ง​แถว server ตอบ 200 โดย​ไม่มี Access-Control-Allow-Origin ออก​มา​สัก​ตัว เบราว์เซอร์​ปฏิเสธ​ที่​ขั้น​อ่าน​คำ​ตอบ ส่วน​การ​เขียน​เกิด​ไป​แล้ว ยกเว้น​ทรง​ที่​ต้อง preflight ซึ่ง​วัด​ได้ OPTIONS = 1 และ POST = 0 คือ​การ​เขียน​ไม่​เคย​เกิด เส้น​แบ่ง​จึง​ไม่​ได้​อยู่​ที่​ข้าม​โดเมน​หรือ​ไม่ มัน​อยู่​ที่ content-type กับ header ข้อ​ที่​คม​ที่สุด​คือ GET ที่​เขียน​ฐาน​ข้อมูล ผ่าน​การ​กัน​ของ CSRF ไป​ทั้ง​ดุ้น​ด้วย 200 และ​หนึ่ง​แถว ส่วน​ตัว​ที่​ปิด​รู​นั้น​ได้​คือ CORS ซึ่ง​ตอบ 403 และ​ไม่มี​แถว​ลง ไล่​จาก​บรรทัด​ที่​ถูก​ปิด token ที่​ผูก​กับ session ลำดับ filter ที่​เลือก​รหัส method ที่ CSRF ไว้ใจ แถว​ที่​ลง​ไป​แล้ว คำขอ​ที่​ไม่​เคย​ออก​เดิน​ทาง ตอน​ที่ server เป็น​คน​ปฏิเสธ จนถึง​สอง​กลไก​กับ​สอง​รู​ที่​มัน​ปิด​คนละ​รู ทุก​ข้อ​อ้าง​มา​จาก probe ที่​รัน​ได้ วัด​ด้วย​จำนวน​แถว จำนวน​คำขอ จำนวน header และ​รหัส HTTP ไม่มี​หน่วย​เวลา​สัก​ตัว 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    row-level security ของ​คลินิก — เปิด​แล้ว policy ยัง​ไม่​เคย​ถูก​เรียก​ใช้

    คอร์ส​ที่​หก​ของ​ซี​รีส์​คลินิก และ​เป็น​คอร์ส​แรก​ของ​ไซต์​ที่​ถาม​ว่า policy ที่​ผูก​อยู่​กับ​ตาราง​แล้ว​และ​เขียน​ถูก​ทุก​ตัว​อักษร กัน​แถว​ของ​ผู้​เช่า​คน​อื่น​ไว้​ได้​จริง​หรือ​ยัง คำ​ตอบ​ที่​วัด​ได้​คือ​ยัง เจ้าของ​ตาราง​ที่​สั่ง ENABLE ROW LEVEL SECURITY แล้ว​อ่าน​ตาราง​หก​แถว​ของ​ตัว​เอง ยัง​ได้ 6 แถว​ครบ เติม FORCE ROW LEVEL SECURITY เข้าไป​โดย​ไม่​แตะ SQL ของ policy สัก​ตัว​อักษร แล้ว​ได้ 0 แถว ตั้ง GUC เป็น​ผู้​เช่า a หรือ b ได้ 3 แถว และ​สั่ง NO FORCE ทั้ง​ที่ GUC ยัง​ตั้ง​อยู่ กลับ​ไป​ได้ 6 แถว สิ่ง​ที่​เปลี่ยน​คือ​ธง​ใน catalog ไม่ใช่​นิพจน์​ที่​เขียน​ไว้ ธี​สิ​ส​พลิก​อีก​สอง​ชั้น ชั้น​ที่​สอง​คือ​หน่วย​ที่​จับ​การ​รั่ว​นี้​ได้​มี​หน่วย​เดียว​คือ​จำนวน​แถว เพราะ​คำขอ​ที่​รั่ว​สำเร็จ​ทุก​ครั้ง​จึง​ไม่มี​รหัส​ข้อ​ผิด​พลาด​ให้​ดู ชั้น​ที่​สาม​คือ​หน่วย​นั้น​มี​จุดบอด​ของ​มัน​เอง ฟังก์ชัน​ของ policy ที่​ไม่​ได้​ตรึง search_path ทำให้​ผู้​เช่า​ที่​เห็น​แถว​สลับ​กัน โดย​ยอด​รวม​ค้าง​อยู่​ที่ 3 ทุก​สถานะ ไล่​จาก policy ที่​ไม่​ทำ​อะไร​เลย คีย์​ของ​ผู้​เช่า​ที่​เป็น​ค่า​ตั้ง​ของ session การ​เขียน​ที่​ถูกกัน​ด้วย policy ที่​คุณ​ไม่​ได้​เขียน การ​ปฏิเสธ​ที่​ไม่​ส่ง​เสียง ประตู​ที่ policy มอง​ไม่​เห็น การ​โจมตี​ที่​ไม่​ขยับ​จำนวน​แถว connection pool ที่​พก​ค่า​ตั้ง​ติด​ไป​ด้วย จนถึง​ตาราง​สัญญา​ว่า​ผู้​อ่าน​พูด​อะไร​ได้​แล้ว ทุก​ข้อ​อ้าง​มา​จาก probe ที่​คุณ​รัน​เอง​ได้ วัด​ด้วย​จำนวน​แถว จำนวน​แถว​ที่​ถูก​กระทำ จำนวน policy รหัส SQLSTATE ธง​บู​ลีน​ใน catalog และ​รหัส HTTP ไม่มี​หน่วย​เวลา​สัก​ตัว 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →

เส้น​ทาง .NET — สร้าง​และ​ดูแล domain Order

9 คอร์ส

ลงมือ​สร้าง platform ฟู้ด​เดลิ​เว​อรี​จริง​ที​ละ​ชั้น ตั้งแต่ C# สมัย​ใหม่​จนถึง observability

  • ระดับ​เริ่ม​ต้น

    C# สมัย​ใหม่​สำหรับ DDD — ปู​พื้น​ก่อน​ลงมือ

    เรียน C# สมัย​ใหม่​ด้วย​การ​สร้าง domain Order ตั้งแต่​ศูนย์ — จุด​เริ่ม​ต้น​ที่​แนะนำ​ของ​สาย .NET/DDD ทั้ง​เส้น ตั้งแต่ record ที่​กลาย​เป็น Value Object, pattern matching ที่​ขับ​เคลื่อน​สถานะ, nullable reference types ที่​กลาย​เป็น guard clause, ไป​จนถึง async/await ที่​กลาย​เป็น​รูป​ร่าง​ของ port

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    Clean Architecture ด้วย .NET

    ลงมือ​สร้าง ASP.NET Core API จริง​ที​ละ layer ตาม Dependency Rule — domain ฟู้ด​เดลิ​เว​อรี​ต่อ​จาก Event Storming พร้อม EF Core, CQRS/MediatR, DI และ test

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​สูง

    แปลง DDD tactical patterns เป็น code จริง (C#)

    ลง​ลึก domain Order เดิม​จาก Clean Architecture .NET — Value Object, Entity, Aggregate, state machine, Domain Event, Specification และ Factory ที่​รักษา​กฎ​ธุรกิจ​ไว้​ใน code

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    ทดสอบ app DDD/Clean Architecture ให้​เป็น

    พิสูจน์​ว่า domain Order จาก Clean Architecture .NET + DDD in Code ทำงาน​ถูก​จริง — ยูนิต test domain แบบ​ไม่​ต้อง mock, test double, Testcontainers และ e2e ผ่าน API พร้อม​พีระมิด test และ​สี่​เสา​หลัก

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​สูง

    เก็บ Aggregate ลง​ฐาน​ข้อมูล​ด้วย EF Core โดย​ไม่​ทำลาย model

    เก็บ domain Order เดิม​ทั้ง​ก้อน​ลง SQL อย่าง​ซื่อสัตย์​ต่อ model — strongly-typed ID, owned type, migration, optimistic concurrency, transaction boundary และ query ให้​ไม่ N+1 ต่อ​จาก Clean Architecture บท 4

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​สูง

    ออกแบบ​ระบบ​เงิน​และ Ledger ด้วย DDD

    เงิน​ไม่มี​วัน​หาย — วาง​ระบบ double-entry ledger ให้ platform ฟู้ด​เดลิ​เว​อรี​เดิม รองรับ wallet, PromptPay, escrow ระหว่าง​ส่ง​อาหาร, settlement, payout ให้​ร้าน/ไร​เด​อร์, refund และ reconcile ยอด​ทุก​บาท​ทุก​สตางค์

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​สูง

    แยก Bounded Context แล้ว​เชื่อม​กลับ — Modular Monolith สู่ Service

    ขยาย domain Order เดิม​เป็น 4 bounded context (Ordering, Kitchen, Delivery, Payment) เชื่อม​กัน​ด้วย integration event และ transactional outbox ที่​เชื่อ​ถือ​ได้ ก่อน​แตก1 context ออก​เป็น service จริง​ด้วย Wolverine + RabbitMQ

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    Observability platform Order — OpenTelemetry + ClickStack

    ปิด​เส้น​ทาง platform Order (#5–#10) ด้วย​ชั้น OPERATE ที่​ขาด​ไป — instrument ระบบ 4 bounded context ด้วย OpenTelemetry ที่​เป็นก​ลาง​ต่อ vendor แล้ว​ส่ง trace/metric/log เข้า ClickStack (ClickHouse + HyperDX) ไล่​หนึ่ง​ออ​เด​อร์​เป็น trace เดียว​ข้าม RabbitMQ ตั้ง SLO/error budget และ​ขับ​เคลื่อน incident จริง​จาก alert สู่ root cause ด้วย C#/.NET

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​สูง

    เขียน C#/.NET ให้​เร็ว: struct, zero allocation, Span<T>

    ชั้น PERFORMANCE ของ domain Order — คอร์ส #8–#11 สร้าง domain ขึ้น​มา #19 สอน​ให้​มอง​เห็น​มัน​ตอน​รัน คอร์ส​นี้​ทำให้​มัน​เร็ว​ขึ้น โดย​มี​หลัก​ฐาน hot path เดียว​ทั้ง​คอร์ส (parse บรรทัด​ออร์เด​อร์ → รวม​ยอด → พิมพ์​ใบ​เสร็จ) ไล่​จาก​การ​วัด​ให้​เป็น → struct/class → boxing → Span<T>/stackalloc → ArrayPool → งาน string → ValueTask จนถึง capstone ที่​วัด​ได้​ว่า​ลด​จาก 12,272 byte ต่อ batch เหลือ 0 byte โดย​ผลลัพธ์​ยัง​ตรง​กัน​ทุก byte (982 byte ทั้ง 7 version) ทุก​ตัวเลข​ใน​คอร์ส​วัด​จริง​บน​เครื่อง​เดียว .NET 10.0.10 / linux-x64 และ​คอร์ส​นี้​ตัดสิน​ด้วย column Allocated ไม่ใช่ column Mean

    8 บท​เรียน

    เริ่ม​เรียน →

เส้น​ทาง AI Engineering

8 คอร์ส

สร้าง​ระบบ AI agent ที่​ใช้​งาน​ได้​จริง​บน domain Order ตั้งแต่ agent ตัว​แรก​จนถึง​ความ​ปลอดภัย แล้ว​เปิด​ฝาก​ระ​โปรง model ถึง​ระดับ neural net

  • ระดับ​เริ่ม​ต้น

    agent ตัว​แรก​ด้วย C#/.NET — สร้าง AI Agent ตัว​แรก

    ประตู​สำหรับ​มือ​ใหม่​ของ​สาย AI-engineering — สร้าง AI agent ตัว​แรก​บน domain Order ฟู้ด​เดลิ​เว​อรี​ที่​คุ้น​เคย ไล่​จาก​การ​เรียก Messages API แบบ​ดิบ สู่ Microsoft.Extensions.AI แล้ว​เติม tool use ปิด​ท้าย​ด้วย the loop จน​ได้ agent Order support ตัว​เล็ก ๆ ที่​ทำงาน​ได้​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    วิศวกรรม​บริบท — Context Engineering

    สร้าง context layer จริง​คร่อม agent Order จาก​คอร์ส​ที่ 15 — retrieval, long-term memory, งบ​ประมาณ token, compaction และ​การ​จัด​ระเบียบ​ผล​ของ tool แล้ว​วัด​ต้นทุน token ของ​มัน​ด้วย C#/.NET

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​สูง

    เครื่องยนต์​ของ agent — Agent Harness & Loop

    สร้าง runtime ของ agent คร่อม agent Order จาก​คอร์ส​ที่ 15/16 ด้วย C#/.NET — the loop และ harness, workflow pattern ตาม​แนว BEA (chaining, routing, parallelization, orchestrator-workers, evaluator-optimizer), ความ​ทนทาน (retry, timeout, idempotency) ปิด​ท้าย​ด้วย autonomous loop ที่​มี compound stop policy จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​สูง

    Agent as Bounded Context — ออกแบบ​ระบบ AI Agent ด้วย DDD

    คอร์ส AI-engineering คอร์ส​แรก​ของ​แก่น — นำ​เครื่อง​มือ​เชิงกล​ยุทธ์​ของ DDD (bounded context, ubiquitous language, context map, ACL) มา​ออกแบบ​ระบบ AI agent ให้​มี​ขอบเขต​ชัดเจน เป็น​คำ​ตอบ​ทวน​กระแส multi-agent hype ที่​มัก​แตก agent เกิน​ความ​จำเป็น

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​สูง

    ประเมิน AI Agent ให้​เป็น — Evals

    คู่หู​สาย AI-engineering ของ Testing in Practice — วัดผล ops-copilot ต่อ​จาก Agent as Bounded Context ให้​เป็น​วิทยาศาสตร์ ด้วย eval ที่​ตัดสิน​จาก​ผลลัพธ์​ไม่ใช่ trajectory, LLM-as-judge ที่​ผ่าน​การ calibrate, error analysis อย่าง​เป็น​ระบบ และ eval ทั้ง offline กับ online

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​สูง

    ออกแบบ MCP Server ที่​ดี

    คอร์ส​ที่​สาม​ใน​สาย AI-engineering ของ​แก่น ต่อ​จาก Agent as Bounded Context — ออกแบบ MCP server ที่​ดี​ผ่าน​มุม​มอง tool-as-ACL วาง Primitive ทั้ง​สาม (Tool, Resource, Prompt) ให้​ชัด​ว่า​ใคร​เป็น​ผู้​ควบคุม และ​ปฏิบัติ​ต่อ​ความ​ปลอดภัย​เป็น​ส่วน​หนึ่ง​ของ​สถาปัตยกรรม​ตั้งแต่​ต้น บน​มาตรฐาน​เปิด​ที่​วัน​นี้​เป็นก​ลาง​ทาง​ค่าย​แล้ว​ภาย​ใต้ Linux Foundation

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    ความ​ปลอดภัย​ของ AI Agent — Guardrails & Security

    ป้องกัน agent Order จาก​คอร์ส​ที่ 15–17 เมื่อ​มี​ศัตรู​ลงมือ​โจมตี​จริง — prompt injection, jailbreak, input/output guardrail, least-privilege + human-approval gate และ​การ​รักษา​ข้อมูล​ไม่​ให้​รั่ว ประกอบ​เป็น defense-in-depth ชั้น​เดียว​ด้วย C#/.NET

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    Deep Learning จาก​ศูนย์ — สร้าง neural net จนถึง transformer ด้วย​มือ

    เปิด​ฝาก​ระ​โปรง model ที่ agent จาก​คอร์ส #15–#18 เรียก​ใช้​ผ่าน API — สร้าง neural network เอง​ตั้งแต่ neuron ตัว​เดียว ไล่ backprop ด้วย micrograd → bigram LM → MLP+embedding → training internals → PyTorch → self-attention/transformer จน​ประกอบ nano-GPT ตัว​จิ๋ว​ที่​รัน​บน CPU ได้ 8 บท​เรียน​ลงมือ​จริง​ด้วย Python ตาม Karpathy Zero-to-Hero

    8 บท​เรียน

    เริ่ม​เรียน →

เส้น​ทาง Rust / Systems

6 คอร์ส

เรียน​ภาษา systems ด้วย​การ​สร้าง​ของ​จริง จาก CLI จนถึง cluster แบบ​กระจาย

  • ระดับ​กลาง

    Rust จาก​ศูนย์ — เรียน​ภาษา systems ด้วย​การ​สร้าง CLI จริง

    คอร์ส Rust แบบ​ยืน​เดี่ยว สำหรับ​วิศวกร​ที่มา​จาก​สาย C#/.NET — เรียน​ภาษา systems ตั้งแต่​ศูนย์​ด้วย​การ​สร้าง​เครื่อง​มือ command-line จริง​หนึ่ง​ตัว (taskcli ตัว​จัดการ​งาน to-do ที่​เก็บ​สถานะ​เป็น JSON) ไล่​จาก cargo new จนถึง capstone แบบ multi-threaded ใช้​แค่​ภาษา​แกน + std + library ที่​นิ่ง​จริง จงใจ​ไม่​พึ่ง async ecosystem ทั้ง 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​สูง

    Rust Systems II — สร้าง Key-Value Store ที่​กู้​คืน​จาก​การ​ล่ม​ได้ (kaen-kvstore)

    คอร์ส Rust แบบ​ยืน​เดี่ยว ต่อ​จาก #21 — สร้าง key-value store บน​เครือ​ข่าย​ที่​กู้​คืน​จาก crash ได้​จริง ด้วย Rust std ล้วน (ไม่มี async/tokio ไม่มี serde) ไล่​จาก wire protocol ที่​เขียน​เอง → append-only log + hash index (model Bitcask) → durability ด้วย fsync → compaction → thread pool → ทดสอบ crash-consistency → benchmark ปู​ทาง​สู่ Distributed Systems (#23) ทั้ง 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​สูง

    Distributed Systems บน kaen-kvstore — Rust Systems III

    ต่อ​จาก #22 — เลื่อน kaen-kvstore จาก1 node เป็น cluster ที่ replicate + quorum-consistent + CRDT ลู่​เข้า​เอง ด้วย Rust std ล้วน (splitmix64 + std SipHash ไม่มี serde/tokio/proptest) สอน​เฉพาะ​ส่วน​ที่ property-test ได้​จริง (vector clock, consistent hashing, quorum, CRDT, Merkle/gossip, harness ฉีด partition) ส่วน consensus/Raft เป็น​ไดอะแกรม ทุก snippet compile+รัน​ได้​จริง​ใน​แซนด์บ็​อกซ์ เป็น​คอร์ส​ที่​สาม​ของ​เสา Systems (#21→#22→#23) ก่อน​ที่ #24 จะ​เปิด async ecosystem ต่อ ทั้ง 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​สูง

    Async Rust ด้วย Tokio — Rust Systems IV

    ต่อ​จาก​ซี​รีส์ Rust (#21–#23) ที่​จงใจ​เลี่ยง async ecosystem — คราว​นี้​เปิด async จริง: future/await, Tokio runtime, task และ .await, non-blocking I/O และ networking เพื่อ​เขียน server ที่​รอง​รับ​คอน​เน​กชัน​จำนวน​มาก​พร้อม​กัน​โดย​ไม่​ต้อง​ผูก1 thread ต่อ​หนึ่ง​คอน​เน​กชัน

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​สูง

    สร้าง​ภาษา​โปรแกรม​ของ​คุณ​เอง — Rust Systems V

    ปิด​ซี​รีส์ Rust ด้วย​การ​สร้าง interpreter ของ​ภาษา​เล็กๆ ตั้งแต่​ศูนย์​ด้วย Rust std ล้วน — scanner/tokenizer → AST → recursive-descent parser → tree-walking interpreter → environment/scope → function และ closure → class และ method จนถึง REPL ที่​รัน script ได้​จริง อิง​โครง Crafting Interpreters แต่​เขียน​ใหม่​ให้​เป็น Rust แท้ (enum + pattern matching + ownership) ไม่มี external crate

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​สูง

    สร้าง log broker เอง — Rust Systems VI

    คอร์ส​ที่​หก​ของ​เสา Rust และ​เป็น​ของ​ที่ #22 สัญญา​ไว้​แล้ว​ยัง​ไม่มี​ใคร​สร้าง — kaen-kvstore ปิด​ท้าย​ด้วย​การ​วาง segment ไว้​เป็น​สะพาน​ไป​คอร์ส​ถัด​ไป แต่ #23 รับ​ไม้​ไป​ทาง​ระบบ​กระจาย คอร์ส​นี้​คือ​ที่​ที่ segment มา​ถึง​จริง สร้าง log broker ทรง Kafka ชื่อ kaen-log ตั้งแต่​ศูนย์​ด้วย Rust std ล้วน ไม่มี external crate สัก​ตัว และ​จงใจ​ไม่​ใช้ Tokio ทั้ง​ที่ #24 สอน​ไว้ เพราะ​แก่น​ของ​คอร์ส​อยู่​ที่ protocol กับ disk ไม่ใช่​ที่ scheduler เดิน​ครบ​สาย​ตั้งแต่ log ที่​เป็น​ความ​จริง segment กับ​สารบัญ​ที่​จงใจ​ไม่​ครบ ทาง produce กับ acks ทาง fetch ที่​จอด​คำขอ​ไว้​แทน​การ​ตอบ​กลับ​ว่าง consumer group กับ offset ที่ commit แล้ว retention กับ compaction delivery semantics จนถึง replication กับ high watermark ธี​สิ​ส​ของ​คอร์ส​คือ log ไม่ใช่​คิว มัน​คือ​ลำดับ​ที่​ไม่​เปลี่ยน ซึ่ง​ผู้​อ่าน​หลาย​ราย​เดิน​อยู่​คนละ​ตำแหน่ง · 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →

เส้น​ทาง​ข้อมูล​และ​ประสิทธิภาพ

3 คอร์ส

เปิด​ฝาก​ระ​โปรง​ชั้น​เก็บ​ข้อมูล ประกอบ​ชิ้น​ส่วน​ของ query engine และ transaction manager ด้วย​มือ จน​อธิบาย​ได้​ว่า planner เลือก​แผน​ด้วย​ตัวเลข​อะไร และ isolation level แลก​อะไร​กับ​อะไร

  • ระดับ​กลาง

    สร้าง query engine เอง — ทำไม query ช้า และ planner ตัดสิน​ใจ​ด้วย​อะไร

    คอร์ส​แรก​ของ​เส้น​ทาง​ข้อมูล​และ​ประสิทธิภาพ — ประกอบ​ชิ้น​ส่วน​ของ query engine ด้วย​มือ​ที​ละ​ชั้น​ด้วย Python stdlib ล้วน: heap file บน​หน้า 4096 byte → B+tree → สถิติ​กับ selectivity → cost model ที่​ไม่มี​หน่วย​เวลา → access path กับ covering index → อัล​กอ​ริ​ทึม join จนถึง capstone ที่​เอา planner ของ​ตัว​เอง​ไป​เทียบ​กับ sqlite3 แล้ว​อธิบาย​ทุก​จุด​ที่​ไม่​ตรง​ให้​ได้ คำถาม​ที่​คอร์ส​นี้​ตอบ​คือ ทำไม​การ​เพิ่ม index บาง​ครั้ง​ถึง​ไม่​ช่วย และ​เอน​จินตั​ด​สิน​ใจ​เรื่อง​นี้​ด้วย​ตัวเลข​อะไร หน่วย​ของ​คอร์ส​คือ​หน้าที่​แตะ ครั้ง​ที่​เทียบ​คีย์ และ​แถว​ที่​ต้อง​ถือ​ไว้​พร้อม​กัน ไม่ใช่​วินาที ทุก​ตัวเลข​วัด​จริง​จาก​สคริปต์​ที่ commit ไว้​ใน​รี​โป 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​สูง

    ทำไม​ต้อง​มี isolation level — สร้าง transaction manager เอง

    คอร์ส​ที่​สอง​ของ​เส้น​ทาง​ข้อมูล​และ​ประสิทธิภาพ และ​เป็น​ชั้น​ที่​คอร์ส query engine ประกาศ​ว่า​ตัว​เอง​ไม่​ทำ — สร้าง transaction manager ตั้งแต่​ศูนย์​ด้วย Rust std ล้วน ไม่มี external crate ตั้งแต่ transaction API → anomaly ที่​ทำ​ซ้ำ​ได้​ทุก​ครั้ง → two-phase locking กับ deadlock → MVCC และ​กฎ​การ​มอง​เห็น → snapshot isolation กับ write skew → SSI → ราคา​ของ transaction จนถึง​การ​เทียบ​กับ SQLite และ PostgreSQL ของ​จริง ธี​สิ​ส​ของ​คอร์ส​คือ isolation level ที่​สูง​ขึ้น​ไม่​ได้​แปล​ว่า​คำ​ตอบ​ถูก​ขึ้น มัน​แปล​ว่า​เอน​จิ​น​ยอม​ปฏิเสธ​งาน​บ่อย​ขึ้น serializable คืน abort ที่​คุณ​ต้อง retry เอง ไม่​ได้​คืนคำ​ตอบ​ที่​ถูก หน่วย​ของ​คอร์ส​คือ​จำนวน abort จำนวน version ที่​ค้าง และ​จำนวน​หน้าที่​เขียน ไม่ใช่​วินาที 8 บท​ลงมือ​จริง​ด้วย Rust

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    column store จาก​ศูนย์ — เก็บ​กลับ​ด้าน​แล้ว​อ่าน​มากกว่า​เดิม

    คอร์ส​ที่​สาม​ของ​เสา​ข้อมูล​และ​ประสิทธิภาพ เก็บ​ตา​รา​งอ​อเด​อร์​ใบ​เดิม​ของ​คอร์ส​ที่ 26 และ 28 กลับ​ด้าน แล้ว​ถาม​ว่าการ​วาง​ค่า​ของ column เดียวกัน​ไว้​ติด​กัน​ซื้อ​อะไร​กลับ​มา​จริง คำ​ตอบ​ที่​วัด​ได้​หัก​ล้าง​สรุป​ตาม​ตำรา​ตั้งแต่​บท​แรก คลัง column ที่​ยัง​ไม่​เข้า​รหัส​และ​แตะ​ครบ 6 จาก 6 column แตะ 3320 หน้า ขณะ​ที่ heap ที่​มัน​มา​แทน​แตะ 3153 หน้า เปิด bit packing แล้ว​ทรง​เดียวกัน​เหลือ 989 หน้า ที่​ชนะ​จึง​เป็นการ​เข้า​รหัส ไม่ใช่​การ​วาง​แนว และ​กลไก​ที่​ตำรา​ยก​ให้​คลัง column ก็​อยู่​ใน​คลัง​แนว​แถว​มา​ก่อน​แล้ว heap เก็บ status ทั้ง column ด้วย 200,000 ไบต์ ส่วน​คลัง column ที่​เก็บ​สตริง​ดิบ​ใช้ 1,985,792 ไบต์ ธี​สิ​ส​ของ​คอร์ส​คือ​การ​แยก​การ​วาง​แนว​ออก​จาก​การ​เข้า​รหัส และ​เมื่อ​แยก​แล้ว​เลือก​การ​เข้า​รหัส​ที่​เล็ก​ที่สุด​ต่อ column ทั้ง​คลัง​เหลือ 1,238,089 ไบต์ เทียบ heap ที่ 12,914,688 ไบต์ ไล่​จาก dictionary ที่​ทำให้​สาม column ใหญ่​ขึ้น การ​นับ​บิต​แทน​การ​นับ byte สอง​การ​เข้า​รหัส​ที่​ถูก​เรียก​ว่า delta เหมือน​กัน zone map ที่​อ่าน​ลำดับ​การ​เขียน​ไม่ใช่​จำนวน​ค่าที่​ไม่​ซ้ำ การ​เรียง​ที่​จ่าย​ราคา​ที่ column อื่น จนถึง​การ​ประกอบ​แถว​กลับ​คืน​ซึ่ง heap แตะ 1 หน้า​และ​คลัง column แตะ 42 หน้า ทุก​ข้อ​อ้าง​มา​จาก probe ที่​คุณ​รัน​เอง​ได้​โดย​ไม่​ต้อง​มี Docker และ​ไม่​ต้อง​ต่อ​เน็ต วัด​ด้วย​หน้าที่​แตะ ไบต์ row group ที่​ข้าม ค่าที่​ถอดรหัส บิต​ต่อ​ค่า จำนวน run และ​จำนวน​ค่าที่​ไม่​ซ้ำ ไม่มี​หน่วย​เวลา​สัก​ตัว 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →

เส้น​ทาง​ภาษา backend

7 คอร์ส

เรียน​ภาษา​ที่​ทีม backend ใช้​จริง ด้วย​การ​สร้าง​ของ​ชิ้น​เดียวกัน​ซ้ำ​ใน​แต่ละ​ภาษา — เครื่อง​มือ​ประมวล​ผล​ออ​เด​อร์​ตัว​เดิม เขียน​ใหม่​ที​ละ​ภาษา เพื่อ​ให้​เห็น​ว่า​แต่ละ​ภาษา​ตัดสิน​ใจ​ต่าง​กัน​ตรง​ไหน และ​แลก​อะไร​ไป​กับ​การ​ตัดสิน​ใจ​นั้น แล้ว​ปิด​ท้าย​ด้วย​คอร์ส​ที่​ไม่​ได้​เริ่ม​จาก​ศูนย์ แต่​วัด​ว่า​รุ่น​ใหม่​ของ​ภาษา​ให้​อะไร​กลับ​มา​ที่​ตรวจ​สอบ​ได้

  • ระดับ​เริ่ม​ต้น

    Go จาก​ศูนย์ — เรียน​ภาษา​ที่​ตัดสิน​ใจน้อย​กว่า ด้วย​การ​สร้าง CLI จริง

    คอร์ส​แรก​ของ​สาย​ภาษา backend สำหรับ​วิศวกร​ที่​เขียน​อีก​ภาษา​เป็น​อยู่​แล้ว — เรียน Go ด้วย​การ​สร้าง​เครื่อง​มือ command-line จริง​หนึ่ง​ตัว (orderctl ตัว​ประมวล​ผล​ออ​เด​อร์​อาหาร​ที่​อ่าน​จาก JSON) ไล่​จาก go mod init จนถึง capstone ที่​เปิด HTTP และ​ทำงาน​พร้อม​กัน​ได้ ใช้ standard library ล้วน ไม่มี framework ไม่มี ORM ทุก​บท​เทียบ​ให้​เห็น​ว่า Go ตัดสิน​ใจ​ต่าง​จาก​ภาษา​ที่​คุณ​เขียน​อยู่​ตรง​ไหน และ​แลก​อะไร​ไป 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​เริ่ม​ต้น

    Java จาก​ศูนย์ — เรียน​ภาษา​ที่​พูด​ชื่อ​ออก​มา​ทุก​ครั้ง ด้วย​การ​สร้าง CLI จริง

    คอร์ส​ที่​สอง​ของ​สาย​ภาษา backend ต่อ​จาก Go จาก​ศูนย์ — สร้าง​เครื่อง​มือ command-line ตัว​เดิม (orderctl ตัว​ประมวล​ผล​ออ​เด​อร์​อาหาร​ที่​อ่าน​จาก JSON) ใหม่​ทั้ง​ตัว​ด้วย Java 25 เพื่อ​ให้​เทียบ​ได้​ตรงๆ ว่า​สอง​ภาษา​ตัดสิน​ใจ​ต่าง​กัน​ตรง​ไหน ไล่​จาก java Main.java ที่​ยัง​ไม่มี build tool ผ่าน record, Maven, Jackson, interface ที่​ต้อง​เอ่ย​ชื่อ, checked exception จนถึง capstone ที่​เปิด HTTP ด้วย JDK เปล่า และ​ใช้ virtual thread ทุก​บท​บอก​ราคา​ของ​ทั้ง​สอง​ฝั่ง ไม่​เชียร์​ฝั่ง​ใด​ฝั่ง​หนึ่ง 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​เริ่ม​ต้น

    Kotlin จาก​ศูนย์ — ภาษา​ที่​ยืม​กล่อง​เครื่อง​มือ​ของ Java มา​ทั้ง​ใบ แล้ว​เปลี่ยน​สาม​อย่าง

    คอร์ส​ปิด​ท้าย​ของ​สาย​ภาษา backend ต่อ​จาก Go จาก​ศูนย์ และ Java จาก​ศูนย์ — สร้าง orderctl ตัว​ประมวล​ผล​ออ​เด​อร์​อาหาร​ตัว​เดิม​ใหม่​ทั้ง​ตัว​ด้วย Kotlin 2.4.10 เพื่อ​ให้​อ่าน​บท​เลข​เดียวกัน​สาม​ภาษา​แล้ว​เทียบ​ได้​ตรงๆ ไล่​จาก​โปรแกรม​แรก​ที่​ยัง​ไม่มี build tool ผ่าน data class, Gradle, kotlinx.serialization ที่​โยน​ทั้ง​คีย์​เกิน​และ​คีย์​ขาด, delegation ด้วย by, ภาษา​ที่​ไม่มี checked exception เลย จนถึง capstone ที่​เปิด HTTP ด้วย JDK เปล่า​และ​ใช้ virtual thread ทุก​บท​บอก​ราคา​ของ​ทั้ง​สาม​ฝั่ง ไม่​เชียร์​ฝั่ง​ใด​ฝั่ง​หนึ่ง 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    Java 8 ถึง 25 — เขียน​ใหม่​ที​ละ​อย่าง แล้ว​วัด​ว่า​ได้​อะไร​กลับ​มา

    คอร์ส​สำหรับ​คน​ที่​เขียน Java เป็น​มา​นาน​แต่​ความ​รู้​หยุด​อยู่​ที่ 8 หรือ 11 — ไม่ใช่​รายการ feature ใหม่​ซึ่ง​หา​ได้​ทุก​ที่ แต่​เป็น​คำ​ตอบ​ของ​สอง​คำถาม​ที่​หาไม่​ได้ คือ​ของ​พวก​นี้​ใช้ได้​จริง​แล้ว​หรือ​ยัง​ใน​รุ่น​ที่​คุณ​รัน​อยู่ และ​เปลี่ยน​ไป​ใช้​แล้ว​ได้​อะไร​กลับ​มา​ที่​ตรวจ​สอบ​ได้ ทุก​ข้อ​อ้าง​วัด​ด้วย javac javap และ java ตัว​จริง​บน JDK 25 ไล่​จาก​บท​วัด​สถานะ​ที่​บอก​ว่า​อะไร final อะไร​ยัง preview ผ่าน record ที่​เป็น​สัญญา​ไม่ใช่​การ​พิมพ์​น้อย​ลง switch ที่​พลาด​ไม่​ได้​กับ​ช่อง​เดียว​ที่​มัน​ยัง​พลาด​ได้ Gatherers ที่​ขี้​เกียจ​จริง virtual thread ที่​นับ​เป็น​จำนวน​ไม่ใช่​เป็น​เวลา จนถึง​ราคา​ของ preview ที่​ตรึง class file ไว้​กับ​รุ่น ไม่มี build tool และ​ไม่มี​หน่วย​เวลา​สัก​ตัว​ทั้ง​คอร์ส 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    สัญญา​บน​สาย — protobuf ที่​สอง​ฝั่ง​ไม่​เคย deploy พร้อม​กัน

    คอร์ส​แรก​ของ​ไซต์​ที่​เป็น​เจ้าของ​เรื่อง protobuf ทั้ง​เรื่อง สัญญา​บน​สาย​ผูก​สอง​ฝั่ง​ที่​ไม่​เคย deploy พร้อม​กัน ฝั่ง​เขียน​คือ Go ฝั่ง​อ่าน​คือ Java แก้ schema หนึ่ง​อย่าง แล้ว​ฝั่ง​ที่​ไม่​ได้​แก้ อ่าน​ได้ อ่าน​ผิด หรือ​อ่าน​ไม่​ออก คำ​ตอบ​ที่​วัด​ได้​คือ​เกือบ​ทุก​การ​แก้​ยัง parse ผ่าน และ​นั่น​คือ​ปัญหา เพราะ​สิ่ง​ที่​ทำให้​สัญญา​พัง​ไม่ใช่ error แต่​เป็น​ค่าที่​เดิน​ไป​นั่ง​ผิด​ช่อง โดย​ไม่มี​อะไร​แดง ไล่​จาก byte ชุด​แรก​ที่​บอก​ว่า​ชื่อ field ไม่​ได้​เดิน​ทาง​ไป​กับ​มัน ผ่าน field ที่​ไม่​เคย​ขึ้น​สาย ของ​ที่​ผู้​อ่าน​รุ่น​เก่า​ถือ​ติดมือ​ไป หมายเลข​ที่​เอา​กลับ​มา​ใช้​ซ้ำ​แล้ว​ค่า​เดิม​ไป​โผล่​ใน​ช่อง​ใหม่ ชนิด​ที่​หน้าตา​เหมือน​เดิม​แต่​คืน​ค่า​คนละ​ตัว ชื่อ​เดียว​ที่​กลาย​เป็น​หลาย​ชื่อ​แล้ว​ชื่อ​แรก​หาย​จริง จนถึง​สอง​ภาษา​ที่​อ่าน byte ชุด​เดียวกัน แล้ว​ตอบ​ต่าง​กัน​หนึ่ง​ช่อง และ​สัญญา​ที่​ตรวจ​ได้​ก่อน​ของ​จะ​ขึ้น ทุก​ข้อ​อ้าง​มา​จาก probe ที่​รัน​ได้ วัด​ด้วย​จำนวน byte ค่า hex หมายเลข field จำนวน unknown field และ​รหัส​ออก ไม่มี​หน่วย​เวลา​สัก​ตัว 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    จำนวนเต็ม​ที่​เชื่อ​ไม่​ได้ — ค่า​เปลี่ยน​ห้า​จุด และ​ไม่มี​จุด​ไหน​แดง

    คอร์ส​ที่​หก​ของ​เสา​ภาษา backend และ​เป็น​คอร์ส​แรก​ที่​ไม่​ได้​สร้าง​เครื่อง​มือ​ประมวล​ผล​ออ​เด​อร์​ขึ้น​ใหม่ มัน​หยิบ​ค่า​เดิม​สอง​ค่า​คือ​ยอด​ออ​เด​อร์​กับ order id แล้ว​เดิน​ตาม​มัน​ข้าม​ห้า​ภาษา เพื่อ​ถาม​ว่า​ปลาย​ทาง​ยัง​เป็น​ค่า​เดิม​อยู่​หรือ​เปล่า สิ่ง​ที่​หัก​ล้าง​สัญชาตญาณ​ไม่ใช่​ภาษา​ต่าง​กัน​ตอบ​ต่าง​กัน แต่​เป็น​ภาษา​เดียว source เดียว ตอบ​ไม่​เหมือน​กันเอง rustc a.rs ให้​รหัส​ออก 101 กับ panic ส่วน rustc -O a.rs ให้​รหัส​ออก 0 กับ 4294967281 และ​สวิตช์​ที่​ตัดสิน​คือ -C overflow-checks ไม่ใช่ debug ไม่ใช่ release ธี​สิ​ส​ของ​คอร์ส​คือ​ค่า​จำนวนเต็ม​ค่า​หนึ่ง​เปลี่ยน​ได้​ห้า​จุด​ระหว่าง​ทาง และ​ทั้ง​ห้า​จุด​เงียบ ตอน​ความ​กว้าง​หมด ตอน​หา​ค่าสัมบูรณ์ ตอน​หาร ตอน​ทศนิยม​กลืน​มัน และ​ตอน​มัน​ข้าม​พรมแดน​ของ​การ parse เข้า​มา Math.abs ของ Integer.MIN_VALUE คืน -2147483648 โดย​ไม่มี exception ส่วน absExact โยน ArithmeticException ออก​มา -7/2 ได้ -3 ที่​สาม​ภาษา -3.5 ที่ Node และ -4 ที่ Python Node ตอบ​ว่า 2**53 เท่ากับ 2**53+1 เป็น true JSON ก้อน​เดียว​เข้า​โปรแกรม Go ตัว​เดียว​ได้​สาม​คำ​ตอบ คือ 9.007199254740992e+15 ที่ map และ 9007199254740993 พร้อม error ที่ struct และ​ครบ​ทั้ง​สอง​ช่อง​เมื่อ​ใช้ UseNumber ส่วน strconv.Atoi ที่​เกิน​ช่วง​คืน 9223372036854775807 พร้อม error ไม่ใช่ 0 ทุก​ข้อ​อ้าง​มา​จาก probe ที่​คุณ​รัน​เอง​ได้ ไม่​ต้อง​มี Docker และ​ไม่​ต้อง​ต่อ​เน็ต วัด​ด้วย​ค่า​จำนวนเต็ม รหัส​ออก ชื่อ class ของ exception และ diagnostic ของ compiler ไม่มี​หน่วย​เวลา​สัก​ตัว 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • ระดับ​กลาง

    เวลา​ที่​เชื่อ​ไม่​ได้ — ครึ่ง​ชั่วโมง​ที่​ไม่มี​อยู่​จริง และ​ภาษา​เดียว​ที่​บอก​ว่า​มัน​ไม่มี

    คอร์ส​ที่​เจ็ด​ของ​เสา​ภาษา backend และ​เป็น​คอร์ส​ที่​สอง​ที่​ไม่​ได้​สร้าง​อะไร​ขึ้น​ใหม่ มัน​หยิบ​เวลา​ขอ​งอ​อเด​อร์ คือ​เวลา​สั่ง เวลา​ตัด​รอบ วัน​ส่ง และ slot ส่ง​ของ แล้ว​เดิน​ตาม​มัน​ข้าม​ห้า​ภาษา เพื่อ​ถาม​ว่า​ปลาย​ทาง​ยัง​ชี้​จุด​เดิม​บน​เส้น​เวลา​อยู่​หรือ​เปล่า ประเทศไทย​ไม่มี DST คน​ไทย​จึง​มัก​คิด​ว่า​เรื่อง​นี้​ไม่ใช่​ปัญหา​ของ​ตัว​เอง แต่​ระบบ​ไทย​คุย​กับ​ระบบ​ใน​โซน​ที่​มี DST และ Bangkok ในปี 1900 ใช้ +06:42:04 ไม่ใช่ +07:00 ธี​สิ​ส​ของ​คอร์ส​คือ​เวลา​ท้อง​ถิ่น​ค่า​หนึ่ง​ไม่​ได้​ระบุ​จุด​เดียว​บน​เส้น​เวลา มัน​อาจ​ไม่มี​จุด​เลย มี​สอง​จุด หรือ​มี​จุด​เดียว​ที่​แต่ละ​ภาษา​เลือก​ต่าง​กัน และ​ใน​ทรง​ที่ probe วัด มี​ภาษา​เดียว​จาก​ห้า​ภาษา​ที่​บอก​คุณ 02:30 ของ​วัน​ที่ 2026-03-08 ที่ America/New_York ไม่มี​อยู่​จริง Java ให้ 2026-03-08T03:30-04:00[America/New_York] Python เก็บ 2026-03-08T02:30:00-05:00 ไว้​ตาม​เดิม และ Rust เป็น​ภาษา​เดียว​ที่​ตอบ​ว่า LocalResult::None บวก 24 ชั่วโมง​จาก 2026-03-07 12:00 ที่​โซน​เดียวกัน​ได้ 13:00-04:00 ที่ Java ส่วน timedelta(hours=24) ของ Python ได้ 12:00-04:00 เท่ากับ​การ​บวก​หนึ่ง​วัน วัน​ส่ง​ของ 2026-10-02 ของ​ร้าน​ใน Bangkok คือ 2026-10-01T17:00:00Z ใน UTC ซึ่ง​เป็น​คนละ​วัน json.dumps ของ Python โยน TypeError ใส่​เวลา​ขอ​งอ​อเด​อร์ และ time.RFC3339 ของ Go กับ to_rfc3339() ของ chrono พิมพ์ offset ของ Bangkok ปี 1900 เป็น +06:42 ทุก​ข้อ​อ้าง​มา​จาก probe ที่​คุณ​รัน​เอง​ได้ ไม่​ต้อง​มี Docker วัด​ด้วย​สตริง​ของ​เวลา offset ที่​อ่าน​จาก API ชื่อ class ของ exception และ variant ของ enum ไม่มี​หน่วย​เวลา​ที่​วัด​จาก​การ​รัน​สัก​ตัว 8 บท​ลงมือ​จริง

    8 บท​เรียน

    เริ่ม​เรียน →
  • บทความ

    Effective Context Engineering

    ขยับ​จาก prompt engineering สู่​การ​คัด​บริบท​ที่​ให้​สัญญาณ​สูงสุด​ให้ AI agent

    Anthropic

    อ่าน →
  • บทความ

    The Clean Architecture

    วงกลม​ซ้อน​ภาย​ใต้ Dependency Rule — dependency ของ code ชี้​เข้า​ด้าน​ใน​เสมอ

    Robert C. Martin

    อ่าน →
  • บทความ

    Structured-Prompt-Driven Development

    ปฏิบัติ​ต่อ prompt เป็น​ชิ้น​งาน​ชั้น​หนึ่ง​ที่​เก็บ​คู่​กับ code ใน version control

    Thoughtworks

    อ่าน →

อ้างอิง

  • Reference ใหม่

    หลัก​การ​ออกแบบ​ซอฟต์แวร์ · DevIQ

    208 หัวข้อ​จาก DevIQ แปล​ไทย​ครบ — หลัก​การ แนว​ปฏิบัติ ดี​ไซน์​แพต​เทิร์น แอน​ติ​แพต​เทิร์น code กลิ่น​แรง กฎ และ DDD โยง​ถึงกัน​ทั้ง​เล่ม พร้อม​ตัวอย่าง code และ​อภิธาน​ศัพท์

    208 หัวข้อ · 7 หมวด

    เปิด​อ่าน →