可以,但你的类型系统需要先知道什么是美元
TypeScript 把所有数字视为同一个东西。下面介绍如何让它区分 USD 和 EUR,使编译器在代码上线前就能拦截货币转换相关的 bug。
2022 年,一家大型金融科技平台处理了一笔 32,700,000.00 的批量转账。金额被存储为普通的 。下游服务以为它是以分为单位。事实并非如此。 这个 bug 逃过了代码审查、单元测试和集成测试。类型系统看到 和 ,就觉得没问题了。两个完全相同的类型,完美兼容,却带来了灾难性的错误。…
探索 AI 优先开发、编码护栏和可处置架构。
TypeScript 把所有数字视为同一个东西。下面介绍如何让它区分 USD 和 EUR,使编译器在代码上线前就能拦截货币转换相关的 bug。
2022 年,一家大型金融科技平台处理了一笔 32,700,000.00 的批量转账。金额被存储为普通的 。下游服务以为它是以分为单位。事实并非如此。 这个 bug 逃过了代码审查、单元测试和集成测试。类型系统看到 和 ,就觉得没问题了。两个完全相同的类型,完美兼容,却带来了灾难性的错误。…
该传秒的地方传了毫秒,这种 bug 能躲过所有测试。下面介绍如何将单位直接编码进 TypeScript 的类型系统,让混用在编译阶段就报错,且运行时零开销。
某个函数的 timeout 参数要求毫秒,你传了 。另一个函数要求秒,你传了 。中间某个地方,你调用了 ,结果整整一小时二十三分钟什么也没发生。 TypeScript 在这里帮不了你。 和 都是 。编译器分辨不出米和英尺、摄氏和华氏、时间戳和时长的区别。你的测试套件大概率也抓不到,因为计算本身是对的,错的是单位。…
TypeScript 中的类型别名不会创建独立的类型。Branded types 可以,而且它们能在编译时帮你避免混淆标识符。
上个季度,我们上线了一个 bug:把退款打给了错误的客户。一个 函数在预期接收订单 ID 的地方收到了用户 ID。两个字符串看起来一模一样,测试通过了,TypeScript 也没有任何异议。 两个标识符的类型都是 。TypeScript 看不出它们之间的区别。如果你曾经把 传给了需要…
差分测试让你无需知道正确答案就能发现 bug。问题在于,相关的错误看起来像是达成一致。以下是如何发现盲点。
你可以在没有形式化证明的情况下信任差分测试,但前提是你必须清楚它究竟会在哪里失效。 这个弱点叫做共模故障(common-mode failure)。当某个规范的每一个实现都做出同样的错误假设时,它们会全部达成一致,而你的测试框架会将其判定为通过。N 版本编程(N-version…
N-version programming 假设你的实现结果一致。我们来看为什么测试远远不够,SMT solvers 如何真正证明等价性,以及如何在‘足够好’和形式化验证之间取舍。
你搭建了一个 n-version 系统。同一个关键函数的三个独立实现,一个选择多数结果的 voter,以及一种你已经规避了单点故障的满足感。 但你并没有证明这些函数是等价的。你只证明了它们能编译通过。 N-version programming 的核心思想是:如果某个实现存在 bug,其他实现大概率不会有,因此…
并行运行多个 LLM 能够捕捉到任何单一模型都会自信地交付的错误。以下是如何构建一个真正有效的分歧解决系统。
你把 prompt 发给 GPT-4o。它返回一个 JSON blob,置信度 0.97。你把同样的 prompt 发给 Claude 3.5 Sonnet。它返回了另一个不同的 JSON blob,置信度也是 0.97。两个模型听起来都无比确定。但它们各自以不同的方式错了。 这不是假设。如果你运行任何非平凡的…
N-version programming 听起来很简单:运行多种实现,然后挑出最佳答案。但在实践中,'最佳'远比'最常见'更难定义。
你有同一个函数的五种实现。三种返回相同结果。一种略有不同。一种抛出异常。哪个才是对的? 大多数团队默认采用多数投票。当输出完全一致、错误显而易见时,这招确实管用。但一旦各实现在细微之处产生分歧,或者每个变体都给出不同答案时,这套机制就会崩解。N-version programming…
基于 LLM 的 N 版本编程不需要多个模型。通过变化提示词、角色设定和推理约束,你可以从单个模型中提取多样化且正确的实现。
N 版本编程默认多样性来自不同的作者。对 LLM 来说,这意味着不同的模型、不同的提供商,甚至不同的训练批次。但这个假设是错的。你可以通过改变提问的方式,而不是提问的内容,从同一个模型中获得有意义的多样性。 问题在于:把 temperature 调到 1.0…
N-version programming 曾承诺独立团队会犯独立的错误。Knight 和 Leveson 在 1986 年的实验证明了相反的事实,NASA 悄然放弃了这条路线。
20 世纪 80 年代初,NASA 面临着一个至今仍在困扰安全关键工程领域的问题:如何容忍那些尚未发现的 bug?他们的答案是 N-version programming。将同一份规范交给三个独立团队。并行运行三个程序。对输出结果进行投票。如果其中一个团队写出了 bug,另外两个团队会通过多数票将其压倒。…
Cucumber 的 'skipped' 状态隐藏了三种完全不同的问题。以下是如何诊断是哪一种在侵蚀你的测试套件,以及如何阻止它。
你有一半的 Cucumber 场景被跳过了。不是失败,是跳过。 那个黄色的状态比红色构建更糟糕。它让你的套件看起来很健康,却在一个礼貌的标签下隐藏了三种完全不同的问题。一个被跳过的场景可能意味着你的 tag 过滤排除了它,某个 step definition 丢失了,或者一个 hook…