AI摘要
还记得我第一次正式参与代码评审时,心情更像是一场“狩猎”。我瞪大眼睛,像扫描猎物一样扫视着同事的代码,迫不及待地想找出里面的拼写错误、格式不规整、或者任何一点可以显示我“高明”之处的地方。我的评论充斥着:“这个变量名取得不对”、“这里应该用StringUtils.isEmpty”、“这个if嵌套太深了”。
我以为我在尽职尽责地保证代码质量。直到有一天,一位平时很温和的同事私下对我说:“你评审时指出的一些点确实对,但每次收到你的评审意见,我压力都特别大,感觉像是在被审判。”
那句话像一盆冷水,浇醒了我。我意识到,我把代码评审当成了一场个人能力的炫耀,一次“找茬”游戏。我忽略了代码背后那个活生生的人,以及代码评审最核心的目的:不是为了证明谁更聪明,而是为了共同打造更好的软件,并让团队中的每个人都变得更强。
这场觉醒,开启了我对代码评审“艺术”的探索。
第一章:心态转变——从“批判者”到“合作者”
旧心态: “我要找出你代码里的所有问题,证明我的价值。”
新心态: “我是这段代码合入前的最后一道安全网,也是帮助作者思考更多场景的伙伴。我们的共同目标是让这段代码更好。”
这个根本性的转变,体现在评论语言的每一个细节上。
- 不要说: “你这里为什么不用策略模式?这样写太丑了。”
- 试着说: “这个逻辑里现在有三个不同的分支,未来如果再加新的类型,可能还需要修改这里。我在想,如果我们用策略模式来封装每个类型的行为,会不会让扩展性更好一些?你觉得呢?”
看出区别了吗?第一种是指令和指责,第二种是邀请和探讨。后者把作者拉到了和你同一阵营,共同面对“代码设计”这个敌人,而不是让你们彼此对立。
第二章:技巧升级——让评论成为“引导”而非“命令”
1. 用提问代替断言
提问能引导作者自己思考,从而学到背后的原理。这是“授人以渔”。
- 断言: “这个数据库查询没加索引,性能会很差。”
- 提问: “这个查询方法会在数据量大的时候被频繁调用吗?我们需不需要考虑为这个字段加上索引来避免全表扫描?”
第二个问题不仅指出了问题,更引导作者思考业务场景和性能的关联,下次他设计代码时,自己就会提前考虑。
2. 解释“为什么”而非只指出“是什么”
这是最有价值的部分。只说什么错了,作者可能不服气,或者不懂装懂地改掉。解释为什么错,才能带来真正的成长。
- 只指问题: “这里不能直接
catch Exception。” - 解释原因: “这里直接
catch Exception会吞掉像NullPointerException这样的运行时异常,让真正的程序错误被隐藏,给后期排查带来很大困难。我们最好只捕获你预期会发生的受检异常。”
3. 区分“必要项”与“建议项”
不是所有评论都同等重要。混为一谈会模糊重点,让作者感到困扰。
- 对于原则性问题(如线程安全、数据一致性错误),我会明确说: “❌ 这里是共享变量,存在线程安全风险,必须修改。”
- 对于编码风格、见仁见智的设计,我会用更温和的语气: “💡 我个人觉得这个方法有点长,拆分成两个小方法可能可读性会更好。当然,这只是个建议,如果你觉得现在这样更清晰,也没问题。”
这样,作者能清晰知道哪些必须改,哪些可以讨论,评审效率更高,氛围也更轻松。
第三章:关注重点——从“码规”到“设计”
早期评审,我总纠缠于空格、括号、命名规范。这些重要吗?重要。但它们是最低标准。现在,我会优先利用自动化工具(如SonarQube, Checkstyle)来保证基础规范,而把宝贵的人工评审精力集中在机器无法判断的事情上:
- 设计清晰度: 这段代码的逻辑容易理解吗?新来的同事能看懂吗?
- 可测试性: 这个类是否便于单元测试?依赖关系是否清晰?
- 可扩展性: 如果需求变了,这个结构容易修改吗?
- 单一职责: 这个类/方法是不是只做了一件事?
比如,我会评论:
“我发现这个OrderService里既处理了订单状态,又发了邮件,还计算了佣金。这让这个类的职责有点重,也不太好测试。我们有没有可能把发邮件和计算佣金的逻辑抽成独立的服务,然后通过事件来触发?这样结构会更清晰一些。”这种关于设计和架构的讨论,才是代码评审最能产生价值、最能促进团队成员技术成长的地方。
第四章:塑造文化——从“个人活动”到“团队仪式”
优秀的代码评审不是一两个人的事,而是一种团队文化。
- 以身作则: 当我自己的代码被评审时,我会对每一条评论都认真回复。对于合理的建议,我会说“好的,已修改,谢谢建议!”;对于有疑问的,我会说“这个地方我当时的考虑是...,想听听你的看法为什么觉得另一种方式更好?” 这种开放、谦逊的态度会感染整个团队。
- 鼓励小规模提交: 我提倡大家频繁地、小批量地提交代码进行评审。一个只涉及几个文件的PR,远比一个修改了50个文件、有上千行代码的PR更容易被仔细审查。这也逼着我们在开发时就要思考模块的合理性。
- 适时进行“面对面评审”: 对于一些特别复杂或核心的代码,我会走到同事座位前,说:“这块逻辑有点复杂,我们能不能一起过一下?我想确保我完全理解了你的设计思路。” 这种面对面的、即时的沟通,能消除文字误解,碰撞出更多火花。
结语:评审的终极目标是“让自已失业”
如今,我再回头看自己当年那些刻薄的评论,感到十分惭愧。我逐渐明白,一次成功的代码评审,其标志不是找出了多少问题,而是作者是否感到有所收获,并且愿意在下次评审中,将同样的善意和智慧传递给其他人。
最让我有成就感的时刻,不是指出了别人一个精妙的Bug,而是看到一位我曾经评审过他代码的同事,在评审别人的代码时,用上了我当初引导他的方式去提问和解释。
这,就是代码评审的艺术。它本质上是一种沟通和协作的艺术。其最高境界,是营造一个让每个人都敢于暴露不足、乐于分享知识、共同追求卓越的技术氛围。当团队中每个人的水平都在这样的互动中提升,当“代码质量”成为所有人内化于心的共同追求时,我这个“资深”工程师的吹毛求疵,也就真的可以“失业”了。
2 条评论
666
写的不错