说实话,我曾经非常讨厌代码评审(Code Review,简称CR)。
大概三年前,我刚带一个小团队时,我觉得自己责任重大,必须把控每一行代码的质量。于是,我化身成了无情的"找茬机器"。每次CR,我都会在同事的PR(Pull Request)下留几十条评论:
“这里缩进不对。” “变量名拼错了。” “这行代码太丑了,重写。”
结果呢?团队气氛降到了冰点。大家看到我走过来都想躲,提交代码时更是战战兢兢,生怕被我当众"处刑"。更糟糕的是,在这种高压对抗下,由于大家把精力都花在和我争论格式问题上,一个严重的逻辑漏洞反而被漏掉了,导致上线当晚生产环境直接宕机。
那一刻我才明白:一旦CR变成了"找茬",效率和质量都会崩盘。
对于咱们中小团队来说,资源本来就紧,大家都是兄弟,抬头不见低头见。怎么才能既保证代码质量,又不伤感情,还能把效率提上去?今天我想复盘那次惨痛经历后,我摸索出的三个"落地"方法。
一、把"机器能做的"交给机器,人只看逻辑
很多团队CR做不下去,最大的阻力就是**“琐碎”**。
我有段时间每天要花2个小时在CR上,其中80%的时间都在纠结:为什么你不加分号?为什么你的花括号换行了?这种争论毫无意义,而且极易引发情绪对立。
观点: 人的精力是昂贵的,不应该用来当"人肉语法检查器"。
真实案例: 当时组里有个刚毕业的小伙子小王,技术不错,就是代码风格狂放不羁。我每次都要在评论区给他捉几十个格式虫子,他也很委屈:“哥,这功能跑起来没问题啊,你老盯着空格干嘛?”
后来我痛定思痛,花半天时间在项目里强制接入了 ESLint + Prettier,并配置了 husky 在提交前自动修复格式。
效果立竿见影: 第二天小王再提交代码,我打开一看,清清爽爽。我不再需要关注缩进、分号、单双引号这些皮毛,直接把精力集中在:
- 业务逻辑对不对?
- 有没有潜在的死循环?
- 数据库查询有没有性能隐患?
落地方法: 不要靠口头约定代码规范,没人记得住。
- 统一配置:在项目根目录配置好 Lint 工具。
- 强制执行:使用
pre-commit钩子,格式不通过直接不让提交。
// package.json 示例片段
"husky": {
"hooks": {
"pre-commit": "lint-staged" // 提交前自动扫描并修复
}
}
当你把"找茬"的任务甩给工具,你作为评审人,就不再是"警察",而是帮忙查漏补缺的"队友"。
二、换种说话方式:把"你应该"改成"我们或许可以"
解决了工具问题,剩下就是人的问题了。
很多技术大牛在CR时喜欢居高临下,觉得代码写得烂就是能力不行。但你要知道,代码是程序员的"孩子",你直接说"这孩子长得丑",谁都会急眼。
观点: CR的目的是代码改进和知识共享,而不是智力碾压。
踩坑经历: 我以前特别喜欢用祈使句:“把这个循环改成Map”、“这里判空逻辑不对,改掉”。 有一次,一位老员工直接在周会上拍桌子:“你这种语气,我觉得你在针对我。”
那次冲突后,我强迫自己改变提建议的"话术"。我发现,只要把主语从**“你”(You)换成“我们”(We),把命令换成疑问**,由于心理防御机制的降低,对方的接受度会高出好几个量级。
对比一下这两种说法:
- ❌ 伤人版:“这个函数写得太长了,很难维护,拆分一下。"(潜台词:你写得烂。)
- ✅ 高效版:“我看这个函数逻辑有点复杂,我们是不是可以把它拆分成几个小函数,这样大家以后维护起来会更方便?"(潜台词:为了团队好,咱们一起优化。)
再比如性能问题:
- ❌ 伤人版:“这里用双重循环会卡死,必须改。”
- ✅ 高效版:“我不确定当数据量达到1万条时,这里会不会有性能瓶颈?你有考虑过换成哈希表来处理吗?”
落地方法: 这就叫"Praise Sandwich”(三明治沟通法)的变体。
- 先肯定:如果代码写得好,不要吝啬赞美(“这个正则写得真漂亮!")。
- 再建议:用询问的语气提出改进点。
- 给理由:一定要解释为什么要改(是为了性能、可读性,还是扩展性?),而不是"因为我说了算”。
自从我改了说话方式,团队里的技术讨论氛围明显变好了,大家甚至开始期待我在CR里留下的"骚操作"建议。
三、拒绝"大爆炸"式提交,设定"400行"红线
这是中小团队最容易踩的坑:憋大招。
很多项目经理喜欢催进度,开发人员就闷头写代码,写了一周,周五下午快下班了,突然甩出一个包含 50 个文件、改动了 2000 行代码的 PR,然后喊一声:“哥,帮忙过一下,急着上线!”
观点: 超过400行的代码变更,人类的大脑是无法有效处理的。
真实案例:
就是文章开头提到的那次事故。当时因为赶工期,核心开发老张一次性提交了整个订单模块的重构代码。我看了一周的代码已经头昏脑涨,面对这几千行代码,我根本没心思细看,心想"老张是老手了,应该没问题”,于是只花了5分钟扫了一眼就点了 Approve。
结果,里面藏了一个极深的逻辑漏洞:在特定并发场景下,库存扣减不一致。如果我当时是一点点看的,大概率能发现;但混在几千行代码里,神仙也看不出来。
落地方法: 后来我给团队定了一条死规矩:“Small CLs”(小粒度提交)。
- 拆分任务:一个功能如果需要写3天,那就拆成3个甚至6个小任务。
- 设定红线:单个PR尽量控制在 200-400行 变动以内。
- 日清日毕:每天都要提交代码,每天都要做CR。不要堆到周五下午。
这就像批改作业,改一篇作文很容易,但让你一口气改完一个班的作文,你只会想随便打个分了事。
总结与行动
回过头看,高效且不伤人的代码评审,核心其实就一句话:对事不对人,机器能干的机器干,人只负责思考。
当我们把情绪对抗拿掉,把机械劳动拿掉,剩下的才是 Code Review 真正的价值——它是一次次微型的技术分享会,是你拉着队友的手,帮他避开前面那个坑。
如果你现在的团队里 CR 推行得很痛苦,不妨试着从这三步开始改变:
- 本周行动:花1小时配置好 ESLint/Prettier,并确保全员同步。
- 沟通微调:下一次评论时,试着把"你为什么"改成"我们是否可以",看看对方的反应。
- 流程优化:拒绝下一个超过 800 行的巨型 PR,要求对方拆分后再看。
最后想问问大家: 在你经历过的代码评审中,有没有哪一句评论让你印象最深刻(不管是让你醍醐灌顶的,还是让你想顺着网线打人的)?
欢迎在评论区里吐槽或分享,咱们一起避坑!