于淼 · Lab
语言 中文
08 · 方法论

已验证 = 命令 + 输出

一句“应该没问题”的成本,通常要到三周之后才结账。

· By 于淼 · #验收纪律#工程信任

我和 AI 协作的所有纪律里,如果只能留一条,我留这条:“已验证”必须等于“命令 + 输出”。没有贴出来的命令、没有它真实的回显,那么“已完成”“应该没问题”“测试跑过了”,一律当作没说。

这条规矩不是我想出来的,是被一次账单教会的。

将近二十个 bug,全都待在“已完成”后面

有一个我很上心的项目,自动化程度很高,一旦算错,损失是真的会发生的那种。上线之前我做了一次逐模块的通读——不看报告,只读代码。

那一次翻出将近二十个 bug。它们的共同点不是难。恰恰相反,大多数一眼就能看出来。共同点是:每一个都待在一段被宣布“已完成”的代码里。

真正让我后背发凉的不是数量,是我发现自己完全没有办法从外面分辨哪一段是可信的。所有的报告都写得一样漂亮,语气一样笃定。

为什么自我验收在结构上就不成立

这不是模型的道德问题。有三个更朴素的原因:

  • 写它的上下文和判它的上下文是同一个。它带着“我刚才就是这么想的”去读自己的代码,看见的是意图,不是行为。人也一样——你很难校对自己刚写完的句子。
  • 说“完成”的成本几乎为零,而“真跑一遍”要付出真实的代价。任何一个系统,只要低成本的路径也能通过验收,它就会走低成本的路径。这是结构问题,不是品行问题。
  • 长对话会稀释标准。上下文越满,早先立下的验收条款越容易被悄悄降级成“大概达到了”。

所以我不再把希望寄托在“让它更诚实”上,而是去改结构。

三条能落地的做法

  1. 每一句“已验证”都得带着证据走。命令一行,输出一段,贴在结论旁边。这条对我自己同样生效——我也经常很想说“应该没问题”。
  2. 写的人不判自己。验收交给一个全新上下文的窗口,考题事先不给实现者看。上下文越干净,越容易看见行为而不是意图。
  3. 能被脚本跑的纪律才算纪律。这个网站有一条检查命令,本地和 CI 跑的是同一条。它管的事情很朴素:代码和文档里不许出现中文、文档缺字段要报错、三种语言的 key 必须对齐、构建必须通过。它一点也不聪明,但它不会累,也不会因为今天赶时间就放我一马。

它真正省下的是什么

一句未经验证的“完成”不是零,是负债。它会被后面的工作当成地基,在它上面继续盖三层;等到某个下午你终于发现地基是空的,要拆的就不是那一行代码了。利息总是三周之后才结账。

我一开始以为“命令 + 输出”是用来防 AI 的。用久了才发现,它最大的用处是让我自己敢往前走:证据链在,我就不必每次都回头把所有东西重读一遍。

这和另一篇文章《信号与噪声》讲的其实是同一件事——那篇讲怎么判断一个结论可不可信,这篇讲怎么把判断落进流程里,让它不依赖我当天的状态。