经验与方法论 · 共识经验 · 收录于 2026-09-01

Code Review 变成了形式主义,还拖慢迭代——怎么让它真正有用?

症状

先说我们团队"最黑"的一个迭代:14 天一个迭代,3.5 天卡在评审等待上。

不是评审严格——是评审流程本身变成了阻塞点。更讽刺的是,那 3.5 天里真正被认真看过的代码不足总量的 40%,剩下的全在"LGTM"里被快速略过。开发在等评审,评审人在等开发"别改太频繁",两边互相等,一个迭代一半时间在空转。我一度觉得 Code Review 这个制度本身就该被干掉。

后来我又见过另一款"死法",比拖慢更阴:评审完全变成走流程。大家为了完成 KPI 随便打个 LGTM,有人甚至不看代码直接点确认。我们做过一次实验,随机抽了 50 个 PR,人工评估每条评论的质量——只有 35% 的评论包含实质性的逻辑或设计建议,其余全是"格式问题""补个注释"或者直接 LGTM。

还有第三种死法,我差点亲手把团队关系搞死:刚当上小组长那会儿,我满脑子"指出问题"就是负责。结果一个同事被我批了三次之后,开始绕着我走,PR 都不给我看了。Code Review 本来是让项目更稳的,结果成了团队关系的坟头。

如果你也在经历这些——评审排队卡死迭代;或者评审已经变成"点赞仪式",大家心照不宣;或者你总觉得"提意见"像在得罪人——这篇文章是写给同类人的。它不是评审规范模板,是那些真刀真枪改过评审流程的人,用数据和个人事故换来的共识:评审既不是检查站,也不是仪式,它是一组放在关键节点上的"减速带"——让你慢一点点,但永远不会让整条路停下来等。

原因

先想清楚:评审为什么普遍翻车?我把见过的团队翻车方式归成四类,几乎每类都有机制原因,不是某个人不努力:

第一类:评审被当成"检查站"。 代码写完了才评审,所有问题攒到最后一次性爆出来。这是最反直觉的一点——评审放在最后,等于把"纠错成本"抬到最高。改一行代码的成本,在写的时候是 1,提交后是 10,上线后是 100。检查站式的评审让所有人养成"先写再说,反正有人看"的心态,评审人则成了全团队最后的质检员,又累又招恨。

第二类:MR 太大,评审人根本看不动。 一个 2000 行的 MR 和一个 200 行的 MR,评审难度不是 10 倍关系,是 30 倍关系。人脑的注意力和工作记忆是有上限的,超过几百行,评审就退化成"看个大概"。大 MR 不是"工作量问题",是"评审失效问题"——它从物理上让认真评审变得不可能。

第三类:评审没有激励,只有义务。 大家默认"评审是额外工作",做完没奖励,漏了问题要背锅。于是最优策略就是"快速 LGTM,别给自己惹麻烦"。再加上人情因素——熟人互捧、不好意思挑刺——形式主义就长出来了。这不是道德问题,是激励结构问题:义务没有回报,质量必然让位于速度。

第四类(最新的):AI 把"批改作业"这件事干掉了。 Linter、Formatter、AI 检查器现在能覆盖大部分表面正确性——命名、格式、early return、类型定义放哪,机器一眼扫完还不出错。以前评审人像老师改卷子,现在卷子机器都改完了,人类评审员忽然发现自己失业了。很多团队的评审随之彻底躺平:"反正 AI 都查过了"。

还有一个藏在所有死法下面的共同点:评审错位——评的东西不是关键的东西。 把精力花在格式和"你为什么不判空"上,真正值钱的设计取舍、边界情况、长期可维护性,反而没人聊。下面每条经验,都是把评审拉回正轨的做法,一条条来自不同团队的实测,不是纸面理论。

解法

下面每条经验都按「现象 → 做法 → 为什么」展开。它们不是一家之言,而是多篇独立实践里反复出现的共识。

经验 0(L1 一句话结论):评审是减速带,不是检查站——前置、小步、对码不对人

把评审从"写完代码之后的检查站"改成"分散在设计、开发、提交阶段的一组减速带":强制你在关键节点稍微慢一点,但不会让整个流程停下来等。 赶时间只看这一条:PR 拆小(≤500 行)、评审前置(设计阶段先对齐)、评论对代码不对人。下面经验 1~5 是具体做法和为什么。

经验 1:PR 拆小——小 PR 是评审质量的物理前提

现象:大 MR 是评审失效的头号原因。2000 行 vs 200 行,评审难度 30 倍;双人评审比单人评审多消耗约 60% 的总时间,但额外发现的问题只有约 15%——不是评审人不行,是 MR 太大时,责任分散效应直接拉满:第一个人认真看完,第二个看到已有评论就"大体认可",第三个只看个大概。这不是多人评审,这是责任分散的完美复现。

