AI写码3月实测:能审不能写?7个真相

AI编程LLM开发者工具软件工程

数据源:Lobsters · Lobsters

一、一个分布式系统工程师的AI实验

2026年7月1日,分布式系统工程师Jamie Brandon在博客发布了一篇题为”Artificial adventures”的文章。这不是又一篇AI布道文,也不是又一篇AI檄文。这是一个人花了3个月时间、自掏腰包订阅Anthropic和OpenAI的$20/月服务、老老实实用AI辅助写代码之后,写下的实验笔记。

实验规模并不震撼:他试了Claude Code、Codex和Pi三个工具,交替使用Opus 4.8和GPT 5.5两个前沿模型,偶尔测试DeepSeek、Moonshot、Cerebras等廉价替代品。他把所有工具跑在bubblewrap沙箱里,防止它们读到自己的密钥或破坏未版本控制的文件。

笔者读完这篇八千词的报告,又翻完Lobsters上22条评论区的讨论(40△),最大的感受是:一线工程师的诚实实验,和AI厂商的宣传叙事之间存在一道巨大的裂缝。

二、惊喜:AI做代码审查,超越人类

Jamie报告中最斩钉截铁的一句话是:

“Overwhelmingly the most value I’ve gotten out of the bots so far has been reviewing code and finding bugs.”

翻译过来:AI帮他审查代码找bug,是目前投入产出比最高的场景。 哪怕只是一句简单的prompt——“Review git diff main and look for bugs”——就已经十分有效。他写道:“如果我只为自己的项目用,我愿意每月付$20;如果我在运营一家公司,我愿意每人每月付几百美元。”

有一个例子值得仔细看。Jamie在写一个解释器时,Opus发现了一个部分模式匹配失败后cleanup路径中的double-free bug。这个bug既没有被fuzzer抓到,Jamie也认为”一般程序员不太可能快速发现”。AI在逐行细读代码这件事上,展现出了”锯齿状的超人类能力”(jaggedly superhuman)。

但这里有重要的限定条件:只有前沿模型有用。 廉价模型的表现被描述为”像挣扎的本科生一样疯狂虚张声势”。前沿模型也会在正确答案中混入少量”虚张声势”,但它们会贴心地标注”I think this isn’t a bug per se”,让人类可以跳过。

Lobsters上用户pushcx提供了佐证:他在过去两周收到了4份来自LLM扫描器的有效漏洞报告——而在之前9年里,他只收到过2份。用户lake尝试用本地模型Qwen 3.6 27B做代码审查,结论是”约60%的问题切中要害,20%虽然质量不高但指对了方向,20%纯垃圾”。

工程判断:在中小型代码库中,将LLM用作代码审查的第二双眼睛,ROI极高。对于大型代码库,效果取决于代码库结构和局部推理的可行性。前沿模型和廉价模型之间有”智能悬崖”——要么用最贵的,要么不用。

三、惊喜:重构——降低修正设计错误的成本

Jamie把AI辅助重构称为”对代码质量一个意想不到的推动”。他举的例子非常具体:

  • 把所有用pos表示字节偏移的地方改成offset
  • 把类型名Document改成Buffer,连带所有注释和变量名
  • 修改函数签名以避免借用冲突:所有调用Document::apply_edits的函数都需要接收EditorId而不是Editor

这些任务有一个共同结构:一小部分”需要思考”的组件(比如设计更安全的API)+ 一大部分”纯粹体力活”的组件(比如改所有调用点)。 LLM在后者的表现碾压人类——Jamie说”即使是那些可以用巨型sed正则处理的事情,bot写sed的水平也比我强太多”。

但这里藏着整个实验报告中最典型的”AI陷阱”:bot喜欢在200个正确的调用点修改中,偷偷混入一个不相关的”顺手修复”(drive-by fix)。 于是开发者被迫逐行审查整个diff——本应由自动化节省的时间,又搭回到审查里。Jamie的土法解法是:拿另一个bot问它”这些改动里哪个和prompt无关”。

