PR 大小
保持 pull request 小且聚焦使能分钟彻底审查非小时略读。
为什么
1000 行 PR 不能审查——审查者略读、点批准、bug 发。Google 和 Microsoft 研究显审查有效性 400 行以上锐降: 审查者找缺陷能力降、疲劳增、审查变橡皮图章。小 PR 相反 15 分钟彻底审、审查者有上下文找真 bug、反馈具体可行动。小 PR 也更快失败——100 行 PR 坏构建 10 分钟修,1000 行 PR 坏构建花 2 小时调试因坏可在任何地方。小 PR 纪律也强作者想增量变更,产更好 设计代码。规则简单: 若 PR 太大不能彻底审查则太大不能合并。
何时使用
每 pull request——若 PR 超 400 行,请求审查前拆。
如何做
1. 每 PR 目标 < 400 行 - 200 行理想——15 分钟审查 - 400 行上限——30 分钟审查 - 1000+ 行不能彻底审查——拆 2. 每变更一 PR - 一功能、一 bug 修、一重构——非混合 - 做三事的 PR 是三 PR - 若变更无关应分开 PR 3. 大变更拆为 PR 栈 - PR 1: 加数据模型和迁移 - PR 2: 加服务层(依赖 PR 1) - PR 3: 加 API 端点(依赖 PR 2) - PR 4: 加 UI(依赖 PR 3) - 每 PR 小且独立可审查 4. 未完成功能用功能标志 - 标志后合并基础设施,后 PR 启用 - 这使合小 PR 不暴露功能 5. 使 PR 易审查 - 写清晰描述: 什么、为什么、如何、测试 - UI 变更加截图 - 链 issue 或设计文档 - 请求审查前自审 diff
示例
// 坏: 1500 行 PR 做一切 // feat: 加用户注册 // - 数据库迁移(200 行) // - 用户模型(150 行) // - 邮件服务(300 行) // - 注册 API(200 行) // - 欢迎邮件模板(150 行) // - 注册表单 UI(300 行) // - 表单验证(200 行) // 总: 1500 行——不能彻底审查 // 好: 拆为小 PR 栈 // PR 1: feat: 加用户模型和迁移(150 行) // - db/migrations/001_add_users.sql // - src/models/user.ts // - tests/models/user.test.ts // PR 2: feat: 加邮件服务(200 行)[依赖 PR 1] // - src/services/email.ts // - src/templates/welcome.ts // - tests/services/email.test.ts // PR 3: feat: 加注册 API(200 行)[依赖 PR 2] // - src/api/register.ts // - src/api/register.test.ts // - 验证输入、创用户、发邮件 // PR 4: feat: 加注册表单(250 行)[依赖 PR 3] // - src/components/RegisterForm.tsx // - src/components/RegisterForm.test.tsx // - src/pages/register.tsx // PR 描述模板: """ ## 什么 加带邮箱验证的用户注册。 ## 为什么 用户不能创账户——这是最高用户请求。 ## 如何 1. 加用户模型和迁移(PR 1) 2. 加欢迎邮件的邮件服务(PR 2) 3. 加注册 API 端点(PR 3) 4. 加注册表单 UI(PR 4) ## 测试 - 模型、服务、API 和表单单元测试 - 全流集成测试 - 手动测: 注册 → 收邮件 → 验证 ## 清单 - [x] 加测试 - [x] 无破坏变更 - [x] 自审 diff """
常见问题
- ⚠因"功能是一事"开 1000 行 PR——审查者略读、批准、邮件服务 bug 发因无人读那部分。
- ⚠同 PR 混 bug 修和重构——审查者分不清哪些是修哪些是重构,若重构致回归修被怪。
- ⚠拆 PR 但每 PR 依赖前未合并 PR——审查者不合并所有 PR 不能跑代码、审查阻。
- ⚠写一行 PR 描述("修 bug")——审查者无上下文、须读 diff 懂变更、审查花两倍长。
最佳实践
- ✓每 PR 目标 < 400 行(200 理想)——研究显审查有效性 400 行以上锐降,小 PR 15 分钟彻底审。
- ✓每变更一 PR——做 bug 修、重构和功能的 PR 是三 PR,混使审查更难坏时更难分怪。
- ✓写清晰 PR 描述(什么、为什么、如何、测试)——审查者需上下文有效审查,好描述半审查时间。
- ✓请求审查前自审 diff——你会抓错字、调试日志和明显问题,审查者时间花你漏的微妙问题。