代码评审的价值超越自动化缺陷检测
文章《代码评审的终结:编码智能体取代人工审查》的摘要给读者描绘了这样一幅图景……
摘要——自 Fagan 在 1976 年将代码审查流程规范化以来,代码评审一直是软件开发中首要的质量关卡。五十年来,合并前由同事检查并评论代码改动,是各种规模组织的基石实践。编码智能体是基于大语言模型(LLM)的自主系统,能够阅读、编写、测试和修复软件。我们认为,编码智能体的能力已经越过了某个阈值,使得传统的人工代码评审不再是软件质量流程中不可或缺的环节。我们的论证基于两点:代码评审的每一个既定目标,智能体都能以更低的成本、更高的吞吐量完成;那种让智能体写代码、人类仍充当强制审查者的朴素集成方式是一条死路,因为它既提供不了有意义的保障,也无法跟上 AI 辅助开发的吞吐量。
这篇文章结构清晰,对不常读研究论文的工程师来说相当易懂。不过我认为,整个论证关键处依赖一个有问题的框架:替代迷思。
作者把同行代码评审拆解成四个功能:缺陷检测、风格统一、知识传递和信息同步,并论证智能体可以胜任每一项。结论自然是:既然智能体能执行所有这些功能,它就有能力取代人类评审者。
但我觉得这忽略了同行代码评审中一些无法被简化为具体功能的重要方面:
评审者的困惑也是一种信号
当经验丰富的工程师阅读代码差异(diff)时,如果他说出“我没看懂”,这种困惑本身就是一个发现。这意味着代码过于复杂、抽象层次有误,或者意图表达不清。LLM 总是能在“处理”数据的意义上“理解”代码,但它无法提供人类那种合理的困惑信号。这篇文章将代码可读性视为一种风格问题,但这并不准确。可读性是一种涌现属性,体现在试图理解代码的人与代码本身之间的交互中。
对变更必要性的专业质疑
质疑变更本身是否合理,例如:
“这真的应该是两个 PR(拉取请求)吗?”
或者
“这是在治标,而不是治本”
这些都是关于意图、范围和适当性的问题。这些考量都先于代码是否“正确”。文章的框架假设:a) 待审查的代码变更是必要的,b) 审查的主要目的是验证。
但任何接触过生产环境的人都知道,代码审查往往是(有时甚至是唯一)可以质疑变更是否必要的关键时刻。
察觉缺失的能力
人类审查员能注意到 API 契约发生了变化,但错误处理却没有跟进。他们能发现什么是缺失的。换言之,能够识别出本应存在却实际不存在的内容。文章对此完全没有提及,这一点尤为有趣,因为缺失盲点(absence blindness)恰恰是 LLM 经常表现不佳的那类失败模式。
Agent 审查的是存在的内容;而具备专业知识的工程师则很容易察觉缺失的部分。
谁写的代码会影响审查的细致程度
同事间的代码审查者拥有一种校准过的注意力,这源于与代码作者(通常也是同事)的过往经验。例如:初级工程师第一次提交支付模块的代码,与资深专家进行的例行重构相比,两者获得的关注度截然不同。
评审员通常会将情境中的人、事、时间、地点与自己关于风险所在地的经验进行匹配。
这篇文章似乎将所有差异都视为等效的输入。
代码评审是双向且建设性的
在我看来,该论文将知识传递简化为单纯的信息输送;智能体只是“生成解释”。但代码评审中的讨论是一种共同的 认知活动。互审者了解作者的方法,作者通过评审者的提问进行学习,最终形成了一种双方在讨论前都未曾具备的共享理解。
这是一项协同工作,而不仅仅是信息的单向传输。智能体的总结无法替代那种能改变双方心智模型的对话。
仓库之外的运维背景信息
“这个服务上周二刚发生过一次事故。”
“负责这个下游消费者的团队准备弃用那个接口。”
“法务部门要求我们不再记录这个字段。”
人类评审员拥有的背景知识远超其自觉范围,尽管他们能在实际场景中识别出各种关联。人们理解组织的当前状态、近期事件,以及未被测试、文档或版本控制所捕获的非正式协议,并能识别这些因素影响被评审代码的方式。这种情况非常普遍,以至于几乎变得隐形。
该文章假设代码库就是完整的上下文。事实并非如此。
对代码的责任感并非仅仅是官僚形式
这篇文章将人类责任视为合规产物,为了法律或其他规则目的而设立的“指定人类”。但意识到自己对批准变更负有个人责任,会塑造你评审代码的方式。这就是所谓的“切身利益相关”。一个对拉取请求进行“签署批准”的智能体不承担后果,显然也不具备激励认真评估的利益结构。尽管该论文的讨论部分确实包含了伦理担忧,但最终将其转向了“需求工程和部署后监控”,在我看来,这是一种推卸责任、拖延解决问题的做法。
这篇文章最根本的问题在于,它默认代码评审首先是一个检测过程:找出缺陷、风格违规、安全问题等等,并假设更快、更便宜地检测出这些问题总是好事。
但代码评审同时也是一个协调过程、一个意义建构过程、一个治理过程。
替代迷思通常就是这样上演的:
- 先把人类的工作贡献拆解成可衡量的功能。
- 然后证明机器也能用自己的方式复现这些功能。
- 最后宣布人类是多余的。
这种思路往往在同一个地方出问题:真正重要的人类贡献,恰恰是跨功能的整合——即人们应对计划外情况和环境的能力,以及履行社会所期待的责任。
这种适应能力在上文第 1 步的拆解中并没有被考虑进去。
我认为原文章同样没有考虑这一点。