从“看不过来”到“算了,能跑就行”:AI 代码 review 的崩溃

4 阅读6分钟

以前 review 代码,是看一个人怎么想。

现在 review AI 代码,常常是看一堵墙。

Agent 说“完成了”。你打开 diff:30 个文件,1200 行变化,测试全绿。你往下滚, 看到一些熟悉的模式、一些合理的抽象、一些看起来没问题的类型。滚到一半,你开始 加速;滚到最后,你点下 approve。

两周后有人问:“这个模块为什么变成这样?”

你答不上来。因为你当时也没有真正看懂,只是没有找到明显的错。

这不是某一个人的懒,而是 review 这件事在 AI 时代失效了。

一、Review 的对象变了

传统代码 review,表面上是在看代码,实际上是在看三件事:

  • 这个人想解决什么问题;
  • 他为什么这样改;
  • 这个改动会不会破坏现有系统。

AI 把第一件事说得很清楚:“我完成了导出功能。” 但它很少把后两件事讲清楚:

  • 为什么新增了一个服务?
  • 为什么要把表格组件重写?
  • 为什么这条依赖从 A 变成了 B?
  • 哪些是需求,哪些是它顺手做的?

代码量越大,这些“为什么”越难从 diff 里还原。

Review 的对象其实已经从“代码”变成了“代码 + 意图 + 结构”。但大多数 review 工具只给你代码。

二、为什么 review 会崩?

1. Diff 太大,注意力先崩

一个人能认真 review 的代码量是有限的。超过那个量,人就会从“逐行判断”切换到 “模式识别”:

  • 看起来像那么回事;
  • 测试过了;
  • 没有明显语法问题;
  • 应该没事。

这不是 review,是盖章。

2. AI 代码看起来太“合理”

AI 写代码通常很整齐:命名一致、类型完整、注释像模像样。这种一致性会让人放松 警惕。

但“看起来合理”不等于“决策正确”。它可能在一个错误的位置写了很漂亮的代码, 也可能用一个很优雅的方式实现了不该做的需求。

3. 结构变化藏在行级 diff 里

一个模块被拆了,在 diff 里可能只是几个 import 和文件移动;一条跨层依赖出现了, 可能只是多了一行 import。

你看到的是行,系统发生的是结构变化。

4. 测试通过带来虚假安全感

测试通过只能说明“已覆盖的行为没坏”,不能说明:

  • 结构是否合理;
  • 是否引入了不必要的依赖;
  • 是否把临时逻辑写进了长期代码;
  • 是否偏离了原始需求。

测试是底线,不是 review 的替代品。

5. 没有“停止点”

人类 review 可以问作者:“这里为什么这么改?” AI 的默认流程是继续写,直到完成。它不会主动说“这个改动已经超出你的要求了, 要不要先确认?”

于是 review 成了唯一的刹车。但 review 已经超载了。

三、Review 不是逐行读,而是分层判断

我现在更愿意把 review 拆成四层:

  1. 意图:这次到底要解决什么问题?
  2. 结构:有没有新增模块、依赖、公开实体变化?
  3. 范围:有没有碰到不该碰的目录和文件?
  4. 实现:关键代码是否合理,测试是否覆盖?

这四层里,最贵的不是第 4 层,而是第 1 到第 3 层。因为它们决定“这次改动该不该 进入系统”。

如果一上来就扎进 1200 行代码,等于把最贵的判断留到最后,而那时注意力已经没了。

四、Jin 想补的是前三层

Jin 不试图让代码 review 变成一键通过。它做的是把意图、结构和范围先摆出来:

  • 提案里有目标、范围、验收标准;
  • 目标架构和当前架构有结构化差异;
  • 差异里能看到新增/删除/变更/移动的模块、实体和依赖;
  • 变更有版本,v1、v2 各自做了什么可以对比;
  • 决策有记录:谁批准、什么时候、针对哪个目标哈希;
  • 应用后有漂移检查,提醒架构和代码是否还对得上。

这样 review 的顺序可以变成:

  1. 先看提案:方向对不对?
  2. 再看架构 diff:结构有没有意外变化?
  3. 再看变更文件:范围有没有越界?
  4. 最后看关键代码:实现有没有问题?
  5. 跑测试和 CI:行为有没有坏?

它不是把 1200 行变成 12 行,而是先告诉你:这 1200 行在结构上意味着什么。

五、一个更现实的 review 策略

即使没有 Jin,也可以用这些原则减少“review 崩溃”:

  • 限制一次 review 的规模。 超过自己认真看的量,就要求拆批,而不是假装看完。
  • 先要“改了什么、为什么”的摘要。 不是让 AI 写一篇作文,而是列结构变化和风险点。
  • 按风险抽样。 核心路径、权限、数据迁移、公共 API 重点看;格式化和小改动可以略过。
  • 把“范围”当 review 项。 对照任务目标,看有没有非目标里的改动。
  • 要求停止点。 结构变化先提案,不要写完再解释。
  • 不要用 LGTM 代替判断。 如果说不清这次改动的结构影响,就不算 review 完。

六、审批不等于 review

这里要特别说清楚:Jin 的审批不是代码 review 的替代品。

批准一个提案,意味着你认可这次架构决策;不意味着你确认了每一行实现都正确。 代码层的 bug、边界条件、性能问题,仍然需要 review、测试和 CI。

Jin 解决的是 review 的入口问题:

  • 先让你看见结构;
  • 再让你决定要不要深入;
  • 把“为什么”留在提案和历史里,而不是聊天记录里。

这不会让 review 变轻松,但会让 review 变得有可能做完。

七、Review 崩溃不是个人问题

如果你发现自己越来越不想 review AI 代码,不要先怪自己不够认真。

这更像是流程设计的问题:

  • 一次给太多;
  • 只给代码,不给意图;
  • 只给行级 diff,不给结构;
  • 只给结果,不给决策记录;
  • 把测试通过当成可以合并的信号。

AI 写代码的速度已经超过了人类逐行 review 的速度。继续用“逐行看完”要求自己, 只会得到两种结果:要么累垮,要么放水。

更好的方式不是看快一点,而是先看更少、更关键的东西。

项目地址:

github.com/ZYF93/openc…

v2.0.32-jin.1 下载:

github.com/ZYF93/openc…

中文完整指南:

github.com/ZYF93/openc…

Jin 是 OpenCode 的社区分支,不是 OpenCode 官方产品。审批门不替代代码 review、 测试和 CI。