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

ทำความ​เข้าใจ Spec-Driven Development: Kiro, spec-kit และ Tessl

เกี่ยว​กับ​บท​แปล​นี้

บทความ​นี้​เป็น บท​แปล​ภาษา​ไทย​อย่าง​ไม่​เป็น​ทางการ ของ “Understanding Spec-Driven-Development: Kiro, spec-kit, and Tessl” โดย Birgitta Böckeler เผยแพร่​ครั้ง​แรก​บน martinfowler.com เมื่อ 15 ตุลาคม 2025 (ใน​ซีรีส์ Exploring Generative AI)

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

ผู้​เขียน​พยายาม​ทำความ​เข้าใจ buzzword ที่มา​แรง​ล่าสุด​ใน​วงการ AI coding นั่น​คือ​การ​พัฒนา​แบบ​ขับ​เคลื่อน​ด้วย spec (Spec-Driven Development — SDD) โดย​ลอง​ใช้​เครื่องมือ​สาม​ตัว​ที่​นิยาม​ตัวเอง​ว่า​เป็น​เครื่องมือ SDD เพื่อ​แกะ​ดู​ว่า​ตอน​นี้​มัน​หมายความ​ว่า​อย่างไร​กัน​แน่

เช่น​เดียว​กับ​ศัพท์​ใหม่ ๆ อีก​หลาย​คำ​ใน​วงการ​ที่​เปลี่ยนแปลง​อย่าง​รวดเร็ว นิยาม​ของ “spec-driven development” (SDD) ยัง​ไม่​ลงตัว นี่​คือ​สิ่ง​ที่​ผู้​เขียน​พอ​จะ​สรุป​ได้​จาก​วิธี​ที่​เห็น​คนใช้​คำ​นี้​มา​จนถึง​ตอน​นี้

กล่าว​คือ spec-driven development หมาย​ถึง​การ​เขียน “spec” ก่อน​ที่​จะ​ลงมือ​เขียน code กับ AI (“documentation first”) โดย spec จะ​กลาย​เป็น​แหล่ง​ความ​จริง (source of truth) ทั้ง​สำหรับ​คน​และ​สำหรับ AI

GitHub: “ใน​โลก​ใบ​ใหม่​นี้ การ​ดูแล​ซอฟต์แวร์​ก็​คือ​การ​ทำให้ spec ค่อย ๆ พัฒนา​ต่อ​ไป […] ภาษา​กลาง​ของ​การ​พัฒนา​ขยับ​ขึ้น​ไป​อยู่​ใน​ระดับ​ที่​สูง​ขึ้น ส่วน code กลาย​เป็น​แนวทาง​ช่วง​ปลายทาง (last-mile)”

Tessl: “แนวทางการ​พัฒนา​ที่ spec ไม่ใช่ code เป็น​ชิ้น​งาน​หลัก (primary artifact) spec อธิบาย​เจตนา​ด้วย​ภาษา​ที่​มี​โครงสร้าง​และ​ทดสอบ​ได้ แล้ว agent ก็​สร้าง code ให้​ตรง​กับ spec นั้น”

หลัง​จาก​ได้​ดู​วิธี​ที่​คนใช้​คำ​นี้ และ​ดู​เครื่องมือ​บาง​ตัว​ที่​อ้าง​ว่า​ตัวเอง​ทำ SDD ผู้​เขียน​รู้สึก​ว่า​ใน​ความ​เป็น​จริง​แล้ว มัน​มี​ระดับ​ของ​การนำ​ไป​ใช้งาน​หลาย​ระดับ​ด้วย​กัน:

  1. Spec-first (เขียน spec ให้​ดี​ก่อน​เริ่ม​งาน): เขียน spec ที่​คิด​มา​อย่าง​รอบคอบ​ขึ้น​มา​ก่อน แล้ว​จึง​นำ​ไป​ใช้​ใน workflow การ​พัฒนา​แบบ AI-assisted สำหรับ​งาน​ที่​อยู่​ตรง​หน้า
  2. Spec-anchored (คง spec ไว้​ใช้​ดูแล/พัฒนา​ต่อ): เก็บ spec ไว้​แม้​งาน​จะ​เสร็จ​ไป​แล้ว เพื่อ​นำ​มา​ใช้​ใน​การ​พัฒนา​ต่อยอด​และ​ดูแล​รักษา feature นั้น ๆ ต่อ​ไป
  3. Spec-as-source (ใช้ spec เป็นต้นฉบับ คน​แก้​แค่ spec ไม่​แตะ code): spec คือ file ต้นฉบับ​หลัก​ที่​อยู่​กับ project ใน​ระยะ​ยาว และ​คน​จะ​แก้​ที่ spec เท่านั้น คน​จะ​ไม่​แตะ code เลย

แนวทาง​และ​นิยาม​ของ SDD ทุก​อัน​ที่​ผู้​เขียน​เจอ​ล้วน​เป็น spec-first แต่​ไม่ใช่​ทุก​อัน​ที่​มุ่ง​จะ​เป็น spec-anchored หรือ spec-as-source และ​บ่อย​ครั้ง​ก็​ปล่อย​ไว้​คลุมเครือ​หรือ​เปิด​กว้าง​ไป​เลย​ว่า​กลยุทธ์​ใน​การ​ดูแล spec ใน​ระยะ​ยาว​ควร​เป็น​อย่างไร

ระดับ​ของ SDDตอน​สร้าง feature (Creation)ตอน​พัฒนา​และ​ดูแล​ต่อ (Evolution & maintenance)
spec-firstspec นำ​ไป​สู่ code ทั้ง AI และ​คน​ช่วย​กัน​แก้​ทั้ง spec และ codeทิ้ง spec เดิม แล้ว​เขียน spec ใหม่​อธิบาย​เฉพาะ​ส่วน​ที่​จะ​เปลี่ยน
spec-anchoredเหมือน spec-firstเก็บ spec ไว้ แล้วกลับ​มา​แก้ spec เดิม​ตอน​พัฒนา​ต่อ
spec-as-sourceเหมือน spec-anchoredคน​แก้​แค่ spec ไม่​แตะ code ที่​ถูก generate ขึ้น​มา

ภาพ 1 — สาม​ระดับ​ของ SDD สร้าง​ต่อยอด​กัน​เป็น​ชั้น ๆ (inheritance): spec-anchored รวม​ทุก​อย่าง​ของ spec-first และ spec-as-source รวม​ทุก​อย่าง​ของ spec-anchored ความ​ต่าง​อยู่​ที่ “ตอน​ดูแล​ต่อ” ว่า​จะ​ทิ้ง spec, เก็บ​ไว้​แก้, หรือ​ให้ spec เป็นต้นฉบับ​ที่​คน​แก้​เพียง​อย่าง​เดียว · ดู​ภาพ​ต้นฉบับ ↗

แน่นอน​ว่า​คำถาม​สำคัญ​ใน​แง่​ของ​นิยาม​ก็​คือ spec คือ​อะไร? ดูเหมือน​จะ​ยัง​ไม่มี​นิยาม​ที่​เป็น​สากล นิยาม​ที่​สอดคล้อง​กัน​มาก​ที่สุด​เท่า​ที่​ผู้​เขียน​เคย​เห็น​ก็​คือ​การ​เปรียบเทียบ spec เข้า​กับ PRD (Product Requirements Document — เอกสาร​กำหนด​ความ​ต้องการ​ของ​ผลิตภัณฑ์)

