审查清单
用一致清单使每审查覆同面: 正确性、安全、性能、可读性、测试。
为什么
无清单代码审查不一致——一审查者重风格、另一重性能、正确性漏因无人查。清单确保每审查覆同关键区: 代码做所声称的吗(正确性)、处理边缘情况吗(健壮性)、安全吗(无注入、无密)、测试了吗(新逻辑覆盖)、可读吗(下开发者懂吗)。清单非填的刚性表;是易忘区的提醒。最有经验审查者受益最多,因经验创盲点——从未被 SQL 注入咬的资深审查者假设已处理,清单提醒查。共享清单也使团队审查一致,质量不依赖谁可审查。
何时使用
每 pull request、团队共享标准。周期审查清单本身加团队常漏项。
如何做
1. 正确性: 代码做所声称的吗? - 实现匹配 issue/PR 描述吗? - 边缘情况处理了吗(null、空、最大、最小、错误)? - 假设记录且有效吗? - 用具体例追逻辑 2. 安全: 代码安全吗? - 输入验证: 所有外部输入验证和消毒了吗? - 认证/授权: 检查正确且每路径上吗? - 密: 有硬编码键、密码或令牌吗? - 注入: 查询参数化了吗、HTML 转义了吗? - 依赖: 新包查已知漏洞了吗? 3. 性能: 代码高效吗? - 算法: 复杂度合适吗(O(n) vs O(n²))? - 数据库: 有 N+1 查询、缺索引、无界结果吗? - 内存: 大对象持比需久吗? - 并发: 有竞条件、死锁吗? 4. 可读性: 下开发者懂吗? - 命名: 名描述什么非如何吗? - 结构: 函数短、单目的、正确抽象层吗? - 注释: 解释为什么非什么吗? - 一致性: 遵代码库约定吗? 5. 测试: 代码测试了吗? - 覆盖: 新逻辑行测试了吗? - 边缘情况: 边界条件测试了吗? - 失败路径: 错误情况测了非仅快乐路径? - 测试质量: 测试断言对的 事还是仅无错抛?
示例
// 审查清单(贴 PR 模板) /* ## 代码审查清单 ### 正确性 - [ ] 实现匹配 issue/PR 描述 - [ ] 边缘情况处理(null、空、最大、最小、错误) - [ ] 假设记录且有效 - [ ] 用具体例追逻辑 ### 安全 - [ ] 所有外部输入验证和消毒 - [ ] 认证检查正确且每路径 - [ ] 无硬编码密(键、密码、令牌) - [ ] 查询参数化、HTML 转义 - [ ] 新依赖查漏洞 ### 性能 - [ ] 算法复杂度合适 - [ ] 无 N+1 查询、缺索引、无界结果 - [ ] 无大对象持比需久 - [ ] 无竞条件或死锁 ### 可读性 - [ ] 名描述什么非如何 - [ ] 函数短、单目的、正确抽象 - [ ] 注释解释为什么非什么 - [ ] 遵代码库约定 ### 测试 - [ ] 新逻辑行测试 - [ ] 边缘情况测试 - [ ] 错误路径测试(非仅快乐路径) - [ ] 测试断言对的事 */ // 用清单的审查评论例: // "安全: userId 来自 req.query 但未验证。 // 攻击者可传 userId=admin。加: // const userId = z.string().uuid().parse(req.query.userId);" // // "测试: 快乐路径测了但错误情况 // (用户未找到)未测。加 404 路径测试。"
常见问题
- ⚠仅审查 diff 漏上下文——新函数孤立看对但从未查授权路径调,审查者未见调用点。
- ⚠勾每框但不实际追逻辑——清单标完但审查者未跑代码或追边缘情况,空指针异常发。
- ⚠把清单当填的门而非思考工具——审查者 30 秒勾每框,审查无清单外价值。
- ⚠加清单项但永不移过时——清单长到 50 项、无人读、变仪式非有用工具。
最佳实践
- ✓用共享清单作覆区提醒非填表——价值在引思考非勾框。
- ✓读周围代码非仅 diff——新函数孤立可能对但调用上下文错。
- ✓用具体例追逻辑特别边缘情况——这抓读代码抓不到的 bug,因代码看起来对但未处理 null。
- ✓保持清单短(每区 5-10 项)移团队总对的项——50 项清单被忽略;10 项被用。