สัปดาห์ที่ 06 · Code Literacy with AI

สั่ง AI จาก Spec

อ่านได้แล้ว · แก้ได้แล้ว · สัปดาห์นี้เป็นขั้นสุดของ Code Literacy — "เริ่มจากศูนย์" · เขียน spec → ให้ AI สร้าง → ทดสอบ → ปรับ จนได้โปรแกรมที่ทำงานได้จริง

เป้าหมายสัปดาห์นี้

🔒 ทำไม "เขียน spec" คือทักษะที่ AI ทำให้คุณไม่ได้ AI "เขียน code" ได้ดีมาก · แต่ AI ไม่รู้ว่าคุณต้องการอะไร · ถ้า spec เขียนไม่ชัด — AI จะเดามั่ว · ถ้า spec ดี — AI จะสร้าง code ที่ใกล้ "พร้อมใช้" ทันที · ค่าของคุณ = ความชัดของ spec · ทักษะนี้สำคัญที่สุดในยุค AI

🎯 Running Case — ขั้นสุดของ Grading App (W04→W05→W06→W07)

W04: อ่าน code · W05: แก้ code · W06: เขียน spec ใหม่จากศูนย์ → ให้ AI สร้าง · W07: ใช้ workflow นี้สร้าง CLI 3 ตัว

flowchart LR W04[W04
อ่านโค้ด
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"

flowchart LR spec["1. Spec
คุณเขียน · ชัด + มีขอบเขต"] 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 มั้ย

def get_input(): bill = float(input("bill total (THB): ")) tip = int(input("tip percent (0-30): ")) n = int(input("num people: ")) return bill, tip, n def validate(bill, tip, n): if bill <= 0: return False, "bill ต้องเป็นบวก" if tip < 0 or tip > 30: return False, "tip ต้อง 0-30%" if n < 1: return False, "ต้องมีคนอย่างน้อย 1" return True, "" def calculate(bill, tip, n): tip_total = bill * tip / 100 grand = bill + tip_total per_person = grand / n return { "tip_total": round(tip_total, 2), "grand_total": round(grand, 2), "per_person": round(per_person, 2), } bill, tip, n = get_input() ok, err = validate(bill, tip, n) if not ok: print(f"❌ {err}") else: r = calculate(bill, tip, n) print(f"💰 ทิปรวม: {r['tip_total']:.2f} THB") print(f"💵 รวมจ่าย: {r['grand_total']:.2f} THB") print(f"👥 คนละ: {r['per_person']:.2f} THB ({n} คน)")

🧪 ลอง edge case: เปลี่ยน tip เป็น 50 · ต้องเห็น ❌ tip ต้อง 0-30% ตาม spec

🎯 ขั้นที่ 4 — Test จริง

อย่าเชื่อ AI ว่าโปรแกรมทำงานได้ — รันทุก test case จากแผน · ถ้าไม่ผ่าน:

  1. บอก AI ว่าเคสไหนไม่ผ่าน — "Test 4 ไม่ผ่าน · เมื่อ tip=50 โปรแกรมยังคำนวณต่อ ไม่ขึ้น error"
  2. ขอให้แก้เฉพาะเคสนั้น — "แก้ validation ให้ตรง · อย่าเปลี่ยน code ส่วนอื่น"
  3. รันใหม่ทุกเคส — เพื่อเช็คว่าแก้แล้วไม่พังเคสอื่น
  4. 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 ใหม่
กฎทอง — Distrust + Verify AI เก่งกว่านักศึกษาปี 1 ในการเขียน Python · แต่ AI เก่งกว่า ในการ "พูด confident เมื่อผิด" ด้วย · กฎคือ "ไม่เชื่อจนกว่าจะรัน + เห็นผลด้วยตา"

📝 ตรวจ Spec ของคุณ — Spec Quality Scorecard

ก่อนสั่ง AI ให้สร้าง — ตรวจ spec ก่อนเสมอ · Scorecard เช็ค 8 criteria + ภาษากำกวม · ลอง "spec ตัวอย่าง" ก่อน แล้วลองวาง spec ของคุณ

เป้า — ก่อนคุยกับ AI ต้องได้คะแนน ≥ 75% ถ้ายัง < 75% — แก้ spec ก่อน · AI จะให้ output ดีกว่ามาก · ทางลัด: กด "ลอง spec ตัวอย่าง" เพื่อดูว่า spec ที่ดีต้องมีอะไรบ้าง

🧪 Workshop — Build 2 Programs from Scratch

  1. เลือก 1 ปัญหาเล็ก ๆ จาก W01 — แค่ที่ทำได้ใน 1 ไฟล์ Python · เช่น "เครื่องคิดเลข BMI", "ตัวสุ่มจับคู่ทีม", "บันทึกค่าใช้จ่ายรายวัน"
  2. เขียน spec ตาม template — ให้ครบทุก section · อย่าข้าม Non-goals
  3. ส่ง spec ขอ AI "วางแผน" — รับ plan + คำถาม → ตอบคำถามให้ครบ
  4. สั่งให้ AI เขียน code — อ่าน code ให้เข้าใจ
  5. รัน test cases ทุกเคส — บันทึกผลใน test-results.md
  6. ถ้ามี case ไม่ผ่าน → ขอ AI แก้ — แล้วรันใหม่
  7. commit + push GitHub — เพิ่ม README.md อธิบายว่าโปรแกรมทำอะไร
  8. ทำซ้ำกับโปรแกรมที่ 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 กว้างเกิน → AI เดามั่ว "ทำระบบจองห้อง" — กว้างเกิน · กำหนดทีละชิ้น "CLI ที่รับการจอง 1 รายการแล้วเซฟลง JSON"
Test แค่ happy path ใส่เคสปกติแล้วได้ผลถูก → คิดว่าใช้ได้ · ต้อง test edge case เสมอ (input ผิด, ค่าว่าง, ค่ามาก)
"ขอ AI เพิ่ม feature ต่อ ๆ ไป" โดยไม่แก้ spec → code รก, ไม่ตรง spec · เพิ่ม feature = update spec ก่อน

ส่งงานสัปดาห์นี้

Reference จาก slide เดิม

เนื้อหานี้ขยาย Topic 11 — GenAI in Coding โดย Mainidea ให้กลายเป็น core skill ของยุค AI ไม่ใช่ topic ปิดท้าย