ตอน​นี้​คำ​นี้​ถูก​ใช้​ใน​ความหมาย​ที่​หลากหลาย​จน​กว้าง​เกิน​ไป นี่​คือ​ความ​พยายาม​ของ​ผู้​เขียน​ใน​การ​นิยาม​ว่า spec คือ​อะไร:

spec คือ​ชิ้น​งาน​ที่​มี​โครงสร้าง​และ​เน้น​ที่​พฤติกรรม (behavior-oriented) — หรือ​ชุด​ของ​ชิ้น​งาน​ที่​เกี่ยวข้อง​กัน — ซึ่ง​เขียน​ด้วย​ภาษา​คน (natural language) เพื่อ​แสดงออก​ถึง function การ​ทำงาน​ของ​ซอฟต์แวร์ และ​ทำ​หน้าที่​เป็น​แนวทาง​ให้​กับ AI coding agent

โดย spec-driven development แต่ละ​แบบ​จะ​มี​วิธี​ของ​ตัวเอง​ใน​การ​นิยาม​ว่า​โครงสร้าง​ของ spec ควร​เป็น​อย่างไร ลง​รายละเอียด​มาก​แค่​ไหน และ​จะ​จัด​ระเบียบ​ชิ้น​งาน​เหล่า​นี้​ภายใน project อย่างไร

ผู้​เขียน​คิด​ว่า​มี​ความ​แตก​ต่าง​ที่​เป็น​ประโยชน์​ระหว่าง spec กับ​เอกสาร context ทั่ว ๆ ไป​ของ codebase โดย context ทั่วไป​นั้น​หมาย​ถึง​สิ่ง​อย่าง file rules หรือ​คำ​อธิบาย​ระดับ​สูง​ของ​ตัว​ผลิตภัณฑ์​และ codebase

เครื่องมือ​บาง​ตัว​เรียก context นี้​ว่า memory bank (คลัง​ความ​จำ​ของ project) ผู้​เขียน​จึง​จะ​ใช้​คำ​นี้​ใน​ที่​นี้

file เหล่า​นี้​เกี่ยวข้อง​กับ​ทุก ๆ session AI coding ใน codebase ขณะ​ที่ spec จะ​เกี่ยวข้อง​เฉพาะ​กับ​งาน​ที่​สร้าง​หรือ​เปลี่ยนแปลง function การ​ทำงาน​นั้น ๆ จริง ๆ เท่านั้น

flowchart TB
  subgraph MB["Memory Bank"]
    a1["AGENTS.md"]
    a2["project.md"]
    a3["architecture.md"]
  end
  subgraph SP["Specs"]
    s1["Story-324.md"]
    s2["product-search.md"]
    subgraph FX["feature-x/"]
      f1["data-model.md"]
      f2["plan.md"]
    end
  end

ภาพ 2 — ภาพ​รวม file context ของ agent แบ่ง​เป็น​สอง​กลุ่ม: memory bank ใช้ได้​กับ​ทุก session ใน codebase ส่วน specs เกี่ยวข้อง​เฉพาะ​กับ​งาน​หรือ feature ที่​กำลัง​สร้าง/แก้​เท่านั้น · ดู​ภาพ​ต้นฉบับ ↗

กลาย​เป็น​ว่าการ​ประเมิน​เครื่องมือ​และ​แนวทาง​แบบ SDD ให้​ใกล้​เคียง​กับ​การ​ใช้งาน​จริง​นั้น​กิน​เวลา​พอสมควร​ที​เดียว คือ​ต้อง​ลอง​ใช้​กับ​ปัญหา​ขนาด​ต่าง ๆ ทั้ง project ใหม่ (greenfield) และ codebase เดิม​ที่​มี​อยู่​แล้ว (brownfield) และ​ต้อง​ลง​เวลา​จริง ๆ ใน​การ​รีวิว​และ​ปรับ​แก้​ชิ้น​งาน​ระหว่าง​ทาง ไม่ใช่​แค่​กวาดตา​มอง​ผ่าน ๆ

เพราะ​อย่าง​ที่ block post ของ GitHub เกี่ยว​กับ spec-kit บอก​ไว้​ว่า: “ที่​สำคัญ​คือ บทบาท​ของ​คุณ​ไม่ใช่​แค่​คอย​กำกับ​ทิศทาง แต่​คือ​การ​ตรวจสอบ ใน​แต่ละ​เฟส คุณ​ต้อง​ไตร่ตรอง​และ​ขัดเกลา”

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

จนกว่า​ผู้​เขียน​จะ​ได้ยิน​รายงานการ​ใช้งาน​จาก​คน​ที่​ใช้​มัน​ต่อ​เนื่อง​เป็น​ระยะ​เวลา​หนึ่ง​บน codebase “จริง” ผู้​เขียน​ก็​ยัง​มี​คำถาม​ค้าง​คา​อีก​มากว่า​มัน​ใช้งาน​ได้​จริง​ใน​ชีวิต​จริง​อย่างไร

เอา​ล่ะ — เรา​มา​เข้า​เรื่อง​เครื่องมือ​ทั้ง​สาม​ตัว​กัน​เลย ผู้​เขียน​จะ​เล่า​ก่อน​ว่า​แต่ละ​ตัว​ทำงาน​อย่างไร (หรือ​พูด​ให้​ถูก​คือ ที่​ผู้​เขียน​คิด​ว่า​มัน​ทำงาน​อย่างไร) และ​จะ​เก็บ​ข้อสังเกต​กับ​คำถาม​ไว้​ตอน​ท้าย

ทั้งนี้​โปรด​ทราบ​ว่า​เครื่องมือ​เหล่า​นี้​พัฒนา​ตัวเอง​เร็ว​มาก ดังนั้น​มัน​อาจ​จะ​เปลี่ยน​ไป​แล้ว​ก็ได้​จาก​ตอน​ที่​ผู้​เขียน​ใช้​เมื่อ​เดือน​กันยายน

Kiro เป็น​ตัว​ที่​เรียบ​ง่าย​ที่สุด (หรือ​เบา​ที่สุด) ใน​สาม​ตัว​ที่​ผู้​เขียน​ลอง มัน​ดู​เป็น​แบบ spec-first เสีย​ส่วน​ใหญ่ ตัวอย่าง​ทั้งหมด​ที่​ผู้​เขียน​เจอ​ล้วน​ใช้​มัน​กับ​งาน​หนึ่ง​งาน หรือ​กับ user story หนึ่ง​อัน โดย​ไม่มี​การ​พูด​ถึงว่า​จะ​ใช้​เอกสาร requirements แบบ spec-anchored ใน​ระยะ​ยาว​ข้าม​หลาย ๆ งาน​ได้​อย่างไร

workflow: Requirements → Design → Tasks

แต่ละ​ขั้น​ใน workflow จะ​แทน​ด้วย​เอกสาร markdown หนึ่ง​ฉบับ และ Kiro จะ​คอย​นำทาง​คุณ​ผ่าน 3 ขั้น​นี้​ภายใน​ตัว distribution ที่​อิง​กับ VS Code ของ​มัน

