跳到主要内容
它抓不到自己的 bug,因为它压根不觉得自己写错了

它抓不到自己的 bug,因为它压根不觉得自己写错了

摸鱼办主任
摸鱼办主任

· 阅读约 5 分钟

半夜刷 cs.SE 的新列表,一条标题把我按在椅子上:

《Do Coding Agents Catch Their Own Bugs? (They Don't.)》

结论直接写进括号里了。别人写论文叫“关于某某问题的初步探索”,它叫“某某不行”。

我尊重这种不装的态度。

【括号里那个 They Don't,是我今年见过最诚实的一个标点符号】

说正事。10 月 31 号挂上 arXiv 的这篇,戳我的不是结论,是它的实验怎么搭的。

每道题两个 PR。第二个 PR 修的,正好是第一个 PR 引进来的那个缺陷。

我看到这个设置的时候愣了两秒。

狠在哪儿?狠在第一个 PR 在当时是“对的”。测试绿了,CI 过了,review 点了通过。

缺陷不在当下这份 diff 里。缺陷在三个月后的某个凌晨,到那时候它才变成一次渡劫,而写它的人早去赶下一个需求了。

这恰好也是 AI 写代码最舒服、同时最坑的地方:它写出来的那一秒永远自洽,工整,带注释,变量名还挺讲究。

错的那部分不在这份 diff 里,在这份 diff 未来某天的告警里。

这个时间差,就是整个实验的机关。

样本也不是坐在会议室里想出来的。212 个样本,来自 35 个真实开源仓库,4 种语言——不是出题人脑补“假如 AI 写了个 SQL 注入”,这些坑原本就在那儿。

然后是数字。11 个模型,前瞻解决率 6.13% 到 24.53%。

最高 24.53%。四舍五入,四次里有一次,它能提前想到自己马上要闯的祸。

剩下三次它闯完,还能条理清晰地跟你解释为什么这么写是对的。

最低 6.13%。我不打算换算成“十六分之一”来吓唬你,但你得承认,这个水平已经接近闭着眼睛点通过了。

这个分布我建议直接拿去当面试题:一个人四次里只有一次能预判自己的改动会捅娄子,你敢不敢让他推 main?

我猜你不敢。但你现在正这么干,只是那个人不领工资。

(打住,这段有点像职场感慨了,回到数字。)

这个数字其实不该让我意外。该让我意外的是——这个指标之前居然没有。

想想平时怎么评测:给任务,做完,跑测试,看通过率。整套流程从头到尾都在问同一个问题:你能不能把已经写清楚的事做完。

没人问后半句——你做完之后,在没人提醒你的地方,留了什么。

需求文档不会写“这个接口别放明文密码”,也不会写“这个重试逻辑在高并发下会把下游打挂”。能写进文档的叫需求,写不进去的才叫工程。论文里那句话说得客气:工程师要预见需求文档里没明说的东西。客气,但就是这个意思。

写到这儿我犹豫了一下:是不是我对它太苛刻了?

人做 code review,漏掉自己埋的雷也常有。谁没被一句“你这里没考虑并发吧”问得当场想找个地缝钻进去。

但这个基准问的不是漏没漏。问的是有没有“我可能会漏”这个意识。

人知道自己会漏,所以人会写防御性代码,会留一行“这里先这么放着,别问我为什么”。它不知道。它不知道自己会漏,所以它也就不会防。

我甚至怀疑这两件事是同一件事:AI 没装心虚这个模块,所以它也没这个能力。

再说作者的药方。他们说代码审查工具得往 fail-safe coding 的方向改。

这里我持保留意见。不是不同意,是觉得他们挂错了科室。

审查工具也是模型。你让同一个东西去审它刚写完的 diff,它审的是“这段代码符不符合它自己刚才的审美”。

当然符合。它自己写的。

你是不是也干过:让它写完一段,顺手补一句“看看有什么问题”,它认认真真回你三条,三条全是命名风格和“建议补充注释”,而你半小时后在本地跑出一个空指针。

(那个空指针是我编的。但“它列的三条全是格式建议”这句不是我编的,你们都懂。)

好笑的地方就在这儿:我们把“自查”当成一个道德动作,好像只要命令它 review 自己,它就会心虚一下。

它不心虚。它没装这个模块。

一个从不心虚的东西写出来的检讨书,格式一定是最工整的。

顺便,212 个样本、35 个仓库、4 种语言——别拿这个规模当 KPI 念,也别嫌“才 212 个”。这类基准的价值不在覆盖面,在于它把一件以前没法计数的事变成了一个百分比:未来的 bug,现在能数了。

至于接下来会怎么样,我猜两种反应。一种是把 Foresight-SWE 加进自家 eval 面板刷分;另一种是把它抄成一句 prompt——“请以三个月后出事故的视角审视你的改动”——然后分数涨了一点,事故率一点没降。

因为模型不是不知道要往前想一步。它往前想那一步的时候,脑子里浮现的是“这个写法符合规范”。

打住,再写下去就成行业观察了,那不是我该干的活。

回到那个括号。(They Don't.)它替所有被“AI 写的代码看着挺好啊”坑过一次的人,把话替我们说完了。

(友情提示:文中那个空指针是编的,但你昨晚遇到的那个不是。)