
我的团队是从去年秋天开始正式把 AI 编码代理放进日常迭代的。当时的判断很乐观它能自动读 issue、规划改动方案、拉分支、改代码、补测试、最后提交 PR本质上是把一个需要连续编码一小时以上的小任务外包出去。但真正投入协作之后第一场风波来得比想象中快。一个由代理独立完成的模块改动合入主干review 也通过了集成阶段却暴露出需求理解偏差返工成本超过两倍人工时间。这件事让我开始认真琢磨一个问题AI 编码代理和之前的自动补全完全不是一回事而团队的代码审查还是老一套这套防线是不是把锚系错了位置。这事的结论并不复杂。AI 编码代理开始进入团队后代码审查真正要补的不是“更严格地盯 diff 里的每一行”而是审查层级本身。过去我们只在一个层级上审查——提交的代码 diff现在至少要拆成四个层级代理接收到的任务定义、代理产出的代码特征、机器层面的自动化预审、以及最终的人类责任兜底。缺了任何一层AI 代理带来的增量速度都会反噬工程质量。1. AI 编码代理进团队最容易被忽视的变化审查对象换了1.1 从自动补全到自主执行代码来源方式变了先看一个基本区别。以前大家都用自动补全类工具模型只负责把光标后面几百个 token 续写出来写哪一行、改哪个文件、为什么这么写仍然是工程师自己的决定。这种工具再强也不过是“更强一点的智能输入法”代码审查的流程不需要做任何调整。AI 编码代理则完全不同。你丢给它一个 issue它会自己做任务拆解自己决定先读哪几个文件自己设计改动方案遇到编译错误会自己修甚至会顺手补一批单元测试最后直接开出一个可以合入的 PR。整个过程里人类只在开头写任务描述、在结尾做 review。这意味着代码的“作者意图”从人转移到了 prompt 里那几行描述。人写代码时脑子里有业务背景、有团队约定、有上一轮讨论中未被写进文档的细节代理写代码时它脑中的全部上下文就是仓库里的代码和任务描述里那几行字。它产出的代码哪怕每一行都符合语法规范也可能在需求语义上差了一大截。1.2 传统“看 diff 反推意图”的审查模型正在失效传统代码审查建立在一个隐性前提上审阅者读到的 diff是另一个人类在自己完整理解业务上下文之后做出的修改reviewer 的任务是沿着代码反推作者的思路确认这个思路和需求是一致的。这个模式在过去非常有效因为人脑会主动补全那些没有写进代码的约束某个接口不能随便改是因为下游支付在依赖它某个配置项不动是因为线上告警阈值跟它绑定某个“笨拙但正确”的写法不能优化是因为历史事故的教训。这些上下文永远不会写进任何一行代码它们只存在于参与讨论的人的记忆里。代理没有这个记忆。它按字面意思理解任务。我在实际协作中遇到过一个典型例子业务方希望能把某个超时重试的间隔从 2 秒调成 5 秒代理正确地找到了超时参数正确地修改了所有调用方也正确地更新了测试。但问题出在真正线上出故障的是另一个中间层那个改出来的参数根本没被链路走到。代码层面的 diff 无可挑剔业务层面的判断却彻底错了。传统的“从代码反推意图”在这里完全失效因为代码没有错错的是任务边界。1.3 把代理当“初稿实习生”而不是“会写代码的同事”我后来给团队定的一个基础认识是不要把一个代理当成能独立负责模块的工程师它更像一个能力很强、速度极快、但没有业务判断力、也不好意思开口问问题的实习生。如果你让一个实习生去做“优化一下接口性能”他可能真的会把整个接口重写成异步批量处理版本哪怕这个接口只是一天调用几十次的内部接口。代理也一样它不会主动问你“性能瓶颈真的是这里吗”“改动范围能不能只控制在这个函数里”。它只会把任务描述里能读到的部分执行得极其完整然后在无关的地方做出华丽但多余的修改。想清楚这一点之后代码审查的整个思路就变了。我们不能只审它最终提交了什么还要审它当初被要求做什么、它自己打算怎么做、它实际在哪里动了手。这三件事必须串成一条线。2. 要补的第一层审查关口前移到“任务与执行意图”2.1 为什么必须在代理开工前锁住需求边界很多团队让代理干活的方式非常原始把 issue 标题复制进对话然后按回车。对这个做法我建议尽早停掉。因为代理的“效率优势”恰恰意味着它会在错误方向上跑得非常远而且它产出的代码越完整人类审阅时越容易产生“已经做得这么完整了应该没啥问题”的判断。更麻烦的是如果代理在错误的方向上把代码写完了重新返工的成本并不只是让代理再改一遍。人工 review 需要重新理解一遍已经合入 PR 的实现逻辑测试需要重新调整依赖这个模块的下游代码可能已经被带动着改了。一次方向错误造成的连锁返工经常比人工从零实现还要贵。所以代码审查的第一层绝不能从 PR 提交之后才开始而要在代理接收到任务的那一刻就开始。团队里要有一个人对“任务描述是否足够精确”负责并且这个人不一定是写 prompt 的人更应该是真正理解业务需求的工程师。2.2 花 10 分钟写一张“代理任务卡”能省下大量返工时间我团队里现在要求所有交给 AI 编码代理的独立任务必须附带一张简单的任务卡。最开始写的时候大家觉得多此一举跑了两个月之后所有人都承认这是性价比最高的一道审查防线。任务卡不需要复杂但四个字段必须齐全目标一句话说明这个改动要解决什么业务问题而不是“把接口延迟降下来”这种含糊表述影响范围明确允许改动的模块、文件或函数边界以及明确不允许触碰的代码区域验收标准用可验证的方式描述“怎么算做完”比如“在 X 场景下响应耗时低于 Y 毫秒原有异常重试逻辑保持不变”不做什么显式列出代理容易顺手做的多余事项比如“不要重构调用方”“不要新增配置项”“不要修改数据库索引”。写这张卡的过程本身就是在做需求澄清。很多时候工程师写完验收标准才发现自己原本的想法根本没想清楚。这比代理跑完代码之后再来争论要便宜得多。2.3 审查 PR 时先做三层对齐再进入代码行任务卡写好之后代码审查的流程也需要跟着调整。我的习惯是拿到含代理产出的 PR 时先不看具体代码改动先做三层对齐第一层任务卡里的目标和 PR 描述里的目标是否一致。如果 PR 描述里出现了任务卡没有提到的额外改动意图基本可以判定代理发生了范围蔓延先让提交者解释清楚。第二层任务卡允许的影响范围和 git diff 涉及的文件列表是否一致。文件数量超出预期 30% 以上就应该停下来逐一看新增文件而不是直接点进单个文件里抠细节。第三层代码改动是否真的对验收标准产生了可观测的影响。很多代理会写出非常完整的代码结构但真正被业务逻辑命中的路径只有其中一条。审阅者需要从验收标准反推代码路径确认改动命中了目标场景。这三层对齐每层花不了几分钟但能过滤掉相当大比例“代码没问题但需求没接上”的跑偏型 PR。代理时代一个残酷的事实是代码 review 如果只看代码质量就永远发现不了需求语义层面的错位而这类错位恰恰是代理代码事故的最大来源。3. 要补的第二层针对 AI 产物特征的专项体检3.1 AI 代码不是“bug 更多”而是错误种类变了把审查关口前移到任务层之后回到代码本身还需要一套和传统代码审查不一样的检查思路。很多人以为 AI 编码代理生成的代码会像新手程序员的代码一样到处是低级语法错误、明显逻辑漏洞、变量命名混乱。实测下来情况恰恰相反——这类问题很少出现因为模型在被训练时已经吸收了海量高质量代码基础的规范感比大多数初级工程师都要强。AI 代码真正让团队翻车的是另一类错误我把它们归纳为“看起来很对但实际站不住”的错误调用一个并不存在的函数却因为库名相近显得很合理使用了一个早已废弃的依赖版本接口编译恰好通过但运行行为已经变了为了满足“覆盖率要提升”的隐性要求补了一堆断言松散、不验证真实行为的测试或者把一段上下文复制错位导致同一逻辑在三个文件里各实现了一遍。这些错误有两个共同点。第一它们在静态检查层面不显现单看每一处代码都有合理的解释。第二它们非常依赖“外部世界”的约束来判断——真实 API 是否存在、依赖版本是否还维护、业务逻辑是否真的要求这一步。所以传统那种靠审阅者经验快速扫一遍 diff 的做法很难抓住它们。3.2 代理写得太“整洁”反而会干扰人眼判断这里有个很微妙但非常现实的干扰项AI 生成的代码风格往往比团队平均水平更整齐。统一的缩进、合理的空行、规范到无趣的命名代码读起来非常顺畅。而这种流畅感会让人的大脑自动降低警惕——你会觉得一个把代码写得这么干净的人思考应该也很严密。我踩过这个坑。一次 review 中我面对一段代理生成的代码结构清晰、注释到位、变量命名毫无破绽读下来的第一反应是“这代码质量可以”。直到我同事提醒我这段代码把原来的运行时配置读取改成了编译期常量而这会导致线上某些环境的行为发生变化。我意识到自己已经被表面的整洁感带走了注意力。从那以后我要求自己在审代理代码时必须有意识地把“风格”这件事完全交给机器去检查。人眼只做语义判断这段逻辑在真实输入下会怎么走分支条件覆盖了哪些边界改动会影响到哪些调用方人脑的注意力是稀缺资源不应该浪费在机器能轻松处理的事情上。3.3 用一张“五查清单”代替凭感觉做代码审查为了对抗“整洁代码带来的麻痹感”我参照一些同行的做法沉淀了一张面向 AI 代理产出的专项审查清单。它不一定能覆盖所有问题但实际用下来命中率相当高检查点 | 主要风险表现 | 处理动作 需求语义对齐 | 改动按字面完成但遗漏了业务边界条件 | 对照任务卡里的验收标准逐项打勾 范围蔓延 | 出现任务卡未允许的无关重构或新增 | 用 git diff --stat 对比计划范围强制撤销无关改动 幻影 API 与废弃依赖 | 调用了模型中“虚构但听起来合理”的函数或老库旧接口 | 依赖 CI 构建之外人工抽查 import 和外部调用点 测试有效性 | 测试断言过宽或过窄mock 过多无法证明真实行为 | 手动改变目标行为确认相应测试会失败 安全与敏感信息 | 硬编码 token、打印敏感字段、权限设计过宽 | 开启 secret scan并对 diff 做敏感关键词抽查这张清单不是给审阅者增加负担恰恰是帮助他们把注意力从“读代码找感觉”变成“按图索骥找风险”。在代理代码已经开始批量进入 PR 流的阶段凭感觉审查的风险会越来越高——因为 AI 产物太擅长制造“感觉上没问题”的表象。3.4 额外注意“过度补测试”这个隐蔽坑代理补测试的能力远远强于一般人的预期但这里藏着一个非常隐蔽的坑它擅长生成“有意义外观”的测试而不是真正验证行为边界的测试。举一个我朋友团队的实际案例。代理修改了一个订单金额计算函数顺手补了五个看似相关的测试用例。review 时大家看到新测试覆盖了正常金额、折扣金额、零元订单觉得覆盖率做得挺好就合入了。结果两周后线上出现满减金额计算错误排查时才发现代理补的那五个测试里压根没有覆盖“折扣后金额需要向上取整”这个核心规则所有断言都基于修改前的实现逻辑写成换句话说测试只是复述了代码没有验证需求。所以我对代理补的测试有一条硬性要求review 时试着手动改一下被测函数的核心逻辑如果测试没有失败说明这个测试是无效的。这比看覆盖率数字准得多。再进一步要求 PR 描述里必须说明新增测试对应的是任务卡里的哪一条验收标准对不上的测试宁可删除。4. 要补的第三层机器前置兜底让人专注语义判断4.1 审查量激增后自动化不是可选项而是必需品代理进入团队之后最直接的变化是 PR 数量和单个 PR 的改动规模都在上升。以前一个工程师一周提交两三个 PR现在一个代理一个晚上能产出三四个改动完整的 PR而且它不需要睡觉、不需要开会、不会在中午排队等咖啡。这是好事但对代码审查来说却是实打实的压力。人工审阅速度不可能线性跟上于是团队会出现两种典型的退化一种是被迫压缩每个 PR 的审查时间草草扫一眼就合入另一种是 PR 堆积成山合入速度成为瓶颈大家开始在流程上寻找捷径。说实话这两种都是事故温床。解法只有一个方向凡是机器能稳定判断的维度全部交给自动化前置执行。传统团队里linter 和格式化检查本来就是自动跑的但面对代理代码自动化的范围要明显扩大。至少包括静态缺陷扫描、依赖供应链检查、密钥与敏感信息扫描、构建与测试流水线这四类。这些检查不是“提升审查质量”的加分项而是避免人工疲劳的兜底层。4.2 从 diff 到提交轨迹cobot 这类工具的切入点传统 PR 审查工具基本都是围绕 diff 设计的它的基本假设是“代码改动的最终状态是唯一需要关注的对象”。但前面已经说过代理代码的问题常常不在最终状态的代码行里而在改动路径和意图的错位里。这两年出现了一批新的辅助审查工具我特别关注的是 cobot 这类偏“提交轨迹分析”方向的产品。它们的切入点不是“代码改了什么”而是“这次提交到底想干什么”工具会把 PR 拆解成一组带有意图标签的提交轨迹分析哪些文件改动的目的是一致的哪些改动偏离了主目标然后把可疑区域标注给人类审阅者。这种“把人直接引向风险点”的做法比让人从几百行 diff 里大海捞针高效得多。需要说明的是这批工具本身还在快速迭代我并不是在推荐某个具体产品。真正值得参考的是它们的思路审查代理代码的关键不是逐行比对最终代码而是理解这次改动的行为意图再对照人类最初定义的期望目标找出偏差位置。机器可以先做偏差定位人再做业务语义判断。4.3 自动化审查接入主干的推荐流程我的团队实践下来一套可行的自动化与人工分工流程大致是这样的第一个阶段是 CI 基础检查。代码推上去之后编译、单测、linter、格式检查照常执行完全不让人介入。代理生成的代码在这阶段通常能顺利通过因为写出可编译、可运行的代码恰恰是它的长项。第二个阶段是专项机器扫描。这里会跑依赖安全扫描、secret 扫描以及前面提到的 cobot 这类提交轨迹分析工具。扫描结果会作为注释直接贴在 PR 对应代码行上同时生成一个总的“风险摘要”让 review 的人一进来就知道机器看过哪些方面、发现了哪些疑点。第三个阶段才是人工 review。人的精力只需要放在机器给出标记的区域加上“任务卡是否对齐、边界是否守得住、测试是否验证真实需求”这几个高层问题上。这样每个 PR 的人工耗时可以控制在十五到二十分钟以内而不是被动的逐行通读。运行这套流程之后我最深的体会是自动化真正的价值不是“替代人做决定”而是把人的注意力从低价值信息中解放出来让人有时间去思考那些只有人才能想清楚的问题。团队代码审查的核心资产是资深工程师的语义判断力这种判断力不应该消耗在“发现拼写错误”这种毫无价值的事情上。5. 要补的第四层责任边界与团队机制5.1 代理代码必须有人承担最终责任技术流程搭得再好最后还是要落到责任边界上。我见过一些年轻团队代码是 AI 代理写的PR 是 AI 代理提交的review 是某个工程师随便点了通过出了事故之后所有人面面相觑找不到任何一个人能说清楚这段代码当初为什么这么改。AI 编码代理不可能成为责任主体哪怕它写得再多、再快这一点必须写进团队的协作规则。每个包含代理产出的 PR都必须有一个明确的“提交负责人”这个人对改动最终负责。他不需要每一行都是自己写的但他必须能够解释清楚任务的目标是什么改动为什么采用当前方案哪些边界被人为确认过如果出了问题从哪里回滚。这个要求实际上是在逼提交负责人把需求理解到位。代理只是执行器人类要当解释器。如果提交负责人无法解释清楚某段逻辑那这段代码就不应该合入主干。5.2 通过分支保护、改动拆小和回滚能力限制风险责任之外还要有操作层面的硬约束。代理的效率很高给了我们快速产出的能力但这种能力如果没有边界控制就会变成快速制造问题资产的能力。我建议至少设立四条机制。第一关闭向主干的直接推送所有改动必须走 PR。第二对敏感目录或核心服务增加额外审批人不能只靠一个普通 reviewer 的通过就合入。第三一个代理提交的 PR 改动行数超过一定规模比如 500 行时必须拆成多个更小的 PR逐个 review避免大爆炸式提交淹没审查注意力。第四任何涉及线上行为变化的改动默认要求放在 feature flag 后面万一现场出事直接关闭开关回滚而不是紧急发版修复。这四条机制本质上都是“限制单次错误的影响半径”。AI 代理可以更早地写出错误的完整版代码我们就必须让错误在被发现时只波及一小块区域。这比寄希望于“代理不会犯大错”可靠得多。5.3 用返工率而不是 AI 占比来衡量代理使用效果最后想聊聊怎么衡量这套机制的效果。很多团队喜欢统计“本月 AI 生成的代码占比”然后把这个数字当成团队现代化程度的指标。我觉得这个指标不但没用还会误导大家去追求代理想产出的越多越好的假象。更值得关注的是两个指标一个是“代理 PR 的返工率”也就是合入后因为需求理解偏差被迫回滚或重做的比例另一个是“review 中发现的语义层问题数量”比如需求定义错误、边界判断失误、测试无效这类的数量。如果前者在上升说明上游任务定义和任务卡机制没有执行到位如果后者在上升反而说明代码审查补位开始起作用了。我曾经在团队里连续统计了八周的返工数据发现返工率最高的场景几乎都集中在“任务目标不清楚但代码写得很完整”的 PR 上。这让我确信了一件事AI 编码代理把团队的生产速度上限拉高了但同时也把需求澄清和执行计划的能力变成了新的瓶颈。瓶颈在哪里代码审查就该在哪里补层。6. 实战中会遇到的问题和排查记录6.1 现象一代理 PR“看起来全对”问题在集成阶段才爆发这是最多团队遇到的第一个坑。代理生成的 PR 在代码层面无明显 bug单测也过了reviewer 自己在本地跑也没发现问题一合入主干反而在集成阶段炸了。这时候的排查思路其实非常明确。第一步先不要去看具体报错栈先回看任务卡和 PR 描述确认代理最初理解的业务目标和实际上线链路是否一致。第二步检查改动影响范围是否超出任务定义重点看是否动了其他模块依赖的公共函数或数据结构。第三步直接通过 feature flag 或回滚操作把改动下线恢复线上稳定再慢慢复盘根因。经验是这类事故的根源八成不在“代码写错”而在“目标任务理解错”或“影响范围超限”也就是我前面说的第一层和第二层审查没有做扎实。补上了任务卡和范围检查之后这类问题会显著减少。6.2 现象二AI 把 PR 产量翻倍人工审查排队到崩溃代理效率上来之后PR 数量短期内翻倍几乎是必然的。如果人工审阅速度跟不上队伍就会在“快速合入”和“流程排队”之间挣扎。我的做法是双管齐下。一边严格控制接入代理的数量刚开始只允许两到三个有经验的工程师把代理用于小范围改动等流程跑顺后再逐步放开。另一边把第三节和第四节提到的专项检查、自动化前置都搭完让机器在 PR 进入人工队列之前就过滤掉那些确定性的问题。说到底人工 review 队列的长度应该由团队的语义判断带宽决定而不是被机器的产出速度牵着走。6.3 现象三自动化扫描告警太多最终被选择性失明自动化扫描刚接入的时候大家会很兴奋地看每一个告警但随着代理 PR 增多告警数量开始失控reviewer 渐渐对扫描结果视而不见这比没有扫描更危险。解决这个问题的思路不是继续加规则而是做告警收敛。我的经验是给扫描工具设优先级能直接阻断合入的严重问题比如密钥泄露、依赖漏洞必须置顶显示且不可忽略低置信度的风格建议直接折叠进一个“供参考”的折叠区不让它们占用主注意力。cobot 这类做提交轨迹分析的工具之所以值得关注也是因为它的产出形式聚焦于“可疑改动区域”而不是列出一百条泛泛的告警这种信息密度对缓解告警疲劳很有效。6.4 现象四没人说得清一段代理改动是谁的责任代理 PR 合入后被发现有问题却找不到能解释这段代码的人。这种混乱如果持续存在再好的流程也会被绕过。在推动代理进团队之前就应该把“每个 PR 必须有提交负责人”这条规则定下来形成一种肌肉记忆。我们现在的做法是提交负责人的名字必须出现在 PR 描述、合入审批、以及事后任命的 on-call 页面里。没有负责人署名的代理 PR 不允许进入人工 review 队列直接在入口处打回。这个过程不需要什么复杂系统规则清晰、执行严格就可以。6.5 团队落地顺序小结如果团队刚刚开始让 AI 编码代理参与日常开发我建议不要直接套过来所有机制否则流程会显得很重推行起来阻力很大。更平滑的顺序是先要求“代理任务卡”和“提交负责人”这两个最基础的动作跑一两个星期然后接入自动化扫描和提交轨迹分析工具把机器能看的都交给机器等大家适应了再专门给代理 PR 加一道专项审查清单。一步一步来比一次性推十条规定要有用得多。我在实际管理代码审查流程的过程中最明显的一个感受是AI 编码代理真正改变的不是我们写代码的速度而是团队“确认代码是否值得合入”时所需的那一圈上下文。过去这些上下文散落在每个工程师脑子里而现在它们必须被显式地写到任务卡里、PR 描述里、自动化规则里。这听起来像多了一堆流程负担但如果流程设计得当负担本身也是收益——因为你在补上的本来就是过去靠老师傅个人经验在扛的那一层。