{"name":"代码审查","id":"软件工程-软件设计-代码质量-代码审查","content":"# 代码审查\n\n代码审查（Code Review，又称代码复查）是通过**阅读和评估源代码**的方式，确保代码在设计、实现、性能、安全和可维护性等方面满足团队标准与业务需求。\n\n> 代码审查的目标是\"**帮助别人变得更好**\"，而不是\"替别人写代码\"。\n\n## 为何要进行代码审查\n\n代码审查的目的不仅是发现缺陷，更是**持续提升团队整体工程质量和能力**的过程：\n\n* **提升质量：** 早期发现设计或实现问题，减少生产缺陷。\n* **促进学习：** 审查过程即知识共享过程，促进团队成员成长。\n* **规范一致性：** 推动统一的编码风格和最佳实践。\n* **增强可维护性：** 审查确保代码清晰、结构合理、易于理解和修改。\n* **提升团队信任与协作：** 审查促进沟通，减少技术孤岛。\n* **数据驱动改进：** 通过量化指标（如审查时长、缺陷发现率）反向优化研发流程。\n\n## 角色\n\n| 角色                  | 职责                     |\n| ------------------- | ---------------------- |\n| **作者（Author）**      | 提交改动的人，应在提交前自检并准备好说明。  |\n| **审查者（Reviewer）**   | 负责从设计、规范、性能、安全等维度提出反馈。 |\n| **维护者（Maintainer）** | 对核心模块或仓库质量负责，有最终合并权。   |\n| **新成员（Observer）**   | 可旁听或参与小型审查，学习代码质量标准。   |\n\n## 审查什么\n\n代码审查的关注点包括但不限于以下方面：\n\n1. **设计合理性**：是否符合系统架构与设计约束。\n2. **可读性与可维护性**：命名、结构、注释是否清晰。\n3. **功能正确性**：是否满足需求，无逻辑或边界错误。\n4. **测试质量**：是否覆盖主要场景，测试是否健壮。\n5. **性能影响**：是否引入明显性能回退。\n6. **安全性**：是否存在潜在安全漏洞。\n7. **兼容性**：是否考虑上下游系统的接口影响。\n\n## 审查文化\n\n> 代码质量是集体责任，而非个人担当。\n\n这一原则根植于两个认知基础：\n- 软件缺陷的成本随发现阶段指数增长（后期修复成本是早期的 10-100 倍）\n- 知识垄断是系统稳定性的最大威胁（单人负责模块 = 高风险单点）\n\n### 核心三角\n\n代码审查文化的稳定结构由三个顶点构成：\n\n| 顶点 | 内涵 | 失衡后果 |\n|-----|------|---------|\n| **心理安全** | 参与者不会因提出问题或暴露缺陷而受到惩罚 | 审查沦为形式、问题被掩盖 |\n| **建设性反馈** | 意见具体、可操作、指向改进而非评判 | 演变为情绪对抗或表面敷衍 |\n| **集体责任** | 代码属于团队，而非个人所有 | 审查者推诿、作者防御 |\n\n## 审查策略\n\n审查策略的核心是**基于风险的差异化投入**。审查深度应与变更影响范围和历史故障暴露程度正相关。\n\n### 变更分级\n\n根据变更对系统的影响范围和深度，将审查投入分为三个层级：\n\n| 级别 | 影响特征 | 审查投入 |\n|-----|---------|---------|\n| **高风险** | 核心逻辑、数据库结构、跨模块接口变更 | 深度审查 |\n| **中风险** | 新功能开发、业务逻辑调整 | 标准审查 |\n| **低风险** | 文档更新、UI 样式调整、注释优化 | 快速审查 |\n\n### 内容分级\n\n审查关注点应按三个层级递进展开：\n\n| 层级 | 审查焦点 | 回答的核心问题 |\n|-----|---------|-------------|\n| **设计级** | 架构约束、模块边界、依赖关系 | 这样的设计是否符合系统演化方向 |\n| **实现级** | 代码逻辑、命名规范、错误处理 | 代码是否清晰表达了设计意图 |\n| **部署级** | 配置变更、环境差异、脚本影响 | 变更是否引入环境一致性风险 |\n\n### 上下文敏感区\n\n以下上下文应触发审查策略的强化调整：\n\n- **历史故障区**：曾导致线上事故的模块，强制增加交叉审查\n- **业务高压线**：资金流、计费逻辑、权限校验等核心路径，强制二次审查\n- **新手盲区**：新成员首次提交的代码类型，应有资深成员伴读\n\n## 审查标准\n\n* **以质量为首要目标。**\n* **务实优先于完美。**\n  若存在更优但非关键性方案，不应阻塞交付。\n* **积极反馈，鼓励改进。**\n  提出问题时应附带改进建议。\n* **记录结论。**\n  对争议和重大决策应记录，便于后续回溯。\n\n## 审查原则\n\n* **遵循规范，不主观臆断。** 客观标准避免无谓争论，审美偏好不等于质量高低。\n* **尊重作者设计，不带情绪化批评。** 防御心理会关闭协作通道，反馈需对事不对人。\n* **注重沟通，而非对抗。** 审查是知识传递机会，不是胜负博弈。\n* **小步快跑，频繁审查。** 增量越小问题越少，认知负荷决定审查质量上限。\n* **关注问题根因，而非表象。** 修复表象是临时修复，追溯根因才能系统性改进。\n\n## 审查形式\n\n### 同步评审\n\n开发者现场讲解代码思路与变更内容，审查者同步提问、讨论。\n适用于核心模块、复杂逻辑、跨模块变更。\n\n**特点：**\n\n* 实时沟通效率高\n* 能快速达成共识\n* 但耗费精力较大，不宜频繁使用\n\n### 异步评审\n\n开发者通过工具（如 GitLab MR、Gerrit、GitHub PR）提交代码，由审查者异步评审。\n\n**特点：**\n\n* 异步沟通灵活\n* 适合常规开发流程\n* 对团队自律和代码表达要求较高\n\n> 原则：**小而多。**\n> 每次提交的变更量应尽量小，以提高审查效率。\n\n## 代码飞检\n\n代码飞检是由质量负责人或架构师对**随机模块或高风险变更**进行的独立审查，目标是发现系统性问题、违规实践或潜在技术债。\n\n### 与常规审查的区别\n\n| 维度 | 常规审查（PR/MR） | 代码飞检 |\n|-----|------------------|---------|\n| **触发方式** | 变更驱动（提交代码 → 自动触发） | 时间驱动（按周/版本节点定期执行） |\n| **审查范围** | 本次变更（增量） | 随机模块或指定模块（存量） |\n| **审查者** | 代码相关开发者 | 质量负责人/架构师（独立于作者） |\n| **关注重点** | 变更的正确性、一致性 | 系统性问题、违规模式、技术债 |\n| **发现问题类型** | 本次引入的缺陷 | 历史积累的架构/规范问题 |\n\n**核心差异**：常规审查是\"防守性\"的（阻止问题进入），飞检是\"进攻性\"的（主动挖掘已存在的系统性问题）。\n\n### 节奏与沉淀\n\n* 可按周或按版本节点评估\n* 飞检结果应沉淀为改进清单与团队培训材料\n\n## 万物评审\n\n代码审查只是质量体系中的一个环节。\n真正的工程文化应做到“**万物可评审**”，包括：\n\n* 需求评审\n* 设计/架构评审\n* 测试计划评审\n* 运维/发布计划评审\n* 事故复盘评审\n\n> 通过**多人参与、视角多样**的方式，提升决策的完整性与前瞻性。\n\n### 评审流程五问\n\n1. **为什么要做？**（目标与价值）\n2. **怎么做？**（设计与实现）\n3. **哪里做？**（影响范围）\n4. **何时做？**（时机与节奏）\n5. **谁来做？**（责任与角色）\n\n### 成本与收益分析\n\n* 明确目标产出\n* 控制审查成本\n* 量化改进效果（如缺陷率下降、交付周期缩短）\n\n### 评审形式\n\n* **会议评审：** 集中讨论重大方案\n* **桌面评审：** 小范围快速确认实现细节\n\n### 参与人员\n\n| 角色     | 职责           |\n| ------ | ------------ |\n| 发起者    | 发起评审，提供材料与背景 |\n| 主持人    | 控制节奏，保持讨论聚焦  |\n| 作者     | 讲解内容，接受反馈    |\n| 评审员    | 提出意见与建议      |\n| 记录员    | 记录结论与改进项     |\n| 团队关键成员 | 负责最终决策或签核    |\n\n## 度量与改进\n\n建立代码审查指标体系，用数据反哺流程优化：\n\n| 指标    | 含义           |\n| ----- | ------------ |\n| 审查覆盖率 | 被审查提交占比      |\n| 审查时长  | 平均从提交到通过时间   |\n| 缺陷发现率 | 每次审查发现的有效问题数 |\n| 审查参与度 | 团队成员参与情况     |\n| 审查满意度 | 审查过程反馈       |\n\n## 关联内容（自动生成）\n\n- [/软件工程/软件设计/代码质量/编码规范.md](/软件工程/软件设计/代码质量/编码规范.md) 编码规范是代码审查的重要依据，审查过程中需要检查代码是否符合团队的编码规范\n- [/软件工程/软件设计/代码质量/整洁代码.md](/软件工程/软件设计/代码质量/整洁代码.md) 整洁代码是代码审查的核心目标之一，审查过程关注代码的可读性、可维护性等整洁代码原则\n- [/软件工程/软件设计/代码质量/防御式编程.md](/软件工程/软件设计/代码质量/防御式编程.md) 防御式编程是代码审查中需要重点关注的实践，确保代码具备良好的错误处理和防护机制\n- [/软件工程/软件设计/代码质量/软件测试/软件测试.md](/软件工程/软件设计/代码质量/软件测试/软件测试.md) 代码审查与软件测试相辅相成，审查关注代码实现质量，测试验证功能正确性\n- [/软件工程/软件设计/代码质量/代码重构.md](/软件工程/软件设计/代码质量/代码重构.md) 代码审查常常会发现需要重构的代码，审查过程也是识别重构机会的重要途径\n- [/软件工程/DevOps.md](/软件工程/DevOps.md) 代码审查是DevOps流程中的重要环节，确保代码质量并促进团队协作\n- [/软件工程/架构治理.md](/软件工程/架构/架构治理.md) 代码审查是架构治理的重要手段，确保代码实现符合架构规范和设计原则\n- [/软件工程/设计模式/设计模式.md](/软件工程/设计模式/设计模式.md) 代码审查过程中会关注设计模式的应用是否恰当，以提升代码的可维护性和扩展性\n- [/软件工程/理论/敏捷软件开发.md](/软件工程/理论/敏捷软件开发.md) 代码审查是敏捷开发实践的重要组成部分，促进团队协作和持续改进\n- [/软件工程/软件设计/软件设计.md](/软件工程/软件设计/软件设计.md) 代码审查需要评估代码实现是否符合软件设计原则和架构要求\n","metadata":"tags: ['软件工程', '个人成长']","hasMoreCommit":true,"totalCommits":12,"commitList":[{"date":"2026-03-25T21:41:17+08:00","author":"MY","message":"docs(software-engineering): 重构代码审查文档结构并完善审查策略","hash":"23e11d867248e10a996a0506ca4d0597b7dd389e"},{"date":"2026-02-12T14:07:03+08:00","author":"MY","message":"doc: 整理标签","hash":"290b3e8ad18f48832ac282290238d020fc030a88"},{"date":"2026-01-21T10:48:40+08:00","author":"MY","message":"docs(software-engineering): 更新代码审查文档添加标签和关联内容","hash":"33b1adb8c6b5026bcd0646588875b85c09d18de0"},{"date":"2025-10-17T15:09:34+08:00","author":"MY","message":"docs(code review): 更新代码审查文档内容与结构","hash":"adf22317771153040a427d5684e50a401ca8fa71"},{"date":"2022-08-09T21:04:09+08:00","author":"MY","message":"✏️代码审查","hash":"0e12e200752dbc0d904947e6fee7964ce45b215e"},{"date":"2022-01-06T21:52:20+08:00","author":"MY","message":"✏️更新 评审","hash":"70de8b3b1456cccd49f4e4931d86b7b1d478af49"},{"date":"2022-01-05T23:41:27+08:00","author":"MY","message":"✏️更新 编码规范 & 代码审查","hash":"59e5ccc62a0ce584fa5db06b98069dad4025d978"},{"date":"2022-01-03T14:20:34+08:00","author":"MY","message":"✏️更新 代码审查","hash":"58380da8efe1ba758677aa1ade67bd4cce43530c"},{"date":"2021-08-20T17:34:07+08:00","author":"cjiping","message":"✏更新 代码审查","hash":"23b340ce44bb15df366cbee5c574afd560f41725"},{"date":"2021-08-18T17:43:55+08:00","author":"cjiping","message":"📦整理 代码质量","hash":"72ef903971f583db2157da6eecbd0dee910787c9"}],"createTime":"2020-02-21T14:03:23+08:00"}