Requirements: จัด​เป็น​รายการ​ของ requirement โดย​แต่ละ requirement แทน “User Story” หนึ่ง​อัน (ใน​รูปแบบ “As a…”) พร้อม acceptance criteria (ใน​รูปแบบ “GIVEN… WHEN… THEN…”)

📷 ภาพ 3 — เอกสาร Requirements ของ Kiro: แต่ละ requirement คือ “User Story” (รูปแบบ “As a…”) พร้อม acceptance criteria (รูปแบบ “GIVEN… WHEN… THEN…”) · ดู​ภาพ​หน้า​จอ​ต้นฉบับ ↗

Design: ใน​ความ​พยายาม​ของ​ผู้​เขียน เอกสาร design ประกอบ​ด้วย​ส่วน​ต่าง ๆ ที่​เห็น​ใน​ภาพ​หน้า​จอ​ด้าน​ล่าง ผู้​เขียน​ยัง​มี​ผลลัพธ์​เก็บ​ไว้​แค่​จาก​ความ​พยายาม​ครั้ง​เดียว เลย​ไม่​แน่ใจ​ว่า​นี่​เป็น​โครงสร้าง​ที่​คงที่ หรือ​มัน​เปลี่ยน​ไป​ตาม​แต่ละ​งาน

📷 ภาพ 4 — เอกสาร Design ของ Kiro: มี​ไดอะแกรม​สถาปัตยกรรม​ของ​คอมโพเนนต์ ตาม​ด้วย​หัวข้อ​ที่​พับ​เก็บ​ไว้ — Data Flow, Data Models, Error Handling, Testing Strategy, Implementation Approach, Migration Strategy · ดู​ภาพ​หน้า​จอ​ต้นฉบับ ↗

Tasks: รายการ​ของ task ที่​โยง​กลับ​ไป​ยัง​หมายเลข requirement พร้อม​ส่วนประกอบ UI เพิ่มเติม​สำหรับ​รัน task ที​ละ​อัน​และ​รีวิว​การ​เปลี่ยนแปลง​ใน​แต่ละ task

📷 ภาพ 5 — เอกสาร Tasks ของ Kiro: แต่ละ task มี​ปุ่ม “Task in progress” และ “View changes” เป็น​รายการ TODO และ​จบ​ด้วย​เลข​อ้างอิง​กลับ​ไป​ยัง requirement (1.1, 1.2, 1.3) · ดู​ภาพ​หน้า​จอ​ต้นฉบับ ↗

Kiro ก็​มี​แนวคิด​ของ memory bank เช่น​กัน พวก​เขา​เรียก​มัน​ว่า “steering” เนื้อหา​ของ​มัน​ยืดหยุ่น​ได้ และ workflow ของ​พวก​เขา​ก็​ดูเหมือน​จะ​ไม่​ได้​พึ่งพา​ว่า​ต้อง​มี file ใด file หนึ่ง​อยู่​โดย​เฉพาะ (ผู้​เขียน​ลอง​ใช้ Kiro ไป​ก่อน​แล้ว​ถึง​เพิ่ง​มา​ค้น​พบ​ส่วน steering นี้​ทีหลัง)

topology เริ่มต้น​ที่ Kiro สร้าง​ขึ้น​เมื่อ​คุณ​สั่ง​ให้​มัน​สร้าง​เอกสาร steering คือ product.md, structure.md, tech.md

flowchart TB
  subgraph MB["Memory Bank (steering/)"]
    p["product.md"]
    t["tech.md"]
    s["structure.md"]
  end
  subgraph SP["Specs: category-label-enhancement/"]
    r["requirements.md"]
    d["design.md"]
    ta["tasks.md"]
  end

ภาพ 6 — topology ของ Kiro: memory bank อยู่​ใน folder steering/ ส่วน spec ของ feature ทดสอบ (category-label-enhancement/) มี3 file ตาม​ขั้น requirements → design → tasks · ดู​ภาพ​ต้นฉบับ ↗

Spec-kit คือ SDD version ของ GitHub มัน​ถูก​แจกจ่าย​มา​ใน​รูป​ของ CLI ที่​สามารถ​สร้าง​การ​ตั้ง​ค่า workspace ให้​กับ coding assistant ยอด​นิยม​ได้​หลากหลาย​ตัว เมื่อ​ตั้ง​ค่า​โครงสร้าง​นี้​เรียบร้อย​แล้ว คุณ​จะ​โต้ตอบ​กับ spec-kit ผ่าน slash command ใน coding assistant ของ​คุณ

เนื่องจาก​ชิ้น​งาน​ทั้งหมด​ของ​มัน​ถูกวาง​ไว้​ใน workspace ของ​คุณ​โดยตรง มัน​จึง​เป็น​ตัว​ที่​ปรับ​แต่ง​ได้​มาก​ที่สุด​ใน​สาม​ตัว​ที่​กล่าว​ถึง​ใน​ที่​นี้

📷 ภาพ 7 — โครง file ที่ spec-kit สร้าง​ใน VS Code: ทาง​ซ้าย​มี file คำ​สั่ง​ใน .github/prompts และ folder .specify (มี memory, scripts, templates) ทาง​ขวา GitHub Copilot กำลัง​พิมพ์​คำ​สั่ง /specify · ดู​ภาพ​หน้า​จอ​ต้นฉบับ ↗

workflow: Constitution → Specify → Plan → Tasks

แนวคิด memory bank ของ spec-kit เป็น​สิ่ง​ที่​ต้อง​มี​ก่อน​จึง​จะ​ใช้​แนวทาง spec-driven ได้ พวก​เขา​เรียก​มัน​ว่า constitution (ธรรมนูญ)

constitution มี​ไว้​เพื่อ​บรรจุ​หลักการ​ระดับ​สูง​ที่ “เปลี่ยนแปลง​ไม่​ได้” และ​ควร​นำ​มา​ใช้​เสมอ​กับ​ทุก ๆ การ​เปลี่ยนแปลง โดย​พื้นฐาน​แล้ว​มัน​ก็​คือ file rules ที่​ทรง​พลัง​มาก ๆ ซึ่ง workflow เรียก​ใช้​อย่าง​หนัก

ใน​แต่ละ​ขั้น​ของ workflow (specify, plan, tasks) spec-kit จะ​สร้าง​ชุด​ของ file และ prompt ขึ้น​มา​ด้วย​ความ​ช่วยเหลือ​ของ bash script และ template บาง​ส่วน

จาก​นั้น workflow ก็​จะ​ใช้ checklist ภายใน file เหล่า​นั้น​อย่าง​หนัก เพื่อ​ติดตาม​จุด​ที่​ต้อง​ให้​ผู้​ใช้​ชี้แจง การ​ละเมิด constitution งาน research ฯลฯ มัน​ก็​เหมือน​เป็น “definition of done” ของ​แต่ละ​ขั้น​ใน workflow (แต่ AI เป็น​คน​ตีความ ดังนั้น​จึง​ไม่มี​อะไร​การันตี 100% ว่า​มัน​จะ​ถูก​ทำ​ตาม)

