AI 编码导致脆弱的代码库

原文:AI usage generates a fragile codebase 作者:Evan X. Merz 日期:2026-11-07 标签:编程、AI、LLM、Web 开发

译注:文中的「我」均指原作者 Evan X. Merz。

一个焦虑的机器人正在把又一段代码放到摇摇欲坠的纸牌屋上

我只能猜测自己五月份被 Meta 裁掉的原因,但我怀疑其中之一是:和同事相比,我对把 AI/LLM 当作编码工具这件事多了一点抵触。别误会,在最后几个月里,我至少有 90% 的代码是用 AI 生成的,这是拿到一个还算过得去的绩效评级的最低门槛。但 AI 并没有让我写出十倍的代码,甚至连两倍都没有。

我在意的是代码质量。我看到一些重度依赖 AI 的同事在推代码,也看到那些代码有多脆弱。里面有很多微妙的问题,长期来看会堆积成技术债,而一些明显的问题也被非常优秀的程序员忽略了。举个例子:我见过我们组最好的程序员之一,试图合入一段用 JavaScript 事件来实现鼠标悬停 CSS 效果的代码,而不是用 :hover 选择器,这种写法完全不具备可扩展性。

现在我在另一家大型科技公司工作,已经完全转向了 100% 用 AI 生成代码,因为这就是今天的期望。然而我依然能看到,越来越多的人开始意识到,对于大规模 SaaS 产品的持续开发而言,这条路走不通。AI 非常擅长解决那些能装进上下文窗口(context window)的问题,但它对那些无法在这个有限视野里被理解的长期问题完全视而不见。

在这篇文章中,我要列出 AI 编码导致代码库脆弱的四种方式,这种脆弱让代码库无法应对高可用、高可扩展 SaaS 应用的要求。

顺便说一句,这篇文章的每一个字都是人写的。虽然下面的题图是 AI 生成的,但文章本身不是 AI 泔水。

AI 让代码库脆弱的四种方式

以下是我观察到的 AI 导致代码库脆弱的四种最常见方式。

1. AI 写的测试很浅

现代 LLM 最明显的缺陷之一,是它们倾向于写简单的自动化测试用例,覆盖不到真正对人类有意义的地方。我经常看到 AI 智能体写了一堆测试 getter/setter 方法的用例,这些方法本身就微不足道,通常不需要太多测试。当 AI 写端到端测试(e2e test)的时候,它们往往只覆盖代码库中已经被覆盖过的场景。换句话说,AI 写的测试只针对一种类型的用户,或者只停留在表面的交互上。这会在测试覆盖率中留下巨大的缺口,而开发者看不到这些缺口,因为行级覆盖率指标反映不出来。

2. AI 写的代码过于复杂

