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