CodeRoad Map 程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。
由 程序员柏风 独立维护 · 关于作者
学习 更多
Review 流程
这一课你将能做到
把 PR 控制在「可审查」的大小范围内,并说服作者拆 PR
设计团队的 Review 节奏:谁来审、多久审完、什么情况可以合并
用 CI、分支保护、模板等工具把流程固化下来
为什么要学
Code Review 最常见的失败不是「审不出问题」,而是「流程烂到没人想审」——PR 堆三天没人看、1000 行变更 reviewers 直接 LGTM、紧急情况绕过 review 直接上 master。
人话:流程对了,review 才有意义;流程不对,review 就是走形式。
先建立图像
健康的 Review 节奏
作者 系统 Reviewer
│ │ │
├─ 提交 PR(<400 行)──→│ │
│ ├─ CI 跑测试/Lint ────────→│ 收到通知
│ │ (5 分钟内出结果) │
│ │ ├─ 24h 内开始审
│ │ ├─ 一次性给完反馈
│ ←── 需要修改 ────────┤ │
├─ 修改并 push ────────→│ │
│ ├─ CI 重跑 ──────────────→│ 复审(只看改动)
│ │ ├─ Approve
│ ←── 自动合并 ────────┤ │
关键指标:
- PR 平均大小:< 400 行变更
- 首次响应时间:< 24h(工作时间)
- 从提交到合并:< 48h
跟着做
步骤 1:控制 PR 大小
❌ 反例:1000+ 行的「史诗 PR」
feat: 课程模块完整实现
- 新增 CourseController(300 行)
- 新增 CourseService(500 行)
- 新增 CourseMapper + XML(200 行)
- 新增 DTO 15 个
- 修改 UserService(100 行)
- 修改配置文件
- 新增测试(500 行)
reviewer 看到这种 PR 的真实反应:拉到最下面,点个 Approve。
✅ 正例:拆成 5 个小 PR
PR 1: feat(course): 新增课程领域模型与 Mapper(200 行)
只含 Entity + Mapper + 单测,不含业务逻辑
PR 2: feat(course): 课程 CRUD Service 层(250 行)
依赖 PR 1,含 Service + 单测
PR 3: feat(course): 课程 Controller + DTO(300 行)
依赖 PR 2,含接口层 + 集成测试
PR 4: feat(course): 课程搜索与筛选(200 行)
PR 5: refactor(user): 抽离用户权限判断供课程模块使用(100 行)
每个 PR 独立可审、独立可合、独立可回滚。
审查动作:看到 >500 行的 PR,第一反应是问「能不能拆」。
步骤 2:写 PR 描述
❌ 反例:
修改课程相关代码
✅ 正例:用模板
## 改动说明
新增课程发布功能:讲师可将草稿课程发布为正式课程,
发布后 C 端可见,同时触发搜索索引更新。
## 影响范围
- 新增接口 `POST /api/v1/courses/{id}/publish`
- 修改 `CourseService.publish()`(新增方法)
- 新增 Outbox 事件 `course.published`
## 测试
- [x] 单元测试:CourseServiceTest 新增 3 个用例
- [x] 集成测试:CourseServiceIT 覆盖并发发布场景
- [x] 本地手动验证:发布 → 搜索可见 → C 端列表出现
## 注意事项
- 依赖 PR #123(课程领域模型)先合并
- 上线后需配置 ES 索引别名
步骤 3:配置 CI + 分支保护 # 设置 → Branches → Add rule
Require a pull request before merging: ✓
Require approvals: 1 # 至少 1 人 approve
Dismiss stale reviews when new commits are pushed: ✓
Require status checks to pass: ✓
- build (Maven compile + test)
- lint (Checkstyle)
- frontend-lint (ESLint + TypeScript check)
Require branches to be up to date: ✓ # 合并前必须 rebase 到最新 main
Restrict who can push to matching branches: ✓ # 禁止直接 push main
不过 CI 不能合
没人 approve 不能合
新 push 会把旧 approve 作废,防止「approve 后又偷偷改代码」
步骤 4:定义 Reviewer 分配规则 CODEOWNERS 文件(放在 .github/CODEOWNERS):
# 后端核心
/src/main/java/com/example/course/ @zhangsan @lisi
# 数据库迁移
/src/main/resources/db/migration/ @dba-team
# 前端
/web/ @frontend-team
# 配置与部署
/application*.yml @devops-team
/Dockerfile @devops-team
效果:PR 一改这些文件,对应的人自动被加为 reviewer。
步骤 5:定 Review SLA 团队约定(写进团队 Wiki,不是口头):
1. PR 提交后 24h(工作日)内必须有 reviewer 开始审
2. Reviewer 一次性给完所有反馈,不要挤牙膏
3. 作者修改后 24h 内 reviewer 必须复审
4. 紧急修复(线上 bug)可以「先合并后补审」,
但必须在 24h 内补 PR 并通知全员
5. PR 超过 48h 没人审,作者可以直接在群里 @ 任何人
为什么 SLA 重要 :PR 挂太久,作者上下文丢失、代码过期要 rebase、团队对「review 是不是必要的」产生怀疑。
步骤 6:处理「紧急情况」 线上炸了 → 直接 push 到 main → 没人知道改了什么 → 下次又炸
线上炸了
→ 创建 hotfix 分支
→ 提 PR,标题加 [HOTFIX]
→ CI 跑过 + 任何 1 个 maintainer 口头同意即可合并
→ 合并后 24h 内必须补正式的 review(即使已合并)
→ 复盘为什么这个 bug 没在 review 阶段被发现
讲清楚要点
PR 越小越好 :400 行是经验上限。超过这个数字,reviewer 的注意力直线下降,漏审率直线上升。
PR 描述是 review 的入口 :写清「做了什么、为什么、影响范围、怎么测」,reviewer 5 分钟就能进入状态。
CI 是 review 的前置条件 :CI 没过的 PR 不该被审——浪费 reviewer 时间。
SLA 决定 review 文化 :没有时限约定,review 一定会拖。一拖,大家就绕开 review 直接 push。
紧急情况也要有事后机制 :允许 hotfix 先上,但必须补 review、补复盘,否则「紧急」会变成常态。
你可能会懵的地方
PR 拆得太小, reviewer 要看 5 个 PR 才能理解全貌怎么办?
用「stacking PR」:PR 2 基于 PR 1 的分支,PR 3 基于 PR 2,依次合并。或者在主 PR 里放设计文档链接,说明整体方案,分 PR 只是分步实施。
Reviewer 一直不给过怎么办?
私聊。90% 的僵局是「评论里说不清楚」。约个 15 分钟语音,大概率当场解决。解决后把结论补到 PR 评论里存档。
作者和 reviewer 对实现方案有分歧怎么办?
先看是不是「风格层面」的分歧(听作者的,他维护这段代码);再看是不是「设计层面」的分歧(拉第三人或 tech lead 仲裁);最后是「事实层面」的分歧(写个 benchmark 或 POC 验证)。
小团队就 2-3 个人,还需要 CODEOWNERS 吗?
不需要。CODEOWNERS 是给「不知道该找谁审」的中大型团队用的。小团队直接在群里喊一声就行,但 SLA 还是要有。
紧急修复后「补 review」有意义吗?代码都上线了。
有。补 review 不是为了改这次代码,是为了:① 让团队知道改了什么;② 复盘为什么没拦住;③ 确认 hotfix 没引入新问题。
错法对照 错法 问题 正解 1000 行 PR Reviewer 直接 LGTM 拆成 <400 行的小 PR PR 描述就一行字 Reviewer 无从下手 用模板写清改动与测试 CI 没过就 @ reviewer 浪费 reviewer 时间 CI 绿才提审 Reviewer 挤牙膏式反馈 来来回回一周 一次性给完反馈 紧急修复直接 push main 没人知道改了什么 Hotfix PR + 事后补审
卡点急救
PR 挂了三天没人审 :在群里 @ 具体的人(不是 @所有人),或直接找 tech lead 协调。长期没人审说明 SLA 没执行,要在团队会议上提。
Reviewer 和作者吵起来了 :停止在 PR 评论里争论,约个 15 分钟语音。文字容易升级情绪,语音能快速对齐。
PR rebase 后冲突太多想放弃 :下次记住「早合并、常合并」——每天同步一次 main 分支,冲突最小化。大型重构前先和团队打招呼,冻结相关文件。
面试常问
你们团队的 Code Review 流程是什么样的?
讲清五个点:PR 大小控制(<400 行)、CI 前置(不过不审)、CODEOWNERS 自动分配、SLA(24h 首响 / 48h 合并)、紧急通道(hotfix + 补审)。最好带一个「这套流程解决了什么具体问题」的例子。
怎么平衡 Review 质量和速度?
质量靠「CI 拦截 + 清单驱动 + 小 PR」;速度靠「SLA + 自动分配 + 一次性反馈」。两者不矛盾——PR 越小,质量越高、速度越快。
Reviewer 水平不够审不出问题怎么办?
三层缓解:① CI 强化(Lint / 测试覆盖率 / 安全扫描)兜底;② 关键模块要求资深 reviewer(CODEOWNERS);③ 团队内做 review 培训(用真实 PR 做案例复盘)。承认 review 不能 100% 拦截问题,线上监控和快速回滚能力同样重要。
自测三问
为什么说「PR 超过 400 行 reviewer 就会开始敷衍」?
CI 没过就提审,浪费的是谁的时间?
紧急修复直接 push 到 main 的危害是什么?正确做法是什么?
小结一句话 Review 流程的本质是「让正确的行为成为默认行为」——小 PR、CI 前置、SLA 时限、紧急有通道,全部用工具和规则固化,不靠自觉。
延伸