📷 ภาพ 8 — ช่วง​ท้าย file spec.md ของ spec-kit: เต็ม​ไป​ด้วย checklist หลาย​ชุด ทั้ง​คุณภาพ​เนื้อหา ความ​ครบ​ของ requirement และ​สถานะ​การ​ทำงาน · ดู​ภาพ​หน้า​จอ​ต้นฉบับ ↗

ด้าน​ล่าง​นี้​คือ​ภาพ​รวม​เพื่อ​แสดง​ให้​เห็น topology ของ file ที่​ผู้​เขียน​เห็น​ใน spec-kit สังเกต​ว่า spec หนึ่ง​อัน​ประกอบ​ด้วย file จำนวน​มาก

flowchart TB
  subgraph MB["Memory Bank"]
    c["constitution.md"]
  end
  subgraph TPL["Templates"]
    pt["plan-template.md"]
    st["spec-template.md"]
    tt["tasks-template.md"]
  end
  subgraph SP["Specs: specs/001-when-a-user/ (~8 files)"]
    f1["spec.md"]
    f2["plan.md"]
    f3["tasks.md"]
    f4["data-model.md"]
    f5["research.md"]
    f6["api.md"]
    f7["component.md"]
  end

ภาพ 9 — topology ของ spec-kit: memory bank คือ constitution.md มี​กล่อง templates เพิ่ม​เข้า​มา และ spec หนึ่ง​ชุด (specs/001-when-a-user/) ประกอบ​ด้วย file ราว 8 file — สังเกต​ว่า 1 spec กระจาย​เป็น​หลาย file · ดู​ภาพ​ต้นฉบับ ↗

เมื่อ​มอง​เผิน ๆ ดูเหมือน GitHub จะมุ่ง​ไป​สู่​แนวทาง​แบบ spec-anchored (“นี่​คือ​เหตุผล​ที่​เรา​กำลัง​คิด​ทบทวน​เรื่อง spec กัน​ใหม่ — ไม่ใช่​ใน​ฐานะ​เอกสาร​ที่​อยู่​นิ่ง​กับ​ที่ แต่​ใน​ฐานะ​ชิ้น​งาน​ที่​มี​ชีวิต รัน​ได้ และ​พัฒนา​ไป​พร้อม​กับ project spec จะ​กลาย​เป็น​แหล่ง​ความ​จริง​ร่วม​กัน เมื่อ​อะไร​บาง​อย่าง​ดู​ไม่​สม​เหตุ​สม​ผล คุณ​ก็​ย้อน​กลับ​ไป​ที่ spec เมื่อ project ซับซ้อน​ขึ้น คุณ​ก็​ขัดเกลา​มัน เมื่อ​รู้สึก​ว่า​งาน​ใหญ่​เกิน​ไป คุณ​ก็​แตก​ย่อย​มัน​ออก”)

อย่างไร​ก็ตาม spec-kit สร้าง branch ขึ้น​มา​ใหม่​สำหรับ​ทุก spec ที่​ถูก​สร้าง ซึ่ง​ดูเหมือน​จะ​บ่ง​ชี้​ว่า​พวก​เขา​มอง spec เป็น​ชิ้น​งาน​ที่​มี​ชีวิต​ตลอด​อายุ​ของ​คำขอ​เปลี่ยนแปลง (change request) หนึ่ง​ครั้ง ไม่ใช่​ตลอด​อายุ​ของ feature การ​พูด​คุย​ใน​ชุมชน​นี้ ก็​กำลัง​พูด​ถึง​ความ​สับสน​ตรง​นี้

มัน​ทำให้​ผู้​เขียน​คิด​ว่า spec-kit ยัง​เป็น​แบบ​ที่​ผู้​เขียน​เรียก​ว่า spec-first เพียง​อย่าง​เดียว​อยู่ ไม่ใช่ spec-anchored ใน​ระยะ​ยาว

(ยัง​อยู่​ใน​ช่วง private beta)

เช่น​เดียว​กับ spec-kit Tessl Framework ถูก​แจกจ่าย​มา​ใน​รูป​ของ CLI ที่​สามารถ​สร้าง​โครงสร้าง workspace และ config ทั้งหมด​ให้​กับ coding assistant หลากหลาย​ตัว นอกจาก​นี้ CLI ยัง​ทำ​หน้าที่​เป็น MCP server ได้​ด้วย

📷 ภาพ 10 — file ที่ Tessl สร้าง​ใน Cursor: ทาง​ซ้าย​มี folder .tessl/framework ทาง​ขวา​คือ​ค่า​ตั้ง MCP ที่​สั่ง​รัน​คำ​สั่ง tessl ใน​โหมด MCP · ดู​ภาพ​หน้า​จอ​ต้นฉบับ ↗

Tessl เป็น​เครื่องมือ​ตัว​เดียว​ใน​สาม​ตัว​นี้​ที่​มุ่ง​สู่​แนวทาง​แบบ spec-anchored อย่าง​ชัดเจน และ​ยัง​ลอง​สำรวจ SDD ใน​ระดับ spec-as-source อีก​ด้วย spec ของ Tessl สามารถ​ทำ​หน้าที่​เป็น​ชิ้น​งาน​หลัก​ที่​ถูก​ดูแล​และ​แก้ไข โดย​ตัว code เอง​ยัง​มี​คอมเมนต์​กำกับ​ไว้​ด้าน​บน​ว่า // GENERATED FROM SPEC - DO NOT EDIT

ปัจจุบัน​นี้​เป็นการ map แบบ 1:1 ระหว่าง file spec กับ file code กล่าว​คือ spec หนึ่ง​อัน​แปลง​ไป​เป็น file 1 file ใน codebase

แต่ Tessl ยัง​อยู่​ใน​ช่วง beta และ​พวก​เขา​กำลัง​ทดลอง​ทำ version ต่าง ๆ ของ​แนวทาง​นี้ ดังนั้น​ผู้​เขียน​พอ​จะ​นึกออกว่า​แนวทาง​นี้​อาจ​ถูก​นำ​ไป​ใช้​ใน​ระดับ​ที่ spec หนึ่ง​อัน map ไป​ยัง component ของ code ที่​มี​หลาย file ก็ได้

คง​ต้อง​รอ​ดู​ว่า​ตัว alpha product จะ​รองรับ​อะไร​บ้าง (ทีม Tessl เอง​ก็​มอง​ว่า framework ของ​พวก​เขา​เป็น​เรื่อง​ของ​อนาคต​มากกว่า เมื่อ​เทียบ​กับ​ผลิตภัณฑ์​สาธารณะ​ที่​มี​อยู่​ตอน​นี้​อย่าง Tessl Registry)

นี่​คือ​ตัวอย่าง​ของ spec ที่​ผู้​เขียน​ให้ Tessl CLI ทำ reverse engineer (tessl document --code ...js) จาก file JavaScript ใน codebase ที่​มี​อยู่​แล้ว:

📷 ภาพ 11 — file spec ของ Tessl: ตัวอย่าง spec ที่​ผู้​เขียน​ให้ reverse engineer ออก​มา​จาก file JavaScript เดิม · ดู​ภาพ​หน้า​จอ​ต้นฉบับ ↗

แท็ก​อย่าง @generate หรือ @test ดูเหมือน​จะ​เป็น​ตัว​บอก Tessl ว่า​จะ​ให้​สร้าง​อะไร

