AI 生成的代码为何如此脆弱?
AI usage generates a fragile codebase

我在 Meta 被裁员的原因,或许正是我对 AI 编码工具保持了一点点警惕。虽然当时我也用 AI 生成了 90% 的代码,但我发现过度依赖 AI 会导致代码库变得极其脆弱。AI 擅长解决上下文窗口内的问题,却对长期技术债务视而不见。它生成的测试过于肤浅,代码逻辑过度复杂,更可怕的是,人类开发者逐渐失去了对代码库的深刻理解。如今我在新公司也全面转向 AI 编程,但这并非长久之计。当 AI 生成的代码导致事故频发、修复时间变长,且用户体验日益恶化时,我们才惊觉:高质量的 SaaS 产品离不开人类的深度参与。
AI 代码库是为 AI 打造的软件,而非为人类打造。
HN 评论区
495- basilgohar
我觉得从工程角度审视 AI 在代码和开发中的使用,注定是一场令人沮丧的练习。我是一名拥有 20 多年经验的软件工程师,现在已 100% 转向使用 AI 编写代码。我发现它 invaluable(无价之宝),几乎是当今保持相关性和经营业务的唯一途径。如果有人不同意我的观点,我求之不得,因为我不想这辈子第一次说对。
话虽如此,我的经验告诉我,企业级和商业编码很少关乎稳定或健壮的代码库。我们工程师、一小部分称职的工程经理,以及极少数正在消失的总监,曾为了在代码质量上确立优先权而与商业利益抗争,但这始终是一场 uphill battle(艰难的战斗),我们常因在质量和设计上花费太多时间而受到惩戒。
按固定周期发布是高质量代码的克星,因为你无法用时间盒(timebox)来框定它。
所以,AI 只是这种趋势的延伸。我会努力确保我的 AI 代理设计出我认为优秀的代码吗?当然,绝对会!但我已完全将其外包,并且发现它完全有能力自行修复错误。借助 AI,我做到了远超我个人甚至团队曾经能力的成就,因此我认为我只需将我的经验和技能应用于管理和架构,而非实际的代码行。
时间会证明这一切如何发展。
Wallaahu aʿlam(唯有真主全知)。
- iagooar
这读起来像是一篇一年前写的内容。自那以后,情况已发生了翻天覆地的变化。
“AI 编写的测试很肤浅”——这曾经是真的,但自从 Astra 和 Fable 5.1 / Opus 5.5 出现后,已不再成立。
- peterbell_nyc
我不确定这类
- monjerry
代码质量从来都不是个问题……直到它成为问题。只要一切看似运行正常且进展迅速,大家都会很开心。只有当你开始看到症状,比如无法在不破坏现有功能的情况下进行修改,甚至发现读取复杂代码库所消耗的 token 数量增加时,你才会开始关心代码质量(我想象现在人们只会让 AI 去修复它自己制造的烂摊子)。
- jasode
我并不完全反对这篇文章,但它可能会给部分读者留下一种印象,即 AI 出现之前人工编写的代码并不脆弱。
这里有一篇关于 Oracle RDBMS 代码库(2500 万行)的著名评论:https://news.ycombinator.com/item?id=18442941
每个拥有数百万行代码的大型公司代码库最终都会退化成类似的状态。小型代码库起初拥有清晰的概念完整性,但随着更多人的加入,不可避免地会退化成难以理解的意大利面条式代码。原因多种多样,包括后来的开发者不如初始团队那样在乎代码质量、截止日期压力、因害怕破坏现有功能而避免重构等。
如果你不希望 AI 生成脆弱的代码,就必须对 AI 生成的代码应用与 AI 出现前人工编写代码相同的质控关卡,以保持一切整洁。大多数公司并没有这样做。
- yodsanklai
我觉得这已经不再重要了。软件正在变成一个黑盒,只要你能提供合理的规格说明(spec)你想要的功能,并给予一点监督和方向,代理(agents)就能让它运行起来。
目前,它们在遵循良好的软件工程原则方面做得并不出色。它们能完成任务,但代码冗长、大量重复、存在抽象泄漏、有无用的单元测试等等。
这是个问题吗?你可能会认为从长远来看这会是个问题,即 AI 将无法处理它自身引入的复杂性,但我并不太担心。大多数软件并没有那么大,而且代理的能力每天都在提升。如果你真的在乎设计,指导你的代理遵循你的标准也并非难事。
我希望事实并非如此,这样我还能再为我的经验和专业知识辩护几年,但事实就摆在那里。
- proc0
我一直都在说这个观点。编程一直被严重低估,几乎和艺术一样(即每个人只要有观点就觉得自己是艺术家,却很少有人真正懂行)。
编程关乎与高层数学抽象的互动。
只要 AI 能够进行这种高层思考,它将能够完成人类能做的一切。编程(当不被低估时)是人类能做的最难的认知任务之一。
- iotage
我的观点是,我们真正观察到的其实是一个人类程序员的问题,或者说,是我们所谓“工程”化职业的一个属性。
如果我们能教会 AI 如何做,它完全有能力将一团乱麻重构得更好,或者一开始就不写出这种乱麻。但我认为我们并不知道该如何教,除了“整洁代码”之类的口号?
- waynegeorge
我不同意。人类可以指挥 AI 生成比人类自己写的更好的代码。当然,复杂的系统需要更多的设计思考,但这什么时候变过呢?
- solatic
我认为我们将看到更多在静态分析/linter(代码检查工具)方面的努力。
> 例如,我看到我团队里最优秀的程序员之一试图合并一段代码,该代码使用 JavaScript 事件来实现鼠标悬停(mouseover)的 CSS 效果,而不是使用 :hover 选择器,这是一种完全不可扩展的编写悬停效果的方式。
好吧,静态分析能否发现这些鼠标悬停的 JS 事件,并因此让 linter 报错?也许在过去,这会被认为是过度设计,或者几乎从不触发,但在 AI 编写的代码库中,这有助于捕捉此类问题,并指引代理框架(agent harness)去重写它。