一份来自乔治城大学安全与新兴技术中心2024年11月的报告指出,AI生成的代码里,大约每两段就有一段携带着安全漏洞。斯坦福大学在2023年ACM计算机与通信安全会议上发表的研究则显示,使用AI辅助编程的开发者写出的代码反而更不安全,而且他们对这些代码的信任度却更高。这些数字并排放在一起时,一个尴尬的现实就浮现了出来:代码生产的速度上去了,审查的速度却没有同步跟上,甚至在自信的错觉中,本该严苛的审视被轻易跳过了。
我自己就是这个尴尬现实的亲历者。从今年三月开始,我着手开发一款叫做Revue的代码审查工具,并且一直在用Revue来审查Revue自身的代码。大概三周后,我留意到一个让自己有些后怕的现象——生成代码的速度,已经远远把审查速度甩在了后面。一个功能块写完,匆匆扫一眼,觉得没问题就直接合并。那种“觉得没问题”的信心在表面上很真实,但这份信心到底有多少依据,我当时并没有认真去验证。速度与审查之间拉开了差距,而填补这个差距,后来就成了我设计整个审查工作流的核心驱动力。
AI把“写代码”这件事变得极其便宜,但它在软件工程流水线上制造了一个新的瓶颈:代码审查。过去,人类写完代码要等同事来挑刺,现在AI几秒吐出一大段逻辑,审查的压力全部堆积在最后一道防线前。更要紧的是,AI同时让工程师对自己的产出更有信心,即便这些产出在安全或性能上藏着暗礁。写得更快、查得更松、信心却更足——这个组合注定会让有问题的代码更快地流进主干。
只把一个AI审查器粗暴地挂到合并请求上,并不能解决这个困局。单个模型跑一遍,给出一份意见,没有人去检验那意见是不是正确的,它更像一个自说自话的旁观者。真正有用的是那种独立于开发过程、每次变更都触发、并且在把发现展示给你之前,先拿原始代码验证一遍对错的审查机制。正是顺着这个思路,我搭建了Revue的六个专职代理和双阶段运行环境。
Revue并不是一个单一的大提示词模型,而是一组可以让你自由指定底层模型的工作流。它跑在两个地方:本地提交前,以及在持续集成流水线上对每一个合并请求自动触发。无论你在GitHub Actions、GitLab CI还是Bitbucket Pipelines里配置,背后都是同一套审查引擎。本地使用很简单,在已有的Claude Code会话里直接调用 /revue 技能,对暂存区的差异进行审查,不等代码以提交的形式离开你的机器,问题就已经暴露出来了。而在CI环节,Revue作为一个管道步骤安静地执行,用完全相同的六个代理对每一次PR进行剖析,输出格式一致的发现。
这六个代理每个人只盯一件事。安全代理专查注入向量、认证绕过和供应链风险,它会追问:参数有没有被未过滤地拼进查询?令牌有没有在无意中暴露?性能代理把代码里的O(n²)循环、内存泄漏和低效查询拎出来,它关心的是当数据量膨胀时,响应时间会不会非线性地崩掉。架构代理关注耦合违规、缺失的错误处理以及模块之间的契约是否被随意打破,它对整体的伤害往往比单个bug更难修补。代码质量代理审视命名是否表意、是否存在不必要的重复逻辑、以及代码是否方便编写单元测试,这些看起来琐碎,却是可维护性的地基。
但是,代理看得多也意味着噪音可能增多,尤其是模型本身会产生“幻觉”——那种看起来条理清晰、实则与代码实际内容八竿子打不着的发现。为此,Revue特别设置了第五个验证代理,它唯一的工作就是把前面四类代理的每一条发现拿去和原始代码进行比对,凡是站不住脚的、被编译器或运行时事实直接推翻的就直接丢弃。也就是说,你最后看到的,都是被验证过、排除了假阳性残留的结果。然后,第六个综合代理登场,它把经过验证的各类发现统合到一起,如果不同代理之间出现了矛盾的意见——比如安全视角说某个写法没问题、性能视角却认为它有隐患——综合代理会权衡并给出一致的判断。最终,它只在合并请求下发布一条整合评论,而不是让开发者面对六个各自嚷嚷的声音。
这种设计还带来了一个实际好处:并行。六个代理虽然各司其职,但并不排队等前一个跑完,它们同时启动,因此整体耗时只相当于单个代理的处理时间,而不是所有代理的耗时累加。这保证了审查带来的延迟足够低,不会让“等待审查结果”成为开发流程中新的不快感来源。
如果审查只是把发现贴出来然后销声匿迹,那它对行为产生的影响十分有限。很多工具的角色到“发表评论”就画上了句号,而真正的改变往往需要对话。为此,Revue被设计成可以回应的对话参与者。开发者在评论串下回复疑问,代理会进一步解读或者做出澄清。比如安全代理标记了一个缺失的HTTP超时设置,开发者在回复中说明超时已经在另一层中间件中被统一处理了,代理核实后就会确认闭环并把讨论标记为解决。这种一来一回不仅让误报有了改判的出口,也让开发者和审查工作流之间建立起信任。
印象更深的是,Revue还有记忆。每一次审查的运行记录都被保留下来,从长期的日志中,你可以看到某个模块的代码质量是逐月上升还是反复在老问题上栽跟头。这些数据不单是事后复盘的材料,也是将来调整审查规则、优化代理行为的依据。把单次审查变成一个连续的学习循环,是我在构建Revue的过程中越发笃定的事情。
回头再看那个让我在三周时警觉的瞬间——代码产出与审查能力之间的速度落差,其实
热门跟贴