与自身计算器结果不符的算例
我经营着一个家居装修成本计算器网站。
每个页面在四个地方显示成本:
- 一个交互式小部件 (widget)。
- 一个静态参考表。
- 正文中的文字示例。
- 一个常见问题解答 (FAQ) 部分。
我发现了一个重大 Bug。一个文字示例说项目成本为 $62,300。而小部件显示的同一项目成本却是 $56,779。
两者之间存在 $5,500 的差距。
这些数字并非随机产生的,而是源于不同的隐藏假设。文字说明假设更换了新的 HVAC(暖通空调)设备,而小部件则假设你会使用现有系统。两者本身都没错,但它们之间没有进行数据同步。
这是一个常见的错误。当你把同一个事实存储在两个地方时,它们就会产生偏差。你不仅仅是在复制内容,你是在复制数据。
我用一个我称之为“源头优先 (source-first)”的规则解决了这个问题。它包含两个部分。
第一部分:成本仅存在于一个地方。
我不再在文本和表格中手动输入数字。现在,计算器函数是唯一的来源。在构建过程中,表格和文字示例会直接从该函数中提取数字。如果函数发生变化,页面上的每个数字都会自动更新。由于数字的值完全相同,因此不可能出现不匹配的情况。
第二部分:每个数字都必须显示其来源。
成本数据并非永久事实,它会失效。我在每个计算中都添加了一个小的数据对象,显示:
- 所使用的场景。
- 数据来源。
- 访问日期。
- 数据应复核的时间。
这保证了数据的真实性。如果源数据错误,整个网站都会出错,但至少网站能保持一致。用户会立即注意到矛盾,而这会摧毁信任。
教训很简单:
- 如果页面上的两个地方显示相同的数字,其中一个应该导入它,而不是重新输入。
- 利用构建过程来同步数据。这能将“纪律问题”转化为“技术上的不可能”。
- 不要再手动编写函数已经计算过的数字。
我花了一整天的时间去删除数字,而不是编写数字。我的代码库变小了,而且它不再对用户撒谎。
Source: https://dev.to/mark_b5f4ffdd8e7cd58/the-worked-example-that-disagreed-with-its-own-calculator-4cp9