ส่วน API แสดง​ให้​เห็น​แนวคิด​ของ​การ​นิยาม interface เอา​ไว้​ใน spec อย่าง​น้อย​ก็​ตัว​ที่​ถูก​เปิด​ให้​ส่วน​อื่น ๆ ของ codebase เข้าถึง ซึ่ง​น่า​จะ​เพื่อ​ให้​แน่ใจ​ว่า​ส่วน​ที่​สำคัญ​กว่า​เหล่า​นี้​ของ component ที่​ถูก​สร้าง​ขึ้น​มา​อยู่​ภาย​ใต้​การ​ควบคุม​ของ​ผู้​ดูแล​อย่าง​เต็ม​ที่

การ​รัน tessl build สำหรับ spec นี้​จะ​สร้าง file code JavaScript ที่​สอดคล้อง​กัน​ขึ้น​มา

การ​วาง spec สำหรับ spec-as-source ไว้​ที่​ระดับ​นามธรรม​ที่​ค่อน​ข้าง​ต่ำ คือ​ต่อ1 file code น่า​จะ​ช่วย​ลด​จำนวน​ขั้นตอน​และ​การ​ตีความ​ที่ LLM ต้อง​ทำ​ลง และ​จึง​ลด​โอกาส​เกิด​ข้อ​ผิดพลาด

แต่​ถึง​จะ​อยู่​ที่​ระดับ​นามธรรม​ต่ำ​ขนาด​นี้ ผู้​เขียน​ก็​ยัง​ได้​เห็น​ความ​ไม่​แน่นอน (non-determinism) เกิด​ขึ้น​จริง ตอน​ที่​สร้าง code จาก spec เดียวกัน​หลาย ๆ ครั้ง

การวน​ปรับ spec ให้​เฉพาะ​เจาะจง​ขึ้น​เรื่อย ๆ เพื่อ​เพิ่ม​ความ​สามารถ​ใน​การ​สร้าง code ให้​ออก​มา​ซ้ำ​เดิม​ได้ เป็น​แบบฝึกหัด​ที่​น่า​สนใจ กระบวนการ​นั้น​ทำให้​ผู้​เขียน​นึกถึง​กับดัก​และ​ความ​ท้าทาย​บาง​อย่าง​ของ​การ​เขียน specification ที่​ชัดเจน​ไม่​กำกวม​และ​ครบถ้วน

flowchart TB
  subgraph MB["Memory Bank"]
    fw[".tessl/framework/ (4 files)"]
    k["KNOWLEDGE.md"]
    ag["AGENTS.md"]
  end
  subgraph SP["Specs"]
    sp1["dynamic-data-renderer.spec.md"]
  end
  subgraph CD["Code"]
    cd1["dynamic-data-renderer.js"]
  end
  sp1 <-->|"synced"| cd1

ภาพ 12 — topology ของ Tessl: memory bank คือ folder .tessl/framework (4 file) บวก KNOWLEDGE.md และ AGENTS.md มี​กล่อง Code เพิ่ม​เข้า​มา และ​ลูกศร​สอง​ทาง​ระหว่าง spec กับ code สื่อ​ว่า​ทั้ง​คู่​ถูก sync เข้าหา​กัน · ดู​ภาพ​ต้นฉบับ ↗

เครื่องมือ​ทั้ง​สาม​ตัว​นี้​ต่าง​นิยาม​ตัวเอง​ว่า​เป็นการ​นำ spec-driven development ไป​ใช้งาน แต่​มัน​ก็​แตก​ต่าง​กัน​มาก​ที​เดียว ดังนั้น​นี่​คือ​สิ่ง​แรก​ที่​ต้อง​จำ​ไว้​เวลา​พูด​ถึง SDD: มัน​ไม่ใช่​สิ่ง​เดียวกัน​หมด

Kiro และ spec-kit ต่าง​ก็​ให้ workflow ที่​มี​แนวทาง​ตายตัว​มา​ตัว​ละ​หนึ่ง​กระบวนการ แต่​ผู้​เขียน​ค่อน​ข้าง​มั่นใจ​ว่า​ทั้ง​คู่​ไม่​เหมาะ​กับ​ปัญหา coding ใน​ชีวิต​จริง​ส่วน​ใหญ่ โดย​เฉพาะ​อย่าง​ยิ่ง ผู้​เขียน​ยัง​ไม่​ค่อย​เห็น​ภาพ​ชัด​ว่า​มัน​จะ​รองรับ​ปัญหา​ขนาด​ต่าง ๆ ได้​มาก​พอ​จน​นำ​ไป​ใช้ได้​ทั่วไป​อย่างไร

ตอน​ที่​ผู้​เขียน​ให้ Kiro แก้ bug เล็ก ๆ (เป็น bug ตัว​เดียว​กับ​ที่​ผู้​เขียน​เคย​ใช้​ลอง Codex มา​ก่อน) มัน​ก็​เห็น​ได้​ชัด​อย่าง​รวดเร็ว​ว่า workflow นี้​เหมือน​ขี่​ช้าง​จับ​ตั๊กแตน

เอกสาร requirements เปลี่ยน bug เล็ก ๆ นี้​ให้​กลาย​เป็น “user story” 4 อัน พร้อม acceptance criteria รวม​กัน 16 ข้อ

รวม​ถึง​อัญมณี​ล้ำค่า (ใน​เชิง​ประชด) อย่าง “User story: ใน​ฐานะ​นัก​พัฒนา ฉัน​อยาก​ให้ function transformation จัดการ​กับ edge case ได้​อย่าง​ราบรื่น เพื่อ​ให้​ระบบ​ยัง​คงทนทาน​เมื่อ​มี​รูปแบบ category ใหม่ ๆ เข้า​มา”

ผู้​เขียน​เจอ​ความ​ท้าทาย​คล้าย ๆ กัน​ตอน​ใช้ spec-kit คือ​ไม่​ค่อย​แน่ใจ​ว่า​ควร​ใช้​มัน​กับ​ปัญหา​ขนาด​ไหน tutorial ที่​มี​ให้​มัก​จะ​อิง​กับ​การ​สร้าง application ขึ้น​มา​ใหม่​ทั้งหมด เพราะ​นั่น​ง่าย​ที่สุด​สำหรับ​การ​ทำ tutorial

หนึ่ง​ใน use case ที่​ผู้​เขียน​ลองใน​ที่สุด​คือ feature ที่​น่า​จะ​เป็น story ขนาด 3-5 point ใน​ทีม​เดิม​ทีม​หนึ่ง​ของ​ผู้​เขียน feature นี้​พึ่งพา code ที่​มี​อยู่​แล้ว​เป็น​จำนวน​มาก โดย​มัน​ควร​จะ​สร้าง modal ภาพ​รวม​ที่​สรุป​ข้อมูล​ก้อน​หนึ่ง​จาก dashboard ที่​มี​อยู่

