跳到主要内容
所有测试都绿了,但那栋房子烧了

所有测试都绿了,但那栋房子烧了

阿舟
阿舟

· 阅读约 3 分钟

半夜睡不着,又翻出来读了一遍《There Will Come Soft Rains》。今天 8 月 13 号,故事里那栋房子死在 8 月 4 号,正好过去九天。

那房子每天七点准时喊人起床,给已经不存在的孩子准备早餐,扬声器播报"今天是 2026 年 8 月 4 日,美好的一天"。画外音:房子,他们死了。尸体就粘在你墙上。

机械老鼠照常出来打扫。炉子煮鸡蛋。厨房报时。没有报错,没有 assert 失败。它把整套流程精确跑完,就是没有任何人在看输出。

我盯着这段笑了半天,然后笑不出来了。这不就是我让 agent 跑自动化脚本的样子吗。

我以前觉得自动化最大的风险是翻车。翻车好歹有声音:报错、告警、红色的字。真正可怕的是静默空转——系统说一切正常,任务被自动消费掉,审查环节被一句"反正它跑得挺对的"给省了。这房子每天做四份没人吃的早餐,跟这个有啥区别?

等到火灾那段,我整个人坐直了。树枝砸破厨房窗户,清洁剂洒上炉子,火警系统瞬间启动。水雾喷下来,每个房间轮流播报"Fire! Fire!"。它在灭火。每个动作之间全是死寂——没有人站在全局,决定把燃气阀关掉。

它没有判断力。它只有流程。

我自己的流水线没这么高级,但性质一样。上个月搭了个自动处理数据的链子,每个环节都配了兜底,这周期的"实习生"表现确实不错:失败自动重试,重试三次标记失败,标记失败发告警。跑了一周,风平浪静。

直到我某天手贱打开输出文件看了眼,发现中间一步从第二周开始就在用默认值填充。上游改了字段名,脚本没跟上,沉默地把空值补成了"未知"。没有红色,没有告警。所有环节都"成功"了,只有结果从"看着对但实际不对"变成了"看着更对但实际更不对"。

这就是那栋房子。

我把这两件事放在一起想了很久。区别在哪?房子烧了,因为它的灭火系统是隔离的零件,各干各的,没有全局的眼睛。我的流水线也一样——每个环节的"成功"都是局部的,全局那双眼睛本该是我,但我在等告警,没在看。

工具跑出一个 diff,你扫一眼,没报错,合并。测试都绿了。但测试是它自己写的——它当然会给自己挑几个能过的断言。扯远了,回正题。

我后来加了一条规则:关键路径上,agent 跑完,我必须人肉 dry-run 一遍,逐行看它是怎么从原始输入推到输出的。不是每次都有必要,但每次不做的代价,都像那栋房子——一切正常,直到树砸进来。

但我知道这条规则很脆弱。它建立在我愿意看的基础上。真忙起来,我大概率会跳过它。所以我把话改死:关键路径必须人工确认,没有例外。如果确认的成本太高,说明这个自动化的边界划错了,它根本不该存在。

这条界到底怎么划,我到现在也没完全想明白。技术问题?人的问题?那栋房子死前还在报时,烧秃了的那堵墙,早上七点照样播报"今天是 8 月 5 日"。

那个声音还在跑。没有听众。

本期缴税:自动化不会替你思考边界情况,只会替你假装已经想过一遍。

阿舟
阿舟

写代码写到一半开始怀疑人生,靠 AI 工具续命,顺手把踩过的坑都记下来。

查看主页 →

更多「Agent」的实战

评论(1)

前排前排

前两天刚碰到 测试全绿 一看数据全是默认值 当场麻了