返回 文章 apply CMS 文章

AI 编码导致代码库脆弱:四个原因与四个迹象

AI 编码虽快,但会带来浅测试、复杂代码、理解下降和审查不足,最终使代码库脆弱。

AI 编码代码质量技术债务软件维护
成长分 / 100 68 综合收获、行动、留存与影响

AI 编码导致代码库脆弱:四个原因与四个迹象
为什么值得读了解 AI 生成代码可能带来的长期技术债务和系统脆弱性。

识别团队中过度依赖 AI 编码的早期警告信号。

关键洞察
  1. AI 编写的测试往往流于表面,覆盖不足且难以发现关键问题。
  2. AI 倾向于生成过度复杂的代码,增加维护难度。
  3. 长期依赖 AI 会降低开发者对代码库的理解,影响问题排查和架构决策。
转成行动

深入阅读

正文与原文对照

原文保真覆盖:全文原文字符:7446

我只能推测自己在五月被 Meta 裁员的种种原因,但我怀疑其中一个原因是我在把 AI/LLM 当作编码工具采用方面,比一些同事稍微更抗拒一些。别误会,在那里最后几个月,我至少 90% 的代码是用 AI 生成的,这是拿到体面绩效评级的最低要求。但 AI 并没有让我的代码量提升 10 倍,甚至连 2 倍都没有。

我关注的是代码质量。我看到一些高度依赖 AI 的同事推送的代码,也看出那是脆弱的代码。其中有许多微妙的问题,长期来看会导致技术债务,甚至一些非常明显的问题也被非常优秀的程序员忽略了。例如,我看到团队里最优秀的程序员之一试图合并一段代码,它用 javascript 事件来实现鼠标悬停的 CSS 效果,而不是使用 :hover 选择器,这是一种完全不可扩展的鼠标悬停写法。

现在我受雇于另一家大型科技公司,并且已经完全转向 100% 用 AI 生成代码,因为这是如今的期望。不过,我能看到很多人开始意识到,这并不是持续开发大规模 SaaS 产品的可持续方式。AI 往往能很好地解决那些能放进其上下文窗口的问题,但对于无法在那个相对较小的范围内理解的长期问题,它完全无感。

在本文中,我将列出 AI 使用导致代码库脆弱的四种方式,这种代码库无法承受高可用、高可扩展 SaaS 应用的需求。

顺便说一句,本文的每一个字都是人写的。尽管下图由 AI 生成,但本文并非 AI 粗制滥造之物。

一个忧心忡忡的机器人把又一块代码放进一个被描绘成摇摇欲坠的纸牌屋的代码库中。

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

以下是我见过的 AI 生成脆弱代码库最常见的四种方式。

1. AI 编写浅层测试

现代 LLM 最明显的失败之一,是它们倾向于编写过于简单的自动化测试用例,不覆盖对人类真正重要的事情。我经常看到 AI 智能体编写大量针对 get/set 方法的测试,这些测试微不足道,通常并不需要太多测试。当 AI 编写 e2e 测试时,它们往往只覆盖代码库中已经覆盖的用例。换句话说,AI 编写的测试只覆盖一种类型的用户,或者只覆盖表面层面的交互。这在测试覆盖率中造成巨大缺口,而开发者对此不可见,因为这些缺口不会被行级覆盖率指标捕捉到。

2. AI 编写过于复杂的代码

AI 也倾向于编写过于复杂的代码。明明一个辅助方法就足够,它却经常使用两三个。它试图遵循 DRY 等编码准则,却矫枉过正,没有意识到这种僵化带来的额外复杂性会让人类开发者更难调试或理解代码。

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

这就是 AI 代码库的第三个问题:人类不理解它们。公司越久依赖 AI 智能体生成代码,理解代码库的开发者就越少。这意味着开发者无法做构建弹性代码库所必需的事情。他们对数据结构和算法的理解不够深入,无法看出某个拉取请求是否包含与既有结构不兼容的新抽象。

4. AI 推进太快,难以维持高质量标准

AI 推进得太快,人类开发者难以维持高质量标准。每个拉取请求都比前一个来得更快,而审查时间却更少。这导致开发者草草浏览代码,遗漏关键细节,从而造成长期技术债务。测试缺口、变量命名不佳等小质量问题在代码库中不断累积,直到它变成一团意大利面条式的代码泥潭。

代码库脆弱的四个迹象

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

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

当你把部门转向智能体编码时,事故数量是否开始缓慢上升?起初,当我们都用智能体生成大量代码时,似乎与传统编码没什么不同。PR 来了,被合并了,一切看起来都没问题。但是,哦,那个月底来了一个 p0,接着下个月有两个 SEV。再下个月更多。现在,经过一两年的智能体编码,似乎每个周末都有事故。AI 编码智能体是影响客户的事故增多的原因。

2. AI 代码库中事故恢复耗时更长

不仅事故更多,事故缓解所需的时间也更长。事实是,你团队中的人类开发者现在对代码库的理解更浅。如果你的编码智能体找不到客户面临的问题,那么人类就得在一个高度复杂且测试不足的代码库中挖掘。他们本质上是在进入陌生领域,因此弄清楚出了什么问题需要更长时间。于是,公司因解决时间更长的事故而损失越来越多的钱。

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

当人类不花时间在代码上时,他们就看不到所有用例。他们无法理解真实人类如何使用代码,因为他们没有确保 AI 正确埋点分析并捕获所有错误。于是,不可见的错误开始出现在代码库中。错误未被捕获,只有真实世界用户才能看到,而不是自动化测试或开发者手动测试中所测试的那类用户。

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

这就引出了 AI 代码库的终极问题:它们并非为人类而造。AI 代码库是由 AI 为 AI 打造的软件。它们既没有针对人类用户使用产品的方式进行定制,也没有针对人类开发者维护产品的方式进行定制。用户体验和开发者体验双双退化,导致恶性循环的「劣化」(enshittification)。

为人类打造的产品需要人的触感

事实是,产品要满足人类客户,就必须由人类视角来指导。没有人喜欢在餐厅从机器上点餐。在网上买衣服,合身程度总是比亲自到店试穿更差。SaaS 产品也是如此。任何时候你把 SaaS 产品交到机器手中,你都在失去对用户和开发者都宝贵的人的触感。这对只靠价格竞争的最廉价产品或许行得通,但高质量的软件产品将继续保有人 的触感。最好、最昂贵的产品将由人类开发者为人类用户量身定制。它们将令人愉悦、使用愉快。它们不会脆弱,因为它们不会主要由 AI 开发。