Agent Dev Thai Academyprinciples · patterns · architecture
ใช้คู่กับกระดาน

หลักการเดิม ในยุค agent

หลักการไม่ได้หายไปตอน AI เขียนโค้ดให้ มันย้ายที่อยู่ จากความจำของ senior ไปอยู่ใน CLAUDE.md, skill, hook และ CI หน้านี้บอกว่าแต่ละกระดานกลายเป็นอะไร บรรทัดไหนควรอยู่ในไฟล์คำสั่งของ agent และโพสต์กับ repo ไหนของเพจที่ทำเรื่องนี้อยู่แล้ว

CLAUDE.md คือความจำของรุ่นพี่

รุ่นพี่ในทีมจำได้ว่าเคยพังตรงไหน agent จำไม่ได้ จบ session แล้วก็ลืม CLAUDE.md คือที่เก็บความจำนั้น และกฎที่ยังอยู่รอดในไฟล์ล้วนมีวันที่มีอะไรพังอยู่ข้างหลัง แต่มันเป็น context ไม่ใช่ configuration ของที่ห้ามพลาดเด็ดขาดต้องเป็น hook หรือ test

skill คือนิสัยที่แพ็กไว้

GStack แยก skill ละหนึ่งโหมด plan ไม่ใช่ review นั่นคือ SRP ที่ย้ายมาใช้กับ agent skill domain-modeling ของ Matt Pocock สั่งให้เขียน GLOSSARY.md กับ docs/adr/ ซึ่งคือ DDD ปี 2003 กับ ADR ปี 2011 ส่วน skill ที่โหลดมาเฉย ๆ แทบไม่ถูกเรียก ตัวที่เขียนเองจากความพังถูกใช้บ่อยกว่า

compound engineering: ทุก fix กลายเป็นกฎ

Compound Engineering ปิดลูปด้วยขั้น capture คือเขียนสิ่งที่เพิ่งเรียนลงในที่ที่งานครั้งหน้าจะอ่านเจอ ถ้าจดไว้ใน Notion agent ตัวถัดไปไม่เห็น Nous Research จดวิธีแก้ของ agent สะสมเป็น skill อยู่หลายเดือน ก่อนจะปล่อย agent 1,393 ตัวลดโค้ด Hermes ลง 34.4% เริ่มได้จากจดบรรทัดเดียวทุกครั้งที่ agent พลาด แล้วยกข้อที่ซ้ำขึ้นเป็นกฎ

SOLID ในโค้ดจริง

S

ไฟล์หนึ่ง เรื่องเดียว

ดูกระดาน →

agent แก้ทุกอย่างที่อยู่ในไฟล์ที่มันเปิด ไฟล์ที่มีสองเจ้าของเลยลากโค้ดของอีกงานเข้ามาใน diff ด้วย หนึ่งไฟล์ หนึ่ง skill หนึ่ง agent ควรมีเหตุผลให้แก้แค่เรื่องเดียว

Don't refactor or improve code beyond what was asked. Flag it instead.
O

เพิ่มของใหม่ ไม่แก้ของเก่า

ดูกระดาน →

ของใหม่ควรเป็นไฟล์ใหม่ ไม่ใช่ else if อีกบรรทัดในไฟล์ที่ทุกอย่างใช้ร่วมกัน ระบบรอบ agent ก็เหมือนกัน เพิ่มความสามารถด้วย skill ใหม่หนึ่งไฟล์ โดยไม่แตะตัวที่รันอยู่

A new channel is a new file that implements the existing interface. Don't add a branch to the shared one.
L

ชื่อเหมือน ต้องทำตัวเหมือน

ดูกระดาน →

agent เขียนตัวใหม่ที่ชื่อ method ตรงกับตัวเดิมได้เสมอ แต่ชื่อตรงกันไม่ได้แปลว่าทำตัวเหมือนกัน และ True ที่ function คืนมาก็เป็นแค่คำบอกเล่า ใช้แทนกันได้จริงต้องผ่าน contract test ชุดเดียวกับตัวเดิม

A new implementation passes the same contract test as the old one. Compiling is not done.
I

