代码审查三年,我差点被自己的 PR 气哭
上周五晚上十点,耳机里放着 Lofi Hip Hop,手指在键盘上敲得飞快,终于把那个拖了两周的动画组件优化完。提交 PR(Pull Request)时,心里还美滋滋:这波性能提升 40%,老板看了不得夸我?结果第二天早上,三位同事在评论区轮番“输出”——“这个缓存策略有内存泄漏风险”、“交互逻辑耦合太重,后续维护会炸”、“建议拆成原子组件,不然下次需求改个颜色你得重写”。
我盯着屏幕,差点把咖啡杯捏碎。那一刻,真的想删库跑路。
但冷静下来想想,其实他们说得都对。我在这家公司待了三年多,从刚毕业的小白干到能独立负责核心模块,PR 也从最初被批“命名像乱码”到现在偶尔能当 reviewer,但每次被怼,还是有点破防。最近正考虑要不要跳槽换个环境,投了几份简历,刷题之余也在复盘自己到底缺什么。突然意识到:代码审查,其实是我技术成长最真实的镜子,也是求职时最容易被忽略的软实力。
为什么我们总在 CR(Code Review)里互相伤害?
先说点扎心的:很多团队的 CR 流程,根本就是走形式。要么是“LGTM”(Looks Good To Me)三连,要么是挑刺大会,最后变成“你行你上”。我经历过两种极端:
- 早期项目赶双11,PM 在群里@全体:“今晚必须上线!”,结果 CR 被压缩成 5 分钟扫一眼,上线后动画卡顿,用户反馈“像 PPT 切换”,运维半夜打电话骂街。
- 后来团队搞“质量月”,领导要求每行代码必须有两人 approve,结果一个简单按钮样式改了三天,前端和设计师在评论区吵“#f0f0f0 算不算灰色”。
这两种都不是好 CR。真正高效的代码审查,不是为了找茬,而是用最小成本预防线上事故,同时促进知识流动。尤其是在我这种对前端动画和交互有执念的人手里,一个没 review 的 requestAnimationFrame 循环,可能就是下一个内存泄漏的源头。
我的实战经验:从“被怼”到“会审”
经过无数次“社死”现场,我总结出几条接地气的 CR 最佳实践,亲测有效:
1. PR 描述别写“fix bug”,要写“救火记录”
以前我写 PR 标题:“修复首页动画闪退”。Reviewer 看了只能猜:是兼容性问题?还是状态没清?现在我会这样写:
背景:iOS 15 下,快速切换 tab 时,GSAP 动画未完成就销毁,导致
Cannot read property 'kill' of null
根因:组件卸载时未清理 timeline 实例
方案:在useEffectreturn 中调用timeline.kill(),并加兜底判断
验证:真机 iOS 15.2 + Android 12,快速切换 50 次无崩溃
效果:Review 时间从 30 分钟缩短到 10 分钟,而且同事能直接看懂上下文,不用翻 issue 或问你。
2. 小步快跑,别搞“史诗级 PR”
曾经为了炫技,我一次性重构了整个交互动画系统,PR 里 2000+ 行改动。结果呢?没人敢点 approve,因为看不懂。最后被 leader 拉去谈话:“你这是给自己埋雷,万一哪天你离职了,谁来接手?”
现在我学乖了:一个 PR 只解决一个问题。比如:
- 先拆出
useAnimationControllerhook - 再优化缓存策略
- 最后接入新业务场景
每步都可独立 review、可回滚。虽然 PR 数量多了,但合并速度反而更快,团队信任度也上来了。
3. Review 时别只说“不好”,要给“解法”
作为 reviewer,我也曾犯过“键盘侠”错误。比如看到别人写 setTimeout(fn, 0),直接评论:“别用 setTimeout,用 queueMicrotask!”——但对方可能根本不知道后者是什么。
现在我会这样写:
这里用
setTimeout可能导致帧延迟,建议改用requestIdleCallback或queueMicrotask。参考 MDN 文档:[链接]。如果担心兼容性,可以用 polyfill,我之前在 XX 项目用过,需要我贴代码吗?
带解决方案的反馈,才叫建设性意见。
4. 善用工具,把人肉检查自动化
有些低级问题,完全没必要靠人眼盯。比如:
- 未使用的变量
- 错误的 ESLint 规则
- 忘记移除
console.log
我们在 CI 里加了这些钩子:
# .github/workflows/ci.yml
- name: Lint
run: npm run lint
- name: Test
run: npm test -- --coverage --coverageThreshold='{"lines":90}'
规则前置,人脑专注高阶逻辑——比如“这个交互动效是否符合用户心智模型”,而不是“你少了个分号”。
跳槽前,我重新理解了 CR 的价值
最近面试了几家公司,发现大厂特别看重 CR 能力。有次二面,面试官直接问:“你最近一次 code review 发现了什么严重问题?怎么推动解决的?”
我讲了去年双11前的一个案例:发现同事在滚动动画里用了 offsetTop,每次触发 reflow,页面掉帧。我不仅提了 issue,还写了性能对比 demo,推动团队统一用 getBoundingClientRect()。最后他说:“能发现问题,还能推动改进,比单纯写代码值钱多了。”
那一刻我恍然大悟:CR 不只是流程,更是工程素养的体现。它反映你的:
- 代码抽象能力(能否看出耦合)
- 用户视角(是否考虑体验)
- 协作意识(反馈是否友好)
- 风险意识(能否预见隐患)
这些,恰恰是求职时简历写不出来的“隐性竞争力”。
最后一点真心话
写这篇文章时,我又收到一个 PR 评论:“这个动画缓存 key 用时间戳,会不会冲突?”——我第一反应还是想反驳,但深呼吸后,回复:“好问题!我改成用组件 ID + 动画类型组合,你看这样行吗?”
成长,大概就是从“我觉得我没错”到“你说得对,我们可以更好”。
如果你也在迷茫期,不妨回头看看自己最近的 PR。那些被指出的问题,可能正是你下一步该补的课。而那些你认真 review 过的代码,终会成为你简历背后最扎实的底气。
毕竟,能写出好代码的人很多,但能一起写出好系统的,才是团队想要的。
附:我们团队的 CR Checklist(简化版)
| 类别 | 检查项 | 工具/方法 |
|---|---|---|
| 功能 | 逻辑是否覆盖所有边界 case? | Jest + RTL 测试 |
| 性能 | 有无不必要的重渲染/重计算? | React DevTools Profiler |
| 可维护 | 组件/函数是否单一职责? | 手动评估 + SonarQube |
| 体验 | 动画/交互是否流畅、无障碍? | Lighthouse + 真机测试 |
| 安全 | 有无 XSS / 敏感信息泄露? | ESLint-plugin-security |
注:别照搬,根据团队规模调整。小团队可以砍掉 SonarQube,大团队建议加 AI 辅助 review(如 CodeRabbit)。
所以,别再把 CR 当负担了。它可能是你跳槽前,最值得投资的“软技能”。

评论 0