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