AI 还倾向于写过度复杂的代码。它经常在一个辅助方法就够用的时候用上两三个。它试图严格遵守 DRY(Don't Repeat Yourself)等编码规范,但矫枉过正了,没有意识到这种死板带来的额外复杂度反而让代码更难被人类开发者调试和理解。

3. 依赖 AI 会降低人类的理解力

这就是 AI 代码库的第三个问题:人类不理解它们。一家公司越长时间依赖 AI 智能体来生成代码,能理解代码库的开发者就越少。这意味着开发者做不了那些构建健壮代码库所必需的事情。他们对数据结构和算法的理解不够深入,看不出一个 PR 里新引入的抽象是否与已有的架构相矛盾。

4. AI 速度太快,质量标准跟不上

AI 太快了,快到人类开发者无法维持一个高质量标准。每个 PR 来得比上一个更快,留给审查的时间更少。这导致开发者只能走马观花地看代码,遗漏那些会变成长期技术债的关键细节。测试缺口、命名不当的变量,这些小的质量问题在代码库里不断累积,直到整个代码库变成一团意大利面条式的烂泥。

代码库已经脆弱的四个信号

如果你不确定编码智能体是否正在伤害你的代码库,可以留意以下这些脆弱的 AI 生成代码库的症状。

1. AI 生成的代码库事故更多

当你把部门切换到智能体编码之后,事故数量是不是慢慢开始上升了?一开始我们都在用智能体大量生成代码的时候,看起来和传统编码没什么两样。PR 来了,合入了,一切似乎都好好的。但月底出了一个 P0 事故,下个月又出了两个 SEV,然后更多。现在,经过一两年的智能体编码,好像每个周末都有事故。AI 编码智能体正是影响客户的事故越来越多的原因。

2. AI 代码库的事故恢复时间更长

不仅事故更多了,恢复时间也更长了。事实是,你团队的人类开发者现在对代码库的理解更浅了。如果你的编码智能体找不到客户遇到的问题,人类就得在一个高度复杂、测试不足的代码库里翻找。他们本质上是在进入一片陌生的领域,所以需要更长时间才能搞清楚到底出了什么问题。于是,公司在那些恢复时间越来越长的事故上损失越来越多的钱。

3. AI 生成的代码库会产生只有用户才能看到的错误

当人类不花时间待在代码里的时候,他们就看不到所有的使用场景。他们无法理解真实用户是如何使用代码的,因为他们没有确保 AI 正确地埋入了分析埋点、正确地捕获了所有错误。于是,隐形的错误开始在代码库中出现。这些错误没有被捕获,只对真实用户可见,而不是自动化测试或开发者手动测试中所覆盖的那类用户。

4. AI 导致糟糕的用户体验

这就引出了 AI 代码库的终极问题:它们不是为人类做的。AI 代码库是 AI 为 AI 写的软件。它们没有为人类用户的使用方式做优化,也没有为人类开发者的维护方式做优化。用户端和开发者端的体验同时退化,形成一个恶性循环,持续的「劣质化」(enshittification)。

为人类做的产品需要人的参与

事实就是:一款产品要让人类客户满意,就必须有人类视角的注入。没有人喜欢在餐厅对着机器点餐。在网站上买衣服永远比不上去店里试穿合身。SaaS 产品也是同样的道理。任何时候你把 SaaS 产品交给机器,你都在失去那种对用户和开发者都有价值的人情味。对于那些只拼价格的最廉价产品,这或许行得通;但高质量的软件产品将继续保留人的参与。最好的、最贵的产品,将由人类开发者为人类用户量身定制。它们会让人觉得有魅力、用起来愉快。它们不会脆弱,因为它们不是主要由 AI 开发的。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
leikooo
作者分享
ARTS 1108: 快慢指针找中点、数据库也是全局变量的仓库与漏洞发现提速后的修复压力
7
MySQL 如何让并发看起来像串行?
6
让 AI 改代码,有时候会遇到一个问题:需求完成了,但多了几个 if;再补一个需求,又加了几个特殊判断。改的时候都说得通,回头看,代码已经绕得有点看不懂了😭。 最近发现 Cursor 的 cursor-team-kit 里有个 skill,叫 thermo-nuclear-code-quality-review,用下来效果挺不错。名字挺狠,可以翻译成「热核级代码质量审查」。它会让 AI 更严格地检查代码,看看哪些地方越改越乱,有没有更简单的写法。 平时让 AI 做 code review,我们往往更关心有没有 bug,边界情况有没有漏掉。这个 skill 会把后续维护也作为审查重点:功能没问题,但下次加需求是不是又得四处补判断?别人接手时,能不能看懂这段代码?如果能在不改变功能的前提下减少分支、去掉多余的封装,它就会要求把这些地方改得更简单。 它查得比较细:有没有到处补条件判断,有没有封装了一层却什么也没简化,业务代码是不是放错了地方。如果这次修改让一个文件从不到 1000 行涨到超过 1000 行,也会要求检查是否该拆分,有充分理由才保留。 安装可以直接交给 AI。在支持安装 skill 的编程工具里,把 GitHub 地址发过去就行: > 帮我安装这个 skill:https://github.com/cursor/plugins/blob/main/cursor-team-kit/skills/thermo-nuclear-code-quality-review/SKILL.md 装好之后,写完一轮代码,让它用这个 skill 检查一下。这时最好说清楚审查范围,比如: > 用 thermo-nuclear-code-quality-review 检查当前分支相对 main 的改动,保存到 docs 目录下面的文件中 最后,如果条件允许,改完还可以换另一家的模型复查一次,把修改后的代码和需求一起给它,看看有没有遗漏,或者为了简化代码改掉了原本的行为。多次校验一下,这样上线才更稳定一些。
8
ARTS 1101: 最长回文串与子序列匹配、一次 URL 请求的来回之旅与如何验证 AI 的交付
6
IP 数据库体积缩小 31%,关键竟然是合并重复子树
4
下载 APP