跳到主要内容

AI 代码审查陷阱:为什么更快的审查正在让你的代码库变得更糟

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的团队比以往任何时候都能发布更多代码。PR 速度提升了,周期时间缩短了,积压也在减少。在管理者看得到的每一块仪表板上,一切都看起来很好。然而,每个 PR 对应的事故数量正悄悄地以每年 23.5% 的速度攀升。

这就是 AI 代码审查的悖论。AI 工具让工程师写代码更快,审查代码也更快——但最关键的缺陷正以比以前更高的比率漏过审查。这个悖论的两面相互叠加,而大多数团队并没有在衡量正确的指标来察觉这一点。

这一机制在认知心理学中已有充分研究:自动化偏见。当一个看起来权威的系统发出批准信号时,人类会降低自身的审查力度。2025 年底发布的一项调查发现,96% 的开发者不完全信任 AI 生成的代码,但只有 48% 的人在合并前会持续验证代码。这个差距——在口头上的不信任与实际行为之间——正是 Bug 藏身之处。

数据并不站在你这边

关于 AI 代码质量的数据并不乐观,尤其是当代码从玩具基准测试转移到生产代码库时。

对 470 个真实开源 GitHub PR 的分析发现,AI 协作编写的代码每个 PR 产生的问题是人工编写代码的 1.7 倍。逻辑和正确性错误高出 1.75 倍。安全漏洞多出 1.57 倍,其中 XSS 漏洞出现频率高达 2.74 倍。大多数工程师预期的那种模式——AI 擅长样板代码但在安全方面较弱——在数据中得到了印证,但实际比率比直觉预期的更糟糕。

更令人担忧的是架构层面发生的事情。对六个月内实时仓库的分析发现,AI 辅助代码库积累权限提升路径的速度是基准的 322%,而架构设计缺陷飙升了 153%。这些不是逐行审查或 linter 能发现的缺陷。它们来自组件随时间交互的方式——等你发现时,修复代价已经高昂。

GitClear 的代码扰动数据又增加了另一个维度:用 AI 辅助编写的代码在两周内被回滚或大幅重写的比率,大约是没有 AI 辅助时的两倍。快速交付不等于持久交付。

从存活率来看,数据说明了全部问题。对 304,362 个 AI 编写提交中 484,606 个被追踪问题的分析发现,24.2% 的 AI 引入问题在仓库的最新版本中依然存在。安全问题的存活率高达 41.1%。你过去的 AI 生成代码并非惰性的——它正在积累审查遗漏的潜在缺陷。

为什么审查者会遗漏这些问题

AI 代码引入的失效模式与标准审查习惯所针对的模式系统性地不同。

人工编写的代码以可预测的方式失败:作者误解了需求,写了边界条件错误的逻辑,或者忘记了他们隐约意识到的边缘情况。Bug 与作者正在思考的内容相关联。了解领域的审查者通常能发现差距,因为他们从相同的心智模型出发来补全内容。

AI 代码以不同的方式失败。72 项同行评审研究中确认的最普遍 Bug 类型是隐性逻辑错误——代码能编译、能运行、能通过浅层测试,并返回看起来合理的结果,但并不反映正确的业务逻辑。这类错误约占 AI 错误的 60%。代码看起来没问题,因为从语法意义上它确实没问题。它只是用正确的方式做了错误的事情。

一个密切相关的失效模式是幻觉 API:模型生成了不存在的函数调用和库引用。研究表明,AI 编程助手在开发过程中建议的软件包中,大约每五个就有一个是虚构的。这些通常在合并前被发现——但并非总是如此,而且围绕它们构建的周边逻辑即使在具体调用被替换后往往也会保留下来。

斯坦福大学对此问题的一项研究发现了一个反直觉的结论:使用 AI 助手的参与者写出的代码安全性明显低于未使用者,但他们同时更倾向于认为自己的代码是安全的。AI 取代了他们的怀疑。对 AI 持批判态度、不断完善提示词并质疑 AI 输出的参与者表现更好。性能差距不在于 AI 用户和非用户之间——而在于批判性 AI 用户和轻信性 AI 用户之间。

审查的语境使情况更糟。当 AI 审查工具显示绿色对勾时,反驳它的社会和认知成本就会上升。审查者必须主动选择不信任一个措辞自信、格式良好的机器判断。大多数人不会这样做。

"更快审查"实际上衡量的是什么

一项涉及 202 名开发者的 GitHub 随机对照试验发现,审查者批准 Copilot 辅助编写代码的可能性高出 5%。研究人员将此解读为 Copilot 生成代码具有更高可读性分数的反映——这可能是部分原因。但即使信心是无根据的,信心也是已知的批准率驱动因素。

指标问题在于,审查速度衡量的是吞吐量,而非质量。在 AI 辅助团队中,每位开发者的 PR 数量同比增长约 20%。每个 PR 对应的事故增长了 23.5%。PR 的中位数大小也在增长——在某些追踪数据中从 57 行增长到超过 110 行——这使得彻底审查更加困难,即使审查者被隐性地期望完成更多工作。

