ข้ามไปยังเนื้อหา
vibe-coder/academy
หลักสูตร
// special feature

Doubt-Driven Development

เช็กลิสต์ของ Fame ที่ตั้งบนความจริงข้อเดียว: โค้ดที่ รันได้ ไม่ได้แปลว่า ถูก ยิ่ง AI ช่วยเขียนเร็วขึ้นเท่าไหร่ ความสงสัยที่ถูกจุดก็ยิ่งสำคัญขึ้นเท่านั้น ก่อนจะมั่นใจว่าเสร็จ ให้สงสัยสี่จุดนี้ก่อนทุกครั้ง

  1. 01

    Imports

    การ import ที่ผิดเงียบ ๆ

    ฉันแน่ใจหรือว่า import ตัวที่ใช้อยู่ คือตัวที่คิดว่าใช้
    อาการ

    import มาผิดโมดูล, import ชื่อชนกัน, หรือ import ของที่ deprecated โค้ดรันได้แต่พฤติกรรมไม่ตรง โดยเฉพาะเมื่อ AI เดาชื่อ package ขึ้นมาเอง

    สิ่งที่ต้องตรวจ

    เปิดดูว่า symbol ที่ใช้มาจากไหนจริง ๆ ตรวจว่า package มีอยู่และเวอร์ชันตรง อย่าเชื่อว่าชื่อที่ดูคุ้นคือตัวที่ถูก

    imports.py
    Python
    1# AI มักเดาชื่อฟังก์ชันที่ "ฟังดูถูก" แต่ไม่มีจริง
    2# ❌ from utils import parse_amount # ฟังก์ชันนี้มีจริงไหม
    3# ❌ import pandas as np # alias สลับ จะพังลึก ๆ
    4
    5# ✅ ยืนยันที่มาก่อนใช้
    6from decimal import Decimal # มาจาก stdlib แน่นอน
    7from app.parsers import parse_amount # path จริงในโปรเจกต์เรา
    8
    9assert callable(parse_amount), "import ผิดตัวแล้ว"
  2. 02

    Path Traps

    กับดักของ path

    path นี้ยังถูกอยู่ไหม ถ้ารันจากที่อื่น หรือบน server จริง
    อาการ

    relative path ที่อิงกับ current working directory พังทันทีเมื่อรันจากโฟลเดอร์อื่น, ใน container, หรือใน worker ที่ cwd ต่างจากตอน dev

    สิ่งที่ต้องตรวจ

    อิง path กับตำแหน่งไฟล์เสมอ ไม่ใช่ cwd ใช้ absolute path ที่คำนวณจาก __file__ / import.meta.url และตรวจว่าไฟล์มีจริงก่อนใช้

    path-traps.py
    Python
    1from pathlib import Path
    2
    3# ❌ พังเมื่อ cwd ไม่ใช่ราก project
    4# config = open("config/banks.json")
    5
    6# ✅ อิงตำแหน่งไฟล์นี้ ไม่ใช่ cwd
    7BASE_DIR = Path(__file__).resolve().parent
    8config_path = BASE_DIR / "config" / "banks.json"
    9assert config_path.exists(), f"ไม่พบไฟล์: {config_path}"
    10config = config_path.read_text(encoding="utf-8")
  3. 03

    Async Mismatch

    async ที่ใส่ไม่ครบ

    ฉันลืม await ตรงไหนไหม กำลังปน sync กับ async อยู่หรือเปล่า
    อาการ

    ลืม await ทำให้ได้ coroutine object แทนผลจริง, เรียกฟังก์ชัน blocking ใน event loop, หรือ mix sync client กับ async framework จน latency พุ่งหรือค่าผิดเงียบ ๆ

    สิ่งที่ต้องตรวจ

    ทุก call ที่เป็น async ต้องมี await, งาน CPU/blocking ต้องไปอยู่ใน executor หรือ worker, และอย่าเรียก sync DB client ใน async handler

    async-mismatch.py
    Python
    1# ❌ ลืม await - ได้ coroutine ไม่ใช่ผลลัพธ์
    2# result = fetch_slip(job_id) # <coroutine object ...>
    3# if result.amount > 0: ... # AttributeError ลึก ๆ
    4
    5# ✅ await ให้ครบ
    6result = await fetch_slip(job_id)
    7
    8# ✅ งาน blocking ย้ายออกจาก event loop
    9import asyncio
    10loop = asyncio.get_running_loop()
    11hashed = await loop.run_in_executor(None, compute_phash, raw_bytes)
  4. 04

    Env Ghost

    ผีของ environment variable

    ค่านี้มีจริงตอน production ไหม หรือมีแค่บนเครื่องฉัน
    อาการ

    โค้ดทำงานบนเครื่อง dev เพราะมี .env แต่พังบน production เพราะ env var ไม่ถูก set ค่าเป็น None/empty แล้วลามไปทั้งระบบ - ตัวร้ายที่สุดเพราะ 'รันได้บนเครื่องฉัน'

    สิ่งที่ต้องตรวจ

    ตรวจ env var ที่จำเป็นตอน startup ให้ fail-fast พร้อมข้อความชัดเจน อย่าใช้ค่า default เงียบ ๆ สำหรับ secret และห้าม commit ค่าจริง

    env-ghost.py
    Python
    1import os
    2
    3REQUIRED = [
    4 "DATABASE_URL", "REDIS_URL",
    5 "DISCORD_WEBHOOK_URL", "MODEL_API_KEY",
    6]
    7
    8def assert_env() -> None:
    9 missing = [k for k in REQUIRED if not os.environ.get(k)]
    10 if missing:
    11 # fail-fast ตอน boot ดีกว่าพังกลางทางบน production
    12 raise RuntimeError(f"ENV หาย: {', '.join(missing)}")
    13
    14# เรียกตอน startup ก่อนรับ traffic
    15assert_env()

เมื่อผ่านทั้งสี่จุดแล้ว คุณยังไม่ได้พิสูจน์ว่าโค้ดถูก คุณแค่ลดโอกาสที่มันจะผิดในแบบที่พบบ่อยที่สุด ความสงสัยไม่ใช่ความไม่มั่นใจ มันคือวินัย รันเทสต์ อ่าน log จริง แล้วค่อยบอกว่าเสร็จ

กลับไปเรียนต่อ