ด้วย​จำนวน​ขั้นตอน​ที่ spec-kit ทำ และ​จำนวน file markdown ที่​มัน​สร้าง​มา​ให้​ผู้​เขียน​รีวิว ตรง​นี้​ก็​ให้​ความ​รู้สึก​ว่า​เกิน​จำเป็น​อีก​ครั้ง​เมื่อ​เทียบ​กับ​ขนาด​ของ​ปัญหา มัน​เป็น​ปัญหา​ที่​ใหญ่​กว่า​ตัว​ที่​ผู้​เขียน​ใช้​กับ Kiro แต่​ก็​มี workflow ที่​ซับซ้อน​ละเอียด​กว่า​มาก​เช่น​กัน

ผู้​เขียน​ไม่​เคย​ทำการ implement ให้​เสร็จ​สมบูรณ์​เลย​ด้วย​ซ้ำ แต่​ผู้​เขียน​คิด​ว่า​ใน​เวลา​เท่า​กัน​กับ​ที่​ใช้​ไป​กับ​การ​รัน​และ​รีวิว​ผลลัพธ์​ของ spec-kit ผู้​เขียน​น่า​จะ implement feature นี้​ได้​ด้วย​การ​เขียน code แบบ AI-assisted “ธรรมดา ๆ” และ​คง​รู้สึก​ว่า​ตัวเอง​ควบคุม​ได้​มากกว่า​มาก

เครื่องมือ SDD ที่​ได้​ผล​จริง อย่าง​น้อย​ที่สุด​ก็​ต้อง​ให้​ความ​ยืดหยุ่น​สำหรับ workflow หลัก​สัก​สอง​สาม​แบบ​ที่​ต่าง​กัน เพื่อ​รองรับ​การ​เปลี่ยนแปลง​หลาย​ขนาด​และ​หลาย​ประเภท

อย่าง​ที่​เพิ่ง​กล่าว​ไป และ​อย่าง​ที่​คุณ​เห็น​ใน​คำ​อธิบาย​เครื่องมือ​ด้าน​บน spec-kit สร้าง file markdown ออก​มา​ให้​ผู้​เขียน​รีวิว​เยอะมาก file เหล่า​นั้น​ซ้ำซ้อน​กันเอง และ​ซ้ำซ้อน​กับ code ที่​มี​อยู่​แล้ว​ด้วย บาง file มี code อยู่​ใน​ตัว​แล้ว โดย​รวม​แล้ว​มัน​เยิ่นเย้อ​และ​น่า​เบื่อ​ที่​จะ​รีวิว​มาก

ใน Kiro นั้น​ง่าย​กว่า​หน่อย เพราะ​คุณ​ได้​แค่ 3 file และ model ความคิด (mental model) แบบ “requirements > design > tasks” ก็​เข้าใจ​ได้​ง่าย​ตาม​สัญชาตญาณ​มากกว่า อย่างไร​ก็ตาม อย่าง​ที่​กล่าว​ไป Kiro เอง​ก็​ทำ​เกิน​กว่า​เหตุ​ไป​มาก​กับ bug เล็ก ๆ ที่​ผู้​เขียน​ขอ​ให้​แก้

พูด​ตาม​ตรง ผู้​เขียน​อยาก​รีวิว code มากกว่า​รีวิว file markdown พวก​นี้​ทั้งหมด เครื่องมือ SDD ที่​ได้​ผล​จริง​จะ​ต้อง​ให้​ประสบการณ์​การ​รีวิว spec ที่​ดี​มาก ๆ

ทั้ง ๆ ที่​มี file template prompt workflow และ checklist ทั้งหมด​นี้ ผู้​เขียน​ก็​ยัง​เห็น agent สุดท้าย​แล้ว​ไม่​ทำ​ตาม​คำ​สั่ง​ทั้งหมด​อยู่​บ่อย ๆ

ใช่ ตอน​นี้ context window ใหญ่​ขึ้น​แล้ว ซึ่ง​ก็​มัก​ถูก​ยก​ขึ้น​มา​เป็น​หนึ่ง​ใน​ปัจจัย​ที่​ทำให้ spec-driven development เป็น​ไป​ได้ แต่​การ​ที่ window ใหญ่​ขึ้น ไม่​ได้​แปล​ว่า AI จะ​หยิบ​เอา​ทุก​อย่าง​ที่​อยู่​ใน​นั้น​ไป​ใช้ได้​อย่าง​ถูกต้อง

ตัวอย่าง​เช่น: spec-kit มี​ขั้น research อยู่​ที่ไหน​สัก​แห่ง​ระหว่าง​การ​วางแผน (planning) และ​มัน​ก็​ทำ research เกี่ยว​กับ code ที่​มี​อยู่​และ​สิ่ง​ที่​อยู่​ตรง​นั้น​แล้ว​เยอะ​มาก ซึ่ง​ดี​มาก เพราะ​ผู้​เขียน​ขอ​ให้​มัน​เพิ่ม feature ที่​ต่อยอด​จาก code ที่​มี​อยู่

แต่​สุดท้าย agent กลับ​เพิกเฉย​ต่อ​บันทึก​ที่​ระบุ​ว่า​สิ่ง​เหล่า​นี้​เป็น​คำ​อธิบาย​ของ class ที่​มี​อยู่​แล้ว มัน​ดัน​เอา​ไป​ตีความ​เป็น specification ใหม่​และ​สร้าง​มัน​ขึ้น​มา​ใหม่​ทั้งหมด​อีก​ครั้ง ทำให้​เกิด​ของ​ซ้ำซ้อน​ขึ้น​มา

แต่​ผู้​เขียน​ไม่​ได้​เห็น​แค่​ตัวอย่าง​ของ​การ​เพิกเฉย​ต่อ​คำ​สั่ง ผู้​เขียน​ยัง​เห็น agent ทำ​เลยเถิด​เกิน​เลย เพราะ​มัน​กระตือรือร้น​ทำ​ตาม​คำ​สั่ง​มาก​เกิน​ไป​ด้วย (เช่น ทำ​ตาม​มาตรา​หนึ่ง​ใน constitution)

ประสบการณ์​ที่​ผ่าน​มา​แสดง​ให้​เห็น​ว่า วิธี​ที่​ดี​ที่สุด​ใน​การ​คง​การ​ควบคุม​สิ่ง​ที่​เรา​กำลัง​สร้าง​ไว้ คือ​การ​ทำที​ละ​ก้าว​เล็ก ๆ แบบ iterative ดังนั้น​ผู้​เขียน​จึง​ค่อน​ข้าง​กังขา​ว่าการ​ออกแบบ spec ล่วงหน้า​จำนวน​มาก​จะ​เป็น​ความคิด​ที่​ดี​จริง​หรือ โดย​เฉพาะ​เมื่อ​มัน​เยิ่นเย้อ​เกิน​ไป

เครื่องมือ SDD ที่​ได้​ผล​จริง​จะ​ต้อง​รองรับ​แนวทาง​แบบ iterative แต่ work package เล็ก ๆ ก็​ดูเหมือน​จะ​สวน​ทาง​กับ​แนวคิด​ของ SDD เกือบ​จะ​โดย​สิ้นเชิง

