全部文章

职场之锤

本文另有英文译文 · 阅读英文版 →

那次我刚提了一个PR,就被一个注释打败了。

评论人写:“这个变量名太抽象了,建议改成更有业务语义一点的。”

我看着那行代码愣了三秒:这变量是他一个月前写的,命名风格我照着来的,怎么现在说抽象?更讽刺的是,我改了变量名之后,他又回了一条:“不太清楚为什么要这么命名。”

评论区像是开了个无声的审判会。技术细节说着说着,就变成了含沙射影的“你是不是不懂业务”“你是不是代码习惯差”。

那天我合完PR,心里特别憋屈,只想关掉 IDE 去跑步。

这不是一次意外的踩雷,而是我们做 Code Review 时常见的一个场景: 从技术共建滑向互相挑刺,从反馈讨论演变成防御姿态。

但如果把 Code Review 仅仅当作找问题的环节,那我们很容易忽略一个事实:Code Review 的真正价值,不是指出多少个问题,而是让团队一起变得更好。

而要做到这一点,除了技术,我们更需要结构化流程设计,和心理安全的建设力。


一、为什么 Code Review 会变成互撕现场?

我后来反思,我们团队那次 PR 评论的火药味,其实并不来自技术分歧,而是一个共性的问题:

大家带着防御性心态写代码,也带着纠错视角做 Review。

1.1 防御性心态:写得像在打官司

有同事说过一句特别真实的话:“我写代码的目标不是写好,而是不被 challenge。”

这听起来像个笑话,但在 Review 压力大的团队里,常常变成真实写照。PR 写得极度详细,像律师陈词;把每一步拆得特别碎,为了“可解释性”;出现逻辑重复或架构混乱,也不敢改动已有代码,怕被质疑动太多。

但结果却适得其反。越是自我防御式的写法,越容易引起 Review 的不信任与误读。

1.2 纠错视角:评审成了找茬比拼

同样地,在 Reviewer这边,也容易陷入另一种误区:我不是在帮助对方改进,而是在证明“我比你想得周全”。

你一定见过这种风格的评语:

  • “不太明白这样做的意义?”

  • “有没有更好的写法?”

  • “感觉这样会有风险。”

这些评论听起来有逻辑,实则缺乏具体建议和共建意图。久而久之,Code Review 就变成了一场互不信任的博弈:谁先提建议,谁就是主导;谁先被 challenge,谁就要辩解到底。

而一旦技术讨论变成了谁对谁错,我们就很难在其中找到成长空间。


二、先有心理安全,才有技术共建

你有没有发现,那些做 Review 氛围特别好的团队,成员之间的交流常常有一种“轻盈感”:可以指出问题,但不会让人难堪;可以表达不同意见,但不会被贴标签;可以承认“我不确定”,而不是被视为不专业。

这背后,其实靠的不是大家性格好,而是他们在无形中建立起了心理安全的文化共识。

2.1 用“共建语气”代替“挑战语气”

同样是指出变量名问题,语气不同,效果天差地别:

  • 挑战语气:“这个变量名太抽象了,建议改成 xxx。”

  • 共建语气:“我在想这个变量是不是可以更贴合业务一点,比如 xxx,方便别人理解?”

前者让人下意识防御,后者则打开了讨论的大门。

不是要对同事客气,而是要对共识的建立更有耐心。Code Review 的目的不是找出谁错了,而是一起把代码写得更让人理解。

2.2 质疑的时候加上动机假设

在我带初级同事做 Review 的时候,有一个很实用的小技巧:如果你不明白对方为什么这么写,先补上你的假设,再提问。

比如:“我猜你可能是考虑了 A 场景,所以加了这段处理逻辑?但我在想,如果是 B 情况,可能会出问题,你怎么看?”

或者“是不是出于性能考虑用了这个缓存策略?我有点担心一致性这块。”

这样做对方不容易陷入“你在否定我”的情绪里,自己也能更清楚这段代码背后的设计动机。

换句话说,先尝试理解,再提出改进,才是真正成熟的技术协作。


三、结构化 Code Review:让技术反馈有章可循

除了心态上的共建意识,流程上的结构化也非常重要。

很多团队 Review 做得低效,就是因为大家没有统一的流程感,PR 写得像流水账,Reviewer 只能凭经验东一枪西一炮。

下面是我试过的一种改法,简单但非常有用:

3.1 写 PR 描述时,用几句话拆解结构

① 本次修改的目的是什么?

② 为什么要这么做(与其他方式比)?

③ 有哪些潜在影响点或需要关注的部分?

④ 怎样测试改动(测试的截图也可以放上去)

这几句话看起来普通,但能大大降低沟通成本,也能帮助 Reviewer 准确聚焦到关键点,而不是每行代码都像地毯式搜索。

3.2 做 Reviewer 时,有章法地提出建议

我一般会用这样一个顺序来组织反馈:

  1. 优先级高的问题先说(比如 bug、错误逻辑), 不留你觉得呢这种模糊句式;
  2. 建议类的内容后(比如说命名、拆分方式);
  3. 全局性的建议提一次就好,不要逐行重复
  4. 无伤大雅的可以加一个“nit:” 表示不改也没问题

这个方式可以帮你控制评论数量与语气强度的平衡,也能逐渐建立起一个我不是在挑你毛病,而是在一起打造更好的代码的共识文化。


写在最后:CR是最被低估的团队信任练习场

我觉得那些团队成长得快、技术共识又稳的团队,有一个共同特点:

他们不是因为技术强才做出好 Review,

而是因为 Review 做得好,才逐渐形成了强的技术文化。

Code Review 从来不只是找问题,而是一个技术人彼此协作、互相认同的过程。

你从一条评语里感受到对方的理解,也在一次次解释中重新打磨自己的设计表达。

技术共建从 Review 开始,信任也在每一次“写”和“看”的过程中慢慢生成。

也许我们都曾在 PR 评论区里焦虑过、争执过、沉默过,

但如果你愿意换个方式说、换个角度听,那Code Review,就不只是代码的事了。它也是团队真正开始合作的那一刻。