代码审查
凌晨两点,代码审查我盯着屏幕上第37行代码,代码审查忽然意识到自己犯了个低级错误——把用户ID直接拼进了SQL查询字符串。代码审查这行代码是代码审查我三天前写的,当时觉得"先跑起来再说"。代码审查现在它像根刺一样卡在喉咙里。代码审查
代码审查这事,代码审查说白了就是代码审查让人看你的丑。但大多数人把它搞成了形式主义的代码审查走秀场。我见过最荒唐的代码审查审查会,六个人围着投影仪,代码审查花四十分钟争论变量命名该用camelCase还是代码审查snake_case,却没人注意到主流程里有个明显的代码审查空指针隐患。
真正的代码审查审查应该像考古,一层层剥开代码的代码审查沉积岩。上周我review同事小张的支付模块,他逻辑写得滴水不漏,异常处理也周全。但我在某个不起眼的工具函数里发现他用了`Math.random()`生成订单号。他辩解说只是内部测试用,可这段代码会被生产环境调用。我给他看了去年某电商平台因为订单号冲突导致的超卖事故报告,他脸瞬间白了。
代码审查最微妙的地方在于,它既是技术活,又是心理博弈。你指出别人的问题,对方本能反应是防御。我学会了一招:先夸再问。"这段缓存策略设计得真巧妙,不过我有点好奇,如果Redis宕机了,降级方案里这个超时时间设成三秒会不会太短?"——把"你错了"换成"我不懂",效果天差地别。
有个现象很讽刺:越是新手越喜欢在审查时大动干戈,把别人代码改得面目全非。反而是资深的工程师,往往只提最关键的两三点。他们知道代码是长出来的,不是雕塑出来的,过度修剪会伤到根。
我自己的代码被审查时,心态也经历过三个阶段。最初是惶恐,觉得每个注释都在嘲笑我;后来变成不服,总想证明自己的写法更优;现在倒是坦然了——审查里被揪出的每个bug,都是免费的学费。上个月我的分页查询被指出索引失效,排查后发现是隐式类型转换搞的鬼。这个坑我记一辈子。
最有效的审查往往不在会议室里。有次我去茶水间倒咖啡,正好撞见隔壁组的老王在跟实习生对着屏幕比划。没有PPT,没有会议纪要,就是两个人盯着代码,偶尔蹦出几句"这里如果并发会怎样"、"这个边界条件你测过吗"。那种自然流淌的讨论,比任何正式评审都锋利。
工具能帮你抓出格式问题、重复代码,但抓不出设计思想的裂缝。审查的核心永远是人——那个人是否愿意放下ego去理解上下文,是否肯花时间模拟异常路径,是否对每行"看似合理"的代码保持怀疑。我见过最漂亮的审查意见只有一句话:"这段逻辑在二月二十九号会出错。"
代码审查终究是场与自己的较量。你写下的每行字,都在等待被另一个人用更清醒的目光重新审视。这不可怕,可怕的是没人愿意认真看你写的东西。现在每次提交pull request,我都会在最后附上一句:"重点请看第80-120行,我觉得那里可能有问题。"——主动暴露弱点,往往能换来更真诚的反馈。
窗外的天快亮了。我把那行SQL改成了参数化查询,又顺手检查了附近三个类似的隐患点。提交信息里只写了四个字:"修复注入"。等明天同事来审查时,希望他能从我的代码里看出些别的——比如一个程序员在深夜学会的谦卑。














