CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
代码审查入门/课时/Review 流程
RawBlame
课时目录12 节

代码审查入门

  1. 01API 语义审查
  2. 02实现语义
  3. 03文档审查
  4. 04测试审查
  5. 05代码风格
  6. 06Review 流程
  7. 07审查清单
  8. 08安全审查
  9. 09AI 辅助审查
  10. 10反馈技巧
  11. 11团队实践
  12. 12综合练习

Review 流程

PR 大小与节奏。

25 分钟

Review 流程

这一课你将能做到

  1. 把 PR 控制在「可审查」的大小范围内,并说服作者拆 PR
  2. 设计团队的 Review 节奏:谁来审、多久审完、什么情况可以合并
  3. 用 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 + 分支保护

GitHub 分支保护规则(main 分支):

# 设置 → 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 阶段被发现

讲清楚要点

  1. PR 越小越好:400 行是经验上限。超过这个数字,reviewer 的注意力直线下降,漏审率直线上升。
  2. PR 描述是 review 的入口:写清「做了什么、为什么、影响范围、怎么测」,reviewer 5 分钟就能进入状态。
  3. CI 是 review 的前置条件:CI 没过的 PR 不该被审——浪费 reviewer 时间。
  4. SLA 决定 review 文化:没有时限约定,review 一定会拖。一拖,大家就绕开 review 直接 push。
  5. 紧急情况也要有事后机制:允许 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 行 PRReviewer 直接 LGTM拆成 <400 行的小 PR
PR 描述就一行字Reviewer 无从下手用模板写清改动与测试
CI 没过就 @ reviewer浪费 reviewer 时间CI 绿才提审
Reviewer 挤牙膏式反馈来来回回一周一次性给完反馈
紧急修复直接 push main没人知道改了什么Hotfix PR + 事后补审

卡点急救

  1. PR 挂了三天没人审:在群里 @ 具体的人(不是 @所有人),或直接找 tech lead 协调。长期没人审说明 SLA 没执行,要在团队会议上提。

  2. Reviewer 和作者吵起来了:停止在 PR 评论里争论,约个 15 分钟语音。文字容易升级情绪,语音能快速对齐。

  3. 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% 拦截问题,线上监控和快速回滚能力同样重要。

自测三问

  1. 为什么说「PR 超过 400 行 reviewer 就会开始敷衍」?
  2. CI 没过就提审,浪费的是谁的时间?
  3. 紧急修复直接 push 到 main 的危害是什么?正确做法是什么?

小结一句话

Review 流程的本质是「让正确的行为成为默认行为」——小 PR、CI 前置、SLA 时限、紧急有通道,全部用工具和规则固化,不靠自觉。

延伸

  • GitHub CODEOWNERS 文档
  • Google Engineering Practices - Code Review
  • 下一课:审查清单——可复制的 CR checklist。
加载本节练习…
← 上一课代码风格下一课 →审查清单