做法:给 MR 立硬门禁——单次变更不超过 500 行(更保守的团队用 400 行甚至 200 行),超过先拆。拆不动?"这次改动就是这么大,没法拆"是伪命题——拆不动说明设计抽象不够,先做架构调整再动手。提交 MR 前配一份自检清单(覆盖测试、调试代码残留、变更行数、合并冲突、数据库迁移脚本、接口文档),有团队靠它消灭了约 30% 的评审往返。

为什么:小 PR 让"认真看完"成为可能,也让每次评审的上下文是完整的——评审人不需要记住上个月的背景才能判断这段代码对不对。而且小 PR 天然分散风险:一个 PR 出问题,回滚范围小,业务不慌。大 MR 的本质是"把评审责任转嫁给同事的注意力",小 PR 是"把注意力还给评审人"。

经验 2:治形式主义——把"义务"改成"质量",用机制消灭 LGTM

现象:形式主义的核心原因就一句话——评审没有激励,只有义务。为了完成 KPI 打 LGTM、不看代码直接点确认,是每个团队都见过的场景。骂人是没用的,人不会因为被骂就变认真,但会因为有机制而改变行为。

做法:三个被验证过的动作——①取消"Review 通过率"这类数量指标,改评"评论质量":至少提一条与业务逻辑或架构相关的意见,否则算无效评审;②引入"随机结对 + 命名匿名":评审人不知道自己评的是谁,避免人情分和熟人互捧;③设"评审沙箱":每两周选一个高风险 PR,全员匿名评审打分,最佳评审者有小奖励。

某团队实测:三个月后,有效评论占比从 35% 提升到 78%,线上缺陷率下降了 60%(从每万行代码 2.1 个降到 0.8 个)。

为什么:人只对"被衡量的事"负责。把指标从"数量"换成"质量",认真评审就变成了绩效的一部分而不是额外奉献;匿名化切断了人情干扰;沙箱制造了"安全的练习场"——练习发生在真实 PR 上之前。注意前提:这套动作适合 10 人以上的团队,小团队需要更柔性的做法(见 L3)。

经验 3:别对人下手,对代码下手——评论是门手艺

现象:CR 最容易翻车的地方,就一个字:"你"。你这里写错了。你为什么不判空。你这逻辑不太行。只要用了"你",对方心里的防御盾就竖起来了——你不是在评审代码,你是在审判同事。我当年把同事批到绕着我走,就是栽在这上面。

做法:把评论对象从"人"换成"代码/场景/我们":不说"你写错了",说"这段逻辑在并发高的时候可能有风险";不说"你命名不行",说"这个 list1 里装的主要是什么数据?要不要换个更具体的名字,比如 activeUserList?";发现看不懂,先承认自己:"这块我读了两遍才理顺,要不要用提前 return 拆一下?"——先承认自己读得费劲,再给建议,用商量的语气收尾。

格式问题交给工具:lint/prettier/AI 能解决 80% 的低级争吵,别在 PR 里留 20 条格式评论。

真要重写也别在评论区硬刚——人多的地方没人愿意认输,私聊、语音、当面,把风险讲清楚,共识达成了,让他自己改。

为什么:评审的本质是"让别人愿意把问题改掉",不是"证明我比你强"。敌人是 Bug,不是同事。把对象从"你"换成"这段代码",意思一点没变,攻击性直接砍半;承认自己读得费劲,是给双方台阶——对方大概率自己就发现问题了,你连补刀都不用。这条经验看起来"软",其实是最硬的技术:它决定了前四条经验能不能持续运转——没人愿意给"审判官"看代码,但大家都愿意让"兜底的人"帮自己把关。

经验 4:AI 时代,评审从"批改作业"变成"补上下文"

现象:以前评审像老师改卷子——"这里该 early return""命名应该是 camelCase""类型定义放 *.interface.ts"。现在这些 Linter、Formatter、AI 全都能自动查,人一秒钟都不用花。很多团队就此躺平:"反正 AI 都查过了",评审变成了摆设。但恰恰相反:AI 替人类干掉了低级检查,人类评审反而被解放出来干真正值钱的事——而大部分团队没接住这个红利。

做法:把评审重心从"对不对"移到"为什么"和"以后怎么办":不问"这段代码对不对",问"为什么选这个设计?这个组件的通用化粒度,以后加功能时扛得住吗?这个函数责任范围是不是太广?三个月后回来看这段代码,会不会皱眉?测试写起来费劲吗?" 对 AI 生成的代码尤其要补上下文——AI 的代码最大的缺口就是"没有为什么",所以评审人要追问:"前提条件是什么?这个边界场景考虑了吗?

