AI 写出来的代码,能跑,CI 也绿了。
但如果你解释不清它为什么这么写,要不要合并?开发者 Vini Brasil 在一篇文章里给出的答案很硬:不要合并。哪怕它看起来已经完成任务。
他讨论的不是同事提交的 PR,而是自己让 coding agent 完成任务后留下的 git diff。更反常的是,他已经用了 plan mode,也会拆任务、小步提交。可一旦改动超出自己的理解范围,review 还是会变成认知过载。
这篇文章真正有意思的地方在这里:AI 编码的瓶颈,正在从“能不能生成代码”,转向“人类还能不能判断这段代码该不该进系统”。
能跑,不代表团队能拥有
作者并不反对 AI 编程。
他的判断更像一个老工程问题的新版本:代码不是写完就结束,而是从合并那一刻开始,被团队长期维护。AI 让实现提前发生,但没有替工程师完成问题理解、方案取舍和复杂度控制。
所以他会拒绝一些“已经工作”的 AI 代码。拒绝标准不是模型名,也不是生成速度,而是自己能不能承担这段代码进入系统后的后果。
| 该拒绝的信号 | 表面看起来 | 真正的问题 |
|---|---|---|
| 说不清方案 | 功能跑通,但无法用自己的话解释 | 维护责任失控 |
| diff 过大 | 一次改动覆盖太多文件 | review 成本上升,回滚变难 |
| 过早抽象 | 先搭框架,再找需求匹配 | 复杂度被提前固化 |
| 代码绕远 | CI 通过,但逻辑难读 | 后续排障和交接变慢 |
| 信输出超过信理解 | 依赖模型判断“应该没问题” | 人类变成橡皮图章 |
这里有个细节很重要。作者提到,第一次用 AI 做大任务,结果常常会被丢掉;第二次反而更好。
不是模型突然升级了。
更可能是人变清楚了。第一次生成让工程师看到了问题边界、坑位和错误方向。到了第二次,人能给出更好的约束,也更知道哪些方案不该要。
这说明 AI coding agent 需要优秀工程师引导。它不是把工程判断外包出去,而是把工程判断提前暴露出来。
CI 通过,只证明它通过了已有检查
很多团队容易被绿色 CI 安慰。
但 CI 验证的是已有测试、lint、构建流程能不能通过。它不负责证明抽象是否合适,也不负责判断边界条件是否完整,更不负责告诉你这段代码三个月后还好不好改。
AI 代码尤其容易卡在这个缝里。
它可以很快补测试、修 lint、让流水线变绿。可它也可能把复杂度藏进更深的调用链、更泛的抽象层,或者一个看似通用、其实没人需要的框架里。
这也是 Copilot、Cursor、Claude Code 这类工具变得更像“会改项目代码的同事”之后,团队必须面对的现实约束:工具越能动手,review 越不能只看结果。
AI review 可以帮忙找明显问题,比如遗漏文件、简单 bug、风格不一致。但它不能替代强制人工 review。原因很朴素:线上故障、接口演进、下一个需求,最后还是人来负责。
对比一下,问题会更清楚:
| 检查方式 | 擅长什么 | 不擅长什么 |
|---|---|---|
| CI | 验证已有测试和构建规则 | 判断设计质量、抽象边界 |
| AI review | 快速扫常见错误和一致性问题 | 承担维护责任、理解业务取舍 |
| 人工 review | 判断方案是否该进系统 | 需要时间,也会受认知负担限制 |
所以,“CI 通过”只能作为入门门槛。
真正的合并门槛应该再往前一步:提交者能不能解释方案,reviewer 能不能判断取舍,团队能不能承受这段代码带来的长期成本。
受影响最大的是写代码的人和合并代码的人
对正在使用 AI coding agent 的软件工程师,这件事意味着一个很具体的动作:不要把 agent 生成结果直接当成自己的方案。
更稳妥的做法,是限制单次 diff,要求自己写清楚方案取舍。看不懂的部分不要靠“模型应该懂”带过去。必要时直接丢掉,带着第一次暴露出来的问题重新生成。
这会让人不舒服。因为表面上,AI 已经把代码写完了;实际上,工程师还要补上理解、筛选和解释的账。
对技术负责人,重点不是禁止 AI,也不是鼓励大家多生成代码。
更现实的动作有几类:限制单次 agent diff 的规模;要求 PR 描述写清“为什么这样改”;对新增抽象设置更高门槛;核心模块保留人类 reviewer 的否决权;AI review 只能做辅助,不应成为免人工审查的理由。
这不是流程洁癖。
如果团队只奖励“更快提交”,不约束“更容易理解”,AI 带来的速度会转成另一种排队成本:代码已经写完,人还在排队弄明白它为什么存在。
接下来最该看的,也不是哪款模型又快了多少。
更值得看的变量是三个:团队能不能把任务拆小;工程师能不能解释 AI diff;负责人敢不敢拒绝已经通过 CI、但设计说不清的代码。
回到开头那一幕:CI 绿了,功能也跑了。问题并没有结束。真正的问题刚开始——这段代码,团队到底能不能接得住。
