Spec Debt ไม่ได้หายไปเมื่อคุณแก้ไขมัน แต่มันแค่ย้ายที่

การแก้ไขปัญหาไม่ได้หมายความว่าปัญหานั้นจะหมดไปเสมอไป บางครั้งคุณก็แค่ย้ายมันไปไว้ที่อื่น

เมื่อเร็วๆ นี้ ผมได้ทำการตรวจสอบโปรเจกต์เพื่อหา Spec Debt ซึ่งก็คือช่องว่างในคำสั่งที่นำไปสู่บั๊กหรือพฤติกรรมที่ไม่พึงประสงค์ของ AI ผมได้แก้ไขปัญหาเฉพาะจุดไป 7 รายการ หลังจากแก้ไขแล้ว ผลการทดสอบก็ผ่าน ทุกอย่างดูเป็นสีเขียว (ผ่านหมด)

แต่หนี้นั้นไม่ได้หายไปไหน มันแค่ย้ายจาก feature files ไปอยู่ใน step definitions แทน

นี่คือสิ่งที่ผมได้เรียนรู้จากการแก้ไขปัญหาเหล่านี้:

  • ความแม่นยำเป็นเรื่องสำคัญ แทนที่จะพูดว่า "การตอบสนองรวดเร็ว" ให้ใช้ว่า "การตอบสนองจะส่งกลับมาภายใน 12 วินาทีหลังจากส่งคำสั่งซื้อ" เพื่อเป็นการกำหนดกรอบเวลาที่ชัดเจน
  • หลีกเลี่ยงความคลุมเครือ คำว่า "ลองใหม่ 2 ครั้ง" นั้นไม่ชัดเจน หมายถึงพยายามทั้งหมด 2 ครั้ง หรือรวมของเดิมเป็น 3 ครั้ง? ให้ใช้คำว่า "มีการส่งคำขอชำระเงินรวมกันไม่เกิน 2 ครั้ง" เพื่อความแน่นอน
  • ระบุกลไกให้ชัดเจน การพูดว่า "สินค้าในคลังถูกปล่อยออกมา" นั้นคลุมเครือเกินไป ควรระบุว่า "inventory service ได้รับคำขอ release สำหรับสินค้า X"
  • กำจัดคำรับรองที่ผิดพลาด หากขั้นตอนใดผ่านการทดสอบเพียงเพราะฟีเจอร์นั้นยังไม่มีอยู่จริง ให้ลบขั้นตอนนั้นทิ้งเสีย การที่การทดสอบผ่านสำหรับขั้นตอนที่ยังไม่มีอยู่จริงคือการหลอกตัวเอง
  • นิยามคำว่า "ถูกต้อง" ให้ชัดเจน อย่าใช้คำอย่าง "ถูกต้อง" หรือ "เหมาะสม" โดยไม่มีค่าที่วัดได้จริง ให้ใช้ "ประกอบด้วย order_id 123" แทนคำว่า "ประกอบด้วย id ที่ถูกต้อง"

ผมได้สร้างเฟรมเวิร์กเพื่อค้นหาปัญหาเหล่านี้ โดยให้ถามคำถาม 5 ข้อนี้กับทุกๆ scenario:

  • ใครเป็นเจ้าของ scenario นี้?
  • มีการตัดสินใจใดที่ยังเปิดกว้าง (ไม่ชัดเจน) อยู่บ้าง?
  • คำศัพท์ทั้งหมดในนี้มีการนิยามไว้แล้วหรือยัง?
  • สิ่งนี้อธิบายถึงพฤติกรรม (behavior) หรือการทำงานภายใน (implementation)?
  • มีอะไรขาดหายไปจากคำอธิบายนี้บ้าง?

กับดักที่ใหญ่ที่สุดคือช่องว่างระหว่างข้อความและโค้ด คุณอาจเขียนคำสั่งใน spec ได้อย่างสมบูรณ์แบบและแม่นยำ แต่ถ้าโค้ดเบื้องหลังของคุณใช้ทางลัดเพื่อให้ผ่านการทดสอบนั้น คุณก็ยังมีหนี้ (debt) อยู่ดี

ใน spec ระบุว่า "สร้างคำสั่งซื้อผ่าน API" แต่ในความเป็นจริง โค้ดกลับใช้วิธีฉีด (inject) คำสั่งซื้อลงในฐานข้อมูลโดยตรงเพื่อประหยัดเวลา ผลการทดสอบคือผ่าน แต่หนี้ได้ย้ายจากส่วนของความต้องการ (requirement) ไปอยู่ที่ส่วนของการทำงาน (implementation) แทน

อย่าพยายามเขียน spec ให้สมบูรณ์แบบตั้งแต่ครั้งแรก จงเขียน ตรวจสอบ และแก้ไขมัน

Source: https://dev.to/diyaburman/spec-debt-doesnt-disappear-when-you-fix-it-it-migrates-d25

Optional learning community: https://t.me/GyaanSetuAi