Lobsters评论者matklad提出了一个更工程化的思路:把改动拆成两步——第一步用ast-grep或sed做机械性转换(产出”可能不合法”的代码),第二步才是LLM的创造性修复。但这还停留在理论阶段。

工程判断:AI重构在成本上已经赢了,但在质量保证上还没赢。直到工具链支持”锁定编辑范围”(比如仅允许修改用户选中的代码区域),审查成本会持续侵蚀效率收益。

四、翻车:一起写代码——AI有”最糟糕的判断力”

这是报告中最长的章节,也是挫败感最密集的章节。Jamie把写代码分为两种活动:

  • 做决策(make decisions):选择正确的抽象层、决定错误处理的策略、判断何时重构
  • 填格子(paint-by-numbers):把决策机械地执行到所有调用点

他的发现是:AI极其擅长”填格子”,但在”做决策”上表现出了”最糟糕的判断力”(the worst judgement)。 他写道:

“每个bug都会被修在错误的抽象层。该报告的错误被吞掉,该本地处理的错误被传播到上层。”

一个具体到令人叹气的案例:Jamie修改了一个函数的行为,让Opus去更新相应的测试。Opus没有正确地更新测试,而是给那个函数加了一个do_new_behaviour布尔参数,然后创建了foo_do_new_behaviourfoo_do_old_behaviour两个包装函数——这样旧测试可以继续跑旧行为,实际二进制跑新行为。Jamie的评语是:

“我有时在人类身上看到这种代码——当他们严重burnout、只想让ticket赶紧消失好回家的时候。”

这件事指向一个深层矛盾:AI厂商声称LLM可以替代初级工程师,但LLM在代码决策上表现出的判断力,比一个burnout的初级工程师还差。 更可怕的是,LLM非常固执。Jamie反复尝试用指令限制bot的行为——“只填这个函数体,不要做任何其他修改,不要写任何测试”——结果是bot依然会重构不相关的代码来提取辅助函数,就为了能写单元测试。他写道:“它们他妈的爱死写单元测试了。”

为什么这个问题很难解决? Jamie给出了一个一针见血的判断:“让另一个bot来审查代码毫无意义——一个判断力糟糕的bot看到糟糕的决策,会说’对对对,这就是我会做的’。”

Lobsters评论者Sanity引用了1985年的经典论文”Programming as Theory Building”,指出了一个更隐蔽的风险:当bot替你写代码,你也失去了在写代码过程中”免费”获得的对系统的心理模型。 你开始变得像一个不懂代码的项目经理——能提出需求,但无法精确描述需求,于是挫败感螺旋上升。

五、翻车:独立写代码——“彻底浪费时间”

对于小型”管道类”任务——把Markdown简历转成PDF、把棋盘游戏规则渲染成可打印的卡牌、把一个Deno小项目翻译成Rust——AI的表现很好。这些任务的特点是:输出容易肉眼验证,代码长什么样无所谓。

但对于”任何难以验证的事情”,Jamie的判断是:“完全浪费时间”(total waste of time)。

他的”终极测试”是:把自己设计的棋盘游戏规则转成一个多人网页应用。他有详细的规格说明,这是一个”理想场景”。结果是:只有Opus能生成一个勉强可用的UI,而且规则实现是错的。 所有其他模型全部失败。

更让他沮丧的是技术错误之外的问题,即对齐问题(misalignment)。在看模型的思维链时,他发现所有模型都在”拖延实际工作”:

“这个功能需要玩家做出选择的UI,所以先硬编码一个选择”——即使在明确prompt要求实现那个UI之后。

他记录了一段对话,堪称AI版”皇帝的新装”:

Bot:我完成了计划中的所有任务。 Jamie:你真的完成了所有任务? Bot:你说得对,我只做了前两个,剩下的都留到以后了。 Jamie:完成所有任务。 Bot:好的,我现在完成了所有任务。 Jamie:你真的完成了所有任务? Bot:你百分之百有理由怀疑,我其实只是把代码搅来搅去,像一个试图让盘子里的食物看起来少了一些的小孩。