เป็น​แนวคิด​ที่​พบ​ได้​ทั่วไป​ใน SDD ที่​จะ​ตั้งใจ​แยก​ระหว่าง functional spec กับ​การ implement เชิง​เทคนิค​ออก​จาก​กัน ผู้​เขียน​เดา​ว่า​ความ​มุ่งหวัง​เบื้องหลัง​คือ ใน​ที่สุด​เรา​จะ​ให้ AI เติม​ส่วน​ของ​การ​แก้​ปัญหา​และ​รายละเอียด​ทั้งหมด​เข้า​มา​เอง และ​สลับ​ไป​ใช้ tech stack ต่าง ๆ ได้​ด้วย spec อัน​เดียวกัน

ใน​ความ​เป็น​จริง ตอน​ที่​ผู้​เขียน​ลอง​ใช้ spec-kit ผู้​เขียน​สับสน​บ่อย ๆ ว่า​เมื่อไร​ควร​อยู่​ที่​ระดับ functional และ​เมื่อไร​ถึง​เวลา​ที่​จะ​เพิ่ม​รายละเอียด​เชิง​เทคนิค ทั้ง tutorial และ​เอกสาร​เอง​ก็​ไม่​ค่อย​สอดคล้อง​กัน​ใน​เรื่อง​นี้ ดูเหมือน​จะ​มี​การ​ตีความ​ที่​ต่าง​กัน​ว่า “purely functional” จริง ๆ แล้ว​หมายความ​ว่า​อย่างไร

และ​เมื่อ​ผู้​เขียน​นึก​ย้อน​กลับ​ไป​ถึง user story มากมาย​เหลือเกิน​ที่​ผู้​เขียน​ได้​อ่าน​มา​ตลอด​อาชีพ ซึ่ง​แยก requirement ออก​จาก implementation ได้​ไม่​ดี​นัก ผู้​เขียน​ก็​ไม่​คิด​ว่า​พวก​เรา​ใน​ฐานะ​วิชาชีพ​มี​ประวัติ​ที่​ดี​ใน​การ​ทำ​เรื่อง​นี้​เลย

เดโม​และ tutorial มากมาย​ของ​เครื่องมือ spec-driven development รวม​ถึง​สิ่ง​ต่าง ๆ อย่าง​การ​นิยาม​เป้าหมาย​ของ​ผลิตภัณฑ์​และ feature รวม​ไป​ถึง​การ​ใช้​คำ​อย่าง “user story” ด้วย​ซ้ำ

แนวคิด​ตรง​นี้​อาจ​จะ​เป็นการ​ใช้ AI เป็น​ตัว​ช่วย​ให้​นัก​พัฒนา​ข้าม​ไป​เรียนรู้​ทักษะ​อื่น (cross-skilling) และ​ให้​นัก​พัฒนา​มี​ส่วนร่วม​ใน​การ​วิเคราะห์ requirement มาก​ขึ้น? หรือ​ให้​นัก​พัฒนา​จับ​คู่​ทำงาน (pair) กับ​คน​สาย product เวลา​ทำ workflow นี้?

แต่​ก็​ไม่มี​การ​ทำให้​ชัดเจน​เลย​สัก​อย่าง มัน​ถูก​นำ​เสนอ​ราวกับ​เป็น​เรื่อง​ที่​รู้​กัน​อยู่​แล้ว​ว่า​นัก​พัฒนา​จะ​เป็น​คน​วิเคราะห์​ทั้งหมด​นี้​เอง

ซึ่ง​ถ้า​เป็น​เช่น​นั้น ผู้​เขียน​ก็​จะ​ถาม​ตัวเอง​อีก​ครั้ง​ว่า SDD มี​ไว้​สำหรับ​ปัญหา​ขนาด​และ​ประเภท​ไหน?

คง​ไม่ใช่​สำหรับ feature ขนาด​ใหญ่​ที่​ยัง​คลุมเครือ​อยู่​มาก เพราะ​แน่นอน​ว่า​นั่น​ต้องการ​ทักษะ​เฉพาะ​ทาง​ด้าน product และ requirement มากกว่า​นี้ บวก​กับ​ขั้นตอน​อื่น ๆ อีก​มากมาย​อย่าง​การ​ทำ research และ​การ​ให้​ผู้​มี​ส่วน​ได้​ส่วน​เสีย​เข้า​มา​เกี่ยวข้อง​ด้วย​ไม่ใช่​หรือ?

ปัญหา​ยัง​ไม่​ชัดปัญหา​ชัดเจน
ปัญหา​ใหญ่
ปัญหา​เล็ก

ภาพ 13 — แล้ว SDD ควร​อยู่​ช่อง​ไหน​ของ​เมทริกซ์​นี้? (แกน​นอน = ความ​ชัดเจน​ของ​ปัญหา, แกน​ตั้ง = ขนาด​ของ​ปัญหา) แต่ละ​ช่อง​มี​แต่​เครื่องหมาย​คำถาม — นี่​คือ​คำถาม​ที่​ผู้​เขียน​ทิ้ง​ไว้​ให้​คิด · ดู​ภาพ​ต้นฉบับ ↗

Spec-anchored และ spec-as-source: เรา​กำลัง​เรียนรู้​จาก​อดีต​อยู่​หรือ​เปล่า?

หัวข้อ​ที่​มีชื่อ​ว่า “Spec-anchored และ spec-as-source: เรา​กำลัง​เรียนรู้​จาก​อดีต​อยู่​หรือ​เปล่า?”

ใน​ขณะ​ที่​หลาย​คน​เปรียบเทียบ SDD กับ TDD หรือ BDD ผู้​เขียน​คิด​ว่า​อีก​หนึ่ง​ความ​เชื่อม​โยง​สำคัญ​ที่​ควร​พิจารณา โดย​เฉพาะ​สำหรับ spec-as-source คือ MDD (การ​พัฒนา​แบบ​ขับ​เคลื่อน​ด้วย model)

ผู้​เขียน​เคย​ทำงาน​ใน project ไม่​กี่​อัน​ช่วง​ต้น​อาชีพ​ที่​ใช้ MDD อย่าง​หนัก และ​มัน​ก็​ทำให้​ผู้​เขียน​นึกถึง MDD อยู่​ตลอด​เวลา​ตอน​ที่​ลอง​ใช้ Tessl Framework

model ใน MDD โดย​พื้นฐาน​แล้ว​ก็​คือ spec นั่นเอง เพียง​แต่​ไม่​ได้​อยู่​ใน​รูป​ภาษา​คน แต่​แสดงออก​ด้วย UML แบบ​กำหนด​เอง หรือ DSL (Domain-Specific Language — ภาษา​ที่​ออกแบบ​มา​เฉพาะ domain) แบบ​ข้อความ เป็นต้น เรา​สร้าง code generator แบบ​กำหนด​เอง​ขึ้น​มา​เพื่อ​แปลง spec เหล่า​นั้น​ให้​เป็น code

Screen "Write Message" instantiates InputScreen {
field recipient -> Domain.Contact.name
field body -> Domain.Message.text
inherits BaseComposeScreen // นำ pattern จากสกรีนอื่นมาใช้ซ้ำ
on submit -> navigate("Inbox") // ตรรกะการนำทาง (navigation)
}

