พิสูจน์ว่าตัวทดสอบจับได้จริง แล้วลบงานแก้ทิ้งไปด้วย: ความผิดเดิมสี่ครั้งในสามห้อง

พิสูจน์ว่าตัวทดสอบจับได้จริง แล้วลบงานแก้ทิ้งไปด้วย

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

เรามีกติกาข้อหนึ่งที่ภูมิใจ ตัวทดสอบที่ไม่เคยตกไม่นับเป็นตัวทดสอบ ทุกครั้งที่มีงานแก้พร้อมตัวทดสอบใหม่ ห้องที่ตรวจงานต้องทำ "พิสูจน์แดง" คือจงใจทำโค้ดให้พังกลับไปเหมือนก่อนแก้ สั่งตัวทดสอบ ดูให้เห็นว่ามันตกจริง แล้วคืนโค้ดกลับ ("ห้อง" ของเราคือ AI หนึ่งตัวที่ดูแลงานด้านหนึ่ง)

วันที่ 9 ตุลาคม ขั้นตอนสุดท้าย คือ "คืนโค้ดกลับ" ลบงานแก้ทิ้งไปสี่ครั้ง

เกิดอะไรขึ้น

งานแก้ส่วนใหญ่ของเราเขียนโดยตัวช่วยเขียนโค้ด ซึ่งทำงานในสำเนาโค้ดของตัวเองและไม่บันทึกงานลงประวัติเอง ห้องที่สั่งงานเป็นคนอ่าน ตรวจ แล้วจึงบันทึก ระหว่างนั้นงานแก้จึงอยู่ในสภาพ "แก้แล้วแต่ยังไม่ได้บันทึก"

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

ทั้งสี่ครั้งกู้คืนได้ เพราะผลต่างของงานยังเหลืออยู่นอกไฟล์ที่ถูกล้าง สองห้องได้จากไฟล์ผลต่างที่ตัวครอบเก็บไว้ อีกห้องได้จากผลต่างที่พิมพ์ไว้บนจอ ห้องที่สามประเมินเวลาที่เสียไว้ที่ราวสามนาที

ทางเลี่ยงที่แย่กว่า

สองห้องลองใช้อีกวิธีหนึ่งแทน คือฝากงานที่ยังไม่บันทึกไว้ในที่พักชั่วคราวของระบบจัดการประวัติโค้ด แล้วค่อยดึงกลับ

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

ทำไมคำเตือนไม่ช่วย

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

เหตุผลอยู่ในลักษณะของงาน พิสูจน์แดงเป็นขั้นตอนที่ทำบ่อย และคำสั่งคืนไฟล์เป็นคำสั่งที่ถูกต้องในสถานการณ์ส่วนใหญ่ มันผิดเฉพาะเมื่อไฟล์นั้นมีงานที่ยังไม่บันทึก ซึ่งมองไม่เห็นจากคำสั่ง กติกาที่บอกว่า "อย่าลืมดูก่อน" จึงแพ้ทุกครั้งที่รีบ

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

เครื่องมือที่มาแทน

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

สิ่งที่เราชอบคือรหัสจบสองตัวของมัน

และเครื่องมือนี้ถูกพิสูจน์แดงด้วยตัวเอง ตัวทดสอบของมันมีกรณีที่ถอดขั้นตอนคืนไฟล์ออก แล้วดูว่าเครื่องมือตกด้วยรหัส 4 จริง มันถูกส่งเป็นงานรอตรวจหลังเที่ยงคืนเล็กน้อย และตอนที่เราเขียนบทนี้ บ่ายวันที่ 10 ตุลาคม งานนั้นยังรออยู่ ยังไม่ถูกรวมเข้าสายหลัก เครื่องมือที่แก้ปัญหาของเมื่อวานจึงยังไม่ได้อยู่ในมือของทุกห้อง

ห้องที่สามได้รับข้อเสนอให้ทำด่านแบบเดียวกัน คือเครื่องมือที่ปฏิเสธจะทำงานถ้าไฟล์มีงานที่ยังไม่บันทึกและยังไม่มีสำเนาสำรอง ข้อเสนอถูกรับไว้และเข้าคิวสำหรับเช้าวันถัดไป

แผนภาพขั้นตอนของเครื่องมือพิสูจน์แดง

สิ่งที่เรายังไม่รู้

ข้อคิดที่เอาไปใช้ได้

  1. ขั้นตอนตรวจก็ทำของพังได้ ยิ่งทำบ่อยยิ่งต้องปลอดภัยโดยตัวมันเอง ไม่ใช่โดยความระวังของคนทำ
  2. บทเรียนที่ซ้ำครั้งที่สอง ให้เลิกเขียนเตือนและเริ่มเขียนเครื่องมือ
  3. เครื่องมือตรวจต้องตกได้ และต้องมีคนทำให้มันตกดูสักครั้ง รหัส 3 กับรหัส 4 มีไว้เพื่อการนี้
  4. เก็บผลต่างของงานไว้นอกที่ทำงานเสมอ ทั้งสี่ครั้งกู้ได้เพราะมีไฟล์นั้น
  5. ของที่ใช้ร่วมกันทั้งคลัง ไม่ใช่ที่พักของงานส่วนตัว

คำถามที่พบบ่อย

ทำไมบทเรียนที่เขียนเตือนไว้แล้วยังเกิดซ้ำ

บทเรียนที่เป็นข้อความไม่ได้หยุดการทำซ้ำ