上季度我为平台团队追踪一个数字:PR 标记「可评审」到第一条人工评论之间的小时数。从里斯本到西雅图的六名工程师之间,中位数是 31 小时。没有明显坏掉的东西——CI 全绿,diff 也不大——但每个 PR 都躺在队列里,直到身处那个时区的某人醒来、开完站会、找到不被打扰的时间。
这支队列是分布式工程的隐形税。Stack Overflow 2024 年开发者调查显示,92% 的开发者至少部分时间远程工作,「拍拍肩膀请人评审」的旧模式已经消失,取而代之的往往是一条无人认领、无人度量的失控队列。
异步评审的解法,是像值班响应故障那样对待评审:有归属、有度量、按风险分级、卡住时自动升级。切换后,首次响应中位数从 31 小时降到 11 小时,没有增加任何会议。下面是完整配置:公开的 SLA 与承载它的工具链。
为什么同步评审一跨时区就失灵
团队同处一室时,代码评审靠「环境感知」:你看到 PR 合入、午饭时听作者聊过它,在会议间隙顺手评审。分布式团队没有这层感知,每次评审都依赖某人「恰好注意到」自己睡觉时落地的改动。
失败模式可以预测:PR 在里斯本下午 5 点提交,最强的评审者在波特兰,等波特兰上线时,作者早已切换了上下文。每次交接都增加数小时,diff 逐渐变凉,合并冲突开始滚雪球。看似评审者太慢,其实是队列坏了。
评审还常常堆积在同两位资深成员身上,成为单点瓶颈;初级工程师也学不到评审判断力,因为反馈循环发生在他们从未参与的通话里。
异步评审流程的四条基本规则
先谈规则,再谈工具。四条承诺,一段话就能写完:
- 每个 PR 在打开那一刻就有具名评审者和截止时间。 不存在孤儿 PR,也没有「总有人会捡起来」的侥幸。
- 反馈必须落成文字、具体、有依据。 一段录屏、一个基准测试或一条失败的测试用例,而不是一句下午就蒸发的口头总结。
- 升级是自动的,不靠人情。 违反 SLA 的 PR 自动改派或在频道提醒,没人需要低声下气地催评审。
- 队列公开可见。 任何人都能看到什么在等待、等了多久、卡在谁手上。
第四条规则的作用超出直觉:等待时间在仪表盘上可见后,团队会自发纠正队列,话题也从「我的 PR 为什么卡住」变成「什么让队列堆积」。
设一个真正够得着的评审 SLA
给评审定服务级目标听着官僚,直到你看到它替代了什么:每位作者每天都在猜,自己的 PR 是被礼貌搁置,还是真的被遗忘。我们的 SLA 就一张表:
| PR 分级 | 首次响应 | 完成评审 | 升级机制 |
|---|---|---|---|
| 低风险(文档、测试、文案) | 24 小时 | 48 小时 | 团队频道提醒 |
| 标准(功能、重构) | 8 工作小时 | 24 小时 | 机器人改派第二评审者 |
| 高风险(认证、支付、迁移) | 4 工作小时 | 12 小时 | 呼叫值班评审者 |
| 热修复 / 故障 | 30 分钟 | 2 小时 | 先合并,事后强制补评审 |
两个细节决定 SLA 真假。其一,「首次响应」指有实质内容的评论——提问、担忧或带理由的批准,光秃秃的 LGTM 不停止计时。其二,计时按各评审地区的「工作小时」算,没人因作者周五傍晚提交 PR 而违约。
给每个 PR 做风险分级
评审产能有限,必须花在刀刃上。每个 PR 打开时就打上分级标签:
- 低风险 — 文档、纯测试改动、文案修订。任何成员都可以评审,SLA 宽松。
- 标准 — 有测试覆盖的功能开发与重构。通过 CODEOWNERS 路由到所属团队。
- 高风险 — 认证、支付链路、schema 迁移、一切触碰 PII 的改动。必须由领域深度评审者把关,录屏讲解是必选项而非可选项。
分级还要配一份评审前自查清单:描述是否讲清了为什么、测试是有意义还是装饰、diff 是否在约 400 行以内。大多数评审延迟是可读性问题的马甲,自查能在评审者发现之前拦下它。
400 行不是教条而是强制函数:超线的改动几乎总含两个可拆分的想法,拆开后评审更快、回滚更省。拆不开的迁移或重命名,就在描述里说明,请求两轮评审:先设计,后实现。
承载流程的工具
这套流程几乎能跑在任何现代技术栈上,关键是自动路由、公开队列、等待可度量。四款我们用过或在用:
| 工具 | 适合场景 | 优势 | 权衡 |
|---|---|---|---|
| GitHub(CODEOWNERS + 合并队列) | 希望留在单一平台的团队 | 自动指派、强制必需评审、队列在 PR 内可见 | SLA 计时需机器人或 Action;堆叠 PR 一般 |
| GitLab(审批规则) | 希望规则内建的团队 | 按路径配置审批规则、合并列车、开箱即用的等待报告 | 审批规则需调校;部分团队觉得节奏偏慢 |
| Graphite | 堆叠式 PR 工作流 | 让小型 PR 堆叠毫无痛苦;键盘优先的评审界面 | Merger 为付费功能;团队需接受堆叠习惯 |
| Loom | 录屏讲解 | 两分钟上下文视频能消掉大多数「快速对齐」会议 | 视频会过期;必须与书面 diff 搭配 |
不必在平台选择上纠结:流程只依赖自动指派、队列可见、等待可度量三个能力,上表每一款都具备。我们在 GitHub 上靠小机器人跑了一年才引入 Graphite。选团队每天本来就会打开的工具,把 SLA 接进去,克制「先换工具再度量」的冲动。
可直接复制的评审 SLA 模板
下面是手册里的完整政策文本,拿去改数字就行:
评审 SLA v1.0
- 每个 PR 打开时确定一名评审者和一个风险分级。
- 首次实质响应:8 工作小时(标准)、4(高风险)、24(低风险)。
- 完成评审:24 工作小时(标准)、12(高风险)、48(低风险)。
- 光秃秃的 LGTM 不算首次响应。
- 违约自动改派给备用评审者,并在频道通知。
- 等待时间的中位数与 90 分位在每月复盘会检视。
模板本身不重要,重要的是「公开」:没人找得到的 SLA 只是建议,写进手册的 SLA 才是承诺。
常见失败模式
实践中,这套流程有三种典型的死法。
SLA 只活在 wiki 里。 违约不触发改派,SLA 一个月内就退化成装饰。先接好升级自动化,再发政策。
评审表演。 异步反馈容易滑向抠字眼竞赛——三十条评论谈变量命名,没有一条谈数据模型。分级在此起作用:高风险 PR 要求评审设计本身,而非标点。
录屏疲劳。 录屏对架构级改动威力巨大,但一刀切强制毫无用处。只对高风险分级强制;标准 PR 里,好的书面描述更胜一筹。
结语
异步评审流程不是买一个工具,而是四条规则、一张表,加上把不可见变成可度量的纪律。起步可以更小:先花两周度量等待时间,发布那张 SLA 表,让数据替你争取剩下的。第二个月起,PR 不再悄无声息地死在队列里。