ตัวอย่าง input/output ชนะคำอธิบายเป็นร้อยแก้ว
แนวคิด
เมื่อเราอยากสื่อว่าต้องการ transformation แบบไหน การอธิบายเป็นร้อยแก้วมักถูกตีความไม่สม่ำเสมอ เพราะภาษาธรรมชาติกำกวม คำว่า "จัดรูปแบบให้เรียบร้อย" หรือ "แปลงข้อมูลให้ถูก" เปิดช่องให้เดาได้หลายทาง วิธีที่ได้ผลกว่าคือให้ตัวอย่าง input กับ output ที่เป็นรูปธรรมสองถึงสามคู่ ตัวอย่างบอกสิ่งที่คำบรรยายบอกไม่ได้ คือขอบเขตและ edge case ที่แท้จริง
หลักนี้ต่อยอดมาจากการให้ verification criteria ที่ชัด แทนที่จะสั่งลอย ๆ ว่า "เขียนฟังก์ชัน validate อีเมล" ให้ระบุ example test case ไปด้วย เช่น user@example.com ต้องได้ true, invalid ต้องได้ false, user@.com ต้องได้ false ตัวอย่างเหล่านี้ตรึงพฤติกรรมที่คาดหวังให้ Claude เห็นชัดตั้งแต่ต้น แล้วสั่งให้รันเทสต์หลัง implement เพื่อให้มันวนแก้เองจนผ่าน
ทำไมสำคัญ
เหตุผลที่ตัวอย่างทรงพลังคือมันปิดช่องว่างระหว่าง "สิ่งที่เราคิด" กับ "สิ่งที่เราเขียน" คำบรรยายเป็นร้อยแก้วเก็บ intent ได้ไม่ครบ พอ Claude ตีความต่าง ผลลัพธ์ก็เพี้ยน การให้ตัวอย่างที่ครอบกรณีปกติและกรณีมุมทำให้ Claude generalize ไปยัง input ใหม่ ๆ ที่หน้าตาคล้ายกันได้ ไม่ใช่แค่แมตช์กรณีที่เราระบุตรง ๆ
จุดที่ได้ผลชัดคือการแก้ edge case ที่พลาดบ่อย เช่นค่า null ใน migration script แทนที่จะบอกว่า "จัดการ null ให้ดีขึ้น" ให้ยกตัวอย่างเจาะจงว่า input ที่มีฟิลด์เป็น null ควรออกมาเป็นอะไร Claude จะเข้าใจกฎที่เราต้องการทันที ตัวอย่างจึงเป็นเครื่องมือ iterative refinement ที่ประหยัดรอบการแก้ เพราะแทนที่จะอธิบายซ้ำหลายรอบว่าทำไมผลยังไม่ตรง เราชี้ด้วยคู่ input/output ที่ต้องการแล้วปล่อยให้มันปรับเข้าหาเป้า
ตัวอย่าง
❌ กำกวม
"เขียนฟังก์ชันแปลงหน่วยวัดที่ไม่เป็นทางการให้เป็นตัวเลข"
✅ มีตัวอย่าง input/output เป็นรูปธรรม
"เขียนฟังก์ชัน parseAmount แปลงข้อความหน่วยวัดเป็นกรัม ตัวอย่าง:
'2 ช้อนโต๊ะ' → 30
'หยิบมือ' → 2
'250g' → 250
'' → 0 (input ว่างคืน 0 ไม่ throw)
เขียนเทสต์ครอบทั้งสี่กรณีนี้ แล้วรันให้ผ่านก่อนบอกว่าเสร็จ"
เช็คความเข้าใจ
ทำไมตัวอย่าง input/output จึงสื่อความต้องการได้ดีกว่าคำอธิบายเป็นร้อยแก้ว
เวลาจะแก้ edge case ที่พลาด เช่นค่า null ควรสื่อกับ Claude อย่างไร