ใครใช้อะไร เห็นแค่นั้น

ดูกระดาน →

CLAUDE.md ยาว ๆ คือ interface ก้อนใหญ่ที่ agent ต้องโหลดทุกงาน กฎทุกข้อแย่งความสนใจกัน แบ่งกฎตามไฟล์ที่ใช้มัน แล้ว agent จะเห็นแค่ส่วนที่เกี่ยวกับงานตรงหน้า

Rules for some files go in .claude/rules/ with paths:, not in this file.
D

กฎเป็นคนกำหนด ไม่ใช่ vendor

ดูกระดาน →

อย่าให้กฎผูกกับของที่เปลี่ยนได้ ทั้ง SDK ของ vendor ชื่อรุ่นโมเดล และค่าสีดิบ ให้กฎเรียกบทบาท แล้วตัวจริงเปลี่ยนได้โดยกฎไม่ต้องรู้

Files with business rules never import a vendor SDK directly.

Clean Architecture ในโค้ดจริง

1

กฎส่วนลดอยู่ที่เดียว

ดูกระดาน →

agent ไม่ค้นของเดิมก่อนเขียน กฎเดียวกันเลยงอกขึ้นมาอีกที่ ให้กฎอยู่ชั้นในที่เดียว แล้วหน้าจอ บอท และ API เป็นฝ่ายเรียกมัน

Search for an existing rule before writing a new one. Business rules import nothing from UI or DB.
2

แปลงของนอกก่อนส่งเข้า

ดูกระดาน →

agent เห็นแค่ไฟล์ที่เปิดอยู่ ไม่เห็นว่าข้อมูลมาจากไหน ของที่ข้ามขอบเข้ามา ทั้ง request เวลา และ API ของอีก repo ต้องถูกแปลงและเช็กที่ขอบก่อนถึงกฎ

Use cases take plain data. Convert requests, rows and timezones at the edge.
3

เช็กกฎได้โดยไม่เปิดเบราว์เซอร์

ดูกระดาน →

ส่วนที่ test ยาก ทั้งหน้าจอ บอท และตัว model เอง ให้โง่ที่สุด กฎกับข้อมูลย้ายไปอยู่ในโค้ดที่เช็กได้ เช่น cron ดึงข้อมูลลงไฟล์ก่อน แล้ว model แค่อ่าน

Fetch data in code first. The model only reads the files. Missing data is n/a, never a guess.
4

สร้างของทุกอย่างที่เดียว

ดูกระดาน →

agent ชอบอ่าน env หรือสร้าง client ตรงไฟล์ที่กำลังแก้ ค่าที่ต้องเปลี่ยนตามที่รันเลยกระจายอยู่ทั่วโค้ด ให้มีที่เดียวที่อ่าน config และต่อทุกอย่าง แล้วให้โปรแกรมหยุดทันทีถ้าค่าขาด

Read env and create clients only in main. Fail at startup and name the missing variable.

Design Patterns ในโค้ดจริง

1

แคมเปญละไฟล์ ตัวเลือกที่เดียว

ดูกระดาน →

วิธีทำงานที่สลับได้ควรอยู่หลังชื่อเดียว แล้วเลือกตอนรัน workflow ของ agent ก็ใช้หลักนี้ได้ skill ไฟล์เดียวส่งให้ model ไหนรันก็ได้ เปลี่ยนแค่ flag

A new pricing rule is a new class behind PricingRule. Don't add a case to the switch.
2

เหตุการณ์เดียว คนรอลงชื่อเอง

ดูกระดาน →

ตัวที่เกิดเหตุไม่ควรต้องรู้ว่าใครรอฟังอยู่ hook ของ Claude Code ทำงานแบบนี้ ผูกกับ event แล้วรอ แต่ตัวฟังที่พังจะถูกข้ามเงียบ ๆ เลยต้องมีทางรู้ว่ามันยังทำงานอยู่

Emit an event. Don't call email or analytics directly from the code that raised it.
3

คำของเรา ตัวแปลงต่อผู้ให้บริการ

ดูกระดาน →

