AI摘要

文章讨论了代码评审的艺术,强调评审的目的不是找茬而是共同成长。作者分享了如何从批判者转变为合作者,使用提问和解释原因的方式进行评审,区分必要项和建议项,关注设计而非仅关注代码规范。最后,作者认为优秀的代码评审是一种团队文化,目标是让每个人都能从中学习和成长。

还记得我第一次正式参与代码评审时,心情更像是一场“狩猎”。我瞪大眼睛,像扫描猎物一样扫视着同事的代码,迫不及待地想找出里面的拼写错误、格式不规整、或者任何一点可以显示我“高明”之处的地方。我的评论充斥着:“这个变量名取得不对”、“这里应该用StringUtils.isEmpty”、“这个if嵌套太深了”。

我以为我在尽职尽责地保证代码质量。直到有一天,一位平时很温和的同事私下对我说:“你评审时指出的一些点确实对,但每次收到你的评审意见,我压力都特别大,感觉像是在被审判。”

那句话像一盆冷水,浇醒了我。我意识到,我把代码评审当成了一场个人能力的炫耀,一次“找茬”游戏。我忽略了代码背后那个活生生的人,以及代码评审最核心的目的:不是为了证明谁更聪明,而是为了共同打造更好的软件,并让团队中的每个人都变得更强。

这场觉醒,开启了我对代码评审“艺术”的探索。

第一章:心态转变——从“批判者”到“合作者”

​旧心态:​​ “我要找出你代码里的所有问题,证明我的价值。”

​新心态:​​ “我是这段代码合入前的最后一道安全网,也是帮助作者思考更多场景的伙伴。我们的共同目标是让这段代码更好。”

这个根本性的转变,体现在评论语言的每一个细节上。

  • ​不要说:​​ “你这里为什么不用策略模式?这样写太丑了。”
  • ​试着说:​​ “这个逻辑里现在有三个不同的分支,未来如果再加新的类型,可能还需要修改这里。我在想,如果我们用策略模式来封装每个类型的行为,会不会让扩展性更好一些?你觉得呢?”

看出区别了吗?第一种是指令和指责,第二种是邀请和探讨。后者把作者拉到了和你同一阵营,共同面对“代码设计”这个敌人,而不是让你们彼此对立。

第二章:技巧升级——让评论成为“引导”而非“命令”

1. 用提问代替断言

提问能引导作者自己思考,从而学到背后的原理。这是“授人以渔”。

  • ​断言:​​ “这个数据库查询没加索引,性能会很差。”
  • ​提问:​​ “这个查询方法会在数据量大的时候被频繁调用吗?我们需不需要考虑为这个字段加上索引来避免全表扫描?”

第二个问题不仅指出了问题,更引导作者思考业务场景和性能的关联,下次他设计代码时,自己就会提前考虑。

2. 解释“为什么”而非只指出“是什么”

这是最有价值的部分。只说什么错了,作者可能不服气,或者不懂装懂地改掉。解释为什么错,才能带来真正的成长。

  • ​只指问题:​​ “这里不能直接catch Exception。”
  • ​解释原因:​​ “这里直接catch Exception会吞掉像NullPointerException这样的运行时异常,让真正的程序错误被隐藏,给后期排查带来很大困难。我们最好只捕获你预期会发生的受检异常。”

3. 区分“必要项”与“建议项”

不是所有评论都同等重要。混为一谈会模糊重点,让作者感到困扰。

  • ​对于原则性问题(如线程安全、数据一致性错误),我会明确说:​​ “❌ 这里是共享变量,存在线程安全风险,必须修改。”
  • ​对于编码风格、见仁见智的设计,我会用更温和的语气:​​ “💡 我个人觉得这个方法有点长,拆分成两个小方法可能可读性会更好。当然,这只是个建议,如果你觉得现在这样更清晰,也没问题。”

这样,作者能清晰知道哪些必须改,哪些可以讨论,评审效率更高,氛围也更轻松。

第三章:关注重点——从“码规”到“设计”

早期评审,我总纠缠于空格、括号、命名规范。这些重要吗?重要。但它们是​最低标准​。现在,我会优先利用自动化工具(如SonarQube, Checkstyle)来保证基础规范,而把宝贵的人工评审精力集中在机器无法判断的事情上:

  • ​设计清晰度:​​ 这段代码的逻辑容易理解吗?新来的同事能看懂吗?
  • ​可测试性:​​ 这个类是否便于单元测试?依赖关系是否清晰?
  • ​可扩展性:​​ 如果需求变了,这个结构容易修改吗?
  • ​单一职责:​​ 这个类/方法是不是只做了一件事?

比如,我会评论:

“我发现这个OrderService里既处理了订单状态,又发了邮件,还计算了佣金。这让这个类的职责有点重,也不太好测试。我们有没有可能把发邮件和计算佣金的逻辑抽成独立的服务,然后通过事件来触发?这样结构会更清晰一些。”

这种关于设计和架构的讨论,才是代码评审最能产生价值、最能促进团队成员技术成长的地方。

第四章:塑造文化——从“个人活动”到“团队仪式”

优秀的代码评审不是一两个人的事,而是一种团队文化。

  • ​以身作则:​​ 当我自己的代码被评审时,我会对每一条评论都认真回复。对于合理的建议,我会说“好的,已修改,谢谢建议!”;对于有疑问的,我会说“这个地方我当时的考虑是...,想听听你的看法为什么觉得另一种方式更好?” 这种开放、谦逊的态度会感染整个团队。
  • ​鼓励小规模提交:​​ 我提倡大家频繁地、小批量地提交代码进行评审。一个只涉及几个文件的PR,远比一个修改了50个文件、有上千行代码的PR更容易被仔细审查。这也逼着我们在开发时就要思考模块的合理性。
  • ​适时进行“面对面评审”:​​ 对于一些特别复杂或核心的代码,我会走到同事座位前,说:“这块逻辑有点复杂,我们能不能一起过一下?我想确保我完全理解了你的设计思路。” 这种面对面的、即时的沟通,能消除文字误解,碰撞出更多火花。

结语:评审的终极目标是“让自已失业”

如今,我再回头看自己当年那些刻薄的评论,感到十分惭愧。我逐渐明白,一次成功的代码评审,其标志不是找出了多少问题,而是​作者是否感到有所收获,并且愿意在下次评审中,将同样的善意和智慧传递给其他人​。

最让我有成就感的时刻,不是指出了别人一个精妙的Bug,而是看到一位我曾经评审过他代码的同事,在评审别人的代码时,用上了我当初引导他的方式去提问和解释。

这,就是代码评审的艺术。它本质上是一种沟通和协作的艺术。其最高境界,是营造一个让每个人都敢于暴露不足、乐于分享知识、共同追求卓越的技术氛围。当团队中每个人的水平都在这样的互动中提升,当“代码质量”成为所有人内化于心的共同追求时,我这个“资深”工程师的吹毛求疵,也就真的可以“失业”了。

版权声明 ▶ 本网站名称:黄磊的博客
▶ 本文标题:代码评审的艺术:从挑毛病到促进共同成长
▶ 本文链接:https://www.huangleicole.com/team-management-and-collaboration/86.html
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

如果觉得我的文章对你有用,请随意赞赏