想象你是一位图书编辑。作者把一部二十万字的书稿交到你手里,你不会直接送去印刷厂——你会先通读,把病句、事实错误、逻辑跳跃的地方一一标注,写退修意见,等作者改完再复读一遍,直到可以放心付印。软件开发里的代码审查(Code Review),就是这套“编辑流程”的数字版本:每个开发者像作者一样提交自己的代码,团队里的其他人像编辑一样逐行阅读、标注疑问、提出修改建议,达成一致后才允许代码合入主分支。 只不过,这里的“书稿”是几千行代码,“出版”是每一次上线发布。审查者要检查的不只是语法错误——那早已被编译器和自动化测试拦截——而是逻辑是否正确、边界是否处理、命名是否清晰、安全隐患是否埋藏,以及这段代码是否与团队既有风格一致。这篇文章会带你走完一整套代码审查的最佳实践:从检查清单到 Gerrit 与 GitHub PR 两种主流工具,从如何写出让人舒服的反馈意见,到如何在审查效率与质量之间找到平衡,最后落地为团队的日常规范。
掌握代码审查,是从“能写代码”走向“能保证代码质量”的必修课。技术负责人靠它建立规范,开发者靠它少写 bug 并快速成长,DevOps 工程师靠它守住发布门禁。
可视化演示
动态演示代码审查最佳实践与流程的核心机制,通过入门/进阶/实战/优化四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
代码审查最佳实践与流程:代码审查 代码审查的价值与核心目标 代码审查检查清单与关注点 核心机制可视化 代码审查最佳实践与流程整体架构与关键组件
审查核心价值
出版社绝不把作者的原稿直接送印。作者再厉害,也会在二十万字的长篇里留下错别字、前后矛盾的人名,或者一个经不起推敲的情节转折。编辑的工作,就是在付印之前把这些瑕疵拦下来。软件开发也一样:再资深的程序员也会在自己的代码里留下盲区,而单测和编译器只能证明“程序没按预期崩溃”,证明不了“这个设计思路本身是对的”。代码审查(Code Review),就是给每段代码配一个同行编辑。
有人问:代码写完能跑不就行了吗?为什么非要别人再看一遍?因为审查的价值不只是抓 bug。它更像出版社的“三审三校”,带来四重收益。第一重是质量保障:审查者的新鲜视角能发现作者“想当然”的假设,比如空指针、并发竞态、错误的数据容错。第二重是缺陷前置:线上事故要紧急发版、回滚、写复盘,而审查现场改掉只需要几分钟。第三重是知识共享:新人看老手的代码学到写法,老手也通过别人的代码了解新业务的链路。第四重是规范统一:当每个人都知道自己的代码会被同行阅读,大家会不自觉地使用团队约定的命名与结构。
一个成熟的编辑部里,编辑最大的成就感不是自己写书,而是经手的每一本书都能放心付印。同理,审查让团队的代码库像一本经过精心编辑的出版物:风格统一、逻辑通顺、经得起读者(用户)检验。
- 后期修复成本符号$C_{\text{后期修复}}$ 表示缺陷等到代码上线、被真实用户触发后才开始修复的全部成本,包含故障抢修、紧急发版和回滚。
- 成本倍数系数6 来自软件工程领域的经验观测,代表缺陷在交付后被发现的修复成本大约是审查阶段发现的数倍。
- 审查时修复成本符号$C_{\text{审查时修复}}$ 表示审查现场发现并立刻修改的成本,此时上下文都在作者脑中,往往只改几行。
- 等式整体含义整条公式说明“缺陷发现越晚,修复代价越大”,这是把质量把关前置到审查环节的量化理由。
审查流程步骤
出版社有标准的发稿流程:登记投稿、初审、外审、退修、终审、付印。每一步都有一个“闸门”,不合格就被打回。代码审查也照着这套闸门设计,只不过速度要快得多——一次典型审查通常在几小时到几天内完成,而不是像出书那样以月为单位。
第一步是提交准备。作者交稿前至少通读一遍自己的稿子,对应到开发,就是提交前自查:本地跑通测试、确认没有调试代码、保持提交足够小。第二步是分配评审人。小团队靠约定——后端代码找资深后端;大项目用工具自动分配,仓库维护者通过 CODEOWNERS 文件把相关模块的负责人设为默认审稿人。
第三步是讨论修改,这是核心环节。评审人在改动代码上做行级评论,作者逐条回应,修改后的新版本以补丁集(patchset)形式更新,评审人再看一遍,这叫一轮迭代。第四步是合入收尾:所有评论被解决、至少两个批准标记(Approval)之后,自动化工具把多次提交压缩合并(squash),重新跑一遍完整测试,然后合入主干、准备发布。
出版社的“三审三校”看起来繁琐,却保证了每一本付印的书都经过多次把关。一套清晰的门禁流程,能让“代码合入”这件事从“赌运气”变成“有保障”。
- 合入标志符号$A$ 表示“可以合入”的最终结论,对应出版社终审签发的付印单。
- 评论解决数量符号$R_{\text{resolved}}$ 表示已经被作者解决或明确回复的评论数;$R_{\text{total}}$ 表示这次评审总共产生的行级评论数。
- 等号含义等号要求两者完全相等,意味着不允许有悬而未决的争议评论,每一条都必须有交代。
- 批准标记符号$P$ 表示评审人点出的批准(Approval)标记,$P \geq 2$ 要求至少两人同意,避免单一评审人的盲区。
- 合取符号$\land$ 表示“并且”,两个条件同时满足才放行,就像出版社要求责任编辑和复审编辑都必须签字。
检查清单要点
出版社校对员手里有一本《编校质量差错认定细则》,从标点、用字、引文到数据逐项核对。审查者心里也得有一份清单,否则“看过一遍”很容易变成“走马观花”——读到后半段,前面的细节已经忘了。
清单第一项是逻辑正确性与边界条件。if 的条件是否覆盖空值?循环是否会越界?并发下会不会出问题?作者写“正常情况”最顺手,恰恰是异常情况最藏 bug。第二项是命名与可读性。变量名是否表意明确?函数是否短小单一?注释是否解释“为什么”而不是复述“是什么”?
第三项是安全性:输入是否校验、敏感信息有没有写进日志、权限检查是否缺失。第四项是测试覆盖:新增功能有没有配套单测?改动有没有破坏既有用例?CI 上的测试结果是否全绿?这四类问题很难同时装在一个人的脑子里,但写下来、做成规范,每个人照着走一遍,就能挡住绝大部分低级错误。
就像校对员按细则逐字核对,审查者按清单逐项过。清单的价值是把“我以为看过了”变成“我逐项核对过”,让质量把关不依赖某一个人的状态好坏。
- 审查发现问题数$N_{\text{defects}}$ 表示一次审查中通过检查清单发现并确认的缺陷数量,包括逻辑错误、安全隐患等。
- 被审查代码行数$L_{\text{reviewed}}$ 表示这次审查实际阅读的代码行数,排除了空行和注释。
- 标准化倍数$\times 1000$ 把结果换算成“每千行缺陷数”,让不同规模的 PR 可以公平比较。
- 结果含义$D$ 值越高说明该模块越需要重点关注,也是团队复盘时调整检查清单的依据。
审查工具对比
十年前,审稿靠邮件把 Word 附件传来传去,批注淹没在几十封邮件里。后来出版社用上了在线审稿系统,意见就地标注、版本一目了然。软件开发也完成了这次升级:Gerrit 与 GitHub PR 就是两套主流的“在线审稿系统”。
Gerrit 像是严谨的中央编辑部:所有变更必须推送到统一的 refs/for/master 分支,以补丁集为单位迭代;每一版修改都留下完整历史,审查人对照新旧版本的差异逐条确认。它的合入门槛是强制的,适合对流程严谨度要求高的团队,例如 Android 开源项目。
GitHub PR 更像开放的圆桌讨论:开发者 fork 仓库、提交 PR,审查者和作者在统一的对话流里讨论,支持行级评论、代码建议(suggest changes)和丰富的机器人生态。它更轻量、社区化,被绝大多数开源项目采用。两者的共同基础是行级评论与 CI 集成——机器先跑一遍格式、静态检查和单测,把“会不会编译”这类琐碎问题挡在人工阅读之前。
工具没有绝对好坏,就像出版社不会因为用了在线系统就自动变成好书出版社。工具决定的是“意见如何被记录、版本如何被追溯”,而最终质量仍取决于使用它的人。
- 机器发现数$N_{\text{tool}} + N_{\text{ci}}$ 表示静态分析工具和 CI 流水线自动拦截的问题数,比如格式错误、明显的空指针风险。
- 问题总数$N_{\text{total}}$ 表示一次变更中所有被发现的问题,既包括机器拦截的,也包括人工审查发现的。
- 收益比率$\eta$ 表示自动化在整个质量把关中的贡献占比,数值高说明团队把人力从重复劳动中解放了出来。
- 分工含义剩下的 $1 - \eta$ 才是人工审查的战场——设计合理性、业务逻辑、扩展性,这些恰恰是机器最不擅长的。
反馈沟通技巧
编辑给作者写退修信,最考验功力。写“你这章写得一塌糊涂”,作者只会防御,下次不再配合;写“这一段的因果关系我读了三遍没捋顺,能否补一句背景交代?”,作者会感激地改。代码审查的评论也是如此——语气不对,再正确的意见也进不了代码。
好的反馈有固定套路:观察 + 影响 + 建议。先描述你看到了什么——“这里是 null 检查缺失”;再说明它会带来什么后果——“用户传空值时这里会抛异常”;最后给出可操作的建议——“参照工具类的写法,提前返回空对象”。
多用提问代替武断:“这里为什么不用缓存?”比“你必须用缓存”更开放,给作者保留解释空间,也让审查者有机会修正自己的误判。同时要避免人身攻击——评价代码,不要评价人。最后别忘了及时肯定:看到巧妙的设计、完备的测试,直接说“这块处理得漂亮”,好的反馈体系里不只有批评。
退修信写得好,作者改得心甘情愿;审查意见说得好,开发者愿意下次主动来找你 review。反馈是礼物,不是判词;礼物讲究包装,判词才无所谓语气。
- 观察组分$O_{\text{observation}}$ 表示你看到的事实,要求具体到某一行代码、某一个场景,而不是笼统地说“这段写得不好”。
- 影响组分$I_{\text{impact}}$ 表示这个代码在什么情况下会造成什么后果,让作者理解问题的严重性。
- 建议组分$S_{\text{suggestion}}$ 表示你期望的修改方向或替代方案,让作者知道下一步怎么做。
- 加法含义加号说明三者缺一不可——缺观察是空谈,缺影响是挑刺,缺建议是只破不立。
效率质量平衡
出版社有上市档期,审稿拖三个月书就过时了;但砍掉三审三校直接付印,书砸了招牌损失更大。代码审查同样面临这对矛盾:审得太松,bug 上线;审得太慢,迭代阻塞。老练的编辑会按“篇幅控制 + 时间预算 + 分层审查”来破题,开发者也可以照搬。
第一个解法是小批提交。一次提交保持在 200-400 行左右:改动小,审查者能完整读完,发现问题的密度最高;改动一旦超过几百行,审查者看到后面就忘了前面,效果急剧下降。第二个解法是给审查设时间预算,经验值是每 100 行代码花 20-30 分钟,超过 45 分钟注意力就开始下降。
发现 PR 太大,要么拆分成多个小 PR,要么召集多人分工审查,而不是逼一个人在深夜草草点“批准”。第三个解法是用自动化过滤琐碎问题——格式、命名、静态安全检查全部交机器,让人的精力留给逻辑与设计。最后按优先级处理问题:阻断性的必须改,建议性的可以记录成后续优化。
出版界的口诀是“慢而不拖,紧而不乱”:节奏要稳,但流程不能形同虚设。审查也是一样,找到那个“审查收益”的甜点区间,既不让流程空转,也不让质量失控。
- 拦截缺陷量$F_{\text{caught}}$ 表示一次审查实际能拦截的问题数量,是衡量审查产出的核心指标。
- 提交规模$L$ 表示一次 PR 改动的代码行数,这是影响审查效果的最主要因素。
- 常数与阈值$k$ 是比例常数,300 是经验阈值,代表审查者注意力能高效覆盖的大致行数上限。
- 分母含义当 $L$ 远小于 300 时,收益近似随行数线性增长;当 $L$ 超过 300,分母变大、增长放缓,说明在“一鼓作气”读完的范围内审查才高效。
团队落地实践
一家出版社的编校制度写得再漂亮,如果编辑互相打掩护、从不提意见,制度就是一张废纸。代码审查最终要落地为团队的文化与习惯,而不是一纸规定。落地的过程可以分成四步:定规范、养文化、固习惯、看数据。
先定规范:把前面讲的检查清单固化成文档,明确“什么情况必须合入门禁、谁来批准、评论多久必须回复、PR 超过多少行需要拆分”。文字化的规则让新人一进来就知道预期,也让审查者敢于提意见——因为标准是大家共同签字的,不是某个人在挑刺。
再养文化:新人入职的第一次提交,安排资深工程师结对审查,让新人亲身体会“被提意见不是被批评”;管理者也要带头提交公开可审的代码,不能只审别人。然后固化习惯:每天留出固定时间处理审查请求,避免评论堆积三五天。最后用数据持续改进:统计每次审查的耗时、拦截的缺陷数、一轮通过率,定期复盘,调整清单和阈值。
作者供稿、编辑审稿、反复打磨,最终成就一本好书;开发者提交、同行审查、持续改进,最终成就一个健康优雅的代码库。把审查变成习惯,团队才真正把“质量”从口号变成了日常。
- 审查覆盖率$C_{\text{coverage}}$ 表示被同行审查过的代码占全部合入代码的比例,是团队审查执行力的核心度量。
- 被审查行数$L_{\text{reviewed}}$ 表示得到至少一个正式评审人确认的代码行数,一般以 PR 被批准时的改动量为准。
- 合入总行数$L_{\text{merged}}$ 表示统计周期内所有合入主干的代码行数,包括紧急修复和直接提交。
- 目标阈值$\geq 0.8$ 意味着至少八成的改动经过同行把关。剩余的两成通常留给紧急热修,但事后必须补审。
AI 应用场景
开源社区的自动门禁
阶段:审查流程自动化 / CI/CD 门禁
解决的问题:大型开源项目每天收到大量 PR,维护者无法逐个人工初审,还容易出现“未审就合入”的漏网之鱼,传统人工盯守模式难以规模化。
具体案例:Kubernetes 仓库通过 CODEOWNERS 自动指定模块负责人为评审人,CI 机器人(如 Prow)自动跑测试并打标签,未达到两个批准标记的 PR 会被机器人锁住无法合入,人工精力只留给真正的设计讨论,把“流程步骤”和“效率平衡”落地成了系统行为。
新人的知识加速器
阶段:团队协作 / 知识管理
解决的问题:新人熟悉业务和代码规范周期长,容易重复踩坑;靠口口相传的经验既零散又不可追溯。传统“师傅带徒弟”在远程办公时代效率急剧下降。
具体案例:某团队要求新员工把自己第一个 PR 的全部审查评论整理成“个人避坑清单”,并在组会上分享;三个月后新人开始给别人的代码做审查,之前踩过的坑全部转化为审查输入,团队的审查文化(反馈沟通技巧 + 检查清单要点)因此形成了正循环。
审查覆盖率的发布门禁
阶段:发布质量管控
解决的问题:紧急修复绕过审查直接上线,导致线上事故反复发生;质量靠个人自觉,无法量化,更无法问责。传统做法只能靠事后批评,治标不治本。
具体案例:一个中等规模的电商团队把“审查覆盖率 ≥ 80%”做成 Dashboard 接入发布流水线,未达标的版本不允许灰度。数据周报驱动团队从“个人自觉”走向“系统强制”,三个月后线上事故率下降约 40%,验证了公式 $C_{\text{coverage}} \geq 0.8$ 在真实业务中的价值。
Python 演示
# -*- coding: utf-8 -*-"""mini_review_bot.py - 基于规则的极简 Code Review 助手输入一段 unified diff 文本, 输出类似人工审查的检查清单意见"""import re def review_diff(diff_text): issues = [] added = 0 removed = 0 files = [] current_file = "unknown" for line in diff_text.splitlines(): if line.startswith("+++"): current_file = line[6:].strip() or "unknown" files.append(current_file) elif line.startswith("+") and not line.startswith("+++"): added += 1 body = line[1:] if re.search(r"TODO|FIXME", body): issues.append((current_file, "medium", "遗留 TODO/FIXME, 需要说明或清理")) if "print(" in body and "logger" not in body: issues.append((current_file, "low", "疑似调试用 print, 建议移除")) elif line.startswith("-") and not line.startswith("---"): removed += 1 if added > 300: issues.append((current_file, "high", "新增超过 300 行, 建议拆分为多个小 PR")) if len(files) > 5: issues.append((", ".join(files[:3]), "high", "涉及文件过多, 请确认是否超出审查范围")) return {"files": files, "added": added, "removed": removed, "issue_count": len(issues), "issues": issues} def main(): sample_diff = """diff --git a/auth.py b/auth.py--- a/auth.py+++ b/auth.py@@ -20,6 +20,9 @@ def login(user, pwd):+ # TODO: add rate limit+ print("user login:", user)+ token = create_token(user)+ if not check_perm(user):+ return None+ return token""" result = review_diff(sample_diff) print("审查文件:", result["files"]) print("新增行:", result["added"], " 删除行:", result["removed"]) print("发现问题:", result["issue_count"]) for fname, level, msg in result["issues"]: print("[%s] %s: %s" % (level, fname, msg)) if __name__ == "__main__": main()
if line.startswith("+++"):识别 diff 里的文件头,更新“当前正在审哪个文件”,对应流程中的上下文切换。elif line.startswith("+") and not line.startswith("+++"):只统计真正新增的代码行,同时跳过文件头,避免误报。if re.search(r"TODO|FIXME", body):用正则扫出遗留标记,对应检查清单里的“可维护性”一项。if "print(" in body and "logger" not in body:找出疑似调试代码,这正是人工审查中最常见的琐碎项,交给机器最划算。if added > 300:对应“小批提交原则”,新增超过 300 行直接给高优先级提示,建议拆 PR。if len(files) > 5:对应“改动范围收窄”,涉及文件过多说明这个 PR 职责可能不单一。return {"files": files, "added": added, ...}把审查结论汇总成结构化结果,方便接入 CI 流水线或机器人做门禁。
常见误区
误区我写的代码被同事指出问题,说明我能力不行、很丢脸,所以提交前要尽量隐藏自己的薄弱部分,免得被批评。
正解审查是对事不对人的集体质量把关,就像编辑给作者退修意见,目标是把书改好,而不是评判作者水平。被提意见只说明“还有改进空间”,连资深工程师的代码也会被提意见。真正丢人的是不让任何人看代码,把低级错误带进线上。
为何常见:人们容易把“对代码的评价”等同于“对人的评价”,加上工作中的成就感与代码绑定,批评代码就感觉像否定自己。
误区只要 PR 已合入并显示 Approved,就说明这段代码没有 bug,可以放心上线。
正解审查降低风险,但不保证消灭所有问题。审查者只能基于有限的上下文做推断,就像编辑不能保证一本书零错字,只能尽量降低差错率。所以合入后仍需监控告警、灰度发布和线上日志兜底。
为何常见:把“批准”当成了“保证”,忽略了人不可能穷尽所有场景这一基本限制。
误区攒一个巨大的 PR 一次合入,可以减少提交次数、节省审查成本,反正审查者都会看一遍。
正解研究表明超过约 300 行的 PR,审查者对后半部分的注意力显著下降,许多问题被一带而过。大 PR 看起来省事,实际是把风险打包拖延到最后一刻。应小步提交,像作者一章一章交稿给编辑,而不是一口气甩二十万字。
为何常见:人们在心里把“提交次数”与“流程负担”划等号,却没算清大 PR 带来的返工和漏检成本。
误区静态检查、单元测试和构建全部通过,不就是质量有保障了吗?机器都检查过了,还要人干什么?
正解机器检查的是“是否符合规则”,人检查的是“这个设计是否合理”。机器抓不住接口滥用、业务逻辑漏洞、扩展性隐患,就像出版社的拼写检查软件替代不了编辑对叙事结构的判断。
为何常见:自动化工具给出的确定性结果给人“客观可靠”的错觉,而设计的优劣恰恰需要主观经验。
误区既然别人是来帮我看代码的,那每条评论我都应该原样改掉,免得得罪人。
正解作者对代码负有最终责任,审查意见只是“建议”。合理的接受,不合理的应该附上理由礼貌拒绝,或者约评审人当面讨论。盲从会让错误的意见也进入代码,最终由作者买单。
为何常见:团队等级观念或讨好心理让人放弃了判断力,把协作当成了上级指令。
面试题
Q1. 关于代码审查的核心目的,以下说法正确的是?
- A.批评写代码的人并追求完美
- B.同行评审保障质量并共享知识← 正确答案
- C.增加流程环节拉长交付周期
- D.完整替代自动化测试工具
答案:B。代码审查的核心是同行评审:在合入前让其他开发者检查代码,既提前拦截缺陷,又让知识在团队中流动。A 错在把审查当成人身批评,C 错在把审查当成官僚负担,D 错在审查与自动化测试是互补关系而非替代关系。
Q2. 以下哪一项适合放进代码审查的检查清单?
- A.代码是否使用了最新版的编程语言
- B.逻辑正确性、可读性与测试覆盖← 正确答案
- C.办公位是否整洁且光线明亮
- D.是否每周提交一次合并请求
答案:B。检查清单应围绕逻辑正确性、命名可读、安全隐患和测试覆盖四类内容。A 关注工具版本而非代码质量,C 是与代码无关的办公环境,D 是提交节奏而非审查对象。
Q3. 收到审查意见后,作者最合适的做法是?
- A.一律拒绝并坚信自己写的没问题
- B.逐条回应,合理接受并说明理由← 正确答案
- C.默默全盘接受且不做任何回复
- D.重新开一个 PR 绕过原讨论
答案:B。审查是双向对话:作者应逐条回复,认可的意见落实修改,不认可的说明理由。A 拒绝沟通会让审查失去意义,C 放弃判断力会让错误意见也进入代码,D 规避讨论会破坏协作信任。
Q4. 关于一次提交(PR)的规模,以下哪种经验最合理?
- A.越大越好,一次合入全部改动
- B.越小越好,每次只改一行代码
- C.每次两三百行便于完整审查← 正确答案
- D.无关改动合并在同一个提交
答案:C。行业经验是 PR 控制在 200-400 行,审查者能在注意力耗尽前完整读完,发现缺陷的效率最高。B 过于碎片化,切碎上下文反而无法审查整体设计;A 和 D 则让审查负担过重、漏检率升高。
Q5. Gerrit 与 GitHub PR 的主要区别体现在?
- A.协作流程与迭代机制的侧重不同← 正确答案
- B.二者功能完全相同没有任何差异
- C.GitHub 不具备行级评论能力
- D.Gerrit 无法进行多人评审
答案:A。Gerrit 以中央仓库和补丁集迭代见长,强调合入门禁;GitHub PR 以分支对话流见长,协作与社区生态更丰富。B 忽略差异,C 与事实不符(GitHub 支持行级评论),D 也错误(Gerrit 本就是多人评审工具)。
Q6. 关于审查效率与质量的平衡,正确的做法是?
- A.用自动化完全替代人工审查
- B.审查时间越长拦截缺陷越多
- C.自动化过滤琐碎问题再人审← 正确答案
- D.优先效率跳过审查快速合入
答案:C。格式、静态检查等琐碎问题交给机器,让人的精力集中在逻辑与设计上,是公认的高效审查模式。A 高估了自动化,设计优劣仍需要人的判断;B 违反注意力衰减规律;D 则直接放弃质量底线。
Q7. 建设性反馈最关键的一点是什么?
- A.直接给代码打分并排名公示
- B.指出问题同时给出改进建议← 正确答案
- C.只表扬优点忽略所有问题
- D.私下讨论但不留下文字记录
答案:B。建设性反馈 = 观察 + 影响 + 建议,既说明问题又给出可操作的改进方向。A 是排名而非反馈,C 回避问题让审查形同虚设,D 把讨论移出记录会丢失可追溯的上下文,别人无法从中学到东西。
Q8. 以下哪些属于代码审查带来的收益?
- A.提前拦截缺陷降低修复成本← 正确答案
- B.团队成员互相学习共同进步← 正确答案
- C.推动代码风格与结构统一← 正确答案
- D.彻底消除所有线上故障
答案:ABC。审查通过前置发现缺陷降低修复成本、促进知识共享、推动团队规范统一。D 过于绝对,审查只能降低风险,不能保证零故障,这与“审查通过不等于没有 bug”的误区一致。
Q9. 高质量的审查评论应该具备哪些特征?
- A.用提问代替武断地否定← 正确答案
- B.针对开发者个人风格评价
- C.引用具体代码位置与场景← 正确答案
- D.附带可操作的改进建议← 正确答案
答案:ACD。好评论对事不对人,指向具体代码并给出建议,常用提问留出讨论空间,避免作者产生防御心理。B 是典型的人身评价,属于建设性反馈的反面教材。
Q10. 团队希望持续改进审查流程,以下做法合理的是?
- A.用拦截缺陷数评估审查价值← 正确答案
- B.定期复盘一轮通过率数据← 正确答案
- C.根据反馈调整检查清单← 正确答案
- D.用审查时长给评审人排名
答案:ABC。用结果数据(缺陷拦截数)、过程数据(一轮通过率)以及一线反馈迭代检查清单,都属于有效的持续改进。D 用时长给评审人排名会诱导磨洋工,把度量用错了对象,反而会腐蚀审查文化。