代码评审里没人说透的那些真问题
上周跟一个做了8年后端的朋友喝酒,他骂了半小时公司的代码评审。说每次评审跟走流程似的,大家对着提交记录挑错别字,连变量名多打了个下划线都要提,真到了逻辑有坑的地方,全装瞎。
代码评审会议上多人对着投影的代码逐行讨论的实拍
麻烦在于,现在太多团队把这个事搞成了KPI。比如有的团队要求每个提交必须有3个以上评审人点头,不然合不进主干。结果呢?大家为了凑人头,随便拉两个不相关的同事点同意,连代码都没打开过。我见过最离谱的,一个写前端的同事,被拉去评审后端的数据库存储过程,他连那个存储过程用的什么方言都不知道,扫了两行就点了approve——后来那个存储过程上线3天,把用户的订单状态全搞混了,赔了小几十万的优惠券。
真正有价值的评审,从来不是找那些一眼能看到的小问题。变量名好不好,缩进对不对,这些东西交给lint工具去管就行,人要干的是工具干不了的事。比如这段循环会不会在极端数据下死循环,这个异常捕获会不会把本来要抛出去的业务错误吞掉,这个接口的参数校验是不是漏了权限校验的环节,这些才是评审该盯的东西。

IDE里代码评审插件的行内批注界面截图
我之前待过的一个团队,踩过这个坑。那时候我们要求所有提交必须走线上评审,每次评审人要写至少3条意见才能通过。结果大家为了凑够3条,本来没意见也要硬找。比如有人会在评审意见里写“这里的注释可以再写得详细一点”,“这个变量名可以改成更有意义的”——这些意见改了也没什么用,不改也出不了事,但提交的人要花半小时改完,再发回去重新评审,一来一回,大半天就没了。后来我们改了规则,lint能查的问题一律不准在评审里提,评审意见只写会影响功能、可维护性、安全性的问题,整个评审的平均时长直接砍了三分之二。
不过话说回来,也不能走另一个极端。有的团队嫌评审麻烦,干脆全跳过,谁写的代码谁自己上线。那更糟,我见过一个刚毕业的小孩,写了个批量删除用户数据的脚本,没加where条件,直接在生产库跑了,删了10万条用户数据,花了两天两夜才从备份里找回来。这事没那么玄,就是本来评审的时候只要有人扫一眼那个脚本,就能发现问题,结果没人看,全是代价。
评审的本质从来不是挑错
很多人对代码评审的误解,从把它当“代码批改作业”开始。说白了,学校里改作业是给老师交差,职场里的代码评审,是你要把自己写的东西,交到几个以后要给你擦屁股的人手里,让他们确认这东西以后不会半夜把人从床上薅起来。评审里最容易被忽略的成本
很多团队算不清评审的账。比如一个3人小组,花1个小时开评审会,看起来好像没什么成本——但这1小时,是三个本来可以写代码、测bug、改需求的人的时间。要是这1小时全用来挑缩进、挑变量名,那纯纯是浪费。