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

บทความ

บทความ​แปล​และ​เรียบ​เรียง​เรื่อง​วิศวกรรม​ซอฟต์แวร์ สถาปัตยกรรม และ​การ​พัฒนา​ด้วย AI — เก็บ​แนวคิด​สำคัญ​จาก​ต้นฉบับ​ภาษา​อังกฤษ​มา​เล่า​เป็น​ภาษา​คน พร้อม​ไดอะแกรม​ที่​วาด​ใหม่​เป็น​ภาษา​ไทย

การ​พัฒนา​ด้วย AI

  • Anthropic

    Effective Context Engineering สำหรับ AI Agent

    ขยับ​จาก prompt engineering สู่​การ​คัด token ที่​ให้​สัญญาณ​สูงสุด พร้อม compaction, การ​จด​โน้ต​แบบ​มี​โครงสร้าง และ​สถาปัตยกรรม subagent

    อ่าน →
  • Thoughtworks

    Harness Engineering: ออกแบบ “โครง​ครอบ” รอบ model

    ชั้น​ถัด​จาก context — กรอบ Guides (feedforward) กับ Sensors (feedback) นิยาม harness ว่า “ทุก​อย่าง​ใน agent ยกเว้น​ตัว model”

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    Loop Engineering: ออกแบบ​วง​วน​ให้ AI ทำงาน​เอง​จน​จบ

    ชั้น​บน​สุด​ของ​ซี​รีส์ context→harness→loop — วงจร reason → act → observe, เงื่อนไข​จบ, verifier และ​คำ​เตือน​เรื่อง​ปล่อย​ให้​วน​โดย​ไม่มี​คน​ดู

    อ่าน →
  • Thoughtworks

    Structured-Prompt-Driven Development (SPDD)

    ปฏิบัติ​ต่อ prompt เป็น​ชิ้น​งาน​ชั้น​หนึ่ง​ที่​เก็บ​คู่​กับ code ใน version control พร้อม​ตัวอย่าง end-to-end ด้วย openspdd และ REASONS Canvas

    อ่าน →
  • Thoughtworks

    ทำความ​เข้าใจ Spec-Driven Development

    Birgitta Böckeler ลอง​ใช้​เครื่อง​มือ SDD สาม​ตัว (Kiro, spec-kit, Tessl) แล้ว​ถอด​ความ​ว่า “การ​พัฒนา​แบบ​ขับ​เคลื่อน​ด้วย spec” หมาย​ถึง​อะไร

    อ่าน →
  • Thoughtworks

    ดัน AI autonomy ใน​การ​เขียน code ได้​ไกล​แค่​ไหน?

    ปล่อย​ให้ Claude สร้าง app Spring Boot แบบ end-to-end เกือบ​ไม่​แทรกแซง แล้ว​พบ​ว่า agent สร้าง scope creep และ​อ้าง​ว่า test ผ่าน​ทั้ง​ที่​ไม่​ผ่าน

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    Ubiquitous Language คือ Context ที่​ดี​ที่สุด​ที่​ให้ AI Agent ได้

    ทำไม glossary ของ ubiquitous language ควร​เป็น context file แรก​ที่​ป้อน​ให้ coding agent ก่อน spec เสีย​อีก พร้อม​ตัวอย่าง​แปลง​เป็น CLAUDE.md

    อ่าน →

