说个让我后怕的事。
上个月有个项目要上线,功能不大,就是给用户加个导出Excel的功能。我自己写完,测了几遍,觉得没问题。但那段时间团队Code Review的人手不够,排期又紧,我就想:要不让AI帮我审一下?
Claude Code扫了一遍代码,噼里啪啦列了十几条建议。我一条条看过去,大部分确实有道理——变量命名不够清晰、某个异常没catch、一个边界条件的判断可以更严谨。我按它的建议改了,改完自己又跑了一遍,没问题,提交,上线。
上线第二天,用户反馈:导出的数据少了。
排查了半天,发现原因——AI帮我"优化"掉了一个边界条件。
先说AI审查代码有多爽
在讲翻车之前,我得先说说AI做Code Review确实有它的杀手锏。
速度快,这是最直观的。 人工Review一段500行的代码,认真看一遍至少半小时。AI呢?十几秒。它不会走神,不会因为下午犯困就漏看一个变量,不会因为"这段代码跟上面差不多"就跳过去。人会偷懒,AI不会。
它真的能挑出"技术债"。 我有一次让AI审查一个老项目,它直接指出十几个问题:未处理的异常、硬编码的魔法数字、重复的逻辑没有抽成函数、某些变量名跟实际含义完全不搭。这些问题单个看都不致命,但攒在一起就是定时炸弹。人工Review很难一次性扫出这么多,因为人的注意力会疲劳。
它不讲情面。 这点其实挺好的。同事之间Review代码,有些小问题你可能不好意思说——"算了,能跑就行"。AI没有这种顾虑,它该挑刺就挑刺,不管你是新人还是架构师。
用了几次之后,我甚至觉得AI比大部分初级开发者的Review质量还高。至少它不会漏掉明显的空指针风险。
然后说说它怎么把我的bug"优化"没了
回到开头那个导出Excel的故事。
我的原始代码里有一个判断:如果用户选择的日期范围超过90天,就不允许导出,弹个提示让用户缩小范围。这是个业务限制——数据量太大的话,服务器扛不住。
AI看到这段代码,给出的建议是:"这个限制可以放宽或移除,用户体验更好。建议改为异步导出,后台处理,不阻塞用户操作。"
它说得对不对?从纯技术角度看,确实是对的。异步导出是更好的方案。但问题是——我这个项目没有做异步队列,没有后台任务机制,改异步不是一两行代码的事,是一个功能重构。
我当时的脑子不知道怎么想的,看到"用户体验更好"这几个字,手一滑,直接把那段限制删了。想着"先上线,后面再补异步"。
结果就是:有用户选了半年的数据去导出,服务器直接崩了。
这个bug本来是不存在的。我的90天限制就是防这个场景的。AI把它"优化"掉了。
还有更离谱的
另一次更经典。
我在写一个支付回调的逻辑,代码里对金额做了两次校验——一次在接收到回调时,一次在实际扣款前。两次校验的逻辑一样,看起来确实是"重复代码"。
AI很敬业地指出:"这里有两个相同的校验逻辑,属于代码重复,建议合并为一个函数。"
它说得对,确实是重复代码。但这个"重复"是故意的。支付相关的逻辑,宁可多校验一次,也不能漏掉。这是安全层面的防御性编程,不是技术债。
幸好那次我在提交前多看了一眼,没按AI说的改。如果真改了,表面上代码更"干净"了,实际上少了一道安全防线。
所以我现在怎么用AI做Code Review
踩了几次坑之后,我摸索出一套自己的用法:
让AI找问题,但由我判断要不要改。 AI的定位是"提出问题的审查员",不是"做决策的架构师"。它指出"这里有重复代码",我来决定这个重复是不是故意的。它说"这个限制可以去掉",我来评估去掉的后果。
给AI足够的上下文。 很多时候AI给出错误建议,是因为它不理解业务背景。现在我会在prompt里加上:"这是支付模块,安全性第一"或者"这段代码的限制是业务需求,不是技术限制"。有了上下文,AI的建议质量明显提高。
"理解每一行"原则。 不管AI建议怎么改,改之前我必须理解每一行的作用。如果不理解,就不改。这个原则救过我不止一次。
支付、权限、数据删除——这些地方AI建议只看不听。 涉及钱、涉及权限、涉及数据不可恢复操作的代码,AI说什么我都不会直接照改。这些地方的"重复"和"冗余"往往是保命的。
说到底
AI做Code Review,有点像体检报告——它能告诉你哪里可能有问题,但具体怎么治,还是得医生来判断。你不能拿着体检报告自己开刀。
它适合找"技术债":命名不规范、异常没处理、重复逻辑、魔法数字。这些问题找出来基本都是对的,改了也没风险。
它不适合判断"业务逻辑":这个限制该不该有、这个重复是不是故意的、这个用户体验值不值得牺牲安全性。这些判断需要理解业务上下文,AI目前还做不到。
所以我的结论是:AI是很好的代码审查工具,但不是很好的代码决策工具。 让它帮你找bug,但别让它帮你做决定。
代码是你写的,后果是你扛的。AI不背锅。
你用AI做Code Review吗?有没有遇到过AI"好心办坏事"的情况?评论区聊聊。
夜雨聆风