ของจากข้างนอกที่หน้าตาไม่ตรงกับของเรา ให้มีตัวแปลงหนึ่งตัวต่อของนอกหนึ่งอย่าง ในโลก agent คือสคริปต์ที่แปลง skill หรือ mission ของ tool หนึ่งให้อีก tool อ่านได้ โดยไม่ต้องเขียนใหม่

Each external API gets one adapter file. Nothing else imports its SDK.
4

ห่อของเดิม ไม่เปิดของเดิม

ดูกระดาน →

เพิ่มพฤติกรรมด้วยการครอบของเดิม ไม่ใช่เปิดแก้ข้างใน hook ที่รันก่อนทุก tool call และตัวบีบ token ที่คั่นก่อนส่งเข้า API คือการครอบแบบนี้ ตัวเดิมไม่รู้ว่าถูกครอบ

Add logging, caching or retry by wrapping the service, not by editing it.
5

เลือกแบบเอกสารที่เดียว

ดูกระดาน →

ให้มีที่เดียวที่ตัดสินว่าจะสร้างของชนิดไหน agent จะได้ไม่ new ของเองกระจายทั่ว ของที่ออกจากที่เดียวกันมีหน้าตาเดียวกันทุกครั้ง เหมือน mission ทุกอันที่ต้องมีเป้ากับเงื่อนไขจบ

Create courses through CourseFactory. Feature code never calls new VideoCourse().
6

ทางเข้าเดียวของการซื้อ

ดูกระดาน →

พอของข้างในเยอะเกินกว่าคนเรียกควรต้องรู้ ก็ต้องมีหน้าบ้านตัวเดียวบัง PStack ทำแบบนี้กับ skill บอก goal ที่เดียวแล้วมันเลือก workflow ให้ โค้ดที่ agent เขียนก็ควรเรียกหน้าบ้าน ไม่ใช่ต่อ service ทีละตัวเอง

Feature code calls checkout() on the facade. Don't wire payment, enrollment and email yourself.
7

ปุ่มหลังบ้านเป็นคำสั่ง

ดูกระดาน →

เก็บคำสั่งเป็นข้อมูลที่มีรหัส แทนการเรียกทำทันที แล้วมันจะต่อคิว ตรวจ และส่งซ้ำได้โดยไม่ได้ผลซ้ำ handoff ข้าม repo กับ idempotency key ใช้หลักเดียวกัน

Every write command carries an id. An id the server has seen returns the old result.
8

ล็อกลำดับขั้นไว้ที่เดียว

ดูกระดาน →

ขั้นตอนที่ต้องเหมือนกันทุกครั้งให้เป็นโค้ดแม่แบบ ส่วนที่ต่างให้เป็นช่องที่เติมได้ agent เติมแค่ช่อง ไม่ต้องเขียนลำดับใหม่ทุกรอบ

Keep the enrollment steps in the base flow. A new course type overrides only the step that differs.

Engineering practice ในงานจริง

1

ทำบน branch ส่งเป็น PR

ดูกระดาน →

agent สองตัวใน checkout เดียวกันจะเขียนทับกัน ให้หนึ่ง session หนึ่ง worktree หนึ่ง branch แล้วงานกลับเข้า main ผ่าน PR ที่คนอ่านก่อน merge

Work on a feature branch. Never commit or push to main.
2

PR เล็ก รีวิวได้จริง

ดูกระดาน →

agent แก้ได้หกไฟล์ในสามสิบวินาที diff ยิ่งใหญ่ ยิ่งตอบไม่ได้ว่าอะไรทำพัง ให้ fix เล็กที่สุดที่ปิดบั๊กจริง และหนึ่ง PR หนึ่งเรื่อง

Before adding a table, service or module, state the smallest fix and why it is not enough.
3

CI คือด่านที่ AI เถียงไม่ได้

ดูกระดาน →

กฎที่เป็นข้อความ agent เถียงได้ กฎที่เป็นโค้ดมันเถียงไม่ได้ ให้ test รันเองทุกครั้ง และมีชุดหนึ่งที่ agent แก้ไม่ได้ ไม่งั้นทางที่สั้นที่สุดคือแก้ test ให้เขียว

