ท้ายเส้นทาง
คำถามเดียวกับท้ายโพสต์ รวมไว้ที่เดียว
13 ข้อ ทุกข้อคือสถานการณ์จากโพสต์ในเส้นทางนี้ คุณต้องเลือกว่าจะทำอะไร ตอบผิดได้ แต่อ่านคำอธิบายให้ครบ
ข้อ 1 / 13หยุด Overengineer ตอนลูกค้ายังเป็น 0
หยุด Overengineer ตอนลูกค้ายังเป็น 0
ยังไม่มีคนใช้สักคน กำลังจะเริ่ม feature แรก แต่อยากตั้ง CI/CD, auth, monitoring ให้ครบก่อน คุณจะทำอะไร
ตอน pre-PMF คอขวดคือความเร็วในการเรียนรู้ ไม่ใช่คุณภาพโค้ด ทุกชั่วโมงที่ polish ของที่ยังไม่มีคนใช้ คือชั่วโมงที่ไม่ได้เรียนรู้ แต่เส้นที่ห้ามข้ามยังอยู่ ผิดตรง R2 เสียเวลา 30 นาทีแก้ ผิดตรง R0 อาจแก้ไม่ได้
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Happy flow first, error handling later. Ship the ugly version. R2 (UI, config, feature flag, prompt tweak): just do it. R0 (deploy contract, production DB migration): stop and ask. อ่านโพสต์ ตอนที่ 1 →
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Happy flow first, error handling later. Ship the ugly version. R2 (UI, config, feature flag, prompt tweak): just do it. R0 (deploy contract, production DB migration): stop and ask. อ่านโพสต์ ตอนที่ 1 →
ข้อ 2 / 13แก้ให้แล้วนะ แต่มันเปลี่ยนแค่ที่เดียว
แก้ให้แล้วนะ แต่มันเปลี่ยนแค่ที่เดียว
สั่ง AI เปลี่ยนสีปุ่มเป็นสีเขียว มันเปลี่ยนให้ อีกสองวันเปิดหน้าอื่น ปุ่มยังส้มอยู่อีกห้าที่ คุณจะสั่งว่าอะไร
สีนั้นถูกพิมพ์ทิ้งไว้หกที่ เพราะแต่ละหน้าถูกสั่งสร้างคนละรอบ AI แก้ครบทุกที่ที่มันเห็นแล้ว แต่มันเห็นแค่ที่เดียว ไล่แก้ทีละที่คือแก้อาการ รวมให้เหลือที่เดียวคือแก้เหตุ แต่อย่ารวมของที่แค่หน้าตาคล้ายกัน ถ้ามันไม่ได้ต้องเปลี่ยนพร้อมกันทุกที่
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Never retype a constant (color, price, shipping fee, url); keep it in one config file. Search for an existing function before writing a new one. อ่านโพสต์ ตอนที่ 2 →
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Never retype a constant (color, price, shipping fee, url); keep it in one config file. Search for an existing function before writing a new one. อ่านโพสต์ ตอนที่ 2 →
ข้อ 3 / 13ปุ่มมันกดไม่ได้จริง แต่ไม่มีใครบังคับให้ลูกค้าใช้ปุ่ม
ปุ่มมันกดไม่ได้จริง แต่ไม่มีใครบังคับให้ลูกค้าใช้ปุ่ม
มีออร์เดอร์เข้ามาด้วยราคาโปรที่หมดไปตั้งแต่เมื่อวาน หน้าเว็บปุ่มเป็นสีเทา ลองกดสิบรอบก็ไม่มีอะไรเกิดขึ้น คุณจะสั่ง AI ว่าอะไร
มันจะใส่ให้ในฟอร์ม เพราะนั่นคือไฟล์ที่คุณเปิดให้มันดู แต่เขาไม่ได้กดปุ่ม เขาเปิดแท็บ network กด copy as curl แล้วยิงตรง หน้าจอเป็นแค่ข้อเสนอแนะ และเทสต์ที่กดผ่านหน้าจอจะผ่านตลอด เพราะหน้าจอคือสิ่งที่กันไว้แล้ว
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Every client-side check is repeated on the server. Read price and permissions from the database and session, never the request. Test by hitting the API directly. อ่านโพสต์ ตอนที่ 3 →
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Every client-side check is repeated on the server. Read price and permissions from the database and session, never the request. Test by hitting the API directly. อ่านโพสต์ ตอนที่ 3 →
ข้อ 4 / 13รันในเครื่องเราผ่านหมด พอขึ้นจริงพังทันที
รันในเครื่องเราผ่านหมด พอขึ้นจริงพังทันที
โค้ดชุดเดิม เครื่องคุณรันผ่านหมด กด deploy ขึ้นไปแล้วพังทันที log บอกว่าหา database ไม่เจอ คุณจะทำอะไร
ค่าพวกนี้ไม่ใช่โค้ด มันเปลี่ยนตามที่รัน hardcode ไว้กี่ที่ ก็ต้องไล่แก้ด้วยมือกี่ที่ทุกครั้งที่โค้ดออกจากเครื่อง ถ้าค่าหายแล้วโปรแกรมยอมรันต่อ มันจะไปพังตอนมีคนใช้ แล้วคุณจะไล่หาไม่เจอว่าพังเพราะอะไร
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Values that change per machine (URL, port, key, secret, path) come from env, never hardcoded. Missing at startup: stop and name the variable. New variables go in .env.example. อ่านโพสต์ ตอนที่ 4 →
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Values that change per machine (URL, port, key, secret, path) come from env, never hardcoded. Missing at startup: stop and name the variable. New variables go in .env.example. อ่านโพสต์ ตอนที่ 4 →
ข้อ 5 / 13แอปไม่ได้ไม่มีบั๊ก มันแค่ยังไม่มีคนใช้
แอปไม่ได้ไม่มีบั๊ก มันแค่ยังไม่มีคนใช้
ลูกค้าทักมาว่าโดนตัดเงินสองรอบ มีออร์เดอร์สองอันห่างกันสี่วินาที คุณลองกดเองสิบรอบก็ไม่เคยเกิด คุณจะสั่ง AI ว่าอะไร
ปิดปุ่มกันได้แค่นิ้ว กันเน็ตหลุดแล้วมือถือส่งซ้ำ ปุ่ม back หรือการรีเฟรชหน้าจ่ายเงินไม่ได้ ใครที่แก้แค่ชั้นนี้จะกลับมาเจอปัญหาเดิม และถ้าไม่มีเทสต์ที่ยิงซ้ำ คุณจะไม่มีวันรู้ว่าที่แก้ไปได้ผลจริงหรือเปล่า
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Submit flows are idempotent: the server keeps an idempotency key and returns the first result on a repeat, a unique constraint backs it, a test sends it twice. อ่านโพสต์ ตอนที่ 5 →
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Submit flows are idempotent: the server keeps an idempotency key and returns the first result on a repeat, a unique constraint backs it, a test sends it twice. อ่านโพสต์ ตอนที่ 5 →
ข้อ 6 / 13ยอดเงินไม่ได้คำนวณผิด มันแค่ปัดเศษในที่ที่เรามองไม่เห็น
ยอดเงินไม่ได้คำนวณผิด มันแค่ปัดเศษในที่ที่เรามองไม่เห็น
บัญชีทักมาว่ายอดรวมไม่ตรงหนึ่งสตางค์ ปิดงบไม่ได้ คุณสร้างออร์เดอร์ทดสอบสิบอันก็ตรงหมดทุกอัน คุณจะสั่ง AI ว่าอะไร
0.1 + 0.2 ได้ 0.30000000000000004 ในเกือบทุกภาษา เศษไปโผล่ตอนลูกค้าซื้อของราคา 129.90 สามชิ้น ลดเปอร์เซ็นต์ แล้วหารกันจ่าย เทสต์ที่ใส่แต่เลขกลมจะผ่านตลอดไป แล้วคุณจะไปเจอตอนบัญชีปิดงบไม่ได้
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Money is an integer of the smallest unit (satang), never float. Calculate in integers end to end; round once, at display, by one written rule. Test with fractional prices. อ่านโพสต์ ตอนที่ 6 →
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Money is an integer of the smallest unit (satang), never float. Calculate in integers end to end; round once, at display, by one written rule. Test with fractional prices. อ่านโพสต์ ตอนที่ 6 →
ข้อ 7 / 13ระบบไม่ได้เตือนผิดเวลา มันเตือนถูกเวลา แค่คนละที่กับที่คุณอยู่
ระบบไม่ได้เตือนผิดเวลา มันเตือนถูกเวลา แค่คนละที่กับที่คุณอยู่
ลูกค้าได้อีเมลเตือนนัดตอนตีสอง นัดจริงคือเก้าโมงเช้า ในแอดมินก็ขึ้นเก้าโมง คุณลองสร้างนัดเองก็เตือนตรงเป๊ะ คุณจะทำอะไร
เครื่องคุณตั้งเวลาไทย เบราว์เซอร์เลยแปลงให้ก่อนวาดลงจอ แต่ตัวที่เก็บจริงคือ 02:00 UTC และ cron ที่ยิงอีเมลรันบนเซิร์ฟเวอร์ที่แทบทุกเจ้าตั้งเป็น UTC เทสต์ที่รันแค่ timezone เดียวจะผ่านตลอดไป
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Store time in UTC with a timezone-aware type. Inputs carry the user's timezone; never guess from the server. Convert in one display layer. Test under TZ=UTC and TZ=Asia/Bangkok. อ่านโพสต์ ตอนที่ 7 →
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Store time in UTC with a timezone-aware type. Inputs carry the user's timezone; never guess from the server. Convert in one display layer. Test under TZ=UTC and TZ=Asia/Bangkok. อ่านโพสต์ ตอนที่ 7 →
ข้อ 8 / 13code ตอบว่า True แล้วข้อมูลหาย 26 อัน
code ตอบว่า True แล้วข้อมูลหาย 26 อัน
กฎ VERIFY BEFORE DONE อยู่ใน CLAUDE.md มานานแล้ว แต่ save helper คืน True ทั้งที่ลิงก์หายไปเงียบ ๆ ไม่มี error สักตัว คุณจะแก้ที่ไหน
กฎนั้นไม่ได้พัง แต่ถ้านิยามของ done คือไม่ crash การ verify ก็แค่ยืนยันว่าไม่ crash ซึ่งผ่านทุกครั้ง ของผม URL หายไป 26 อัน และโพสต์ที่ลงไปแล้ว 22 อันถูกนับเป็น draft มาหลายเดือน
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Done means read back and found. Any helper that saves and returns True must re-read and assert the item exists. "No error" is not done. อ่านโพสต์ ตอนที่ 8 →
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Done means read back and found. Any helper that saves and returns True must re-read and assert the item exists. "No error" is not done. อ่านโพสต์ ตอนที่ 8 →
ข้อ 9 / 13สั่งให้แก้ bug แต่มันไปแก้ test
สั่งให้แก้ bug แต่มันไปแก้ test
สั่ง AI ให้ไปแก้ bug มันกลับมาบอกว่าเสร็จแล้ว test เขียวหมด เปิด diff ดู มันไปแก้ test ไม่ได้แก้ bug คุณจะทำอะไร
test คือ metric และ AI จะ optimize ทุก metric ที่คุณให้มัน ตราบใดที่มันเห็นและแก้ test ได้ ทางที่สั้นที่สุดคือแก้ test ไม่ใช่แก้ code ลบทิ้งหมดก็ไม่ช่วย ทีมในเคสที่ทุกคนอ้างไม่ได้ลบ test เขาเพิ่ม review กับ check ว่ามี public API ตัวไหนหายไป
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: When fixing a bug, do not edit tests without saying why. Prove done by running the real flow and showing its output, not by a green suite. อ่านโพสต์ ตอนที่ 9 →
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: When fixing a bug, do not edit tests without saying why. Prove done by running the real flow and showing its output, not by a green suite. อ่านโพสต์ ตอนที่ 9 →
ข้อ 10 / 13แก้ไปแก้มาทั้งอาทิตย์ ยังตอบไม่ได้ว่าอันไหนทำพัง
แก้ไปแก้มาทั้งอาทิตย์ ยังตอบไม่ได้ว่าอันไหนทำพัง
แก้มาสามวัน มีคนทักว่าหน้า checkout กดไม่ได้ ระหว่างนั้นแก้ไปอีกยี่สิบรอบใน commit ก้อนเดียวที่เขียนว่า "fix stuff" คุณจะทำอะไรต่อ
ระยะห่างระหว่างทำพังกับรู้ว่าพังคือต้นทุนจริง พังแล้วรู้ใน 3 วินาทีจบใน 2 นาที พังแล้วรู้อีก 3 วัน ของทับกันไปยี่สิบชั้น และจุดที่ยังดีไม่เคยถูกทำเครื่องหมายไว้ เลยไม่มีที่ให้กลับไป
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Before saying done, run the tests and paste the actual output. Failing tests mean not done. One change per commit; never bundle. อ่านโพสต์ ตอนที่ 10 →
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Before saying done, run the tests and paste the actual output. Failing tests mean not done. One change per commit; never bundle. อ่านโพสต์ ตอนที่ 10 →
ข้อ 11 / 13ผมทำงานข้าม 3 repos ด้วย Claude Code ยังไงไม่ให้พัง
ผมทำงานข้าม 3 repos ด้วย Claude Code ยังไงไม่ให้พัง
เปิด Claude Code สาม terminal พร้อมกัน frontend backend contract terminal หนึ่งแก้ API response shape อีก terminal ยังใช้ shape เดิม frontend พังทั้งที่ไม่ได้แตะ คุณจะทำอะไร
AI ทุก terminal เห็นแค่ repo ตัวเอง ถ้าไม่มีขอบเขตกับ contract ที่เดียว มันจะเดา backend behavior เอง แล้ว frontend จะใช้ field ที่ backend ลบไปแล้ว
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Never change the API shape on your own; if it does not match the contract, ask first. Never assume backend behavior that is not in the contract. อ่านโพสต์ ตอนที่ 11 →
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Never change the API shape on your own; if it does not match the contract, ask first. Never assume backend behavior that is not in the contract. อ่านโพสต์ ตอนที่ 11 →
ข้อ 12 / 13จ้าง agent 1,393 ตัวมารีแฟคเตอร์โค้ดล้านบรรทัดได้ แต่ถ้าไม่มีของอย่างนึงก่อน ก็แค่ได้ขยะเร็วขึ้น
จ้าง agent 1,393 ตัวมารีแฟคเตอร์โค้ดล้านบรรทัดได้ แต่ถ้าไม่มีของอย่างนึงก่อน ก็แค่ได้ขยะเร็วขึ้น
เห็น Nous Research ใช้ agent 1,393 ตัวลดโค้ด Hermes ไป 34.4% แล้วอยากทำแบบเดียวกันกับ repo ตัวเอง คุณจะเริ่มจากอะไร
เขาสั่งสั้นได้เพราะรายละเอียดถูกจดเป็น skill hermes-agent-dev มาหลายเดือนก่อน ไม่ใช่เพราะโมเดลเก่งขึ้น agent 1,393 ตัวที่ไม่มีของพวกนี้ คือได้งานห่วยเร็วขึ้น 1,393 เท่า และของที่หลุดมาสองอันคือของที่เทสต์ไม่ได้ครอบ
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Each time I correct how you work, write the correction to the skill file. Commit every verified step. Before a large change, list what must stay identical. อ่านโพสต์ ตอนที่ 12 →
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Each time I correct how you work, write the correction to the skill file. Commit every verified step. Before a large change, list what must stay identical. อ่านโพสต์ ตอนที่ 12 →
ข้อ 13 / 13สิ่งที่ไม่มีใน docs #01: Marketplace ก่อน Migration
สิ่งที่ไม่มีใน docs #01: Marketplace ก่อน Migration
ของที่คุณปล่อยไปไวรัล คนอยากซื้อขายต่อ แต่ยังไม่มี marketplace ที่ใช้ได้จริงสักเจ้า และ migration ใหญ่ของเครือข่ายยังไม่จบ คุณจะทำอะไร
ของห่วยที่อยู่ในจังหวะที่ใช่ ชนะของสวยที่มาช้า แต่ต้องใจถึงพอจะทิ้งมันด้วย v1 มีหน้าที่พามาถึงจุดที่ทำ v2 ได้ จบหน้าที่แล้วก็วาง
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Label throwaway code as throwaway, with the condition that retires it. When that condition lands, rebuild; do not keep patching v1. อ่านโพสต์ ตอนที่ 13 →
กฎที่โพสต์นี้ทิ้งไว้ใน CLAUDE.md: Label throwaway code as throwaway, with the condition that retires it. When that condition lands, rebuild; do not keep patching v1. อ่านโพสต์ ตอนที่ 13 →
คะแนนเก็บในเบราว์เซอร์ของคุณเท่านั้น