การคัดกรองบั๊กด้วย Claude Code โดยใช้วงจรที่ทำซ้ำได้: ทำให้เกิดซ้ำ ย่อกรณี หาสาเหตุที่เป็นไปได้ เพิ่ม regression test แล้วส่งการแก้แบบแคบพร้อมการตรวจสอบ

เมื่อเจอรายงานบั๊กที่เป็นครั้งคราว บั๊กมักรู้สึกเหมือนไม่มีแบบแผน คุณอาจลองเปลี่ยนโค้ดสักหน่อย หวังว่าปัญหาจะหายไป บางครั้งมันหายจริง แต่คุณก็ไม่ได้เรียนรู้อะไร และปัญหาเดียวกันก็อาจกลับมาในรูปแบบต่าง ๆ
การคัดกรองบั๊กคือสิ่งตรงกันข้าม มันเป็นวิธีรวดเร็วในการลดความไม่แน่นอน เป้าหมายไม่ใช่แก้ทุกอย่างทันที แต่คือเปลี่ยนคำร้องเรียนคลุมเครือให้เป็นประโยคที่ชัดเจนและทดสอบได้ จากนั้นทำการเปลี่ยนแปลงที่เล็กที่สุดซึ่งพิสูจน์ว่าประโยคนั้นไม่เป็นจริงอีกต่อไป
นั่นคือเหตุผลที่วงจรนี้สำคัญ: ทำให้เกิดซ้ำ ย่อกรณี หาสาเหตุที่เป็นไปได้โดยมีหลักฐาน เพิ่ม regression test ทำการแก้ไขแบบแคบ แล้วตรวจสอบ ทุกขั้นตอนจะตัดการเดาในแบบหนึ่ง ๆ ออกไป หากข้ามขั้นตอน คุณมักต้องจ่ายด้วยการแก้ไขครั้งใหญ่ ผลข้างเคียง หรือบั๊กที่ “แก้แล้ว” แต่จริง ๆ ยังไม่หาย
ยกตัวอย่างสมจริง ผู้ใช้บอกว่า: “ปุ่มบันทึกบางครั้งไม่ทำอะไรเลย” หากไม่มีวงจรนี้ คุณอาจไปค้นโค้ด UI แล้วเปลี่ยนเวลา สเตต หรือการเรียกเครือข่าย แต่หากใช้วงจร คุณจะทำให้คำว่า “บางครั้ง” กลายเป็น “เกิดขึ้นเสมอ ภายใต้เงื่อนไขเหล่านี้” เช่น: “หลังแก้ไขชื่อเรื่องแล้ว สลับแท็บเร็ว ๆ ปุ่มบันทึกยังคงถูกปิดใช้งาน” ประโยคเดียวนี้ถือว่าสำเร็จแล้ว
Claude Code ช่วยเร่งกระบวนการคิด: เปลี่ยนรายงานให้เป็นสมมติฐานที่ชัดเจน แนะนำจุดที่ควรมองหา และเสนอเทสต์เล็ก ๆ ที่ควรล้มเหลวได้ มันมีประโยชน์มากเมื่อต้องสแกนโค้ด logs และ diff ล่าสุดเพื่อสร้างคำอธิบายที่เป็นไปได้อย่างรวดเร็ว
คุณยังต้องยืนยันสิ่งที่สำคัญด้วยตัวเอง ยืนยันว่าบั๊กเกิดจริงในสภาพแวดล้อมของคุณ ใช้หลักฐาน (logs, traces, เทสต์ที่ล้มเหลว) มากกว่าเรื่องเล่าที่ดูดี เก็บการแก้ไขให้เล็กที่สุด พิสูจน์ด้วย regression test และตรวจสอบให้ชัดเจนเพื่อไม่ให้คุณแลกบั๊กใหม่มาแทนที่บั๊กเดิม
ผลตอบแทนคือการแก้ไขเล็ก ๆ ที่ปลอดภัย อธิบายได้ ยืนยันได้ และไม่ย้อนกลับเป็นบั๊ก
การแก้ที่ดีเริ่มจาก workspace ที่สะอาดและคำอธิบายปัญหาเดียวที่ชัดเจน ก่อนจะถาม Claude ให้เลือกรายงานหนึ่งฉบับแล้วเขียนใหม่เป็น:
“เมื่อฉันทำ X ฉันคาดหวัง Y แต่ได้ Z”
ถ้าคุณเขียนประโยคนี้ไม่ได้ นั่นยังไม่ใช่บั๊ก แต่อยู่ในขั้นตอนของปริศนา
รวบรวมข้อมูลพื้นฐานล่วงหน้าเพื่อไม่ต้องวนกลับบ่อย ๆ รายละเอียดเหล่านี้ทำให้ข้อเสนอแนะทดสอบได้แทนที่จะคลุมเครือ: เวอร์ชันแอปหรือ commit (และเป็น local, staging หรือ production หรือไม่) รายละเอียดสภาพแวดล้อม (OS, เบราว์เซอร์/อุปกรณ์, feature flags, ภูมิภาค) อินพุตที่แน่นอน (ฟิลด์ฟอร์ม, payload ของ API, การกระทำของผู้ใช้) ใครเห็นปัญหา (ทุกคน, บทบาท, บัญชี/tenant เดียว) และความหมายของ “คาดหวัง” (ข้อความ, สถานะ UI, status code, กฎธุรกิจ)
จากนั้นเก็บหลักฐานไว้ขณะที่ยังสด รอยเวลาหนึ่งครั้งอาจช่วยประหยัดเวลาเป็นชั่วโมง ๆ จับ logs รอบเหตุการณ์ (client และ server ถ้าเป็นไปได้) รูปหน้าจอหรือคลิปสั้น ๆ request IDs หรือ trace IDs timestamp ที่ชัดเจน (พร้อม timezone) และชิ้นข้อมูลที่เล็กที่สุดที่ทริกเกอร์ปัญหา
ตัวอย่าง: แอป React ที่สร้างโดย Koder.ai แสดงข้อความ “Payment succeeded” แต่สถานะคำสั่งซื้อยังเป็น “Pending” ให้จดบทบาทผู้ใช้, order ID ที่แน่นอน, เนื้อหา response ของ API, และบรรทัด log ของเซิร์ฟเวอร์สำหรับ request ID นั้น ตอนนี้คุณสามารถขอให้ Claude โฟกัสที่ flow เดียวแทนการบอกปัด
สุดท้าย กำหนดกฎการหยุด ตัดสินใจว่าคุณจะถือว่าแก้ไขแล้วเมื่อใดก่อนเริ่มเขียนโค้ด: เทสต์เฉพาะผ่าน, สถานะ UI เปลี่ยน, ข้อผิดพลาดไม่โผล่ใน logs รวมทั้งเช็คลิสต์การยืนยันสั้น ๆ ที่คุณจะรันทุกครั้ง วิธีนี้ช่วยป้องกันการ “แก้” อาการแล้วส่งบั๊กใหม่
รายงานที่ยุ่งมักผสมข้อเท็จจริง การเดา และความหงุดหงิด ก่อนขอความช่วยเหลือ ให้เปลี่ยนเป็นคำถามชัดเจนที่ Claude ตอบด้วยหลักฐานได้
เริ่มด้วยสรุปหนึ่งประโยคที่ตั้งชื่อฟีเจอร์และความล้มเหลว ตัวอย่างดี: “การบันทึกร่างบางครั้งลบชื่อเรื่องบนมือถือ” ไม่ดี: “Drafts พัง” ประโยคนี้จะเป็นสมอสำหรับกระทู้การคัดกรองทั้งหมด
จากนั้นแยกสิ่งที่คุณเห็นออกจากสิ่งที่คาดหวัง เก็บให้เรียบและเป็นข้อเท็จจริง: ปุ่มที่คลิก ข้อความบนหน้าจอ บรรทัด log timestamp อุปกรณ์ เบราว์เซอร์ สาขา commit ถ้าไม่มี ให้บอก
โครงสร้างง่าย ๆ ที่คุณสามารถวางได้:
ถ้าข้อมูลขาด ให้ถามแบบใช่/ไม่ใช่ เพื่อให้คนตอบได้เร็ว: เกิดบนบัญชีใหม่ไหม? เกิดเฉพาะบนมือถือไหม? เกิดเฉพาะหลังรีเฟรชไหม? เริ่มเกิดหลัง release ล่าสุดไหม? ทำซ้ำในโหมดไม่ระบุตัวตนได้ไหม?
Claude ยังมีประโยชน์เป็น “เครื่องทำความสะอาดรายงาน” วางรายงานดิบ (รวมข้อความจากสกรีนช็อต, logs, แชท) แล้วถาม:
“Rewrite this as a structured checklist. Flag contradictions. List the top 5 missing facts as yes/no questions. Do not guess causes yet.”
ถ้าเพื่อนร่วมทีมบอกว่า “มันล้มเหลวแบบสุ่ม” บีบให้เป็นสิ่งที่ทดสอบได้: “ล้ม 2/10 ครั้งบน iPhone 14, iOS 17.2 เมื่อแตะ Save สองครั้งเร็ว ๆ” ตอนนี้คุณสามารถทำให้มันเกิดขึ้นตามต้องการได้
ถ้าคุณทำให้มันเกิดไม่ได้ ทุกขั้นตอนถัดไปคือการเดา
เริ่มจากทำซ้ำในสภาพแวดล้อมเล็กสุดที่ยังแสดงปัญหาได้: local dev build, สาขาเล็ก ๆ, ชุดข้อมูลเล็ก, และเปิดบริการให้น้อยที่สุด
จดขั้นตอนที่แน่นอนเพื่อให้คนอื่นทำตามได้โดยไม่ต้องถาม เพิ่มคำสั่ง คำสั่ง IDS และตัวอย่าง payload ให้คัดลอกวางได้
เทมเพลตรวบรวมง่าย ๆ:
ความถี่เปลี่ยนกลยุทธ์ของคุณ บั๊กที่เกิด “เสมอ” เหมาะกับการวนรอบเร็ว บั๊กที่เกิด “บางครั้ง” มักชี้ไปที่ปัญหาเรื่องเวลา, แคช, สภาวะการแข่งขัน, หรือสถานะที่ซ่อนอยู่
เมื่อมีโน้ตการทำซ้ำแล้ว ให้ถาม Claude หา probing tests เล็ก ๆ ที่ลดความไม่แน่นอนโดยไม่ต้องเขียนแอปใหม่ probes ที่ดีคือเล็กและเจาะจง: บรรทัด log เป้าหมาย รอบขอบเขตที่ล้มเหลว ค่า debug สำหรับคอมโพเนนต์เดียว วิธีบังคับพฤติกรรมให้เป็น deterministic (seed แบบคงที่, เวลาแบบคงที่, worker เดียว), ชุดข้อมูลขนาดเล็กที่ทริกเกอร์ปัญหา หรือ request/response คู่เดียวที่เล่นซ้ำได้
ตัวอย่าง: flow สมัครสมาชิกล้มเหลว “บางครั้ง” Claude อาจแนะนำให้ log user ID ที่สร้าง, ผลการ normalize อีเมล, และรายละเอียด unique constraint แล้วรัน payload เดิม 10 ครั้ง หากล้มเหลวแค่ครั้งแรกหลัง deploy นั่นชี้ให้เช็ค migrations, การอุ่น cache, หรือข้อมูล seed ที่ขาด
การทำ reproduction ที่ดีมีประโยชน์ แต่ reproduction ที่ย่อแล้วทรงพลัง มันช่วยให้เข้าใจเร็วขึ้น ดีบักง่ายขึ้น และโอกาส “แก้พลาด” ต่ำลง
ตัดสิ่งที่ไม่จำเป็นออก ถ้าปัญหาโผล่หลัง flow UI ยาว ๆ ให้หาเส้นทางสั้นสุดที่ยังทริกเกอร์มันได้ เอาหน้าจอที่ไม่จำเป็น, feature flags, และการรวมระบบที่ไม่เกี่ยวออกจนกว่าจะหายหรือยังคงอยู่
จากนั้นย่อข้อมูล ถ้าบั๊กต้องใช้ payload ขนาดใหญ่ ให้ลองหาขนาดเล็กสุดที่ยังล้มเหลว ถ้ามันต้องใช้รายการ 500 รายการ ให้ลอง 5 แล้ว 2 แล้ว 1 เอาฟิลด์ออกทีละตัว เป้าหมายคือชิ้นส่วนที่น้อยที่สุดที่ยังทำให้บั๊กเกิด
วิธีปฏิบัติที่ใช้ได้จริงคือ “ตัดครึ่งแล้วทดสอบ”:
ตัวอย่าง: หน้าชำระเงินล่ม “บางครั้ง” ตอนใช้คูปอง คุณพบว่ามันล้มเฉพาะเมื่อมีอย่างน้อยหนึ่งไอเท็มที่ลดราคา คูปองมีตัวพิมพ์เล็ก และการจัดส่งเลือก “รับเอง” นั่นคือกรณีย่อของคุณ: ไอเท็มที่ลดราคา 1 ชิ้น, คูปองตัวพิมพ์เล็ก, ตัวเลือกรับของ
เมื่อได้กรณีย่อแล้ว ให้ขอ Claude สร้าง scaffold สำหรับ reproduction ขนาดเล็ก: เทสต์เล็กที่เรียกฟังก์ชันล้มเหลวด้วยอินพุตเล็กสุด, สคริปต์สั้นที่เรียก endpoint เดียวด้วย payload ย่อ, หรือ UI test เล็กที่เข้า route เดียวแล้วทำการเดียว
เมื่อทำซ้ำได้และมีกรณีย่อแล้ว หยุดเดา เป้าหมายคือได้รายการสั้น ๆ ของสาเหตุที่เป็นไปได้ แล้วพิสูจน์หรือปฏิเสธแต่ละข้อ
กฎที่เป็นประโยชน์คือจำไว้ที่สามสมมติฐาน ถ้ามากกว่านั้น แสดงว่าเทสต์ยังใหญ่เกินไปหรือการสังเกตไม่ชัด
แปลสิ่งที่เห็นเป็นที่ที่มันอาจเกิดขึ้น อาการที่เห็นใน UI ไม่ได้หมายความว่าปัญหาอยู่ที่ UI เสมอไป
ตัวอย่าง: หน้าร้าน React แสดง toast “Saved” แต่ข้อมูลหายทีหลัง นั่นอาจชี้ไปที่ (1) สเตตของ UI, (2) พฤติกรรม API, หรือ (3) ทางการเขียนลง DB
ขอให้ Claude อธิบายโหมดที่น่าจะล้มเป็นภาษาธรรมดา แล้วถามว่าพิสูจน์แต่ละข้ออย่างไร เป้าหมายคือเปลี่ยน “อาจเป็น” ให้เป็น “เช็คสิ่งนี้จริง ๆ”
สามสมมติฐานทั่วไปและหลักฐานที่ต้องเก็บ:
เก็บโน้ตให้กระชับ: symptom, hypothesis, evidence, verdict เมื่อสมมติฐานหนึ่งสอดคล้องกับข้อเท็จจริง ให้ล็อก regression test แล้วแก้เฉพาะสิ่งที่จำเป็น
Regression test ที่ดียืนยันว่าบั๊กมีจริง และบอกเมื่อคุณแก้จริง ๆ
เริ่มด้วยการเลือกเทสต์ที่เล็กที่สุดตรงกับความล้มเหลว ถ้าบั๊กเกิดขึ้นเมื่อหลายส่วนทำงานร่วมกัน unit test อาจพลาด
ใช้ unit test เมื่อฟังก์ชันเดียวคืนค่าผิด ใช้ integration เมื่อขอบเขตระหว่างส่วนเป็นปัญหา (handler + DB หรือ UI + state) และใช้ end-to-end เฉพาะเมื่อจำเป็นต้องมีทั้ง flow
ก่อนจะให้ Claude เขียนอะไร ให้ย้ำกรณีย่อเป็นพฤติกรรมที่คาดหวังอย่างเคร่งครัด ตัวอย่าง: “เมื่อผู้ใช้บันทึกชื่อเรื่องว่าง API ต้องคืน 400 พร้อมข้อความ ‘title required’.” ตอนนี้เทสต์มีเป้าหมายชัดเจน
แล้วให้ Claude ร่างเทสต์ที่ล้มก่อน เก็บ setup ให้น้อยที่สุดและคัดลอกข้อมูลที่ทริกเกอร์บั๊ก ชื่อเทสต์ให้ตั้งตามประสบการณ์ผู้ใช้ ไม่ใช่ชื่อฟังก์ชันภายใน
ตรวจสอบด่วน:
เมื่อเทสต์ล้มด้วยเหตุผลที่ถูกต้อง คุณก็พร้อมจะทำการแก้แบบแคบด้วยความมั่นใจ
เมื่อมี repro เล็ก ๆ และ regression test ที่ล้มแล้ว อย่าหลงเชื่ออยาก “ทำความสะอาด” โค้ด เป้าหมายคือหยุดบั๊กด้วยการเปลี่ยนแปลงเล็กสุดที่ทำให้เทสต์ผ่านด้วยเหตุผลที่ถูกต้อง
การแก้แบบแคบควรเปลี่ยนพื้นผิวให้น้อยที่สุด หากความล้มเหลวอยู่ในฟังก์ชันเดียว ให้แก้แค่นั้น หากขาดการตรวจสอบขอบเขต ให้เพิ่มการตรวจตรงขอบเขต ไม่ต้องเปลี่ยนทั้งสายเรียก
ถ้าใช้ Claude ช่วย ให้ขอ 2 ตัวเลือกการแก้ แล้วเปรียบเทียบขอบเขตและความเสี่ยง ตัวอย่าง: ถ้าแบบฟอร์ม React แครชเมื่อฟิลด์ว่าง คุณอาจได้:
ตัวเลือก A มักเป็นทางเลือกในการ triage: เล็กกว่า, รีวิวง่ายกว่า, มีโอกาสทำลายสิ่งอื่นน้อยกว่า
เพื่อให้การแก้เป็นแบบแคบ แตะไฟล์ให้น้อยที่สุด เลือกการแก้ในพื้นที่ท้องถิ่นก่อน refactor เพิ่ม guard หรือ validation ที่จุดเข้าของค่าที่ไม่ดี และทำให้การเปลี่ยนพฤติกรรมชัดเจนด้วย before/after หนึ่งชัดเจน ใส่คอมเมนต์เฉพาะเมื่อเหตุผลไม่ชัด
ตัวอย่างจริง: endpoint Go ทำ panic เมื่อ query param แบบ optional หาย แก้แบบแคบคือจัดการสตริงว่างที่ boundary ของ handler (parse ด้วย default หรือคืน 400 พร้อมข้อความชัดเจน) หลีกเลี่ยงการเปลี่ยน utils ร่วมถ้า regression test ไม่ชี้ว่าปัญหาอยู่ที่โค้ดร่วม
หลังเปลี่ยนแล้ว ให้รันเทสต์ที่ล้มและเทสต์ใกล้เคียง 1–2 รายการ ถ้าการแก้ต้องอัพเดตเทสต์ที่ไม่เกี่ยวหลายรายการ นั่นคือสัญญาณว่าการเปลี่ยนกว้างเกินไป
การยืนยันเป็นจุดที่คุณจับปัญหาง่าย ๆ แต่พลาดได้: แก้แล้วผ่านเทสต์เดียวแต่ทำลายทางเดินใกล้เคียง, เปลี่ยนข้อความผิดพลาด, หรือเพิ่ม query ช้า
เริ่มด้วยการรัน regression test ที่เพิ่มไว้ ถ้าผ่าน ให้รันเทสต์เพื่อนบ้าน: เทสต์ในไฟล์เดียวกัน โมดูลเดียวกัน หรือสิ่งที่ครอบคลุมอินพุตเดียวกัน บั๊กมักซ่อนตัวใน helpers ร่วม parsing หรือ boundary checks ดังนั้นความล้มเหลวที่เกี่ยวข้องมักอยู่ใกล้ ๆ
จากนั้นทำการตรวจสอบด้วยตนเองตามขั้นตอนรายงานต้นทาง ให้สั้นและชัด: สภาพแวดล้อมเดียวกัน ข้อมูลเดียวกัน ลำดับคลิกหรือการเรียก API เดียวกัน ถ้ารายงานคลุมเครือ ให้ทดสอบสถานการณ์ที่คุณใช้ทำซ้ำ
ถ้าต้องการให้โฟกัส ให้ขอ Claude ร่างแผนการยืนยันสั้น ๆ ตามการเปลี่ยนและสถานการณ์ที่ล้ม แชร์ไฟล์ที่เปลี่ยน พฤติกรรมที่ตั้งใจ และสิ่งที่อาจได้รับผลกระทบ แผนที่ดีที่สุดสั้นและทำได้จริง: 5–8 ข้อที่เสร็จภายในไม่กี่นาที แต่ละข้อมีผล/ไม่ผ่านที่ชัดเจน
สุดท้าย จดสิ่งที่ยืนยันไว้ใน PR หรือบันทึก: เทสต์ที่รัน ขั้นตอน manual ที่ลอง และขอบเขตที่ไม่ได้ทดสอบ (เช่น “ไม่ได้ทดสอบมือถือ”) เพื่อให้การแก้ตรวจสอบได้ง่ายขึ้นและย้อนกลับได้ง่ายในอนาคต
วิธีที่เร็วที่สุดที่จะเสียเวลา คือยอมรับ “การแก้” ก่อนจะทำซ้ำปัญหาได้ ถ้าทำให้ล้มไม่ได้อย่างน่าเชื่อถือ คุณจะไม่รู้ว่าจริง ๆ สิ่งที่ดีขึ้นคืออะไร
กฎปฏิบัติ: อย่าขอการแก้จนกว่าจะอธิบายการตั้งค่าที่ทำซ้ำได้ (ขั้นตอน อินพุต สภาพแวดล้อม และภาพของสิ่งที่ “ผิด”) หากรายงานคลุมเครือ ให้ใช้เวลาตอนต้นในการเปลี่ยนเป็นเช็คลิสต์ที่คุณรันสองครั้งแล้วได้ผลเหมือนกัน
แก้ก่อนมีกรณีทำซ้ำได้. ต้องมีสคริปต์หรือชุดขั้นตอน “ล้มทุกครั้ง” ขั้นต่ำ หากมันล้ม “บางครั้ง” ให้จับเวลา ขนาดข้อมูล ฟีเจอร์แฟลก และ logs จนกว่าจะไม่เป็นสุ่ม
ย่อเร็วเกินไป. ถ้าคุณย่อกรณีลงก่อนยืนยันการล้มต้นทาง อาจทำให้สัญญาณหายไป ก่อนอื่นล็อก baseline reproduction แล้วค่อยย่อทีละอย่าง
ให้ Claude เดา. Claude เสนอสาเหตุที่เป็นไปได้ได้ แต่คุณต้องมีหลักฐาน ขอ 2–3 สมมติฐานและการสังเกตที่แน่นอนที่จะยืนยันหรือปฏิเสธแต่ละข้อ (log line, breakpoint, ผล query)
เทสต์รีเกรชันที่ผ่านด้วยเหตุผลผิด. เทสต์อาจ “ผ่าน” เพราะไม่เคยเข้าเส้นทางล้ม ให้แน่ใจว่าเทสต์ล้มก่อนแก้ และล้มด้วยข้อความหรือ assertion ที่คาดหวัง
รักษาอาการแทนทริกเกอร์. ถ้าเพิ่ม null check แต่สาเหตุจริงคือ “ค่านี้ไม่ควรจะเป็น null” คุณอาจซ่อนบั๊กลึกกว่า ควรแก้เงื่อนไขที่สร้างสถานะไม่ดี
รัน regression test ใหม่และขั้นตอน reproduction เดิมก่อนและหลังการเปลี่ยน ถ้าบั๊กเกิดตอนใช้คูปองหลังเปลี่ยนการจัดส่ง ให้เก็บลำดับเต็มนี้เป็น “ความจริง” แม้เทสต์ย่อจะเล็กกว่า
ถ้าการยืนยันของคุณพึ่งพา “ตอนนี้ดูดี” ให้เพิ่มการตรวจสอบหนึ่งอย่าง (log, metric, หรือ output ชัดเจน) เพื่อให้คนถัดไปตรวจยืนยันได้เร็ว
เมื่อกดดัน เวลาไม่เพียงพอ วงจรเล็ก ๆ และทำซ้ำได้ย่อมดีกว่าการไล่ดีบักแบบฮีโร่
เขียนการตัดสินสุดท้ายเป็นไม่กี่บรรทัดเพื่อให้คนถัดไป (มักเป็นคุณในอนาคต) เชื่อถือได้ รูปแบบที่มีประโยชน์: “Root cause: X. Trigger: Y. Fix: Z. Why safe: W. What we did not change: Q.”
ขั้นตอนต่อไป: อัตโนมัติเท่าที่ทำได้ (สคริปต์ repro ที่บันทึกไว้ คำสั่งเทสต์มาตรฐาน เทมเพลตสำหรับบันทึกสาเหตุราก)
ถ้าคุณสร้างแอปด้วย Koder.ai (koder.ai), Planning Mode สามารถช่วยร่างการเปลี่ยนก่อนแตะโค้ด และ snapshots/rollback ทำให้ทดลองอย่างปลอดภัยขณะทำงานผ่าน repro ที่ซับซ้อน เมื่อแก้แล้วและยืนยันได้ คุณสามารถส่งออกซอร์สโค้ดหรือ deploy และโฮสต์แอปที่อัปเดต รวมถึงใช้โดเมนที่กำหนดเองหากต้องการ
Bug triage คือการฝึกนิสัยในการเปลี่ยนรายงานคลุมเครือให้เป็นประโยคที่ชัดเจนและทดสอบได้ แล้วทำการเปลี่ยนแปลงเล็กที่สุดที่พิสูจน์ได้ว่าประโยคนั้นไม่เป็นความจริงอีกต่อไป
มันไม่ใช่การพยายาม “แก้ทุกอย่าง” ในครั้งเดียว แต่เป็นการลดความไม่แน่นอนทีละขั้น: ทำให้เกิดซ้ำ ย่อกรณี ตั้งสมมติฐานที่มีหลักฐาน รองรับ เพิ่ม regression test แก้แบบจำกัด แล้วตรวจสอบผล
เพราะแต่ละขั้นจะตัดการเดาออกไปคนละแบบ
เขียนใหม่เป็นรูปแบบ: “When I do X, I expect Y, but I get Z.”
จากนั้นเก็บบริบทพอให้ทดสอบได้:
เริ่มจากยืนยันว่าทำซ้ำได้ในสภาพแวดล้อมที่เล็กที่สุดที่ยังแสดงปัญหาได้ (มักเป็น local dev กับชุดข้อมูลเล็ก)
ถ้ามันเกิด “บางครั้ง” พยายามทำให้เป็น deterministic ด้วยการควบคุมตัวแปร:
อย่าย้ายไปขั้นถัดไปจนกว่าจะทำให้ล้มเหลวได้ตามต้องการ มิฉะนั้นคือการเดา
การย่อหมายถึงตัดสิ่งที่ไม่จำเป็นออกไปจนกว่าจะยังคงเกิดบั๊กอยู่
วิธีปฏิบัติ: “ตัดครึ่งแล้วทดสอบ”
ย่อทั้ง ขั้นตอน (เส้นทางผู้ใช้สั้นลง) และ ข้อมูล (payload เล็กลง, ฟิลด์/รายการน้อยลง) จนได้ทริกเกอร์ที่เล็กที่สุด
ใช้ Claude Code เพื่อเร่งการวิเคราะห์ ไม่ใช่เพื่อให้เดาแทนคุณ
คำขอที่ดีมีลักษณะเช่น:
แล้วคุณต้องตรวจสอบ: ทำซ้ำในเครื่อง, ดู logs/traces, ยืนยันว่าเทสต์ล้มเหลวด้วยเหตุผลที่ถูกต้อง
จำกัดไว้ที่ สาม สมมติฐาน ถ้ามากกว่านั้นมักหมายความว่า repro ยังใหญ่เกินไปหรือสังเกตไม่ชัด
สำหรับแต่ละสมมติฐานให้เขียน:
เลือกระดับเทสต์ที่เล็กที่สุดที่สอดคล้องกับความล้มเหลว:
เทสต์ที่ดี:
ทำการเปลี่ยนแปลงที่เล็กที่สุดซึ่งทำให้ regression test ที่ล้มเหลวนั้นผ่าน
กฎปฏิบัติ:
ใช้เช็คลิสต์สั้น ๆ ที่ทำได้เร็ว:
จดบันทึกสิ่งที่รันและสิ่งที่ไม่ได้ทดสอบไว้ เพื่อให้ผลน่าเชื่อถือ
วิธีนี้จะบังคับให้มีความก้าวหน้าและหยุดการดีเลย์การไล่หาเหตุผลแบบไม่มีที่สิ้นสุด