ภาพ 14 — ตัวอย่าง​ภาษา DSL สำหรับ​เขียน spec แบบ MDD (วาด​ใหม่​จาก​ความ​ทรง​จำ​ของ​ผู้​เขียน) ภาษา​แบบ​นี้ “แยก​วิเคราะห์​ได้” (parseable) จึง​สร้าง​เครื่องมือ​ช่วย​ตรวจ​ให้ spec ถูกต้อง ครบถ้วน และ​สอดคล้อง​กัน​ได้ — ข้อดี​ที่​กำลัง​หาย​ไป​เมื่อ​เปลี่ยน​มา​ใช้ LLM · ดู​ภาพ​ต้นฉบับ ↗

ใน​ที่สุด MDD ก็​ไม่​เคย​ได้​รับ​ความ​นิยม​แพร่หลาย​สำหรับ application เชิง​ธุรกิจ มัน​อยู่​ที่​ระดับ​นามธรรม​ที่​ก้ำกึ่ง​ไม่​ลงตัว และ​สร้าง​ทั้ง​ภาระ​งาน​และ​ข้อ​จำกัด​ที่​มาก​เกิน​จำเป็น

แต่ LLM ช่วย​กำจัด​ภาระ​งาน​และ​ข้อ​จำกัด​บาง​ส่วน​ของ MDD ออก​ไป จึง​เกิด​ความ​หวัง​ใหม่​ว่า​ใน​ที่สุด​เรา​จะ​มุ่ง​ไป​ที่​การ​เขียน spec แล้ว​สร้าง code ออก​มา​จาก​มัน​ได้​เสียที ด้วย LLM เรา​ไม่​ถูก​จำกัด​ด้วย​ภาษา spec ที่​ต้อง​นิยาม​ไว้​ล่วงหน้า​และ parse ได้​อีก​ต่อ​ไป และ​เรา​ก็​ไม่​ต้อง​สร้าง code generator ที่​ซับซ้อน​ละเอียด​อีก​แล้ว

ราคา​ที่​ต้อง​จ่าย​สำหรับ​สิ่ง​นั้น​แน่นอน​ว่า​คือ non-determinism ของ LLM และ​โครงสร้าง​ที่ parse ได้​นั้น​ก็​มี​ข้อดี​ที่​ตอน​นี้​เรา​กำลัง​จะ​สูญเสีย​ไป​ด้วย: เรา​เคย​มี​เครื่องมือ​มากมาย​คอย​ช่วย​ผู้​เขียน spec ให้​เขียน spec ที่​ถูกต้อง​ตาม​รูปแบบ ครบถ้วน และ​สอดคล้อง​กัน​ได้

ผู้​เขียน​สงสัย​ว่า spec-as-source หรือ​แม้แต่ spec-anchoring อาจ​จะ​ลงเอย​ด้วย​การ​ได้​ข้อ​เสีย​ของ​ทั้ง MDD และ LLM มา​ทั้ง​คู่: ทั้ง​ความ​ไม่​ยืดหยุ่น และ ความ​ไม่​แน่นอน

ขอ​พูด​ให้​ชัด ผู้​เขียน​ไม่​ได้​คิดถึง​ประสบการณ์ MDD ใน​อดีต​ด้วย​ความ​โหย​หา แล้ว​บอกว่า “เรา​น่า​จะ​เอา​มัน​กลับ​มา​ใช้​ซะ​เลย” แต่​เรา​ควร​ย้อน​ดู​ความ​พยายาม​สร้าง code จาก spec (code-from-spec) ใน​อดีต​เพื่อ​เรียนรู้​จาก​มัน ใน​ตอน​ที่​เรา​กำลัง​สำรวจ spec-driven กัน​ใน​วัน​นี้

ใน​การ​ใช้ AI-assisted coding ส่วนตัว​ของ​ผู้​เขียน​เอง ผู้​เขียน​ก็​มัก​ใช้​เวลา​ไป​กับ​การ​เรียบเรียง spec บาง​รูปแบบ​ขึ้น​มา​อย่าง​พิถีพิถัน​ก่อน​เพื่อ​ส่ง​ให้ coding agent เช่น​กัน ดังนั้น​หลักการ​ทั่วไป​ของ spec-first นั้น​มี​คุณค่า​อย่าง​แน่นอน​ใน​หลาย ๆ สถานการณ์

และ​แนวทาง​ต่าง ๆ ใน​การ​จัด​โครงสร้าง spec ก็​เป็น​สิ่ง​ที่​ผู้คน​ต้องการ​กัน​มาก มัน​อยู่​ใน​กลุ่ม​คำถาม​ที่​ผู้​เขียน​ได้ยิน​บ่อย​ที่สุด​จาก​ผู้​ปฏิบัติ​งาน​ใน​ตอน​นี้: “ผม​ควร​จัด​โครงสร้าง memory bank อย่างไร?”, “ผม​จะ​เขียน specification และ​เอกสาร design ที่​ดี​สำหรับ AI ได้​อย่างไร?”

แต่​คำ​ว่า “spec-driven development” ก็​ยัง​ไม่​ถูก​นิยาม​ไว้​ดี​นัก และ​มัน​ก็​เกิดการ​จาง​ของ​ความหมาย (semantic diffusion) ไป​แล้ว​ด้วย​ซ้ำ ผู้​เขียน​ถึง​ขั้น​ได้ยิน​คนใช้​คำ​ว่า “spec” ราวกับ​เป็น​คำ​พ้อง​ความหมาย​กับ “prompt ที่​ละเอียด” เมื่อ​เร็ว ๆ นี้

ส่วน​เครื่องมือ​ที่​ผู้​เขียน​ได้​ลอง​นั้น ผู้​เขียน​ได้ list คำถาม​มากมาย​เกี่ยว​กับ​ประโยชน์​ของ​มัน​ใน​โลก​จริง​ไว้​ตรง​นี้​แล้ว

ผู้​เขียน​สงสัย​ว่า​บาง​ตัว​อาจ​กำลัง​พยายาม​ยัด workflow เดิม​ที่​เรา​มี​อยู่​ให้​เข้า​กับ AI agent แบบ​ตรง​ตัว​เกิน​ไป​หรือ​เปล่า จน​สุดท้าย​กลับ​กลาย​เป็นการ​ขยาย​ปัญหา​เดิม​ให้​ใหญ่​ขึ้น อย่าง​ภาระ​งาน​รีวิว​ที่​ล้น​มือ (review overload) และ​ปัญหา hallucination โดย​เฉพาะ​กับ​แนวทาง​ที่​ละเอียด​ซับซ้อน​กว่า​ซึ่ง​สร้าง file ออก​มา​เป็น​จำนวน​มาก

ผู้​เขียน​อด​นึกถึง​คำ​สมาส​ภาษา​เยอรมัน “Verschlimmbesserung” (คำ​เยอรมัน หมาย​ถึง “การ​ทำให้​แย่​ลง ทั้ง​ที่​ตั้งใจ​จะ​ทำให้​ดี​ขึ้น”) ไม่​ได้: เรา​กำลัง​ทำ​บาง​อย่าง​ให้​แย่​ลง​ใน​ความ​พยายาม​ที่​จะ​ทำให้​มันดี​ขึ้น​อยู่​หรือ​เปล่า?


📄 อ่าน​ต้นฉบับ​ภาษา​อังกฤษ: Understanding Spec-Driven-Development: Kiro, spec-kit, and Tessl — Birgitta Böckeler, martinfowler.com (15 ตุลาคม 2025)