คลิปที่ระบบบอกว่ามี แต่เปิดไม่เจอ — บั๊กที่อันตรายที่สุดของระบบเก็บหลักฐาน
CamBooth มีหน้าที่เดียว คือเก็บหลักฐานว่าตอนแพ็คสินค้าใส่อะไรลงกล่องไปบ้าง
ผลิตภัณฑ์ที่มีหน้าที่แบบนี้มีความล้มเหลวอยู่หนึ่งแบบที่ยอมรับไม่ได้เลย — บอกว่ามีหลักฐาน แต่พอถึงเวลาต้องใช้กลับไม่มี
และเราเจอบั๊กแบบนั้นจริง ๆ
อาการ
ถ้าลูกค้าตั้งค่าที่เก็บวิดีโอเป็นโฟลเดอร์ชื่อภาษาไทย ทุกอย่างจะดูปกติดี
- โปรแกรมเปิดได้ กล้องทำงาน ตาชั่งอ่านค่าได้
- ยิงบาร์โค้ดแล้วระบบเริ่มอัด
- ปิดออเดอร์แล้วระบบบันทึกว่ามีคลิปของออเดอร์นี้
- ไม่มีข้อความผิดพลาดใด ๆ
แต่ไฟล์วิดีโอไม่เคยถูกเขียนลงดิสก์เลย
ทุกอย่างเดินหน้าตามปกติจนกว่าจะมีเคสจริง — ลูกค้าแจ้งว่าได้ของไม่ครบ ร้านเปิดระบบไปหาคลิปของออเดอร์นั้น ระบบบอกว่ามี แต่เปิดไม่ขึ้น
สาเหตุ
ไลบรารีที่เราใช้เขียนไฟล์วิดีโอเปิดไฟล์ผ่านเส้นทางแบบเก่าที่รองรับเฉพาะอักขระในชุดอักษรของระบบ ซึ่งไม่ครอบคลุมภาษาไทย
เมื่อเจอชื่อโฟลเดอร์ภาษาไทย มันเปิดไฟล์ไม่ได้ — แต่ไม่ได้แจ้งข้อผิดพลาดกลับมาให้โปรแกรมรู้ มันเพียงแค่ไม่เขียนอะไรลงไป
โปรแกรมของเราจึงเดินหน้าต่อด้วยความเข้าใจว่าการอัดสำเร็จ แล้วบันทึกรายการคลิปลงฐานข้อมูลตามปกติ
ที่เจ็บกว่านั้นคือฝั่งเปิดดูคลิปมีปัญหาเดียวกัน — แม้ไฟล์จะถูกเขียนสำเร็จ การเปิดดูและการตัดคลิปย่อยก็ทำไม่ได้ถ้าอยู่ใต้โฟลเดอร์ภาษาไทย
ทำไมถึงไม่เจอเร็วกว่านี้
เพราะไม่มีอะไรให้เจอ
ความล้มเหลวที่มีข้อความผิดพลาดจะถูกพบเสมอ — มันขึ้นบนหน้าจอ มันเข้าไปอยู่ในบันทึกเหตุการณ์ มีคนโทรมาถาม
ส่วนความล้มเหลวแบบเงียบไม่ทิ้งร่องรอยอะไรเลย ระบบรายงานว่าทุกอย่างเรียบร้อย และไม่มีใครไปเปิดคลิปเก่าดูเล่น ๆ เพื่อยืนยันว่าเปิดได้จริง
สภาพแวดล้อมทดสอบของทีมพัฒนาก็ใช้เส้นทางภาษาอังกฤษเป็นธรรมชาติ ปัญหานี้จึงมีอยู่ได้เฉพาะที่หน้างานลูกค้าเท่านั้น
วิธีแก้
ฝั่งอัด — เขียนลงไฟล์พักก่อนแล้วค่อยย้าย
เราอัดลงไฟล์ชั่วคราวที่ชื่อเป็นอักขระอังกฤษล้วน โดยวางไว้บนไดรฟ์เดียวกับปลายทาง แล้วย้ายไปยังโฟลเดอร์จริงเมื่อหยุดอัด
รายละเอียดเรื่อง “ไดรฟ์เดียวกัน” สำคัญ เพราะการย้ายไฟล์ภายในไดรฟ์เดียวกันเป็นการเปลี่ยนชื่ออย่างเดียว ใช้เวลาเกือบเป็นศูนย์ไม่ว่าไฟล์จะใหญ่แค่ไหน ถ้าข้ามไดรฟ์จะกลายเป็นการคัดลอกจริงซึ่งกินเวลาและอาจสะดุดตอนปิดออเดอร์
และถ้าเส้นทางเป็นอักขระอังกฤษอยู่แล้ว ระบบจะไม่ทำอะไรเพิ่มเลย ไม่มีค่าใช้จ่ายส่วนเกิน
ฝั่งอ่าน — สร้างชื่อเรียกชั่วคราว
สำหรับการเปิดดูและตัดคลิป เราสร้างชื่อเรียกชั่วคราวที่เป็นอักขระอังกฤษชี้ไปยังไฟล์เดิม ใช้ระหว่างอ่านแล้วลบทิ้งเมื่อเสร็จ
วิธีนี้ไม่ได้คัดลอกไฟล์ จึงไม่กินพื้นที่และไม่ต้องรอ (ถ้าระบบไฟล์ไม่รองรับ จะถอยไปใช้การคัดลอกแทน)
ที่สำคัญที่สุด — ไม่เงียบอีกต่อไป
ถ้าเปิดไฟล์เพื่อเขียนไม่ได้จริง ๆ ด้วยเหตุผลใดก็ตาม โปรแกรมจะหยุดและแจ้งเป็นข้อความภาษาไทยทันที แทนที่จะบันทึกรายการคลิปที่ไม่มีอยู่จริงลงฐานข้อมูล
ข้อนี้สำคัญกว่าสองข้อแรก เพราะสองข้อแรกแก้สาเหตุที่เรารู้แล้ว ส่วนข้อนี้ป้องกันสาเหตุที่เรายังไม่รู้ — ดิสก์เต็ม สิทธิ์ไม่พอ ไดรฟ์เครือข่ายหลุด ทั้งหมดนี้จะทำให้เกิดอาการเดียวกันได้ และตอนนี้ทุกกรณีจะแจ้งเตือนแทนที่จะเงียบ
บทเรียนที่เราเอาไปใช้ต่อ
บั๊กนี้เปลี่ยนวิธีคิดของเราเรื่องหนึ่ง
ในระบบที่มีหน้าที่เก็บหลักฐาน “บันทึกว่ามี” กับ “มีจริง” ต้องไม่มีทางแยกออกจากกันได้ ถ้าการเขียนไฟล์ยังไม่ยืนยันว่าสำเร็จ ก็ยังไม่ควรมีแถวข้อมูลที่บอกว่ามีไฟล์นั้น
ฟังดูเป็นเรื่องพื้นฐาน แต่ในทางปฏิบัติมันแปลว่าต้องยอมให้โปรแกรมหยุดและบ่นดัง ๆ ในสถานการณ์ที่ปล่อยผ่านไปเงียบ ๆ ก็ได้ ซึ่งเป็นการตัดสินใจที่ขัดกับสัญชาตญาณของคนเขียนโปรแกรมพอสมควร
แต่สำหรับผลิตภัณฑ์ที่ลูกค้าเอาไปใช้ยืนยันความถูกต้องกับปลายทาง เราคิดว่านี่คือทางเลือกเดียวที่ยอมรับได้
บันทึกคลิปตอนแพ็คสินค้า ลดปัญหาการเคลม