Paste the real test output before saying done. If a bug fix changes a test file, say why first.
4

commit message คือ context

ดูกระดาน →

session ใหม่จำอะไรไม่ได้ ของที่เหลือให้มันอ่านคือ git log ให้หนึ่ง commit หนึ่งเรื่อง และ message บอกความจริง แล้ว commit จะเป็นทั้งบริบทของรอบหน้าและจุดที่ย้อนกลับได้

One change per commit. Use feat:, fix: and BREAKING CHANGE: so the version reads from the log.
5

ถอยได้ในคำสั่งเดียว

ดูกระดาน →

agent สร้างของใหม่ได้เร็ว ก็ต้องทิ้งได้เร็ว ปักหมุดไว้ตอนของยังดี แล้วแยกให้ออกว่างานไหนย้อนได้ทำเลย งานไหนย้อนไม่ได้ต้องหยุดถามก่อน

R0 (deploy, migration, push to main) stop and ask. R2 (easy to revert) just do it.

DDD ในงานจริง

1

แต่ละส่วนมีข้อมูลของตัวเอง

ดูกระดาน →

คำเดียวกันแปลว่าคนละอย่างได้เมื่ออยู่คนละฝ่าย agent ที่เห็นทั้ง repo จะเอาความหมายของฝ่ายหนึ่งไปใช้กับอีกฝ่าย ให้หนึ่ง agent ถือหนึ่ง context และเขียนขอบเขตไว้ใน CLAUDE.md ของมัน

This terminal owns billing/ only. Changes that touch learning/ go through a handoff.
2

หนึ่งเรื่อง หนึ่งคำ ทุกไฟล์

ดูกระดาน →

agent ใช้คำตามที่เห็นในโค้ด ถ้าโค้ด เอกสาร และไฟล์จริงใช้คำไม่ตรงกัน มันจะเขียนของที่อ่านแล้วดูถูกแต่ทำงานผิด เขียน glossary กลางไว้ แล้วให้ทุก agent ใช้คำชุดเดียวกัน

Use the terms in GLOSSARY.md. If a word could mean Customer or User, ask which.
3

กฎที่นั่งอยู่ในทางเข้าเดียว

ดูกระดาน →

agent แก้ row ไหนก็ได้ที่มันเข้าถึง ถ้าไม่มีอะไรกัน ให้การเปลี่ยนที่ต้องสอดคล้องกันผ่านตัวหลักตัวเดียว ตัวที่คิดยอดเอง เช็กกฎเอง และมี constraint ที่ฐานข้อมูลการันตีอีกชั้น

Change an order only through Order methods. Totals are computed inside, never taken from the caller.
4

แปลงระบบนอกที่ชายแดน

ดูกระดาน →

ข้อมูลจากข้างนอกมาพร้อมคำและรูปทรงของเขา ถ้าปล่อยเข้ามาตรง ๆ agent จะเขียนตามคำของเขาไปทั่วระบบ แปลงที่ชั้นกั้นชั้นเดียว แล้วของที่หายให้เป็นค่าว่างที่ชัด ไม่ใช่ให้เดา

Map external responses to our types in one translator. Missing fields become explicit nulls.

แผนภาพที่ CI เช็กได้

1

แผนภาพโครงสร้างเป็นกฎที่ CI รัน

ดูกระดาน →

class diagram ในเอกสาร agent ไม่เคยเปิดอ่าน ให้ลูกศรในภาพกลายเป็นกฎ import ที่ CI เช็ก แล้ว diff ที่ลากเส้นผิดทางจะแดงก่อนถึงคนรีวิว

domain/ never imports from app/ or infra/. CI checks the imports.
2

ลำดับตอนจ่ายเงินเป็น test

ดูกระดาน →

เขียนลำดับที่ระบบต้องทำตั้งแต่ต้นจนจบเป็นข้อก่อน แล้วค่อยให้ agent เขียน test ตามลำดับนั้น test ต้องยิงผ่าน API จริง ไม่ใช่ล้อตามโค้ดที่มันเพิ่งเขียน

Write the main flow as numbered steps, then one test that runs those steps through the public API.
3