สถาปัตยกรรม​ซอฟต์แวร์

  • Robert C. Martin

    The Clean Architecture

    สังเคราะห์ Hexagonal และ Onion เป็น​วงกลม​ซ้อน​กัน (Entities → Use Cases → Interface Adapters → Frameworks) ภาย​ใต้ Dependency Rule

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    MVC + Service Layer vs. Clean Architecture + DDD

    เทียบ​สอง​สถาปัตยกรรม​บน domain Order เดียวกัน​ที​ละ scenario ทั้ง​ราคา​ที่​จ่าย​และ​สิ่ง​ที่​ได้​กลับ​มา พร้อม​แบบ​ประเมิน​และ​บันได​ย้าย​ที​ละ​ขั้น​ที่​หยุด​ค้าง​ได้

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    Aggregate ควร​ใหญ่​แค่​ไหน — ให้ concurrency เป็น​คน​ตอบ

    สอง context แก้​คนละ​บรรทัด​ขอ​งอ​อเด​อร์​ใบ​เดียวกัน แล้ว​ฝั่ง​ที่ save ทีหลัง​ถูก​ปฏิเสธ · รัน​จริง​บน EF Core กับ file SQLite แล้ว​รายงาน​เป็น​จำนวน conflict จำนวน​รายการ​ใน ex.Entries และ​จำนวน​แถว​ที่​โหลด ทั้ง​ขอบ​อ้วน​และ​ขอบ​ที่​แยก​แล้ว

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    Modular Monolith, Vertical Slice, Clean: สาม​คำ​ที่​ไม่​ได้​แข่ง​กัน

    สาม​คำ​นี้​ตอบ​คนละ​คำถาม จึง​เปิด​พร้อม​กัน​ได้​ทั้ง​แปด​ชุด พร้อม​เครื่อง​ประกอบ​สาม​แกน​ที่​กด​เล่น​ได้ จุด​ที่​มัน​ชน​กัน​จริง และ​วิธี​เลือก​ที​ละ module

    อ่าน →
  • Alistair Cockburn

    Hexagonal Architecture (Ports & Adapters)

    กัน​แกน application ออก​จาก​โลก​ภายนอก (UI, ฐาน​ข้อมูล, test) ด้วย port และ adapter — เปลือก​มาตรฐาน​สำหรับ​ครอบ domain model แบบ DDD

    อ่าน →
  • Martin Fowler

    “Event-Driven” หมายความ​ว่า​อะไร​กัน​แน่?

    แยก​สี่ pattern ที่​มัก​ถูก​เหมา​รวม: Event Notification, Event-Carried State Transfer, Event Sourcing และ CQRS พร้อม​ข้อดี​ข้อ​เสีย

    อ่าน →
  • Martin Fowler

    Microservice Trade-Offs

    ชั่ง​ข้อดี (ขอบเขต module ชัด, deploy อิสระ, เลือก​เทคโนโลยี​ได้) กับ​ต้นทุน (ความ​ซับ​ซ้อน​แบบ​กระจาย, eventual consistency, งาน ops) เทียบ monolith

    อ่าน →

