4. 评审类型与时机选择:正式评审、技术走查、结对评审、同行评审,何时用哪种?

评审这件事,说起来简单——不就是找人看代码吗?但我在项目里见过太多「评审变批斗会」或者「评审走过场」的情况。说白了,选错评审类型,比不评审还糟糕。

嵌入式开发有个特点:硬件耦合深、实时性要求高、出了问题很难远程打补丁。所以评审类型的选择,直接决定了你是真发现问题,还是浪费时间。

我个人习惯把评审分成四类:正式评审、技术走查、结对评审、同行评审。它们各有各的脾气,用对了地方就是利器,用错了就是内耗。

4.1 四种评审类型速览

先给个总览表格,方便你快速对照。后面我再逐个拆解。

评审类型 核心特点 典型时长 参与人数 正式程度
正式评审 有流程、有角色、有记录、有结论 1-2 小时 5-8 人 ★★★★★
技术走查 作者主导,逐行讲解,听众提问 30-60 分钟 3-5 人 ★★★☆☆
结对评审 两人实时协作,边写边审 持续进行 2 人 ★★☆☆☆
同行评审 非正式,异步或同步,侧重经验分享 15-30 分钟 2-4 人 ★★☆☆☆

核心原则:评审的正式程度,应该与文档/代码的关键程度成正比。一个启动加载器的初始化代码,不值得开 2 小时正式评审;但系统架构变更,绝对不能只靠结对评审带过。

4.2 正式评审:什么时候必须上「重武器」?

正式评审,说白了就是「开大会」。有主持人、有记录员、有评审组长,会前要发材料,会后要出报告。听起来很重,但有些场景非它不可。

我建议在以下场景使用正式评审:

  • 架构设计文档:系统模块划分、接口定义、任务调度策略。这些一旦定下来,后面改动的成本极高。
  • 关键安全功能:比如汽车电子的 ASIL-D 级别代码、医疗设备的生命支持逻辑。这类代码出问题不是 bug,是事故。
  • 跨团队接口协议:比如 CAN 总线报文定义、SPI 通信协议、内存布局约定。多个团队依赖同一个接口,必须白纸黑字确认。
  • 重大重构方案:涉及架构级变更时,需要多方达成共识。

我曾经踩过的坑:有一次我们团队对 Bootloader 的升级流程做了改动,觉得「代码量不大,走个结对评审就行了」。结果上线后,升级过程中断电导致设备变砖。后来复盘发现,问题出在状态机跳转逻辑上——结对评审的两个人都是开发思维,没人从测试和运维角度去审视。从那以后,凡是涉及状态机、异常恢复、安全降级的设计,我坚持走正式评审,至少拉上测试和运维的人一起。

正式评审的典型流程:

  1. 作者提前 2-3 天发送评审材料
  2. 评审人独立预审,记录问题
  3. 召开评审会议,逐条讨论
  4. 记录决议:通过 / 有条件通过 / 重新评审
  5. 作者整改,评审组长确认关闭

4.3 技术走查:最被低估的高效评审方式

技术走查,很多人觉得它「不够正式」,但我个人认为它是嵌入式开发中性价比最高的评审方式。

怎么操作?作者坐在屏幕前,打开代码或文档,逐行逐段地讲给听众听。听众随时打断提问。不需要提前准备材料,不需要写评审报告。

技术走查最适合的场景:

  • 驱动层代码:寄存器操作、中断处理、DMA 配置。这些代码逻辑密集,走查时能发现很多「想当然」的错误。
  • 算法实现:比如 PID 控制、卡尔曼滤波、FFT 处理。作者边讲边推导,听众能及时发现边界条件遗漏。
  • 中等复杂度的模块:一个模块几百行代码,逻辑清晰但细节多。走查比正式评审灵活,比结对评审有更多视角。
  • 新人代码审查:新同事写的代码,走查是最好的带教方式。我见过太多新人被正式评审吓到不敢说话,但走查时能主动问出很多好问题。

一个小技巧:技术走查时,我要求作者不要提前给听众发代码。为什么?因为一旦提前发了,听众会自己看,走查时就变成了「我已经看过了,没什么好问的」。现场逐行讲解,反而能逼着听众跟着作者的思路走,更容易发现逻辑断层。

4.4 结对评审:日常开发的最佳拍档

结对评审,其实就是两个人坐在一起写代码。一个人写,另一个人实时看。这不是「一个人写、一个人玩手机」,而是真正的实时协作。

