แก้ไข + ต่อยอดโค้ด AI
ตอนนี้คุณอ่านโค้ดได้แล้ว — สัปดาห์นี้คือ "แก้ทีละนิด" · เปลี่ยนเงื่อนไข, เพิ่มข้อมูล, รวมหลายโปรแกรม — เรียน syntax โดย ลงมือแก้จริง ไม่ใช่ท่องตำรา
เป้าหมายสัปดาห์นี้
- เปลี่ยนค่า / เงื่อนไข / output ของโปรแกรม AI ได้
- เพิ่ม feature เล็ก ๆ (เพิ่ม field, เพิ่ม case, เพิ่ม print) ได้
- ใช้ Cursor Ctrl+K ให้ AI แก้ inline + ดู diff ก่อนรับ
- ทำ regression test — เช็คว่าของเดิมยังทำงานหลังแก้
- เจอ error และอ่านมันออก
- ใช้ git commit หลังทุกการแก้ที่สำเร็จ
🎯 Running Case — ต่อยอด Grading App ของพี่นัท
ใน W04 เราอ่าน code ของ Grading App แล้ว · สัปดาห์นี้ แก้ + ต่อยอด · ความจริงคือ — ในงานจริง 90% ของเวลาคุณใช้แก้ code ที่มีอยู่ ไม่ใช่เขียนใหม่
📊 4 ระดับของการแก้โค้ด (Modification Pyramid)
ไม่ใช่ทุกการแก้ "ยากเท่ากัน" · จัดเป็น 4 ระดับ — เริ่มจากระดับต่ำสุด ปลอดภัยที่สุด · ไต่ขึ้นเมื่อมั่นใจ
เปลี่ยนวิธีคำนวณ · เปลี่ยน format
⚠️ ต้อง regression test"] L3["Level 3: รวมหลาย program
function + list + dict + loop ผสมกัน
เริ่มซับซ้อน"] L2["Level 2: เพิ่ม case / field
เพิ่ม condition · field ใหม่ใน dict
ปานกลาง"] L1["Level 1: เปลี่ยนค่า / ข้อความ
เลข · string · ไม่แตะ logic
✅ ปลอดภัยสุด"] L1 --> L2 --> L3 --> L4 classDef safe fill:#064e3b,stroke:#34d399,color:#fff classDef mid fill:#3d2c1a,stroke:#ffd43b,color:#fff classDef risky fill:#3b2962,stroke:#8b5cf6,color:#fff classDef dangerous fill:#5c1818,stroke:#ef4444,color:#fff class L1 safe class L2 mid class L3 risky class L4 dangerous
🟢 Level 1 = แก้ไม่พลาด · 🔴 Level 4 = ต้องทดสอบหนัก เพราะอาจพังของเดิม
หลักคิด — "Small Steps, Always Working"
กฎสำคัญที่นักศึกษาปี 1 มักทำผิด: "พยายามแก้หลายอย่างพร้อมกัน" · ผลคือ code เสีย แล้วไม่รู้ว่าตรงไหน · กฎคือ:
ทุก commit คือ save point ที่ปลอดภัย — ย้อนกลับได้เสมอ
🟢 Level 1 — เปลี่ยนค่า / ข้อความ
เริ่มจากการแก้ที่ ปลอดภัยที่สุด — เปลี่ยน string หรือเลข · ไม่แตะ logic
ตัวอย่าง: เปลี่ยนเกณฑ์ + เพิ่มเกรด A+
ดู diff ทางขวา — เปลี่ยนแค่ "เลข + ข้อความ" · structure ของ if/elif เหมือนเดิม
การเปลี่ยนแค่ค่าตัวเลขกับข้อความ — "ทำไม่พลาด" · เริ่มฝึก git commit ตรงนี้
🟡 Level 2 — เพิ่ม case / field ใหม่
ตัวอย่าง: เพิ่มเกรด "I" สำหรับคะแนนติดลบ
if บรรทัดแรกของ Before กลายเป็น elif ใน After ·
ถ้าลืมเปลี่ยนตัวนี้ — code จะรันได้ "แต่ผลผิด" เพราะ score >= 80 ก็จะเป็น A
แม้คะแนน < 0 (ตรวจไม่เจอ I) · นี่คือเหตุที่ต้องใช้ Diff Viewer ดูทุก change
ตัวอย่าง: เพิ่ม field "email" ใน student dict
🟣 Level 3 — รวม 2 โปรแกรม
เอา grade_calc.py มารวมกับ pass_count.py — สร้างโปรแกรมที่:
- รับ list ของคะแนน
- คำนวณเกรดทุกคน
- นับจำนวนแต่ละเกรด
ตรงนี้คุณ ผสม 4 อย่างแล้ว: function, list, dict, loop · นี่คือ "Level 3"
🔴 Level 4 — แก้ behavior
ขั้นนี้ ยากที่สุด เพราะต้องเข้าใจ flow จริง — เช่น เปลี่ยนวิธีคำนวณ, เปลี่ยน output format
ตัวอย่าง: ใช้ค่าเฉลี่ยถ่วงน้ำหนัก
⌨️ Cursor Ctrl+K — ให้ AI แก้ Inline (Level 1-2 ของ AI-assisted edit)
Cursor มี shortcut พิเศษ Ctrl+K (Mac: Cmd+K) ที่ "แทรก AI ที่ตำแหน่ง cursor" — แทนที่จะ copy-paste ใน chat → ทำงานเร็วกว่าเดิม 5 เท่า
Workflow แนะนำ
- เลือก code ที่อยากแก้ — ไฮไลต์บรรทัดที่ต้องการแก้ใน editor
- กด Ctrl+K — กล่อง prompt จะลอยขึ้นมาเหนือ selection
- พิมพ์ instruction สั้น ๆ — เช่น "เพิ่ม A+ สำหรับ ≥ 85" หรือ "แก้ให้รับ float ด้วย"
- กด Enter — รอ AI AI จะแสดง "diff overlay" (เขียว/แดง) แสดงสิ่งที่จะเปลี่ยน
- กด Accept (✓) หรือ Reject (✗) — "อ่าน diff ให้ละเอียดก่อนรับเสมอ" · นี่คือจุดที่คุณรับผิดชอบ
- รัน + commit — ถ้าใช้ได้ → git commit · ถ้าพัง → Ctrl+Z ทันที
✅ Regression Test — เช็คว่าของเดิมยังทำงาน
Regression = "ถอยหลัง" · Regression test = ตรวจว่า "feature เก่ายังทำงาน" หลังจากเพิ่ม feature ใหม่ · ทุกครั้งที่แก้ code ต้องถามตัวเอง: "input ที่เคยได้ผลถูก ตอนนี้ยังถูกอยู่มั้ย?"
วิธีง่ายที่สุด — เขียน test list ก่อนแก้
# ก่อนแก้ — บันทึก expected behavior
calc_grade(85) → "A"
calc_grade(75) → "B"
calc_grade(45) → "F"
calc_grade(0) → "F"
# หลังแก้ Level 2 (เพิ่ม case I) — ต้องผ่านเดิม + case ใหม่
calc_grade(85) → "A" ✅ ของเดิมยังถูก
calc_grade(75) → "B" ✅
calc_grade(45) → "F" ✅
calc_grade(0) → "F" ✅
calc_grade(-5) → "I" ✅ ของใหม่ใช้ได้
กฎเหล็ก: ก่อน commit ทุกครั้ง — รัน test ทุกตัวที่เคยมี · ถ้ามีตัวไหนพัง = "คุณทำของเดิมพังโดยไม่รู้ตัว"
🕵️ จับ AI เมื่อมัน "แก้เกิน" (Over-modification)
AI ชอบช่วย "เกินที่ขอ" · ขอแก้บรรทัดเดียว — มันเปลี่ยน 5 อย่าง · Diff Viewer คือเครื่องมือจับ
ตัวอย่าง: ขอ AI แก้ "เพิ่ม case I" แต่ AI ทำเกิน
- Rename function — ทุกที่ที่เรียก
calc_grade()จะพังหมด - เปลี่ยน return type จาก string → dict — caller ที่คาด string ก็พัง
- เพิ่ม type hints — ไม่ได้ขอ · ถ้าอยากได้ ค่อยขอแยก
5 pattern ของ AI ที่ "ทำเกิน"
| Pattern | วิธีจับ |
|---|---|
| Rename ตัวแปร / function | ดู diff — ชื่อเปลี่ยนทุกที่ |
| เปลี่ยน return type | ดูบรรทัด return — type เดิมกับใหม่ตรงกัน? |
| เพิ่ม import / library | ดูส่วนบน — import ใหม่โผล่มั้ย |
| เพิ่ม error handling ที่ไม่ขอ | ดู try/except ที่ไม่เคยมี |
| Refactor structure | ดูถ้าจำนวน function เพิ่ม / ลด |
🐞 อ่าน Error Message ให้เป็น — Error Anatomy
หลีกเลี่ยงไม่ได้ — เมื่อแก้ code คุณจะเจอ error · มันไม่น่ากลัวถ้าอ่านเป็น
กายวิภาคของ Python Error
Traceback (most recent call last): ← ② "เกิด error ที่ขั้นไหน"
File "grade.py", line 12, in <module>
print(scor) ← ③ บรรทัด code ที่พัง
NameError: name 'scor' is not defined ← ① "ชนิด error" + "รายละเอียด"
วิธีอ่าน:
- อ่านบรรทัดสุดท้ายก่อน — บอก type + reason
- ดูชื่อ error — NameError / TypeError / SyntaxError ฯลฯ
- ดู file + line — ตามขึ้นไปดู code ที่บรรทัดนั้น
- เข้าใจ "ทำไม" — error message มักบอกตรง ๆ ถ้าอ่านช้า ๆ
5 Error ที่นักศึกษาเจอบ่อยที่สุด
| Error | แปลว่า | ตัวอย่าง | วิธีแก้ |
|---|---|---|---|
NameError |
ใช้ตัวแปรที่ยังไม่ได้สร้าง | print(scor) ทั้งที่ตัวแปรชื่อ score |
เช็ค typo · ดูว่าตัวแปรประกาศก่อนใช้ |
TypeError |
ใช้ type ผิด | "5" + 3 (str + int) |
แปลง type ก่อน: int("5") + 3 |
SyntaxError |
เขียนผิดไวยากรณ์ | ลืม : หลัง if |
ดูบรรทัดที่ Python ชี้ · ปกติคือลืม : / ) / " |
IndentationError |
เยื้องผิด | code ใน if ไม่เยื้อง |
เยื้อง 4 space (กด Tab) · ห้ามผสม tab + space |
KeyError |
คีย์ใน dict ไม่มี | student["age"] ไม่มี field age |
ใช้ .get("age") · หรือเช็ค "age" in student |
ลองรัน + แก้ error ด้วยตัวเอง
code นี้มี 3 error · ลอง Run → อ่าน error → แก้ → Run อีก จนผ่าน
🔓 เฉลย (พยายามแก้เองก่อน!)
def calc_grade(score)ขาด:ท้ายบรรทัด → SyntaxErrorelse:ตามด้วยreturn "F"ที่ไม่เยื้อง → IndentationError (ต้องเยื้อง 4 space)print(grad(...))ใช้gradแทนcalc_grade· จริง ๆ ไม่ต้อง wrap →print(calc_grade(int(score)))
🧪 Workshop — 15 การแก้ใน 1 สัปดาห์
เอา 4 โปรแกรมจาก W04 มา แก้ทั้งหมด 15 ครั้ง · commit ทุกครั้งที่ทำสำเร็จ
- grade_calc.py — แก้เกณฑ์เป็น A+/A/B+/B/C+/C/D/F (8 ระดับ แทน 5 ระดับ)
- grade_calc.py — เพิ่ม case "I" สำหรับคะแนน < 0
- grade_calc.py — แสดง emoji 🎉 ถ้าได้ A/A+
- grade_calc.py — รับคะแนนหลายตัวคั่นด้วยจุลภาค (เช่น "85, 72, 91") แล้วคำนวณ avg
- pass_count.py — เปลี่ยน threshold ผ่านเป็น 60
- pass_count.py — เพิ่มการรายงาน "คะแนนสูงสุด" และ "คะแนนต่ำสุด"
- pass_count.py — เพิ่ม category "เกียรตินิยม" สำหรับ ≥ 80
- student_dict.py — เพิ่ม field "email" และ "year"
- student_dict.py — เก็บ list ของ student (3 คน) แทน 1 คน
- student_dict.py — print เรียงตามคะแนนเฉลี่ย
- login.py — เปลี่ยน max_attempts เป็น 5
- login.py — เพิ่ม username ด้วย (ต้องตรงทั้งคู่ถึงเข้าได้)
-
login.py — print เวลาที่ login ได้สำเร็จ
(ใช้
from datetime import datetimeขอ AI ช่วยถ้าไม่รู้) - รวม grade_calc + pass_count — ตามตัวอย่าง "ระดับ 3" ด้านบน
- เพิ่มถ่วงน้ำหนัก — ตามตัวอย่าง "ระดับ 4" ด้านบน
🐙 ฝึก Git Commit
Cursor มี git ในตัว — เปิด Source Control ที่ sidebar (icon รูปสาขา)
- เปิด terminal ใน Cursor →
git initใน folder โปรเจกต์ - สร้าง .gitignore ใส่
__pycache__/,*.pyc,.venv/ - หลังแก้แต่ละข้อ + รันได้ → Source Control → กรอกข้อความ → Commit
- ข้อความ commit ที่ดี สั้น + verb + noun เช่น "เพิ่ม case I สำหรับคะแนนติดลบ"
- หลังจาก 15 commits → push ขึ้น GitHub (W14 จะลงลึก)
ข้อผิดที่พบบ่อย
ส่งงานสัปดาห์นี้
- 📁 GitHub repo ที่มี ≥ 15 commits ของ Workshop
- 📝
changelog.mdสรุปการแก้ทั้ง 15 อย่างสั้น ๆ - 🐞
errors.mdรวม error ที่เจอ + วิธีแก้ (เปิดประวัติฝึกอ่าน error)
Reference จาก slide เดิม
ครอบคลุม Topic 5 (Conditions), Topic 6 (Repetition), Topic 7 (Functions) ผ่านการแก้โค้ดจริง