- ปรับโครงสร้างวิธีใช้ เครื่องมือเขียนโค้ดด้วย AI ใหม่จากพื้นฐาน โดยเสนอ เวิร์กโฟลว์ที่ต้องผ่านขั้นตอนทบทวนแผนอย่างชัดเจนก่อนเขียนโค้ดเสมอ
- หลักการสำคัญคือ “ก่อนอนุมัติแผน อย่าให้ Claude เขียนโค้ด” ซึ่งช่วยให้ควบคุมเชิงโครงสร้างและใช้โทเคนได้อย่างมีประสิทธิภาพ
- กระบวนการทั้งหมดดำเนินเป็นวงจร Research → Plan → Annotation → Todo List → Implementation → Feedback
- ในแต่ละขั้นจะทำงานร่วมกันโดยยึด เอกสาร markdown (research.md, plan.md) เป็นศูนย์กลาง และยกระดับความสมบูรณ์ผ่านการใส่คอมเมนต์และแก้ไขซ้ำ
- วิธีนี้เน้น การแยกแล้วผสานพลังการลงมือทำของ AI กับวิจารณญาณของมนุษย์ เพื่อให้ได้ผลลัพธ์ที่เสถียรและสม่ำเสมอแม้ในระบบที่ซับซ้อน
ภาพรวมเวิร์กโฟลว์ทั้งหมด
- ตลอดราว 9 เดือนที่ผ่านมา ได้ใช้ Claude Code เป็นเครื่องมือพัฒนาหลัก และแทนที่จะใช้วิธีทั่วไปแบบ “ป้อนพรอมป์ต์ → สร้างโค้ด → วนแก้ไข” ก็ได้สร้างกระบวนการที่เป็นระบบโดย แยกการวางแผนออกจากการลงมือทำ
- ก่อนที่ Claude จะเขียนโค้ด จะต้องให้มันลงมือทำโดยอิงจาก เอกสารแผน (plan.md) ที่ผู้เขียนตรวจและอนุมัติแล้ว เท่านั้น
- แนวทางนี้ช่วย ลดการลองผิดลองถูกที่ไม่จำเป็น, รักษาอำนาจการตัดสินใจด้านสถาปัตยกรรม, และ เพิ่มคุณภาพให้สูงสุดเมื่อเทียบกับปริมาณโทเคนที่ใช้
Phase 1: Research
- ทุกงานเริ่มต้นจาก การวิเคราะห์โค้ดเบสอย่างลึกซึ้ง
- สั่งให้ Claude วิเคราะห์โฟลเดอร์หรือฟีเจอร์ที่กำหนดแบบ “อ่านอย่างละเอียด (detailed, intricacies)”
- และต้องบันทึกผลลัพธ์ลงใน ไฟล์
research.md
- เอกสารนี้ทำหน้าที่เป็น พื้นผิวสำหรับการทบทวน (review surface) เพื่อใช้ตรวจสอบความเข้าใจของ Claude และหากมีความเข้าใจผิดก็จะแก้ในขั้นนี้
- เพราะรีเสิร์ชที่ผิดจะนำไปสู่แผนและการพัฒนาที่ผิด จึงเป็นการป้องกันล่วงหน้าต่อ ปัจจัยความล้มเหลวที่มีต้นทุนสูงที่สุด
- ตัวอย่างเช่น ป้องกันปัญหาอย่างการมองข้ามชั้นแคช, ไม่สะท้อนกฎของ ORM, หรือสร้างลอจิกซ้ำซ้อน
Phase 2: Planning
- หลังทบทวนรีเสิร์ชแล้ว จะให้ Claude เขียน แผนการพัฒนาโดยละเอียด (plan.md)
- รวมถึงโค้ดสไนเป็ตจริง, พาธไฟล์ที่จะต้องแก้, และ trade-off ต่าง ๆ
- ใช้ ไฟล์ markdown ที่จัดการเองได้โดยตรง แทน plan mode ที่มีมาในตัว
- หากให้ reference implementation จากโอเพนซอร์สไปด้วย คุณภาพของแผนที่ Claude เขียนจะดีขึ้นมาก
- สิ่งที่สำคัญยิ่งกว่าตัวเอกสารแผนเอง คือ วงจรการใส่คำอธิบายประกอบ (Annotation) ที่ตามมา
Annotation Cycle
- ผู้เขียนจะเปิด plan.md แล้ว เพิ่มคอมเมนต์ inline ด้วยตัวเองโดยตรง
- เช่น แก้สมมติฐานที่ผิด, ปฏิเสธแนวทาง, หรือเพิ่มความรู้เฉพาะโดเมน
- ตัวอย่าง: “อันนี้ต้องเป็น PATCH”, “ไม่ต้องมีแคช”, “ย้ายฟิลด์ visibility ไปไว้ระดับลิสต์” เป็นต้น
- จากนั้นสั่ง Claude ว่า “ให้อัปเดตเอกสารตามคอมเมนต์ แต่ยังไม่ต้องลงมือพัฒนา”
- จะ วนรอบคอมเมนต์-อัปเดตนี้ 1~6 ครั้ง โดยใช้คำสั่ง “don’t implement yet” เพื่อป้องกันการลงมือเร็วเกินไป
- เอกสาร markdown ทำหน้าที่เป็น สถานะ (state) ที่ใช้ร่วมกันได้ ซึ่งชัดเจนและมีโครงสร้างมากกว่าการสั่งงานแบบสนทนา
- ผ่านการทำซ้ำ แผนทั่วไปจะ ค่อย ๆ พัฒนาเป็นสเปกที่เข้ากับระบบจริงได้อย่างสมบูรณ์
การสร้าง Todo List
- ก่อนลงมือพัฒนา จะให้ Claude เพิ่ม รายการงานย่อย (todo list)
- รวมงานย่อยในแต่ละขั้นเพื่อใช้ติดตามความคืบหน้า
- Claude จะทำเครื่องหมายรายการที่เสร็จแล้ว จึงติดตามสถานะได้ง่ายแม้เป็นเซสชันยาว
Phase 3: Implementation
- เมื่อทุกการตัดสินใจถูกยืนยันแล้ว จึงสั่งให้ลงมือทำด้วยพรอมป์ต์มาตรฐาน
- เช่น “อย่าหยุดจนกว่าจะทำทุก task เสร็จ”, “ห้ามใส่คอมเมนต์ที่ไม่จำเป็น”, “ห้ามใช้ชนิด any/unknown”, “ทำ typecheck อย่างต่อเนื่อง” เป็นต้น
- คำสั่งนี้เป็น ขั้นตอนเชิงกลที่ทำตามแผนตรง ๆ โดยการตัดสินใจเชิงสร้างสรรค์ได้เสร็จสิ้นไปก่อนแล้ว
- หากข้ามแผนแล้วไปลงมือทำทันที ก็จะกลายเป็นการเขียนโค้ดบนสมมติฐานที่ผิด ดังนั้นกฎ “don’t implement yet” จึงเป็นอุปกรณ์นิรภัยหลัก
Feedback During Implementation
- ระหว่างลงมือทำ ผู้เขียนจะเปลี่ยนบทบาทเป็น ผู้กำกับดูแล
- ฟีดแบ็กจะสั้นและชัด เช่น “ฟังก์ชันนี้หายไป”, “ย้ายไปแอป admin” เป็นต้น
- เวลาแก้ฝั่งฟรอนต์เอนด์ อาจใช้คำสั่งสั้น ๆ อย่าง “wider”, “2px gap” หรือใช้สกรีนช็อตร่วมด้วย
- มีการอ้างอิงโค้ดเดิมบ่อยครั้งเพื่อ รักษาความสม่ำเสมอของ UI/UX
- หากไปผิดทิศทาง จะ git revert แล้วลองใหม่โดยลดขอบเขตงานลง ซึ่งได้ผลดีกว่าการค่อย ๆ แก้ต่อจากของที่ผิด
Staying in the Driver’s Seat
- ไม่มอบ อิสระเต็มรูปแบบ ให้ Claude โดยการตัดสินใจสุดท้ายยังเป็นของมนุษย์เสมอ
- สามารถเลือกใช้เพียงบางส่วนจากข้อเสนอของ Claude หรือแก้ไข, ลบ, และกำหนดทางเลือกทางเทคนิคใหม่ได้
- ตัวอย่าง: “อันแรกใช้ Promise.all”, “อันที่สี่กับห้าข้ามไป”
- “เอาฟังก์ชันดาวน์โหลดออก”, “ห้ามเปลี่ยนฟังก์ชันซิกเนเจอร์”, “ให้ใช้เมธอดของไลบรารีที่ระบุ” เป็นต้น
- Claude รับหน้าที่ ลงมือทำเชิงกล, ส่วนมนุษย์รับหน้าที่ ตัดสินใจและจัดลำดับความสำคัญ
Single Long Sessions
- ทำงานต่อเนื่องตั้งแต่รีเสิร์ชไปจนถึงพัฒนาใน เซสชันยาวเพียงเซสชันเดียว
- ระหว่างเซสชัน Claude จะสะสมบริบทอย่างต่อเนื่อง และด้วย auto-compaction ก็ยังรักษาบริบทได้เพียงพอ
- plan.md จะถูก เก็บไว้ในรูปแบบสมบูรณ์ตลอดทั้งเซสชัน และสามารถอ้างอิงได้ตลอดเวลา
สรุปประเด็นสำคัญ
- “อ่านให้ลึก เขียนแผน ขัดเกลาด้วยคอมเมนต์ แล้วค่อยลงมือทีเดียว”
- แม้ไม่มีพรอมป์ต์ซับซ้อนหรือ system instruction พิเศษ ก็ยังคงได้คุณภาพสูงด้วยไปป์ไลน์ที่มีวินัยซึ่ง แยกการคิด (Thinking) ออกจากการพิมพ์ (Typing)
- Research ช่วยกันการแก้ไขแบบไม่รู้จริง, Plan ช่วยกันการแก้ไขที่ผิดทิศ, และ Annotation คือจุดที่ใส่วิจารณญาณของมนุษย์เข้าไป
- การลงมือขั้นสุดท้ายจะ ทำเป็นกระบวนการอัตโนมัติหลังจากที่ทุกการตัดสินใจถูกยืนยันแล้ว จนเกิดเป็นโครงสร้างการทำงานร่วมกันที่มีประสิทธิภาพ
4 ความคิดเห็น
ผมก็เจอปัญหาคล้าย ๆ กันอยู่เรื่อย ๆ เหมือนกันครับ ถ้าร่วมงานกับ AI แบบอิงแชตอย่างเดียว การแตกงานเป็นหน่วยย่อย (WBS), ความคืบหน้า, และบันทึกการตัดสินใจก็มักจะพร่าเลือนไปครับ
พอเอาไฟล์แผนไว้ในรีโปไปเลย แล้วเก็บสิ่งที่ถูกนำไปใช้จากการรันตามแผนนั้นไว้ด้วย ก็ช่วยรักษาคอนเท็กซ์ได้ค่อนข้างดีเลยครับ
เนื้อหานี้ไม่ได้จำกัดอยู่แค่กับ Claude เท่านั้น แต่ดูเหมือนว่าจะสามารถประยุกต์ใช้ได้โดยทั่วไปกับบริการ AI อื่น ๆ ที่ทำงานบน CLI เช่นกัน
ความคิดเห็นจาก Hacker News
ประเด็นสำคัญจริง ๆ ไม่ใช่ว่า “มีการวางแผนหรือไม่” แต่คือ การทำให้สมมติฐานต่าง ๆ ถูกเปิดเผยออกมา ก่อนที่โมเดลจะทำให้มันกลายเป็นโค้ด
LLM มักล้มเหลวไม่ใช่ที่ไวยากรณ์ แต่ที่ ข้อสมมติฐานที่มองไม่เห็น อย่างสถาปัตยกรรมหรือข้อจำกัดต่าง ๆ ดังนั้นแผนที่มีการบันทึกไว้จึงกลายเป็นพื้นผิวสำหรับดีบักข้อสมมติฐานเหล่านั้น
printf()บรรทัดเดียวแล้ว Heisenbug หายไปมีคนบอกว่าต้องใช้คำอย่าง “ลึก ๆ”, “ละเอียด” ถึงจะทำให้ Claude ไม่อ่านแบบผิวเผิน แต่พูดตรง ๆ ว่า ผมไม่เข้าใจโดยสัญชาตญาณเลย ว่าทำไมมันถึงเป็นแบบนั้น
ผมใช้โครงสร้างที่มีเอกสาร 3 ประเภทกับสกิล 2 แบบ
Specs คือเอกสารออกแบบคงที่ของโปรเจกต์, Plans คือแผนการทำงานที่ LLM สร้างขึ้น, และไฟล์ Working memory ใช้ติดตามสถานะความคืบหน้า
ใช้ planner skill ของ Gemini Pro เพื่อสร้างแผนใหม่ และใช้ implementer skill ของ Codex เพื่อเอาไปทำจริง
แบบนี้คอนเท็กซ์จะเบาและโฟกัสมากขึ้น ทำงานได้มีประสิทธิภาพกว่าเดิม แม้ใช้แพ็กเกจ $20 ของ Codex/Gemini ก็ยังเดินงานได้เร็วพอ
ไอเดียการ ใส่คอมเมนต์ไว้ในเอกสารแผนโดยตรง รู้สึกสดใหม่ดี เลยสงสัยว่ามีวิธีเก็บคอมเมนต์พวกนั้นแยกไว้หรือจัดการให้กลับมาทบทวนทีหลังได้ไหม
มีบางอย่างในแนวทางนี้ที่ผมไม่ค่อยชอบ
อย่างแรก วิธี บิ๊กแบง ที่สร้างโค้ดทั้งหมดทีเดียว มักทำให้ได้ก้อนโค้ดขนาดใหญ่ที่เข้าใจยาก ผมคิดว่าการวางแผนและลงมือทำแบบเป็นขั้นจะดีกว่า
อย่างที่สอง แม้จะมีการให้ฟีดแบ็ก แต่กลับ ไม่อัปเดต knowledge base น่าเสียดาย ควรบันทึกสาเหตุของข้อผิดพลาดไว้เพื่อไม่ให้ซ้ำอีกครั้ง
สุดท้าย ไม่มีการพูดถึงเรื่องการทดสอบเลย ควรมี Test-Driven Development (TDD) อย่างน้อยบางส่วน น่าสนใจว่าแนวทางพัฒนาที่มี AI ช่วยจะผสานกับวิธีการแบบนี้อย่างไร
เวิร์กโฟลว์นี้จริง ๆ แล้วคือ วิธีมาตรฐานของ Claude Code ที่ Anthropic แนะนำ แต่ข้อเสียคือถ้าแผนไม่สมบูรณ์ก็ต้องเริ่มใหม่ตั้งแต่ต้น
เพราะงั้นผมเลยแบ่ง ออกแบบ → วางแผน → ลงมือทำ ออกเป็นหลายแบตช์ ถ้าแบ่งแผนเป็นหน่วยละไม่เกิน 1,500 บรรทัด จะควบคุมความซับซ้อนได้ง่ายกว่า
แอป 30,000 LOC ของผมมีแผนรวม 100,000 บรรทัด จะให้ทำทีเดียวเป็นไปไม่ได้
ผมไม่ได้ยึด plan.md เป็นหลัก แต่เน้น scaffold ที่รันได้กับ validation loop มากกว่า
ผมสร้างระบบชำระเงินจริงชื่อ Kolibri Tickets ร่วมกับ AI และหัวใจสำคัญไม่ใช่ให้โมเดลพิมพ์โค้ดได้เร็ว แต่คือ ออกแบบ validation loop ให้ดี
แบบนี้จะทำให้ส่งขึ้นใช้งานได้เร็วขึ้นจริง ไม่ใช่แค่ “ภาพลวงตาเรื่องความเร็ว” เอกสาร Plan เป็นวิธีหนึ่งในการรักษาสถานะร่วมกัน และ harness ที่ตรวจสอบได้ ก็เป็นอีกวิธีหนึ่ง
ผมใช้ Claude Code เพื่อ เตรียมการสอน
เขียนโน้ตการสอนด้วย Quarto แล้วให้ Claude แปลงเป็น สไลด์ Slidev จากนั้นก็ใส่คอมเมนต์ในสไลด์เพื่อให้ฟีดแบ็ก เช่น “อันนี้แยกเป็นสองสไลด์”, “ตรงนี้เพิ่มรูปภาพ”
ฟีดแบ็กแบบ คอมเมนต์บนตัวเอกสาร ทรงพลังมาก ช่วยได้มากทั้งเรื่องระยะห่างของโทเค็นและการคงบริบท
# เปลี่ยนส่วนนี้เป็น Xตอนนี้มีเครื่องมืออย่าง Kiro ของ Amazon, Antigravity ของ Google, Spec Kit ของ GitHub และ OpenSpec ที่มีฟังก์ชันลักษณะนี้อยู่แล้ว
ความล้มเหลวที่แพงที่สุดของการเขียนโค้ดแบบมี AI ช่วย ไม่ใช่ syntax error แต่คือ การนำไปใช้ที่บางส่วนทำงานได้ดี แต่พังทั้งระบบโดยรวม
เพราะงั้นผมเลยเพิ่ม brief.md ตั้งแต่ต้น เพื่อระบุการนิยามปัญหา ตัวชี้วัดเป้าหมาย และเกณฑ์หยุดทำฟีเจอร์ แบบนี้จะช่วยลดต้นทุนจากความไม่สอดคล้องกันระหว่างเป้าหมายทางธุรกิจกับการลงมือทำทางเทคนิค