结对评审最适合的场景:

  • 复杂逻辑的首次实现:比如一个状态机、一个协议解析器。两个人一起推演,能避免很多低级错误。
  • 调试疑难 bug:一个人卡住了,另一个人换个视角,往往能快速定位问题。
  • 新人上手:让有经验的工程师带着新人结对,比任何文档培训都有效。
  • 紧急修复:线上问题需要快速出补丁,结对评审既能保证速度,又能保证质量。

注意:结对评审不是「一个人写、一个人看」,而是两个人轮流「驾驶」。我习惯每 30 分钟换一次角色。写的人专注实现,看的人专注「这里是不是漏了边界检查?」「这个变量命名会不会误导人?」。两个人保持对话,而不是沉默。

4.5 同行评审:轻量级的「第二双眼睛」

同行评审,是最轻量级的方式。不需要开会,不需要预约会议室。你写完一段代码,发给另一个工程师,他抽空看看,给你反馈。或者你们在茶水间聊两句:「诶,我这个中断处理函数你帮我瞄一眼?」

同行评审最适合的场景:

  • 非关键模块的日常代码:比如日志模块、工具函数、配置解析。这些代码出问题影响不大,不需要大动干戈。
  • 文档初稿:设计文档的第一版,先让同行看看结构是否合理,再决定要不要走正式评审。
  • 经验分享:你发现了一个好用的设计模式,或者踩了一个坑,找同行聊聊,互相学习。
  • 跨领域检查:硬件工程师看软件工程师的寄存器配置,软件工程师看硬件工程师的时序图。这种交叉检查,正式评审太隆重,同行评审刚刚好。

我曾经犯过的错:有一段时间,我觉得同行评审「太随意」,所有代码都走正式评审。结果团队评审效率直线下降,大家开始抵触评审。后来我才明白,不是所有代码都值得 2 小时会议。把同行评审当作日常习惯,把正式评审留给真正重要的节点,这才是健康的评审文化。

4.6 如何选择?一张决策流程图

说了这么多,到底怎么选?我画了一张决策流程图,你可以贴在工位上。

评审类型选择决策流程图 评审类型选择决策流程 需要评审的文档/代码 是否涉及安全/架构/跨团队接口? 是 正式评审 否 是否复杂逻辑/驱动/新人代码? 是 技术走查 否 是否紧急修复/调试/新人结对? 是 结对评审 否 同行评审 说明: 1. 正式评审:架构/安全/跨团队接口,需提前准备材料 2. 技术走查:复杂逻辑/驱动/新人代码,作者逐行讲解 3. 结对评审:紧急修复/调试/新人结对,两人实时协作 4. 同行评审:非关键模块/文档初稿/经验分享,轻量灵活 关键:评审类型匹配风险等级,不浪费也不遗漏 正式评审保底线,技术走查抓细节,结对评审提效率,同行评审养习惯

4.7 我的经验总结

做了这么多年嵌入式,我总结了几条关于评审时机的「潜规则」:

  • 不要等代码写完再评审。我习惯在「设计阶段」就做一次技术走查,确认思路没问题再动手。否则写完了发现方向错了,返工成本太高。
  • 评审频率和项目节奏挂钩。项目初期(架构阶段)多用正式评审,中期(编码阶段)多用技术走查和结对评审,后期(集成测试阶段)回归正式评审做验收。
  • 评审不是考核,是协作。我见过一些团队把评审当成「找茬」,搞得人人自危。其实评审的目的是帮作者发现问题,不是证明作者不行。你想想看,如果评审氛围不好,谁还敢把代码拿出来审?
  • 工具只是辅助,人才是核心。不管用 GitLab MR 评审、Gerrit 还是 Jira,工具解决不了「评审文化」的问题。我见过用最简陋的邮件列表做评审的团队,效果比用高大上工具的团队好得多——因为他们真的在认真看代码。

一个小建议:如果你刚开始建立评审流程,别一上来就搞正式评审。先让团队养成「同行评审」的习惯,每天花 15 分钟互相看看代码。等大家习惯了被审视、也习惯了审视别人,再逐步引入技术走查和正式评审。评审文化是养出来的,不是管出来的。

嗯,关于评审类型和时机选择,就聊到这里。记住一句话:没有最好的评审方式,只有最合适的评审方式。关键是根据文档/代码的重要程度、复杂程度和紧急程度,灵活切换。