" 有个团队的做法很有代表性:从"直接给答案"改成"一起想"——"这样写可以,但要不要考虑一下这个场景?

"——把评审从单向批改变成双向思考。

为什么:机器能查"写对了没有",但查不了"这个设计对不对""半年后维护它的人会不会想骂人""这个决策和别的模块的时间线一致吗"。这些判断需要业务上下文和长期视野,恰恰是人类唯一不可替代的部分。AI 时代评审的岗位不是消失了,是升级了:从"语法检查员"升级成"上下文补充员"。谁先完成这个转型,谁就同时拥有了 AI 的速度和人类的判断。

经验 5:评审要度量,防膨胀——数据驱动,而不是追责

现象:评审流程改了半年,效果好不好?大多数团队答不上来——没有度量,只有感觉。另一个极端是流程膨胀:每个改动都要三层评审、五个签字,每多一层评审就多一个等待点,每个等待点都可能变成阻塞点——评审从减速带变成了收费站。

做法:建三个最小度量:平均评审时长、首次响应时长、评审发现的缺陷率(评审中拦下的问题数 / 上线后暴露的问题数)。用数据回答"评审到底值不值",而不是靠感觉和争吵。定期审查评审流程本身:这层评审还在产出价值吗?这个等待点是不是已经变成阻塞点?是就拆掉。评审层级宁可少不可多——少一层只是多一份风险,多一层就是多一个永久等待点。

为什么:度量让评审从"信仰问题"变成"工程问题"——有数据就能迭代,没数据就只能吵。而"防膨胀"是大型团队最该警惕的:评审的价值在于"拦住问题",不在于"流程看起来严格"。数据驱动的团队把评审当成系统来调优,而不是当成制度来供奉。

怎么开始用(落地清单,L1 执行层)

  1. 立 PR 门禁:单次变更 ≤500 行,配自检清单(测试/调试残留/行数/冲突/迁移/文档),超过先拆;
  2. 评审前置:设计阶段先对齐方案,别等代码写完再"开喷";
  3. 改质量指标:取消通过率,评"至少一条业务/架构相关意见",匿名随机结对(10 人以上团队);
  4. 评论话术:对代码不对人,"我们/这段代码"代替"你",格式交给工具,重写私聊;
  5. 建三个度量:评审时长、首次响应、缺陷率,每季度审视一次评审流程本身有没有膨胀。

怎么迁移到你的场景(L3 深入层)

  • 个人项目 / 开源项目:没有同事,你的评审人是"未来的自己"——PR 拆小、写清"为什么"(提交信息就是你的评审记录);给贡献者的评论,先感谢再提问,别让新人第一次提 PR 就被"你"字劝退。
  • 小团队(3-10 人):不要全套上匿名和沙箱——柔性做法:结对评审(写的人 + 看的人坐一起过一遍),话术先行,先让小 PR 和"评审前置"落地,这两条就能解决 80% 的痛。
  • 10 人以上团队:经验 2 的三件套(质量评分、匿名结对、评审沙箱)可以上,配度量体系;最该警惕的是流程膨胀——每层评审都要能回答"它还在产出价值吗"。
  • AI 时代:把表面检查全部交给工具和 AI,人类评审只聊"为什么"和"以后怎么办";对 AI 生成的代码,重点补"前提条件、边界场景、设计取舍"——AI 的代码最缺上下文,而上下文只有人能给。
  • 如果你正在"评审变形式主义"的团队里:别先从别人下手,先从自己下手——下一次评审,提一条业务逻辑或架构相关的实质意见,把"你"换成"这段代码",你会看到评论区的气氛变掉。机制是团队的,话术是自己的,而话术是你能立刻开始的那一半。

收尾:最后说句实话:我见过最伤人的评审,不是挑错挑得狠,而是从头到尾没人在乎「为什么」。代码总会写错,评审的意义从来不是抓住错误,是让写代码的人和看代码的人,对「这段代码为什么存在」达成一致。下一次评审,别急着挑毛病——先问一句「这里为什么这么写」,你会看到评论区从战场变成课堂。AI 时代尤其如此:表面检查 AI 全包了,人类只剩「为什么」这一件事值得做。

不绑定工具

本条目为共识型经验,不挂接具体工具;相关工具类问题请到对应工具的问题页。

来源与证据

收录 共识经验 · 不承诺实测
本条目为共识型经验:不承诺本地实测,案例已脱敏提炼进正文,外部来源不逐一列出。

← 经验与方法论 问题域 | 问题货架 | 遇到其它问题?去 问题空间 提交求助卡