AI 代码审查的现状:18 个月回顾
Source: Dev.to
请提供您希望翻译的具体文本内容,我将按照要求将其翻译为简体中文,并保留原始的格式、Markdown 语法以及技术术语。谢谢!
介绍
自从我们公司开始在日常工作中大量使用 AI,已经快一年半了。我们测试了各种工具——例如 Windsurf、GitHub Copilot、Cursor、Claude 和 LibreChat——现在我可以自信地评论 AI 模型对软件工程这一学科的影响。
在本文中,我将提出我对使用 AI 进行代码审查的 客观观点。
注意: 我不是 AI 专家。我没有深入的技术知识,无法像互联网上的许多人如今那样讨论模型架构。感觉每个人都自认为是大语言模型的专家,但这显然不现实。
Source: …
为什么代码审查仍然重要
代码审查是每个软件项目的关键阶段,忽视它往往会导致后期出现不可预测且严重的问题。自软件时代伊始,无论使用何种编程语言,审查已编写的代码都被视为投入生产前的必经步骤。
历史案例:阿波罗飞船软件
- 项目: 阿波罗飞行软件(名为 Luminary)
- 规模: > 145 000 行代码
- 过程: 每个文件都包含注释(see the repository on GitHub),整个代码库经历了多轮审查和批准。
当时,每一行代码都是手工编写、审查和优化的。即使在 1960 年代初,需求定义、设计、编码、测试和维护等流程也被严格遵循。
Margaret Hamilton,负责开发阿波罗飞行软件的实验室负责人,曾说:
“阿波罗让人们意识到——虽然这并不是它的工作方式——提前定义系统以最小化错误要比先写出一堆代码再通过层层补丁来修正要好得多。这一信息似乎被忽视了——在这方面,今天的软件仍然是 50 年前的建造方式。”
通过在早期发现并修复错误,系统足够稳定,能够在登月前几秒出现意外的 CPU 超负荷时仍然正常运行。在所有载人阿波罗任务中未报告任何软件错误——这充分体现了人类精确性的卓越成果。
代码审查金字塔
一个在软件工程中广为人知的概念是 Code Review Pyramid,它展示了不同审查方面的相对重要性:
- 功能与设计
- 实现
- 测试
- 文档
- 代码风格
根据我的个人经验,我在审查他人代码时一直遵循这个层级。然而,第一次审查总是针对我自己的代码——由我本人进行。
在推送更改或让 AI 检查之前,请自行回顾金字塔。
不要仅仅检查语法。
实用的人类审阅者技巧
- 像第一次阅读一样阅读。
- 提问自己:
- 什么让人困惑?
- 有哪些是隐含的?
- 在写作和审阅之间休息一下。
- 许多开发者会在一天结束时提交更改,此时疲劳会导致错误被忽视。
- 等到早晨再审阅,精神焕发,效果会显著提升。
AI 能自动化的内容
审查过程的若干环节可以实现自动化:
- 代码风格强制执行
- 语法错误检测
- 测试覆盖率验证
- 代码优化建议
- 通用错误检测
AI 在代码审查中的优势
| 优势 | 描述 |
|---|---|
| 即时反馈 | 传统审查可能需要数小时甚至数天;AI 能立即回复。 |
| 无认知疲劳 | 审查他人代码的数百行会让人精神疲惫。AI 永不疲倦。 |
| 生产力可扩展 | 在大型团队中,人类审查者在审查上花费大量时间,影响生产力。AI 的速度不随团队规模下降。 |
| 一致性检测 | AI 每次都能发现相同的问题,尤其是约定或小缺陷。 |
| 可扩展吞吐量 | AI 每天可以审查数十个拉取请求,性能不受影响。 |
一项思科研究发现,一次审查 超过 400 行代码 会降低审查者发现错误的能力,大多数缺陷在前 200 行中被发现。此洞见塑造了行业实践——但 AI 并不受此限制。它可以处理大规模审查而不出现性能下降。
缺失的部分:理解
虽然 AI 在上述任务上表现完美——我也在很大程度上依赖它——但它仍缺少一个根本的东西:理解。
- 当前的 AI 系统在许多方面都相当有限。
- 我们被它们处理语言的能力所欺骗,以为它们具备智能,然而它们并不理解物理世界。
- 它们缺乏持久记忆、真正的推理以及长期规划——这些是真正智能的关键方面。
机器学习范式快速入门
1. 监督学习
- 经典方法。
- 模型在包含 输入 和正确 输出(标签)的示例数据集上进行训练。
- 示例:展示一张桌子的图像并标记为 “table”。模型进行预测;如果错误,则调整其内部参数。如此反复数百万次,形成强大的输入‑输出关联。
2. 强化学习
- 更贴近人类学习的某些方面。
- AI 并不是被告知确切的正确答案,而是 行动、观察结果,并获得 奖励 或 惩罚。
- 它调整未来的行动以最大化长期奖励。想想你学骑自行车的过程:尝试、摔倒、调整,最终成功。
(文章后续继续讨论强化学习,但此处摘录结束。)
Closing Thought
AI 是一个极其强大的代码审查助手——快速、一致且可扩展。然而,它仍然是一个并不真正理解它所评估代码的工具。拥有代码审查金字塔和良好习惯(比如休息)的人工审查员,仍在交付健壮、可维护的软件方面发挥着关键作用。
Reinforcement Learning – Limits of the Paradigm
通过试验、错误和纠正,强化学习(RL)可以产生令人印象深刻的结果。然而,这一范式存在局限性。它效率低下,仅在明确界定的环境中(例如下棋、围棋或扑克)才有效,因为这些环境的成功指标是已知且明确的。在缺乏明确反馈的复杂真实世界情境中,强化学习变得不切实际。
自监督学习
这是最近 AI 革命的基础,包括像 ChatGPT 这样的大型语言模型。在这里,系统通过创建自己的预测任务从未标记的数据中学习——例如,尝试预测句子中缺失的词。通过在海量文本上进行训练,模型构建了词语和概念之间模式与关系的内部表征。
- 这种方法使 AI 获得了生成连贯且上下文感知语言的惊人能力。
- 它仍然 不 赋予模型真正的理解或推理能力——这只是模式识别,而非理解。
即使具备了所有这些复杂性,AI 仍然根本上受限于其训练数据和目标。它并不像人类那样理解事物;它仅仅是对统计关系进行建模。
软件的角色
软件,按定义,是一种必须根据人类需求和行为运行的工具——有时甚至在关系生命安全的系统中发挥作用。正是在这一区别中,人类的意识和直觉仍然是不可替代的。
最终思考
我将以一幅完美捕捉过去两年开发格局变化的视觉图结束。
- 编写代码本身从未真正成为问题。
- 真正的挑战一直是交付 零错误 且 可靠 的软件。
教训很明确:AI 是强大的盟友——尤其在自动化审查过程中的重复性工作方面——但人类因素仍是智慧、同理心和理解的最终防线,而这些是任何算法尚未能够完全模拟的。