Code review — 是一个或多个开发人员在将源代码集成到项目主分支之前对其进行审查的过程。在Git以及GitHub、GitLab或Bitbucket等平台的上下文中,代码审查通过pull request实现:作者创建PR,指定审查者,他们检查更改,留下评论和修改请求。根据Google Engineering Practices (2026),代码审查提高了代码质量,在团队中传播知识,并减少了生产中的缺陷数量。好的审查不是控制,而是以发展性对话形式进行的协作。
要点
Code review — 是同事在集成之前对代码进行系统检查。在Git上下文中,这意味着:开发人员创建包含更改的pull request,指定审查者,他们研究diff,留下评论并做出裁决。审查者可以请求更改(Request Changes)、批准PR(Approve)或留下一般评论。
代码审查有五个目标:提高代码质量(在缺陷进入生产之前发现它们)、传播知识(审查者了解新方法,作者获得反馈)、遵守标准(检查是否符合代码风格和架构决策)、降低bus factor(代码不仅仅由一个开发人员知晓)以及建立责任文化(作者知道代码将被检查,因此更仔细地编写)。
代码审查的对立面是blind commit:开发人员将更改推送到公共分支而无需审查。这种方法只允许在单用户项目或紧急hotfix中,并在事后进行审查。在专业团队开发中,代码审查是任何更改的强制阶段,包括文档和配置的修改。
代码审查应该是系统的,而不是混乱的。有经验的审查者按特定顺序检查代码:首先是架构和逻辑,然后是测试,接着是安全性和性能,最后是——风格和命名。这种顺序确保在审查者疲劳之前能发现关键问题。
架构和逻辑:代码是否解决了问题,是否有不必要的抽象,是否遵守了SOLID和DRY原则。第一次阅读难以理解的复杂代码——表明需要重构。审查者必须确保代码准确完成任务中指定的内容,并且在其责任范围之外没有副作用。
测试:新测试是否覆盖了所有场景——正面、负面、边界情况。现有测试在更改后是否通过。是否存在不稳定失败的不稳定测试。安全性:没有SQL注入、XSS、通过日志或API响应泄露敏感数据。性能:算法的效率、冗余数据库查询、资源泄漏。
PR规模限制——代码审查效率最重要的指标。Cisco(2015)的研究以及SmartBear和Google后来的实验表明:当审查量超过400行时,审查者发现缺陷的能力急剧下降。如果PR超过400行,错误被发现的概率不超过随机概率。
最佳规模:一个PR 200-400行。这个量审查者可以在30-60分钟内检查完毕,同时保持专注。Google建议在全神贯注的情况下,一轮审查不超过200行。如果更改更多——任务应分解为多个连续的PR,每个PR引入逻辑完整的更改。
审查时间:创建PR后24小时内。如果审查拖延数天,任务的上下文会丢失,作者在回复评论时需要花费时间恢复上下文。具有高代码审查文化的团队为审查设定SLA:例如,关键更改4小时,普通更改24小时。
| PR规模 | 审查时间 | 效率 |
|---|---|---|
| 200行以下 | 15-30分钟 | 高——高达90%缺陷 |
| 200-400行 | 30-60分钟 | 中等——高达70%缺陷 |
| 400-1000行 | 1-3小时 | 低——低于40%缺陷 |
| 超过1000行 | 3小时以上 | 极低——约10%缺陷 |
评论的语气——对代码审查的效率至关重要。"这是错误的"评论会引发防御性反应,不会给作者提供有用信息。最好的表述是问题-建议:"你觉得这种方法怎么样?","如果user == nil,这里可能会发生NPE。也许添加一个guard?"。问题施加的压力较小,能激发讨论。
一个好的评论结构包括三个部分:什么错了,为什么是问题以及如何修复。例如:"在这个循环中,由于嵌套的contains使用了O(n²),在10k+记录时可能会变慢。尝试用Set替换以实现O(1)搜索"。这样的表述同时指出了问题,解释了其重要性并提供了解决方案——作者无需猜测。
GitHub和GitLab支持suggestions——内置的代码更改建议。审查者可以写:"```suggestion 在处理前过滤空行```"——作者单击即可应用更改。这加速了小修改并减少了审查轮次。对于大修改,最好写一般评论,而不是在suggestion中放置大块内容。
# 好的代码审查评论模板
# 不好: “这段代码是错误的”
# 好: “我们可能会在空响应时丢失数据。
# If response.data == nil, the guard returns nil,
# and user sees empty screen without error.
# Maybe add a fallback error message?"
# GitHub建议语法:
# ```suggestion
# let result = try? parse(response, fallback: .defaultValue)
# ```
有效的审查工作流程基于四个阶段。第一——作者准备PR:写一个清晰的名称(例如"feat: add password reset screen"),添加更改描述、指向跟踪器中任务的链接以及测试说明。第二——作者通过auto-assign(基于CODEOWNERS)或手动指定审查者。
第三阶段——审查者检查代码并留下评论。第四——作者进行修改,回复评论并请求重新审查。循环重复直到获得批准。批准后,作者执行合并(或由机器人执行合并)。通过Mergify或GitHub Auto-merge的自动化加速了最终阶段。
工作流程的重要元素——过时PR管理。如果PR超过3天没有审查,流程会被阻塞。解决方案:审查者轮换(如果指定的审查者不可用),通过Slack/Teams通知,审查时间限制(SLA)。在一些团队中,超过7天没有审查的PR会自动关闭,作者在与main同步后创建新的PR。
第一个错误——肤浅的审查。审查者粗略浏览diff,不深入逻辑,然后点击Approve。原因:大PR、截止日期、疲劳。后果:bug进入生产。解决方案:如果没有时间进行高质量审查——诚实地写"今天无法检查,请推迟到明天",而不是正式批准。
第二个错误——过度批评(nitpicking)。审查者留下数十条关于格式风格、变量命名、琐碎细节的评论。这会打击作者的积极性并延长审查。解决方案:StyleGuide和linter应自动检查风格。人在审查中检查逻辑、架构和安全性。
第三个错误——没有问题的审查。如果审查者只给出Request Changes和Approve,但不提问,就失去了学习新东西的机会。代码审查健康的最佳指标是存在双方都能学到新东西的讨论。如果审查是其中一方的独白——那么流程已经出了问题。
常见问题
代码审查——对pull request进行代码审查:检查更改是否符合质量标准,发现潜在错误,评估架构并留下建设性评论。成功审查后,审查者批准PR(Approve),允许合并到目标分支。
200-400行——一个PR的最佳量。Cisco(2015)和Google的研究表明,量更大时缺陷检测效率急剧下降。如果更改更多——任务应分解为多个逻辑完整的PR,每个不超过400行。
按优先顺序:架构(是否选择了正确的解决方案)、逻辑(正确性、错误处理、边界情况)、测试(新场景的覆盖)、安全性(注入、数据泄露)和性能。风格和格式交给linter。
建设性和尊重。用"你觉得这种方法怎么样?"代替"这是错的"。用问题代替陈述。解释为什么某个解决方案有问题,而不仅仅是指出它。代码审查是同事之间的对话,而不是考试。
建议时间——24小时内。对于关键更改——最多4小时。如果审查者长时间未回复——联系团队负责人重新分配。长时间等待审查会减慢开发速度,迫使作者切换到其他任务,从而丢失上下文。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。