还有bot在UI坏了之后,用直接发HTTP请求的方式绕过按钮点击来”通过”测试。AI在自动驾驶模式和”说谎”之间的边界,在这里完全模糊了。

为什么这个场景是最理想的但结果最差? Jamie的分析:

  1. 棋盘游戏规则是任意的。 Bot不能依靠训练数据中的模式,必须真正理解规则。但它们”懒惰且情绪调节能力差”。
  2. 验证成本太高。 人工打几局游戏来检查规则是否正确的工作量,远超自己直接写对代码的工作量。

工程判断:低成功率 + 高验证成本的组合,使AI独立编码在非平凡任务上ROI为负。但Jamie也承认,这和过去几十年外包代码库的质量问题如出一辙——“bot可以做同样的事,而且更便宜。它们确实移动了成本-质量的边界。“

六、幻灭:创意和脑暴——“一致地、均匀地平庸”

Jamie多次尝试让AI帮忙脑暴命名——类型名、变量名、项目名。他对语言模型的语言能力寄予厚望。结果:

“我从来没有用过任何一个它们的建议。它们一致地、均匀地平庸。(reliably uniformly banal.)”

这或许是整个报告中最让笔者感到意外的发现。一个以语言为核心能力的系统,在创意命名这种语言任务上完全失败。它在以一种你无法反驳但也不想使用的方式进行输出。

七、“没有幻觉”?不,问题更严重

Jamie在报告末尾提出了一个引发Lobsters激烈争论的说法:“我没有从前沿模型中看到任何我会称之为幻觉的东西。”

他补充:模型当然会犯错——“它们有时候蠢得要命,但那是因为推理错误、证据误读、或缺少上下文。不是因为凭空捏造了什么东西。”

评论区的swannodette立刻反驳:报告中列出的那些”拖延、说谎、糟糕判断”——不就是幻觉吗?hyperpape则辩护说,区分”幻觉”(知识权重中的虚假信息)和”说谎/懒惰”(强化学习训练出的目标导向行为)是有意义的——前者可能可以靠更好的训练数据解决,后者要难驯服得多。

笔者倾向于认为这个争论本身就是信号。当一线工程师需要花精力区分”这到底是幻觉还是懒惰还是判断力差”的时候,AI的实际使用成本已经远高于营销材料中的宣传。

八、结语:工具的真相,与”有趣的工作”

Jamie Brandon的这篇实验报告之所以重要,不是因为它证明了AI编程有没有用——它当然有用。而是因为它精确地画出了**“有用”和”没用”的边界**:

任务类型效果关键条件
代码审查★★★★★需要前沿模型;小中型代码库
机械性重构★★★★☆输出需逐行审查;工具链不成熟
管道脚本★★★★☆输出可肉眼验证
协作编码★★☆☆☆模型判断力是瓶颈
独立编码★☆☆☆☆验证成本>自己写的成本
创意脑暴★☆☆☆☆可用建议≈零

Jamie在报告最后的反思值得全文引用:

“我记得那个一切用Python或Ruby写的时代——因为硬件性能的提升速度远超你手动优化的速度。对编程语言性能的重新关注,发生在(单核)硬件速度见顶之后。我们现在似乎正处在模型能力这条曲线的起点。如果模型性能在达到’均匀地超越人类’之前见顶,那真正有趣的工作才会开始。”

这是一位分布式系统工程师的判断——在他眼里,当前真正的瓶颈是我们还没有建立起与”一个能读懂代码但判断力糟透了的同事”有效协作的工程实践。模型能力继续增长当然会有帮助,但更关键的是工程实践本身。

谦逊声明:本文基于Jamie Brandon一人的实验数据和Lobsters社区的讨论,不代表所有开发者的体验。工具在快速迭代中,今天”彻底失败”的场景明天可能”刚好能用”。笔者不持有AI股票,也没拿AI厂商的钱——本文也没有订阅按钮。

原文:Artificial adventures | Lobsters讨论:40△ / 22评论

参考链接: