为什么在大语言模型代理时代,人工代码审查仍然至关重要

TL;DR

人工代码审查依然至关重要,因为它能揭示真正的理解障碍,质疑变更的必要性,发现缺失的功能,利用组织上下文,确保问责制,并实现双向学习——这些能力是当前基于大语言模型的代理无法可靠提供的。


1. 人类的困惑是一种有价值的缺陷信号

结论: 当评审者说 “我不理解这个” 时,这种困惑本身就是一个问题的标志,而大语言模型无法复制这种反应。

  • 评审者无法理解代码变更,表明代码过于复杂、抽象不当或意图不清晰。
  • 大语言模型在解析代码方面总是“理解”的,但它们从不会产生 困惑 信号。
  • 被评审的文章将可读性视为风格问题;dimbletimbers 的评论强调,至少两人理解功能的实现方式(即使这个数字正趋近于一到零之间)是核心安全机制。

"我希望能看到更多这样的对人工代码审查的辩护……至少有两个人理解这个功能是如何工作的(即使这个数字正趋近于一到零之间)。" – dimbletimbers

2. 对变更必要性的质疑性提问

结论: 人工评审者可以质疑变更本身是否应存在,这是缺陷检测之前的关键一步。

  • 像 “这个变更是否应该拆分为两个 PR?” 或 “这解决的是症状还是根本问题?” 这类问题,深入探究了意图、范围和适当性。
  • 该文章假设每个变更都是必要的,忽略了评审者作为防止无用或范围错误工作的守门人的角色。
  • n4r9 指出,大语言模型最难完成的检查项是验证变更是否 在功能上实现了其声明的目标。

"……我们首先检查的是:‘测试是否通过?’ 然后我们再看……范围和潜在影响……部署和回滚计划……" – metalspot

3. 检测 缺失 的内容(缺失盲区)

结论: 人类能够发现缺失的错误处理、缺少的 API 合同或遗漏的测试——这些是大语言模型已知的薄弱环节。

  • 缺失盲区(参见链接的基准测试)的概念表明,大语言模型经常忽略缺失的元素。
  • 人工评审者依靠领域知识建立的预期来发现漏洞。
  • metalspot 强调,“有经验的工程师能轻易发现缺失的部分”,这与仅审查现有内容的代理形成鲜明对比。

4. 针对作者的校准关注

结论: 对代码作者的过往经验会影响评审的深度和重点,这是大语言模型无法模仿的细微差别。

  • 资深工程师的常规重构会受到较轻的审查,而初级工程师对关键模块的首次提交则会受到更严格的审查。
  • 该文章将所有代码变更视为等价输入,忽略了这种校准的风险评估。

5. 代码审查是一种 协同式 学习活动

结论: 审查是一种双向对话,能重塑作者和评审者双方的认知模型,而不仅仅是单向的信息传递。

  • 知识传递涉及共同理解,而不仅仅是生成解释。
  • dguest 观察到,每次合并请求都在教会评审者贡献者是如何产生困惑的,这强化了其双向性。

"每次合并请求都在教会你,你的贡献者是如何产生困惑的。" – dguest

6. 运营上下文存在于代码仓库之外

结论: 人工评审者会将最近的事件、下游弃用、法律约束和非正式协议带入评审中。

  • 示例陈述:“我们上周二在这个服务上刚发生了一次事故”,或“法务部门告诉我们不要记录这个字段”。
  • 该文章假设代码库是完整的上下文,这是错误的。
  • metalspot 指出,代码审查历史上承担了协调、治理和责任隔离的功能,这些功能需要外部上下文。

7. 问责制与“利益相关”

结论: 个人责任激励全面审查;而自主代理缺乏后果和激励。

  • 人工评审者是具体的人,可以被追究法律或职业责任。
  • 该文章将责任归为官僚形式,忽略了问责制的激励作用。
  • metalspot:“代码审查从来不只是关于代码。它让律师满意,并提供了一个执行真正让系统运行起来的事情的途径。”

8. 超越缺陷检测:协调、理解与治理

结论: 代码审查是一个多用途过程,包括协调、理解与治理,而不仅仅是缺陷检测。

  • 该文章的“替代神话”将人类贡献简化为可衡量的功能,然后声称代理可以复制每一项。
  • 这种分解忽略了人类在各项功能之间所起的整合作用。
  • metalspot 认为,随着 AI 生成代码的规模扩大,传统的代码审查将变成一种责任保护机制,而非质量关卡。

9. 社区对审查未来的看法

  • clintonb 担心,由 AI 驱动的反馈会侵蚀工程师的学习机会。
  • ChicagoDave 认为,设计评审将取代代码评审,成为主要的人类关卡。
  • bhouston 预测,对于超过 90% 的非关键 AI 生成代码,人工评审将消失。
  • looperhacks 报告称,GitHub Copilot 内置的评审远未达到“机器将很快审查所有代码”这一叙事所要求的水平。

10. 人机协同审查的实用检查清单

基于 n4r9 的非详尽清单,一次稳健的审查应提出以下问题:

  1. 变更是否实现了其声明的功能目标?
  2. 是否存在多余的产物(调试打印、密钥等)?
  3. 是否不存在明显的缺陷(内存泄漏、安全漏洞)?
  4. 代码是否易于理解且抽象良好?
  5. 是否遵循了风格指南?
  6. 是否有性能改进?
  7. 变更是否得到了充分测试?

大语言模型在第 2-6 项表现良好,但在第 1 项(功能意图)和检测缺失元素(第 3-4 项)上表现不佳。


最终观点

尽管大语言模型代理可以自动化许多低层级的检测任务,但它们无法替代人工评审者揭示困惑、质疑必要性、检测缺失功能、基于作者历史进行校准风险评估、参与协同学习、注入外部运营上下文以及承担问责的能力。因此,即使 AI 生成的代码日益普及,代码审查仍然是一个关键的协调与治理机制。

Sources

相关