สถานะออเดอร์เป็นตารางเดียว

ดูกระดาน →

สถานะที่ไม่ได้เขียนเป็นตาราง agent จะเดาเอง และค่าที่ไม่รู้จักจะตกไปที่ค่า default เงียบ ๆ เขียนว่าจากสถานะไหนไปไหนได้ และต้องมีสถานะที่แปลว่าไม่เอาแล้ว

Status changes go through the transition table. An unknown status throws. It never falls back to a default.

Agent setup ในงานจริง

1

กฎอยู่ผิดที่

ดูกระดาน →

agent อ่าน CLAUDE.md เป็น context ไม่ใช่ configuration ทุกบรรทัดคือคำขอที่แย่งความสนใจกัน ของที่ห้ามพลาดต้องเป็น hook ที่รันก่อนเครื่องมือ กฎเฉพาะงานโหลดเมื่อแตะไฟล์ของมัน ที่เหลือสั้นพอให้ทุกบรรทัดถูกอ่าน

Hard limits live in hooks, folder rules in .claude/rules/ with paths. Before adding a rule, name the rule it overlaps.
2

AI ลืมทุก session

ดูกระดาน →

agent จบ session แล้วลืม ของที่อยู่รอดคือไฟล์ที่ session หน้าโหลด บทเรียนที่ agent จดเองสามช่อง สถานะงานที่อัปเดตหลังทุกงาน และการตัดสินใจที่มีวันที่กับเหตุผล ทุก terminal อ่านโฟลเดอร์เดียวกัน

On a pattern failure, log it to MEMORY.md: what happened, root cause, correct behavior. Read spec.md first; update it before saying done.
3

skill ที่โมเดลมองไม่เห็น

ดูกระดาน →

skill ที่โมเดลไม่เห็นคำอธิบายก็ไม่ถูกหยิบมาใช้ เก็บแต่ตัวที่ถูกเรียกจริง ตัวละหนึ่งโหมด ทุกตัวกัน failure ที่เคยเกิดจริง และเปลี่ยนรุ่นโมเดลเมื่อไร ตรวจคำกล่อมที่เขียนไว้ให้รุ่นเก่า

A new skill names the failure it prevents. Keep descriptions under two lines; cut skills that were never invoked.
4

cron ที่เขียนแล้วไม่มีใครอ่าน

ดูกระดาน →

cron ทำงานตอนคุณนอน แต่ของที่มันเขียนมีค่าก็ต่อเมื่อมีคนอ่าน ทุก pipeline มีฝั่งเขียนกับฝั่งอ่าน ตรวจทั้งสองข้าง และให้ agent อ่าน snapshot ที่ cron เตรียมไว้ แทนการไปดึงเองตอนทำงาน

Every pipeline with a read and a write side: verify both, not just the side that produces output.

ชิมก่อนรับ

1

หน้าเว็บที่ออกมาโหล

ดูกระดาน →

agent ไม่ได้ออกแบบ มันเฉลี่ย สั่งว่าให้สวยได้ค่ากลางของทุกหน้าที่มันเคยเห็น ใส่โน้ตจากอ้างอิงสามชิ้นก่อนสั่ง เรียกของโหลด้วยชื่อ และปิดทางที่ไม่ต้องการทั้งตอนเปิดและตอนท้ายของคำสั่ง

Before generating UI, read the reference notes. No gradient text, no particle hero, no three-column card grid. Run the slop audit before shipping.
2

draft ที่ไม่ใช่เสียงเรา

ดูกระดาน →

agent ชอบเขียนให้คุณดูดี และเห็นด้วยกับทุกอย่างที่คุณพิมพ์ ไฟล์เสียงห้าข้อที่มันอ่านก่อนเขียน เรื่องจริงแบบเละ ๆ ที่คุณเล่าให้มันฟัง และคำสั่งให้สวนก่อน คือสิ่งที่ทำให้ draft เป็นเสียงคุณ

Before a draft ships, run the five taste filters: brag, voice, concrete, position, bloat. If it fails, rewrite it from a new angle; don't patch words.
3

AI ตัดสินแทนคุณ

ดูกระดาน →

