สั่ง AI จาก Spec
อ่านได้แล้ว · แก้ได้แล้ว · สัปดาห์นี้เป็นขั้นสุดของ Code Literacy — "เริ่มจากศูนย์" · เขียน spec → ให้ AI สร้าง → ทดสอบ → ปรับ จนได้โปรแกรมที่ทำงานได้จริง
เป้าหมายสัปดาห์นี้
- เขียน spec ที่ชัดเจน ก่อนสั่ง AI · ตรวจกับ Scorecard ก่อนใช้
- ขอให้ AI "วางแผนก่อน" ไม่ใช่เขียน code ทันที
- ทดสอบโปรแกรมที่ AI สร้าง ก่อนเชื่อ
- จับ AI hallucination ระดับเบาได้
🎯 Running Case — ขั้นสุดของ Grading App (W04→W05→W06→W07)
W04: อ่าน code · W05: แก้ code · W06: เขียน spec ใหม่จากศูนย์ → ให้ AI สร้าง · W07: ใช้ workflow นี้สร้าง CLI 3 ตัว
อ่านโค้ด
passive] --> W05[W05
แก้โค้ดเล็ก ๆ
reactive] W05 --> W06["W06 (ตอนนี้)
เริ่มจาก spec
proactive"] W06 --> W07[W07
build 3 tools
repeatable] classDef past fill:#0b1020,stroke:#6b748c,color:#9aa3b8 classDef current fill:#3b2962,stroke:#ec4899,stroke-width:3px,color:#fff classDef future fill:#0b1020,stroke:#6b748c,color:#9aa3b8 class W04,W05 past class W06 current class W07 future
วงจร "Spec → Plan → Code → Test"
คุณเขียน · ชัด + มีขอบเขต"] plan["2. Plan
AI วาง · คุณตรวจ"] code["3. Code
AI เขียน · คุณอ่าน"] test{"4. Test
ผ่านมั้ย?"} done([✅ Done]) spec --> plan --> code --> test test -->|Yes| done test -->|"No · code bug"| code test -->|"No · ใช้ wrong assumption"| plan test -->|"No · spec ไม่ชัด"| spec classDef human fill:#0d3f3a,stroke:#34d399,color:#fff classDef ai fill:#3b2962,stroke:#8b5cf6,color:#fff classDef decision fill:#5c2618,stroke:#ff7a18,color:#fff classDef ok fill:#064e3b,stroke:#34d399,stroke-width:2px,color:#fff class spec human class plan,code ai class test decision class done ok
🟢 งานของ คน · 🟣 งานของ AI · 🟠 จุดตัดสินใจ — สังเกตว่า "ไม่ผ่าน" วนกลับขั้นที่ เหมาะสม ไม่ใช่ขั้น Code เสมอ
📝 Spec Template — ใช้ได้ทุกโจทย์
## Spec: [ชื่อโปรแกรม]
**ปัญหา / เป้าหมาย:**
[1-2 ประโยค ว่าใครเดือดร้อนกับอะไร ใช้แล้วจะแก้ได้ยังไง]
**Input:**
- [field 1: ชื่อ, ชนิด, ตัวอย่าง]
- [field 2: ...]
**Output:**
- [แสดงอะไร, format ไหน]
**Rules / Logic:**
- ถ้า X → ทำ Y
- ถ้า A และ B → ทำ C
- ห้าม [edge case]
**Constraints:**
- ทำงานบน Python 3.11+
- ไม่ใช้ library นอก (เว้นแต่ระบุ)
- ทำงานบน command line (ยังไม่ทำ UI)
**Success Criteria:**
- รันแล้วไม่ error เมื่อ input ถูกต้อง
- แสดง error message ที่ดีเมื่อ input ผิด
- [acceptance test ที่เฉพาะกับโจทย์]
**Non-goals:**
- ยังไม่บันทึกลงไฟล์ (เก็บใน memory พอ)
- ยังไม่ทำ GUI
**Example session:**
> กรอกคะแนน: 78
> เกรด: B
ตัวอย่างเต็ม — "Tip Calculator"
## Spec: Tip Calculator
**ปัญหา:**
กลุ่มเพื่อนกินข้าวกัน 4 คน อยากแบ่งบิลรวมทิป — ต้องการเครื่องมือคำนวณเร็ว ๆ ในมือถือ
แต่ตอนนี้ยังทำเป็น CLI พอ
**Input:**
- bill_total: float, เช่น 1450.00
- tip_percent: int, เช่น 10
- num_people: int, เช่น 4
**Output:**
- ทิปรวม (THB)
- รวมที่ต้องจ่าย
- คนละเท่าไหร่
**Rules:**
- tip_percent อยู่ระหว่าง 0-30 เท่านั้น
- num_people ต้อง >= 1
- ถ้า input ผิด → print "❌ ค่าไม่ถูกต้อง" แล้วจบโปรแกรม
**Success:**
- เคสปกติ: bill=1450, tip=10%, n=4 → ทิป 145, รวม 1595, คนละ 398.75
- เคสไม่ผ่าน: tip=50 → แจ้ง error
**Non-goals:**
- ยังไม่เก็บ history
- ยังไม่ split unevenly
🎯 ขั้นที่ 2 — ขอ AI "วางแผน" ก่อนเขียน code
นักศึกษาปี 1 มักทำผิด: copy spec ไป paste ใน AI แล้วถาม "เขียน code ให้หน่อย" · AI จะเดาทันที ผลคือ "ใกล้แต่ไม่ตรง" · ทำให้ตรงด้วยการขอ plan ก่อน
ตัวอย่าง prompt ที่ดี
นี่คือ spec ของ Tip Calculator: [paste spec]
ก่อนเขียน code ขอ:
1. List โครงสร้าง function ที่จะมี (ชื่อ + parameter + return)
2. แผน validate input
3. test cases ที่จะรันตรวจ (อย่างน้อย 5 เคส รวม edge case)
4. คำถามที่ฉันยังตอบไม่ครบใน spec
อย่าเขียน code ในรอบนี้
AI อาจตอบ
**โครงสร้าง functions:**
- get_input() → returns (bill, tip_percent, num_people)
- validate(bill, tip, n) → returns (ok: bool, error: str)
- calculate(bill, tip, n) → returns dict {tip_total, grand_total, per_person}
- print_result(result) → no return
**Validate plan:**
- bill > 0
- 0 <= tip <= 30
- n >= 1
**Test cases:**
1. ปกติ: 1450, 10, 4 → ทิป 145, รวม 1595, คนละ 398.75
2. ทิป 0%: 100, 0, 2 → ทิป 0, รวม 100, คนละ 50
3. 1 คน: 200, 15, 1 → คนละ 230
4. tip มากกว่า 30 → error
5. คน 0 → error
6. bill ติดลบ → error
**คำถามที่ยังไม่ชัด:**
- ปัดเศษคนละเท่าไหร่ทศนิยม 2 หรือ 0?
- ใช้สกุลเงิน THB เท่านั้น หรือ flexible?
เห็นมั้ย — AI ถามคำถามดี ๆ ที่ คุณยังไม่ได้คิด · ตอบเสร็จแล้วค่อยให้ เขียน code
🎯 ขั้นที่ 3 — สั่งให้เขียน code
ใช้แผนข้างบน + คำตอบของคำถาม:
- ปัดเศษทศนิยม 2
- THB only
เขียน Python 3.11 ครบทุก function · มี if __name__ == "__main__"
· อย่าใช้ library นอก · code < 60 บรรทัด
AI จะเขียน · คุณอ่านดูว่า "ตรงกับ plan ที่ตกลงกันมั้ย"
🐍 รัน Tip Calculator (ที่ AI สร้าง)
ลองรัน reference implementation ที่ AI สร้างจาก spec นี้ · ใส่ bill, tip%,
num_people ใน Input — ดูว่า output ตรงกับ Success criteria มั้ย
🧪 ลอง edge case: เปลี่ยน tip เป็น 50 · ต้องเห็น ❌ tip ต้อง 0-30% ตาม spec
🎯 ขั้นที่ 4 — Test จริง
อย่าเชื่อ AI ว่าโปรแกรมทำงานได้ — รันทุก test case จากแผน · ถ้าไม่ผ่าน:
- บอก AI ว่าเคสไหนไม่ผ่าน — "Test 4 ไม่ผ่าน · เมื่อ tip=50 โปรแกรมยังคำนวณต่อ ไม่ขึ้น error"
- ขอให้แก้เฉพาะเคสนั้น — "แก้ validation ให้ตรง · อย่าเปลี่ยน code ส่วนอื่น"
- รันใหม่ทุกเคส — เพื่อเช็คว่าแก้แล้วไม่พังเคสอื่น
- Commit ทันที — เพราะนี่คือเวอร์ชันที่ ทำงานได้
🚨 AI Hallucination — รูปแบบที่พบบ่อย
| ลักษณะ | สัญญาณ | วิธีจับ |
|---|---|---|
| เพิ่ม feature ที่ไม่ขอ | code มี "advanced" stuff ที่ไม่อยู่ใน spec | เทียบกับ spec บรรทัดต่อบรรทัด |
| import library ที่ไม่จำเป็น | เห็น import pandas ใน Tip Calc | ใช่เปล่า ลบทิ้ง |
| ใช้ function ที่ไม่มีจริง | math.calculate_tip() | รัน — error |
| โค้ดที่ดู ok แต่ logic ผิด | ปัดเศษผิด, off-by-one | รัน test case |
| "ทำเสร็จแล้ว!" ทั้งที่ไม่ครบ | AI พูด confident แต่ขาด case | ตรวจ spec ทุกข้อ |
| หลงทาง — ตอบคนละโจทย์ | เปลี่ยนเรื่องไปทำอย่างอื่น | ขอ restart พร้อม spec ใหม่ |
📝 ตรวจ Spec ของคุณ — Spec Quality Scorecard
ก่อนสั่ง AI ให้สร้าง — ตรวจ spec ก่อนเสมอ · Scorecard เช็ค 8 criteria + ภาษากำกวม · ลอง "spec ตัวอย่าง" ก่อน แล้วลองวาง spec ของคุณ
🧪 Workshop — Build 2 Programs from Scratch
- เลือก 1 ปัญหาเล็ก ๆ จาก W01 — แค่ที่ทำได้ใน 1 ไฟล์ Python · เช่น "เครื่องคิดเลข BMI", "ตัวสุ่มจับคู่ทีม", "บันทึกค่าใช้จ่ายรายวัน"
- เขียน spec ตาม template — ให้ครบทุก section · อย่าข้าม Non-goals
- ส่ง spec ขอ AI "วางแผน" — รับ plan + คำถาม → ตอบคำถามให้ครบ
- สั่งให้ AI เขียน code — อ่าน code ให้เข้าใจ
-
รัน test cases ทุกเคส
— บันทึกผลใน
test-results.md - ถ้ามี case ไม่ผ่าน → ขอ AI แก้ — แล้วรันใหม่
- commit + push GitHub — เพิ่ม README.md อธิบายว่าโปรแกรมทำอะไร
- ทำซ้ำกับโปรแกรมที่ 2 — โจทย์อื่น
💬 ตัวอย่าง Prompt ดี vs ไม่ดี
| ❌ ไม่ดี | ✅ ดี |
|---|---|
| "เขียนเครื่องคิดเลข" | "เขียนเครื่องคิดเลข Python CLI สำหรับนักศึกษาคำนวณ BMI · รับน้ำหนัก kg + ส่วนสูง cm · ปัดทศนิยม 1 · บอก category WHO (underweight/normal/overweight/obese) · ใช้ Python 3.11 ไม่มี library นอก" |
| "ทำให้มันทำงาน" | "Test case 3 ไม่ผ่าน: เมื่อใส่ความสูง 0 ควรขึ้น error แต่โปรแกรม crash · ช่วยแก้ validation ไม่ต้องเปลี่ยน logic ส่วนอื่น" |
| "เพิ่ม feature นั้นด้วย" | "เพิ่ม feature: บันทึกประวัติ BMI ลง history.txt ทุกครั้งที่คำนวณ · บรรทัดละ 1 entry format: 'YYYY-MM-DD HH:MM | bmi=X | category=Y' · เพิ่ม non-goal: ยังไม่ทำ search/filter" |
ข้อผิดที่พบบ่อย
ส่งงานสัปดาห์นี้
- 📄 spec.md × 2 (โปรแกรม 1, โปรแกรม 2)
- 🐍 code.py × 2 ที่ทำงานได้
- 📋 test-results.md ทุกเคส ผ่าน/ไม่ผ่าน
- 📁 GitHub repo มี README.md + screenshot การรัน
Reference จาก slide เดิม
เนื้อหานี้ขยาย Topic 11 — GenAI in Coding โดย Mainidea ให้กลายเป็น core skill ของยุค AI ไม่ใช่ topic ปิดท้าย