การ​ทดสอบ​และ​คุณภาพ

  • บทความ​ต้นฉบับ​ของ Kaen

    test ที่​ไซต์​นี้​ยก​เป็น​ตัวอย่าง​ที่​ดี จับ​อะไร​ไม่​ได้​บ้าง

    แก้ code ของ​โดเมน Order ให้​ผิด​ที​ละ​จุด​แล้ว​รัน​ชุด test เดิม​ซ้ำ​ทุก​ครั้ง · ชุด​ที่​คอร์ส​ยก​เป็น​ตัวอย่าง​ที่​ดี​ปล่อย​ความ​ผิด​พลาด​แบบ​ไหน​ผ่าน​บ้าง ตัว​ไหน​คือ​ช่อง​ว่าง​จริง และ test ที่​ปิด​มัน​ได้ที​ละ​ตัว

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    ภาษา​ไทย​ทำให้ code พัง​คนละ​ชั้น​กัน​สี่​ชั้น

    ชั้น byte ที่​ลบ​อักขระ​ผิด​วิธี​แล้ว​กิน เ กับ ซ ไป​ด้วย · ชั้น code point ที่​ทำให้ \b ของ regex มอง​ไม่​เห็น​คำ​ไทย · ชั้น​คำ​ที่​ทำให้​เว็บ​นี้​เอง​ค้น​คำ​ที่​อยู่​ใน​หน้า​ส่วน​ใหญ่​ของ​ไซต์​แล้ว​ได้​ศูนย์ · และ​ชั้น culture ที่​ทำให้​ปี​เดียวกัน​ต่าง​กัน 543

    อ่าน →

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

  • บทความ​ต้นฉบับ​ของ Kaen

    ทำไม index ที่​คุณ​เพิ่ง​เพิ่ม​ถึง​ไม่​ถูก​ใช้

    เปิด​แผน​จริง​จาก SQLite ที​ละ​รูป​ร่าง​ของ query — function คร่อม column, ลำดับ column ใน composite index, LIKE กับ collation และ ORDER BY ที่ index เรียง​ให้​ไม่​ได้

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    กลไก transaction ของ PostgreSQL — MVCC กับ WAL เป็น​เรื่อง​เดียวกัน

    รัน PostgreSQL ตัว​จริง​สอง​คอน​เน​กชัน​แล้ว​นับ​ว่า​แต่ละ​ระดับ isolation ยอม​ให้​เกิด​อะไร · Repeatable Read กัน lost update ได้​ทั้ง​ที่​เอกสาร​เรียก​มัน​ว่า snapshot isolation แล้ว​ตาม​ราคา​ของ MVCC ไป​ดู​ว่า​มัน​โผล่​ที่ WAL ตรง​ไหน

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    UNIQUE ที่​ยอม​ให้​ซ้ำ — soft delete กับ NULL ที่​ไม่​เท่ากับ​ตัว​เอง

    UNIQUE (email, deleted_at) รับ​อีเมล​เดียวกัน​ซ้ำ​ได้​สาม​แถว​รวด โดย​ไม่มี error เพราะ NULL ไม่​เท่ากับ NULL ใน​สายตา​ของ index · วัด​สอง​ทาง​แก้บน PostgreSQL 18 แล้ว​พบ​ว่า​ทาง​ที่​อ่าน​แล้ว​สะอาด​กว่า เปิด​รู​ใหม่​ตรง​การ​ลบ​ทั้ง​ชุด​ใน​คำ​สั่ง​เดียว

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    ขนาด transaction ที่​ถูก​ที่สุด​ไม่ใช่​ใหญ่​ที่สุด

    รัน​งาน​เดีย​วกันเป๊ะ​บน PostgreSQL กับ SQLite ทุกข​นาด transaction แล้ว​วัด WAL ด้วย​หน่วย​ของ​แต่ละ​ตัว · SQLite ลง​อย่าง​เดียว​จริง แต่​เส้น​โค้ง​ของ PostgreSQL เป็น​รูป​ตัว U เพราะ HOT update ตาย​หมด​เมื่อ transaction ยาว​เกิน​ไป

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    code ที่​เขียน​เพื่อ​ดู​แถว​ที่​ลบ​แล้ว ทำให้​เห็น​ข้อมูล​ของ​ลูกค้า​ราย​อื่น​ไป​ด้วย

    `IgnoreQueryFilters()` เป็น​สวิตช์​ระดับ query ไม่ใช่​ระดับ​ตัว​กรอง · รัน EF Core 10 ตัว​จริง​บน​คลัง​ที่​มี​สอง tenant แล้ว​นับ​ว่า​แต่ละ​ท่า​คืน​แถว​ของ​ใคร​มา​บ้าง ทั้ง​ใน query ตรง ๆ ใน query ที่​ไม่​ได้​เอ่ย​ชื่อ​ตาราง​นั้น​เลย และ​ใน​รายงาน​ที่​นับ​อย่าง​เดียว

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    query ตัว​เดียวกัน ราคา​ต่าง​กัน​สอง​พัน​เท่า เพราะ​ค่า​เดิน​มา​ถึง​เอน​จิ​น​คนละ​ทาง

    keyset pagination ที่​เขียน​ด้วย​ท่า OR เป็น​ท่า​เดียว​ที่ LINQ เขียน​ได้ และ​มัน​เร็ว​ตอน​คุณ​วาง​ค่า​ลง​ไป​ทดสอบ​เอง แต่​ช้า​ตอน​แอป​ส่ง​ค่า​เป็น parameter · นับ opcode ที​ละ​ท่า​บน​ตาราง 200,000 แถว แล้ว​วัด​ซ้ำ​บน PostgreSQL ด้วย​หน่วย​ของ​มัน​เอง

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    NULL แถว​เดียว​ทำให้ NOT IN คืน​ศูนย์​แถว และ​ท่า​ที่​ตอบ​ผิด​คือ​ท่า​ที่​จ่าย​น้อย​ที่สุด

    query ที่​ถาม​ว่า​ออ​เด​อร์​ไหน​ยกเลิก​แล้ว​แต่​ยัง​ไม่​ได้​คืน​เงิน ตอบ​ว่า​ไม่มี​เลย ทั้ง​ที่​มี​อยู่​สาม​พัน​กว่า​รายการ เพราะ​ตาราง refunds มี​แถว​ที่ order_id เป็น NULL อยู่​แถว​เดียว · หน้า​นี้​วัด​ทั้ง SQLite และ PostgreSQL แล้ว​ถาม EF Core ว่า LINQ ที่​เขียน​กัน​ทุก​วัน​เดิน​เข้า​ช่อง​นี้​หรือ​ไม่

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    ชื่อ​ไทย 200 ชื่อ เรียง 13 ทาง ได้ 2 ลำดับ และ 188 ตำแหน่ง​ไม่​ตรง​กัน

    `ORDER BY name` บน​ชื่อ​ไทย​ให้​คำ​ตอบ​สอง​แบบ ต่าง​กัน 188 จาก 200 ตำแหน่ง · วัด​สิบ​สาม​ทาง​บน SQLite, PostgreSQL 18 และ .NET บน​คลัง​ชื่อ​ใบ​เดียวกัน แล้ว​พบ​ว่า​สิ่ง​ที่​ตัดสิน​ลำดับ​ไม่ใช่​เอน​จิน แต่​เป็น base image ของ​คอนเทนเนอร์​ที่​ไม่มี​ใคร​เลือก​เพราะ​เรื่อง​ภาษา​ไทย

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    migration บรรทัด​เดียว​ที่​ไม่​ได้​แตะ​ข้อมูล​สัก​หน้า แต่​หยุด query ทุก​ตัว​ที่​ตาม​มา

    reader ที่​เปิด transaction ค้าง​ไว้​หนึ่ง​ตัว บวก ALTER TABLE ที่ rewrite ศูนย์​หน้า​หนึ่ง​บรรทัด เท่ากับ query แปด​ตัว​ที่​ไม่​ได้​รัน​เลย · วัด​ความ​ยาว​คิว​จาก pg_locks บน PostgreSQL 18.6 แล้ว​ตอบ​ว่า lock_timeout เปลี่ยน​อะไร

    อ่าน →