这恰好创造了自动化偏见滋生所需的确切条件。审查者更忙了,PR 更大了,代码看起来很好,而且一个工具已经说它没问题了。结果是审查步骤从真正的质量关卡转变为产生书面记录的形式。

组织动态进一步强化了这一点。交付速度是可见的,也是受奖励的。逃到生产环境的缺陷需要时间追溯到其根源。等事故追溯到六周前某次审查过快这一具体关联时,因果链已经不可见了。

复杂化一切的技能退化问题

缺陷逃逸率是一阶问题。技能退化问题让一切随时间变得更糟。

一项涉及 52 名初级工程师的随机对照试验发现,使用 AI 辅助的组在理解力测试中得分低了 17 个百分点(50% vs 67%,效应量 d=0.738)。最大的差距出现在调试问题上——而这恰恰是在审查过程中发现 AI 代码所引入错误所需的技能。

这不是偶然现象。认知卸载研究一致表明,依赖外部工具完成认知任务会降低内部执行该任务的能力。微软研究团队在医学影像中记录了相同的模式:依赖 AI 进行息肉检测的肿瘤学家在三个月后显示出可测量的技能下降。

这里重要的是复合效应。随着工程师更频繁地使用 AI,他们阅读和评估 AI 生成代码的能力会退化。最有能力发现 AI Bug 的审查者,是那些在没有 AI 拐杖的情况下花费了大量时间编写和调试代码的工程师——而随着初级工程师完全跳过学徒期,这一群体正在缩小。Stack Overflow 发现,67% 的早期职业开发者现在每天使用 AI。

一篇关于这一动态的理论论文精确建模了激励错位:一个有典型任期的管理者会将 AI 使用量设定在对其团队工程师长期技能发展最优水平的近两倍。生产力信号是即时的,技能成本是延迟且分散的。

结果是一个"区域 II"陷阱:短期生产力指标提升,而潜在的工程能力悄然退化。在团队面临 AI 无法解决的问题、并发现自己已失去独立解决能力之前,这一切都是隐形的。

真正有效的审查规范

能持续发现 AI Bug 的审查者,不是读代码更慢的人——而是改变了审查内容的人。

先看架构,再看代码行。 最重要的审查问题不是"这段代码正确吗?"而是"这是正确的解决方案吗?"在阅读具体函数之前,先问:这个方案符合现有架构吗?它是否重复了一个已经存在的模式?领域知识丰富的人会认为这个方案合适吗?AI 辅助代码导致的架构缺陷增加 153%,几乎从不在逐行审查中显现。当你从解决方案的形态出发时,才能看到它。

针对 AI 的检查清单。 标准审查清单是为人工编写的代码设计的,会遗漏 AI 生成的失效模式。一个有效的补充包括:每个 API 调用在当前使用的库版本中是否真的存在?错误处理是否覆盖了空输入、空集合和网络失败?授权是在服务端强制执行的,而不仅仅是在 UI 上?每一段 AI 生成的逻辑是否反映了实际的业务规则,而不是一个看似合理的通用版本?

行为证明,而非语法审批。 最常见的审查失败是批准看起来正确的代码,却没有验证它在对抗性条件下是否行为正确。在本地运行代码,针对边缘情况测试。追踪非正常路径。CI 通过是底线,不是上限。

PR 描述中的归因声明。 要求作者说明 AI 扮演的角色、使用了什么提示词,以及在接受或修改输出时做了什么人工判断,可以实现两个目标:建立问责制,并给审查者一个校准信号。一个作者写"AI 写了这个,我审查了结构"的 PR,与"AI 写了样板,但我重写了核心逻辑"的 PR,需要不同程度的审查。

刻意的无 AI 练习。 定期在没有 AI 辅助的情况下编写和调试代码的工程师,会保持发现 AI 在审查过程中引入的失效模式所需的判断力。最优秀的团队将此视为需要主动维护的技能,而不是待淘汰的传统习惯。代码审查是这种练习自然发生的为数不多的场合之一——但只有在审查者真正深入代码而非依赖工具链时才成立。

复合循环

真正的风险不是任何单一漏过的缺陷。而是反馈循环:AI 加速生产,自动化偏见加速审批,AI 代码引入比人工代码更多的架构和安全债务,这些债务积累是因为审查遗漏了它,而本应发现它的工程师正在失去这样做的能力。

每一个用 PR 速度和审批速度衡量 AI 采用率的组织,都在衡量方程式的错误一边。这个问题的领先指标是大多数团队没有追踪的东西:按代码作者分类的缺陷逃逸率、AI 密集型服务中事故的诊断时间、事故复盘中的理解深度。

工具不会消失,也不应该消失。关键不在于 AI 代码本质上是糟糕的——而在于为人工编写代码构建的审查实践对 AI 编写代码来说系统性地不足,而 AI 带来的速度提升正被质量关卡的退化部分抵消。解决方案是设计能够考虑 AI 特定失效模式的审查流程,而不是假设绿色检查自动化加上更快的人工签字等同于审查本应做的事情。

Let's stay in touch and Follow me for more thoughts and updates