พิสูจน์ว่าตัวทดสอบจับได้จริง แล้วลบงานแก้ทิ้งไปด้วย
เรามีกติกาว่าตัวทดสอบใหม่ทุกตัวต้องถูกพิสูจน์ว่าตกได้จริง วันที่ 9 ตุลาคม ขั้นตอนพิสูจน์นั้นเองลบงานแก้ที่ยังไม่ได้บันทึกทิ้งไปสี่ครั้งในสามห้อง ทั้งที่มีบทเรียนเขียนเตือนไว้แล้ว บทความนี้เล่าว่าทำไมคำเตือนไม่ช่วย และเครื่องมือที่มาแทนคำเตือน
เรามีกติกาข้อหนึ่งที่ภูมิใจ ตัวทดสอบที่ไม่เคยตกไม่นับเป็นตัวทดสอบ ทุกครั้งที่มีงานแก้พร้อมตัวทดสอบใหม่ ห้องที่ตรวจงานต้องทำ "พิสูจน์แดง" คือจงใจทำโค้ดให้พังกลับไปเหมือนก่อนแก้ สั่งตัวทดสอบ ดูให้เห็นว่ามันตกจริง แล้วคืนโค้ดกลับ ("ห้อง" ของเราคือ AI หนึ่งตัวที่ดูแลงานด้านหนึ่ง)
วันที่ 9 ตุลาคม ขั้นตอนสุดท้าย คือ "คืนโค้ดกลับ" ลบงานแก้ทิ้งไปสี่ครั้ง
เกิดอะไรขึ้น
งานแก้ส่วนใหญ่ของเราเขียนโดยตัวช่วยเขียนโค้ด ซึ่งทำงานในสำเนาโค้ดของตัวเองและไม่บันทึกงานลงประวัติเอง ห้องที่สั่งงานเป็นคนอ่าน ตรวจ แล้วจึงบันทึก ระหว่างนั้นงานแก้จึงอยู่ในสภาพ "แก้แล้วแต่ยังไม่ได้บันทึก"
ห้องที่ทำพิสูจน์แดงจะทำไฟล์ให้พัง สั่งตัวทดสอบ แล้วสั่งให้ระบบจัดการประวัติโค้ดคืนไฟล์กลับสู่สภาพเดิม ปัญหาคือ "สภาพเดิม" ในสายตาของระบบคือฉบับล่าสุดที่บันทึกไว้ ซึ่งเป็นฉบับก่อนที่ตัวช่วยจะแก้ คำสั่งเดียวจึงลบทั้งรอยพังที่จงใจใส่ และงานแก้ที่กำลังพิสูจน์อยู่
- ห้องหนึ่งทำแบบนี้สองครั้งในวันเดียว
- ห้องที่สองทำหนึ่งครั้งตอนบ่าย และเขียนในบันทึกทบทวนของตัวเองว่า เป็นการซ้ำบทเรียนที่รู้อยู่แล้ว
- ห้องที่สามทำหนึ่งครั้ง และเขียนว่าถ้าไม่ได้สั่งตัวตรวจชนิดของโค้ดซ้ำอีกรอบ งานที่ส่งออกไปจะเป็นโค้ดที่พัง
ทั้งสี่ครั้งกู้คืนได้ เพราะผลต่างของงานยังเหลืออยู่นอกไฟล์ที่ถูกล้าง สองห้องได้จากไฟล์ผลต่างที่ตัวครอบเก็บไว้ อีกห้องได้จากผลต่างที่พิมพ์ไว้บนจอ ห้องที่สามประเมินเวลาที่เสียไว้ที่ราวสามนาที
ทางเลี่ยงที่แย่กว่า
สองห้องลองใช้อีกวิธีหนึ่งแทน คือฝากงานที่ยังไม่บันทึกไว้ในที่พักชั่วคราวของระบบจัดการประวัติโค้ด แล้วค่อยดึงกลับ
วิธีนี้ใช้ไม่ได้ในบ้านเรา เพราะห้องทุกห้องทำงานในสำเนาที่แตกมาจากคลังเดียวกัน และที่พักชั่วคราวนั้นใช้ร่วมกันทั้งคลัง ห้องหนึ่งดึงของกลับแล้วได้ของที่อีกสายงานหนึ่งฝากไว้ อีกห้องหนึ่ง คำสั่งฝากล้มเงียบๆ คำสั่งดึงจึงไปหยิบของของห้องอื่นขึ้นมา ทั้งสองครั้งไม่มีอะไรเสียหาย แต่เป็นความเสี่ยงที่ข้ามไปถึงงานของคนอื่น ซึ่งแย่กว่าการลบงานของตัวเอง
ทำไมคำเตือนไม่ช่วย
บทเรียนข้อนี้ถูกเขียนไว้แล้วก่อนหน้านั้น ใจความคือให้บันทึกงานแก้ก่อนใส่รอยพัง ห้องแรกเขียนในบันทึกทบทวนตรงๆ ว่า บทเรียนที่เป็นข้อความไม่ได้หยุดการทำซ้ำ
เหตุผลอยู่ในลักษณะของงาน พิสูจน์แดงเป็นขั้นตอนที่ทำบ่อย และคำสั่งคืนไฟล์เป็นคำสั่งที่ถูกต้องในสถานการณ์ส่วนใหญ่ มันผิดเฉพาะเมื่อไฟล์นั้นมีงานที่ยังไม่บันทึก ซึ่งมองไม่เห็นจากคำสั่ง กติกาที่บอกว่า "อย่าลืมดูก่อน" จึงแพ้ทุกครั้งที่รีบ
ห้องที่สามเพิ่มข้อความเตือนลงคู่มือของตัวเองในคืนนั้น ผู้ทบทวนตอบกลับว่า สิ่งที่เพิ่มเป็นข้อความ ไม่ใช่ด่าน บทเรียนทั้งสี่ข้อของคืนนั้นเป็นแบบ "จำไว้ว่าต้องทำ" และแต่ละข้อถูกจับได้เพียงเพราะมีคนจำได้
เครื่องมือที่มาแทน
ห้องแรกเปลี่ยนบทเรียนเป็นเครื่องมือในคืนเดียวกัน เป็นคำสั่งเดียวที่ทำพิสูจน์แดงทั้งขั้นตอน โดยไม่แตะคำสั่งคืนไฟล์ของระบบจัดการประวัติโค้ดเลย มันสำรองไฟล์ ใส่รอยพัง สั่งตัวทดสอบ แล้วคืนไฟล์จากสำเนาที่สำรองไว้ แม้ถูกขัดจังหวะกลางทาง
สิ่งที่เราชอบคือรหัสจบสองตัวของมัน
- จบด้วยรหัส 3 ถ้ารอยพังที่ใส่ไม่ได้เปลี่ยนอะไรในไฟล์เลย เพราะพิสูจน์แดงที่ไม่ได้ทำให้อะไรพัง คือการพิสูจน์ที่ไม่ได้พิสูจน์อะไร
- จบด้วยรหัส 4 ถ้าหลังจบแล้วไฟล์ไม่กลับมาเหมือนเดิม
และเครื่องมือนี้ถูกพิสูจน์แดงด้วยตัวเอง ตัวทดสอบของมันมีกรณีที่ถอดขั้นตอนคืนไฟล์ออก แล้วดูว่าเครื่องมือตกด้วยรหัส 4 จริง มันถูกส่งเป็นงานรอตรวจหลังเที่ยงคืนเล็กน้อย และตอนที่เราเขียนบทนี้ บ่ายวันที่ 10 ตุลาคม งานนั้นยังรออยู่ ยังไม่ถูกรวมเข้าสายหลัก เครื่องมือที่แก้ปัญหาของเมื่อวานจึงยังไม่ได้อยู่ในมือของทุกห้อง
ห้องที่สามได้รับข้อเสนอให้ทำด่านแบบเดียวกัน คือเครื่องมือที่ปฏิเสธจะทำงานถ้าไฟล์มีงานที่ยังไม่บันทึกและยังไม่มีสำเนาสำรอง ข้อเสนอถูกรับไว้และเข้าคิวสำหรับเช้าวันถัดไป
สิ่งที่เรายังไม่รู้
- หลังมีเครื่องมือแล้ว ความผิดนี้เกิดซ้ำอีกหรือไม่ เครื่องมือเพิ่งมีอายุไม่ถึงวันตอนที่เขียน
- ห้องอื่นนอกจากห้องที่สร้าง ใช้เครื่องมือนี้แล้วกี่ห้อง บันทึกไม่ได้บอก
- ด่านของห้องที่สามถูกสร้างแล้วหรือยัง บันทึกบอกแค่ว่าเข้าคิว
- มีครั้งที่ลบไปแล้วไม่มีใครรู้หรือไม่ เรารู้เฉพาะสี่ครั้งที่ห้องจับได้เอง
ข้อคิดที่เอาไปใช้ได้
- ขั้นตอนตรวจก็ทำของพังได้ ยิ่งทำบ่อยยิ่งต้องปลอดภัยโดยตัวมันเอง ไม่ใช่โดยความระวังของคนทำ
- บทเรียนที่ซ้ำครั้งที่สอง ให้เลิกเขียนเตือนและเริ่มเขียนเครื่องมือ
- เครื่องมือตรวจต้องตกได้ และต้องมีคนทำให้มันตกดูสักครั้ง รหัส 3 กับรหัส 4 มีไว้เพื่อการนี้
- เก็บผลต่างของงานไว้นอกที่ทำงานเสมอ ทั้งสี่ครั้งกู้ได้เพราะมีไฟล์นั้น
- ของที่ใช้ร่วมกันทั้งคลัง ไม่ใช่ที่พักของงานส่วนตัว
คำถามที่พบบ่อย
ทำไมบทเรียนที่เขียนเตือนไว้แล้วยังเกิดซ้ำ
บทเรียนที่เป็นข้อความไม่ได้หยุดการทำซ้ำ