ภาษา​และ platform

  • บทความ​ต้นฉบับ​ของ Kaen

    C# 8 ถึง 14: อะไร​เปลี่ยน​การ​ออกแบบ อะไร​แค่​เปลี่ยน​การ​พิมพ์

    เจ็ด version 94 feature แต่​มี​แค่​สิบ​เจ็ด​ตัว​ที่​เปลี่ยน​สิ่ง​ที่ compiler พิสูจน์​หรือ​บังคับ​ให้​ได้ · คลัง​ครบ​ทุก​ตัว​พร้อม code ที่ compile จริง​ทั้ง​ทิศ​ผ่าน​และ​ทิศ​ปฏิเสธ

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    เปิด analyzer ครบ​ทุก​ตัว​แล้ว await ใน foreach ก็​ยัง​ไม่มี​ใคร​เตือน

    เปิด​สวิตช์ analyzer ทุก​ตัว​ที่ .NET SDK ยอม​ให้​ตั้ง แล้ว​นับ​สิ่ง​ที่​มัน​พูด ผล​คือ 17 diagnostic ตกลง​บน code ที่ await อยู่​ใน​ตัว​วน และ​ไม่มี​ตัว​ไหน​พูด​ถึง​ตัว​วน​เลย · จาก​นั้น​วัด​ต่อว่า Task.WhenAll ที่​ทุก​คน​บอก​ให้​ใช้ เปลี่ยน​พฤติกรรม​ของ exception อย่างไร และ​มัน​ทำ code พัง​ใน​สาม​กรณี​ไหน

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    file .rs เดิม​ทุก byte เปลี่ยน​แค่​บรรทัด edition แล้ว​ห้า​ใน​หก​โปรแกรม​ให้​ผล​คนละ​อย่าง

    edition 2021 เปลี่ยน​ให้ closure จับ​ที​ละ field แทนที่​จะ​จับ​ทั้ง​ตัวแปร · เอา​ซอร์ส​หก file ชุด​เดียวกัน​ไป​คอม​ไพล์​สอง​ครั้ง ต่าง​กัน​แค่​บรรทัด​เดียว​ใน manifest แล้ว​นับ สาม​ตัว​แดง​เป็น​เขียว หนึ่ง​ตัว​เขียว​เป็น​แดง​ด้วย E0277 และ​หนึ่ง​ตัว​คอม​ไพล์​ผ่าน​ทั้ง​คู่​แต่​พิมพ์​ลำดับ drop คนละ​แบบ

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    เอกสาร​สอง​หน้า​ของ Epic ให้​คำ​ตอบ​คนละ​อย่าง​เรื่อง TObjectPtr และ​ทั้ง​คู่​ถูก

    หน้า​หนึ่ง​บอก​ว่า​เลือก TObjectPtr หรือ raw pointer ก็ได้ ไม่​กระทบ shipped product · อีก​หน้า​บอก​ว่า​ถ้า​ไม่​แปลง​ให้​ครบ GC อาจ​คืน​หน่วย​ความ​จำ​ของ UObject เร็ว​เกิน​ไป · ทั้ง​คู่​จริง และ​สิ่ง​ที่​ตัดสิน​ว่า​ประโยค​ไหน​ใช้​กับ​คุณ​คือ​สวิตช์​สอง​บรรทัด​ใน DefaultEngine.ini

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    คีย์เวิร์ด​เดียว​ที่​หาย​ไป เปลี่ยน​การ​คัด​ลอก​จาก​ศูนย์​เป็น​หมื่น​หก

    move constructor ที่​ไม่​ได้​ประกาศ noexcept ทำให้ std::vector เลือก​คัด​ลอก​แทน​การ​ย้าย​ทุก​ครั้ง​ที่​ขยาย · จำนวน​ครั้ง​ที่​ขยาย​และ​ความ​จุ​ปลาย​ทาง​เท่า​กัน​เป๊ะ​ทั้ง​สอง​รอบ สิ่ง​ที่​ต่าง​คือ​ตอน​ขยาย​มัน​เลือก​ทำ​อะไร · แล้ว​เปิด​สวิตช์ warning ที่​แรง​ที่สุด​เท่า​ที่​คอม​ไพ​เลอ​ร์​ยอม​ให้​ตั้ง ก็​ไม่มี diagnostic ตัว​ไหน​พูด​ถึง​ต้นทุน​นั้น

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    สอง​บรรทัด​ที่​เหมือน​กัน​ทุก​ตัว​อักษร บรรทัด​หนึ่ง​จอง อีก​บรรทัด​ไม่​จอง

    Go มี​เพดาน​สาม​ตัว​ที่​ตัดสิน​ว่า​ของ​จะ​อยู่​บน stack หรือ​หนี​ไป heap ไม่ใช่​ตัว​เดียว แต่ละ​บาน​ขยับ​ด้วย​หนึ่ง​ไบต์​จาก​ศูนย์​เป็น​หนึ่ง · แล้ว go build -gcflags=-m ซึ่ง​เป็น​เครื่อง​มือ​ที่​คนใช้​ตอบ​คำถาม​นี้ พูด​ประโยค does not escape กับ​ทั้ง​สอง​ฝั่ง​ของ​บาน​ที่​สาม และ​ผิด​หนึ่ง​ฝั่ง

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    สลับ​สอง​บรรทัด​ใน pom.xml แล้ว jar บน classpath เปลี่ยน​รุ่น

    library ตัว​เดียว​ถูก​ขอ​สอง​รุ่น​จาก​สอง​เส้น​ทาง Maven เลือก​ตัว​ที่​ใกล้​ที่สุด​แล้ว​ตัดสิน​การ​เสมอ​ด้วย​ลำดับ​ที่​พิมพ์ ส่วน Gradle เลือก​ตัว​ที่​สูง​ที่สุด · วัด​สิบ​ทรง​บน resolver ตัว​จริง​ทั้ง​สอง​ฝั่ง แล้ว​พบ​ว่า​บรรทัด​ที่​คุณ​เขียน​เอง​เพื่อ​สั่ง​มัน ฝั่ง​หนึ่ง​เชื่อ​ฟัง อีก​ฝั่ง​เขียน​ทับ และ mvn compile คาย​คำ​เตือน​เรื่อง​นี้​ศูนย์​บรรทัด

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    ท่า​โจมตี JWT ที่​ทุก​คน​ท่องจำ ตาย​หมด​แล้ว ส่วน​รู​ที่​ยัง​เปิด​คือ​ข้อ​ที่​ไม่มี​ใคร​สั่ง​ให้​ตรวจ

    ยิง token แปด​ใบ​เข้า verifier เก้า​ทรง​บน​สาม library ที่ JVM ใช้​จริง รวม 88 ช่อง · alg none กับ alg confusion ถูก​ปฏิเสธ​ครบ 36 จาก 36 ช่อง · แต่ token ที่​ไม่มี exp เลย​ผ่าน​ทั้ง​เก้า​ช่อง และ​สวิตช์​ที่​เปิด​ตรวจ aud ไม่​แตะ iss เลย​สัก​นิด

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    เติม​คอม​เมน​ต์​บรรทัด​เดียว​ใน .dockerignore แล้ว​เสีย layer เท่ากับ​แก้ source

    วัด​สอง Dockerfile ที่​ต่าง​กัน​แค่​ลำดับ​ของ COPY บน​การ​แก้​เจ็ด​แบบ รวม​สิบ​สี่​ทรง · touch ไม่​ทำให้ cache หลุด​สัก​ขั้น ส่วน file ใหม่​ที่​ไม่มี​ใคร​อ่าน​ทำให้​หลุด​เท่ากับ​แก้ source · และ​คอม​เมน​ต์​ใน .dockerignore ที่​ไม่​ตัด file ไหน​เพิ่ม ก็​ราคา​เดียวกัน

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    pattern เดียวกัน ข้อความ​เดียวกัน แปด engine ตอบ​ตรง​กัน​แค่​ทรง​เดียว

    ให้​แปด engine จาก​สี่ runtime อ่าน pattern จาก​รายการ​เดียวกัน สิบ​ห้า​ทรง รวม 120 ช่อง · ตอบ​ตรง​กัน​หมด​แค่​ทรง​เดียว · และ \b รอบ​คำ​ไทย​ใน​ข้อความ​ไทย​ล้วน ไม่มี engine ไหน match เลย​สัก​ตัว ด่าน​ที่​เขียน​แบบ​นั้น​จึง​แดง​ไม่​ได้

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    switch ที่​ไม่มี default มี default อยู่ และ​มัน​โยน exception ที่​คุณ​ไม่​เคย​พิมพ์

    javac พิสูจน์​ได้​ว่า switch ของ​คุณ​ครอบคลุม​ทุก​ค่า แล้ว​มัน​ก็​ยัง​ใส่​ทางออก​ที่​โยน MatchException ลงใน bytecode ให้​อยู่ดี · หน้า​นี้​เดิน​ไป​บน​ทางออก​นั้น​จริง โดย​ไม่​แตะ file class ของ​ผู้​เรียก​แม้แต่​ไบต์​เดียว เปลี่ยน​แค่ library บน classpath · และ​ตัวการ​ไม่ใช่ sealed ไม่ใช่ pattern matching

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    constructor เป็น private แล้ว แต่​ยัง​มี​ประตู​อีก​บาน​ที่ compiler สร้าง​ให้​เอง

    data class ของ Kotlin ที่​ประกาศ constructor เป็น private ยัง​ได้ copy() ที่​เป็น public มา​ฟรี · หน้า​นี้​นับ​ว่า​เส้น​ทาง​ไหน​ผ่าน factory กี่​ครั้ง​และ​ผ่าน init กี่​ครั้ง แล้ว​พบ​ว่า​คำ​อธิบาย​ที่​เล่า​กัน​บ่อย​ที่สุด​เรื่อง​นี้​ผิด และ​ผิด​ใน​ทาง​ที่​ทำให้​คน​ถอด​ยาม​ตัว​เดียว​ที่​ยัง​ยืน​อยู่

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    preview ไม่​ได้​ตรึง​แค่​ธง มัน​ตรึง class file ไว้​กับ​รุ่น

    แปล​ด้วย --enable-preview แล้ว​รัน​โดย​ไม่​ใส่​ธง JVM ปฏิเสธ​ตั้งแต่​อ่าน​หัว file พร้อม​เลข​รุ่น​ที่​มี​ส่วน​รอง​เป็น 65535 · class นั้น​รัน​ได้​เฉพาะ​บน​รุ่น​ที่​แปล​มัน ไม่ใช่​รุ่น​นั้น​ขึ้น​ไป · พร้อม​เกณฑ์​สาม​ข้อ​สำหรับ​ตัดสิน​ใจ

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    equals ของ record ไม่ใช่ code ที่​ใคร​เขียน และ​นั่น​คือ​ประเด็น​ทั้งหมด

    javap บอก​ว่า record มี member สาธารณะ​หก​ตัว​เทียบ​กับ​สาม​ตัว​ของ class ที่​เขียน​มือ · และ​สาม​ตัว​ที่​เพิ่ม​มา​เรียก bootstrap method ตัว​เดียวกัน จึง​เปลี่ยน​ตาม​ทันที​เมื่อ​เพิ่ม field ต่าง​จาก equals ที่ IDE สร้าง​ให้

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    ย้าย​จาก instanceof มา​เป็น switch แล้ว null เปลี่ยน​ความ​หมาย

    instanceof เป็น​เท็จ​เมื่อ​ค่า​เป็น null จึง​ตกลง​มา​ที่​กิ่ง​สำรอง ส่วน switch ที่​มี pattern โยน NullPointerException แม้​จะ​มี default เขียน​ไว้ · การ​ย้าย​จึง​เปลี่ยน​ความ​หมาย​โดย​ไม่มี​อะไร​เตือน

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    data class ที่​มี Array — equals กับ hashCode ถูก​สร้าง​ด้วย​นิยาม​คนละ​อัน

    สอ​งอ็​อบ​เจ​กต์​ที่​เนื้อ​ใน​เหมือน​กัน​ทุก​ตัว​อักษร ไม่​เท่า​กัน แต่ hash เท่า​กัน · เปิด bytecode แล้ว​พบ​ว่า equals เรียก Intrinsics.areEqual ส่วน hashCode เรียก Arrays.hashCode · และ​การ​แก้ array หลัง​ใส่​ลง set ทำ​ให้​อ็​อบ​เจ​กต์​หา​ตัว​เอง​ไม่​เจอ

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    lateinit แลก​ข้อความ error ที่​ดี ด้วย field ที่​กลาย​เป็น public

    lateinit บอก​ชื่อ property ตอน​แตะ​ก่อน​กำหนด​ค่า ส่วน bang bang ตอบ​ว่า null เฉยๆ · แต่ javap บอก​ว่า backing field ของ lateinit เป็น public ขณะ​ที่ nullable ได้ private · ด่าน​ของ​มัน​อยู่​ที่ getter ซึ่ง​หลบ​ได้

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    suspend ไม่ใช่​เรื่อง​ของ thread — มัน​เปลี่ยน​ลาย​เซ็น​ที่ JVM เห็น

    suspend fun ที่​ประกาศ​คืน Long ถูก JVM มอง​เป็น method ที่​คืน Object และ​รับ Continuation เพิ่ม · พร้อม class ที่​ไม่มี​ใคร​เขียน​ซึ่ง​มี field ชื่อ label เป็น​ตัว​นับ​สถานะ และ​เก็บ​ตัวแปร​ท้อง​ถิ่น​ไว้​นอก stack

    อ่าน →
  • บทความ​ต้นฉบับ​ของ Kaen

    JEP 491 แก้ pinning ที่​คน​พูด​ถึงกัน​หมด​แล้ว และ​เหลือ​บาน​ที่​ไม่มี​ใคร​พูด​ถึง

    virtual thread ที่​บล็อก​ขณะ​ถือ monitor เคย​ตรึง carrier thread ไว้ · JDK 24 แก้​ข้อ​นั้น​แล้ว​จริง หน้า​นี้​นับ event ของ JFR ข้าม​สาม version เพื่อ​ยืนยัน · แล้ว​วัด​อีก​เคส​หนึ่ง​ที่​ยัง​ตรึง​อยู่​บน​ทุก version รวม​ทั้ง​ตัว​ล่าสุด และ​เคส​นั้น​คือ​ช่อง​ควบคุม​ของ​การ​วัด​ไป​ใน​ตัว

    อ่าน →

หมายเหตุ: บทความ​ใน​หมวด​นี้​เป็น​บท​แปล/เรียบ​เรียง​เพื่อ​การ​ศึกษา โดย​ให้​เครดิต​และ link กลับ​ไป​ยัง​ต้นฉบับ​เสมอ (ยกเว้น​บท​ที่​ระบุ​ว่า​เป็น “บทความ​ต้นฉบับ​ของ Kaen”) ศัพท์​เทคนิค​คง​ไว้​เป็น​ภาษา​อังกฤษ​ตาม​ต้นฉบับ​เพื่อ​ให้​ค้นหา​เอกสาร​ต่อ​ได้​ง่าย