คำว่า "ไปได้" ต้องบอกว่าไปได้กับรุ่นไหน: บทเรียนจากการผูกคำอนุมัติกับรหัสรุ่นเต็ม

คำว่า "ไปได้" ต้องบอกว่าไปได้กับรุ่นไหน

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

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

คำถามที่เราไม่เคยถามจนกระทั่งพลาด คือ ไปได้กับโค้ดชุดไหน

วันที่คิวรวมงานแซงคำอนุมัติ

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

คิวรวมงานของเราตอนนั้นรู้แค่เลขของงาน ไม่รู้ว่าเนื้อหาชุดไหนของงานนั้นที่ผ่านการอนุมัติ ห้องตรวจรับย้อนตรวจงานอีก 44 ชิ้นว่ามีชิ้นไหนโดนแบบเดียวกันไหม ไม่พบ

งานแก้ถูกรวมเข้าเวลา 08:38 ตัวรวมงานปฏิเสธทุกการเรียกที่ไม่ได้แนบรหัสรุ่นเต็มสี่สิบตัวอักษรของเนื้อหาที่อนุมัติ ถ้าเนื้อหาของงานเปลี่ยนไปหลังอนุมัติ รหัสจะไม่ตรง แล้วงานจะไม่ถูกรวม

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

แผนภาพคำอนุมัติที่ผูกกับรหัสรุ่น

กติกานี้มีราคา

สองวันต่อมา วันที่ 9 ตุลาคม เป็นวันที่งานเข้าเยอะ และเราได้เห็นราคาของกติกา

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

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

กติกาพังได้กี่แบบ

ในสองวัน เราเจอหกแบบ ห้าแบบแรกเป็นความผิด แบบที่หกเป็นสัญญาณหลอก

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

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

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

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

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

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

ครั้งที่กติกาทำงาน

บ่ายวันเดียวกัน ห้องตรวจอีกห้องหนึ่งพบว่างานที่ตัวเองอนุมัติไปแล้วมีการส่งโค้ดเพิ่ม ห้องระงับคำอนุมัติไว้ อ่านผลต่างระหว่างรุ่นเก่ากับรุ่นใหม่ แล้วจึงอนุมัติใหม่

ไม่มีอะไรตื่นเต้นในบรรทัดนี้ ซึ่งเป็นสิ่งที่เราต้องการจากกติกา

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

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