ตัวอย่างการคำนวณที่ขัดแย้งกับเครื่องคิดเลขของตัวเอง
ผมทำเว็บไซต์สำหรับคำนวณค่าใช้จ่ายในการปรับปรุงบ้าน
แต่ละหน้าจะแสดงค่าใช้จ่ายใน 4 จุด:
- วิดเจ็ตแบบโต้ตอบได้ (Interactive widget)
- ตารางอ้างอิงแบบคงที่ (Static reference table)
- ตัวอย่างที่เป็นข้อความในเนื้อหา
- ส่วนคำถามที่พบบ่อย (FAQ)
ผมพบข้อผิดพลาด (bug) ครั้งใหญ่ ตัวอย่างที่เป็นข้อความระบุว่าโครงการมีค่าใช้จ่าย $62,300 แต่ในวิดเจ็ตกลับบอกว่าโครงการเดียวกันนั้นมีค่าใช้จ่าย $56,779
มีส่วนต่างอยู่ถึง $5,500
ตัวเลขเหล่านี้ไม่ได้เกิดขึ้นแบบสุ่ม แต่มันมาจากสมมติฐานที่ซ่อนอยู่ต่างกัน ข้อความที่เขียนไว้สมมติว่าต้องเปลี่ยนเครื่อง HVAC ใหม่ ส่วนวิดเจ็ตสมมติว่าคุณจะใช้ระบบเดิมที่มีอยู่ ทั้งสองแบบไม่ได้ผิด แต่พวกมันไม่ได้เชื่อมโยงข้อมูลถึงกัน
นี่คือความล้มเหลวที่เกิดขึ้นได้บ่อย เมื่อคุณเก็บข้อมูลชุดเดียวกันไว้ในสองที่ ข้อมูลเหล่านั้นจะเริ่มคลาดเคลื่อนออกจากกัน คุณไม่ได้แค่ทำเนื้อหาซ้ำซ้อน แต่คุณกำลังทำข้อมูลซ้ำซ้อน
ผมแก้ไขเรื่องนี้ด้วยกฎที่ผมเรียกว่า source-first ซึ่งมีสองส่วน
ส่วนที่หนึ่ง: ค่าใช้จ่ายต้องมีอยู่เพียงที่เดียวเท่านั้น
ผมเลิกพิมพ์ตัวเลขลงในข้อความและตาราง แต่ตอนนี้ ฟังก์ชันเครื่องคิดเลขคือแหล่งข้อมูลเพียงหนึ่งเดียว ตารางและตัวอย่างที่เป็นข้อความจะดึงตัวเลขโดยตรงจากฟังก์ชันนั้นในระหว่างกระบวนการ build หากฟังก์ชันเปลี่ยน ตัวเลขทุกตัวบนหน้าเว็บก็จะเปลี่ยนตามโดยอัตโนมัติ คุณจะไม่มีทางพบข้อมูลที่ไม่ตรงกัน เพราะตัวเลขเหล่านั้นคือค่าเดียวกัน
ส่วนที่สอง: ตัวเลขทุกตัวต้องแสดงที่มาของมัน
ข้อมูลค่าใช้จ่ายไม่ใช่ข้อเท็จจริงที่คงอยู่ตลอดไป แต่มันมีวันหมดอายุ ผมจึงเพิ่ม data object เล็กๆ เข้าไปในการคำนวณทุกครั้ง ซึ่งจะแสดง:
- สถานการณ์ (scenario) ที่ใช้
- แหล่งที่มาของข้อมูล
- วันที่เข้าถึงข้อมูล
- วันที่ควรตรวจสอบข้อมูลอีกครั้ง
สิ่งนี้ช่วยให้ข้อมูลมีความโปร่งใสและถูกต้อง หากข้อมูลต้นทางผิด เว็บไซต์ทั้งเว็บก็จะผิดไปด้วย แต่อย่างน้อยเว็บไซต์ก็จะมีความสอดคล้องกัน หากผู้ใช้พบความขัดแย้งของข้อมูลทันที นั่นจะทำลายความเชื่อมั่นลง
บทเรียนนี้เรียบง่ายมาก:
- หากสองจุดบนหน้าเว็บแสดงตัวเลขเดียวกัน จุดหนึ่งควรใช้วิธี import ข้อมูลมา ไม่ใช่การพิมพ์ซ้ำ
- ใช้กระบวนการ build ในการซิงค์ข้อมูล วิธีนี้จะเปลี่ยนปัญหาด้านวินัยให้กลายเป็นเรื่องที่เป็นไปไม่ได้ในทางเทคนิค (คือป้องกันไม่ให้เกิดความผิดพลาดได้โดยสิ้นเชิง)
- เลิกเขียนตัวเลขด้วยมือในสิ่งที่ฟังก์ชันคำนวณไว้ให้แล้ว
ผมใช้เวลาทั้งวันไปกับการลบตัวเลขแทนที่จะเขียนมันขึ้นมา ตอนนี้ codebase ของผมเล็กลง และมันไม่โกหกผู้ใช้งานของผมอีกต่อไป
Source: https://dev.to/mark_b5f4ffdd8e7cd58/the-worked-example-that-disagreed-with-its-own-calculator-4cp9