agent ทำทุกอย่างที่สั่ง และไม่เคยถามว่าแน่ใจเหรอ ให้มันเสนอ แล้วคุณตัดสิน ทุกคำขอผ่านคำถามก่อนเริ่ม ทุก flag มีคำตอบในบันทึก และผลสแกนอ่านจากชื่อกฎ ไม่ใช่สี

AI assists execution. Operator owns architecture. Don't over-automate decision-making.

ใช้ kanly ให้ agent มีกติกา

1

อีก terminal ไม่รู้ว่าคุณเปลี่ยน

ดูกระดาน →

terminal แต่ละตัวเห็นแค่ repo ของตัวเอง พอ /compact กินความจำ สิ่งที่ตัวหนึ่งเปลี่ยน อีกตัวไม่เคยรู้ ให้ตัวที่เปลี่ยนเขียน handoff แค่ส่วนที่เปลี่ยน อีกตัวอ่านก่อนเริ่มงาน แล้ว verify เทียบ contract กับโค้ดจริงก่อน ship แทนที่คุณจะเป็นคนกลางก๊อป context ทั้งวัน

If a change here affects another repo, write a handoff before ending: what changed, what to do next, breaking changes, the new contract. Read pending handoffs before starting.
2

loop ที่ไม่มีเส้นชัย

ดูกระดาน →

loop ที่วิ่งเองหยุดตอนมันรู้สึกว่าเสร็จ หรือตอนชน timeout เขียนเงื่อนไขจบเป็นข้อที่เช็กได้ก่อนปล่อย แล้วให้การเช็กเป็นตัวปิดงาน เขียนทีหลังคือคำบรรยาย ไม่ใช่ contract

Never start an autonomous loop without named, checkable done conditions written first. Close only when every condition passes; a timeout is not done.
3

คนเขียนอนุมัติเอง

ดูกระดาน →

agent ที่ตรวจงานตัวเองอ่านข้อสมมติของตัวเองซ้ำ ส่ง diff ให้ context ที่ไม่ได้เขียน เห็น spec diff test และกล้าตอบว่าไม่ผ่าน ทุก flag แก้หรือปัดพร้อมเหตุผลหนึ่งบรรทัด

The writer is not the approver. Review in a fresh context that sees the spec, the diff and the tests. Answer every flag: fix it or give a one-line reason; silence counts as a dodge.
4

เสร็จแล้ว โดยไม่มีหลักฐาน

ดูกระดาน →

สาม terminal ตอบเรื่องเดียวกันได้สามคำตอบ มั่นใจเท่ากันหมด ให้ทุกตัวอ่านไฟล์ชุดเดียวกันตอนเปิด ใครเปลี่ยนอะไรจดลงไฟล์นั้น และคำว่าเสร็จมาพร้อมคำสั่งที่รันกับผลที่ได้

Every terminal reads the same state file at start; whoever changes something writes it there. Never claim a change is complete without running verification. "I edited the file" is not done.

แผลเป็นจากงานจริง

1

ความจริงเดียวกัน เขียนไว้สามที่

ดูกระดาน →

agent ไม่ค้นก่อนว่าความจริงข้อนี้มีคนคำนวณไว้แล้ว มันเขียนใหม่ในไฟล์ที่เปิดอยู่ ร้านเลยมีคำว่าจ่ายแล้วสามแบบ ตั้งชื่อความจริงที่คำนวณได้ไว้ที่เดียวใน core ทุกหน้าเรียกตัวนั้น ตัวที่สองคือบั๊กแม้วันนี้ผลจะตรงกัน

Name a derived fact once in core and call it from every path. A second definition of the same fact is the bug.
2

ของใหม่วางข้างของเก่า ทั้งคู่ยังวิ่ง

ดูกระดาน →

สั่งให้เปลี่ยน agent มักเพิ่มของใหม่ไว้ข้างของเก่า เพราะการลบดูเสี่ยง ผลคือสองทางที่ยังวิ่งทั้งคู่ คนเรียกแยกกันไปคนละทาง การแทนที่จบเมื่อทางเก่าไม่มีใครเรียกได้ใน change เดียวกัน เอกสารเปลี่ยนตาม และค้นครั้งเดียวไม่เจอชื่อเก่า

A replacement makes the old path unreachable in the same change, proven by grep. No soft deprecation; flip the doc too.
3

ถามว่าทำไม ได้ diff กลับมา

ดูกระดาน →

agent อ่านคำถามว่าทำไมเป็นคำสั่งให้แก้ มันแก้ตามทฤษฎีแรก และย้อนของที่คุณเปิดไว้เองโดยไม่ถาม รอบที่ถามว่าทำไม คัดแยก หรือแย้ง ตอบด้วยข้อสรุปที่เช็กได้กับหลักฐาน ไม่มีการแก้ไฟล์ และของที่คุณเปลี่ยนเองถูกรายงาน ไม่ถูกย้อน

A why, triage or pushback turn contains zero edits. Report the operator's own change; never reverse it.
4

หน่วยเงินอยู่ในคอมเมนต์ ไม่ได้อยู่ใน type

ดูกระดาน →

agent เชื่อคอมเมนต์ข้างช่องเงิน และคูณร้อยเองทุกที่ที่มันเห็นตัวเลข หน่วยเงินที่อยู่แค่ในคอมเมนต์จึงผิดเงียบ ๆ ให้หน่วยอยู่ใน type มีที่แปลงที่เดียวตรงรอยต่อกับเจ้าระบบตัดเงิน แล้ว compiler จะจับให้แทนคุณ

Put the money unit in the type, never in a comment or a field name. Convert once, at the provider boundary.
5

ทฤษฎีมาก่อนหลักฐาน

ดูกระดาน →

agent ตอบสาเหตุได้ทันทีจากความเคยชิน แล้วแก้ ถอน โทษ config และยิงทดสอบอีกห้าครั้ง ให้มันยกไฟล์กับบรรทัด คำตอบจริงจากระบบ หรือบรรทัดใน log ก่อนเอ่ยชื่อสาเหตุ และเริ่มจาก diff ของตัวเองก่อนเสมอ

Name no cause without a receipt: file:line, a live response or a log line. Re-read your own diff first.
6

catch ที่คืนค่าปลอดภัยปลอม

ดูกระดาน →

agent ชอบห่อ error ด้วย catch ที่คืนค่าที่ดูปลอดภัย หน้าจอเลยไม่พัง แต่โกหก ยอดเป็นศูนย์ทั้งร้าน health ยังเขียว catch ต้อง throw หรือ log ห้ามคืนค่าที่หน้าตาเหมือนข้อมูล และ health ต้องเรียกของที่มันพึ่งจริง ไม่ใช่ดูว่ามี env

A catch never returns a value that looks like data. Health checks call the dependency, not the env var.
7

พฤติกรรมอยู่นอก repo

ดูกระดาน →

agent เห็นแค่ repo ทุกปัญหาเลยดูเหมือนแก้ได้ด้วยโค้ด บางพฤติกรรมอยู่ในหน้าตั้งค่าของเจ้าระบบตัดเงิน หรือในรหัสลับของ deploy ตัวนั้น ก่อนแก้โค้ด ให้มันบอกว่าพฤติกรรมนี้อยู่ที่ไหน แล้วอ่านค่าจากที่ระบบใช้จริงตอนรัน ไม่ใช่จากไฟล์

Before a code fix, name where the behaviour lives: repo, vendor dashboard or this deploy's secrets. Verify the runtime store.
8

เสร็จแล้ว คือคำพูด ของจริงอยู่บนสาย

ดูกระดาน →

handoff บอกว่าเสร็จ ความจำบอกว่า deploy แล้ว agent เชื่อทั้งสองอย่าง แล้วต่อหน้าจอกับช่องที่ไม่มีในคำตอบจริง ให้มันเรียก endpoint จริงและอ่าน version ที่รันอยู่ก่อนต่อ และจบ session ด้วยการจด branch จำนวน commit ที่ยังไม่ขึ้น และ version ที่ deploy ลงไฟล์

Read done and deployed from the live endpoint and the running version, never from a handoff, a memory or a commit.