
AI 真正改变软件工程的地方,不是“代码写得更快”,而是让我们第一次正面撞上一个更棘手的问题:代码生产速度已经超过了代码验证速度。
这件事在普通应用里已经足够麻烦,在 Kubernetes、云原生平台、IaC、分布式存储、Service Mesh、调度系统、数据库、中间件这类大型基础设施项目里,则会直接变成生产事故。
因为基础设施代码有一个残酷特点:基础测试通过,不代表生产环境安全。
单元测试能覆盖函数逻辑,集成测试能覆盖已知链路,CI 能拦住格式错误和一部分回归。但真正让客户线上崩溃的,往往不是 happy path,而是那些测试环境很难复现的缝隙:并发竞态、资源泄漏、权限差异、配置漂移、网络抖动、灰度期间的版本不一致、Helm/Terraform 渲染后的真实运行时行为、跨组件协议细节、历史兼容性、以及某个老 maintainer 脑子里的 tribal knowledge。
AI 代码生成让这个问题被放大了。
过去一个工程师写一天代码,提交一个 PR,reviewer 至少还能跟上阅读节奏。现在一句“帮我重构这个模块”,几秒钟生成上千行改动。代码产出变快了几十倍,但人类理解代码的速度没有变。更危险的是,AI 写出的代码常常不是一眼就错的代码,而是看起来很正确、结构很完整、命名很规范、注释也很体面的代码。
这类代码最难审。
它可能不是 bug,而是“正确的废话”:多余的抽象、多余的异常处理、多余的封装、多余的 fallback、多余的配置项。它们不会立刻炸掉 CI,却会让系统复杂度上升,让未来的 review、排障和演进成本变高。更麻烦的是,AI 生成代码时的推理过程已经消失了。人类 reviewer 看到的是结果,却不知道它为什么存在、权衡过什么方案、忽略了哪些约束。
所以,大型基础设施项目面对 AI,不应该只讨论“能不能让 AI 写代码”,而应该讨论另一件更关键的事:AI 时代,代码应该如何被测试、审查和合入。
一、基础设施项目的失败,不常发生在测试覆盖到的地方
大型基础设施项目和普通业务系统不一样。它们不是只服务一条明确业务链路,而是作为其他系统的地基存在。
一个 Kubernetes Operator 的小改动,可能影响 CRD reconcile 行为;一个 Terraform module 的默认值变化,可能让生产集群权限扩大;一个调度器策略调整,可能在小规模测试集群里表现良好,却在客户真实负载下造成资源饥饿;一个重试逻辑看似增强了韧性,却可能在下游故障时制造雪崩。
这类问题基础测试很难拦住,原因很具体:
- 边缘 case 不可穷举:基础设施项目面对的是组合爆炸,不是固定业务流程。
- 并发问题依赖时序:race condition、锁粒度、watch/cache 不一致,通常只在特定压力下出现。
- 资源问题依赖环境:CPU、内存、FD、连接池、磁盘 IO、API Server QPS,在 dev 环境和 prod 环境完全不同。
- IaC 的真实行为发生在渲染之后:YAML、Helm、Kustomize、Terraform plan/apply 之后才暴露实际权限、网络策略和资源限制。
- 分布式系统失败不是单点错误:真正的问题常来自重试、超时、幂等、降级、版本兼容和跨服务依赖。
- 历史约束不在代码里:很多“为什么不能这样改”的原因藏在过去的 incident、issue、PR 争论和 maintainer 经验里。
AI 的加入会进一步增加这些盲区。它擅长补全局部模式,却不天然理解系统历史;它能写出看似完整的错误处理,却不一定知道这个项目里某个错误码必须透传;它能生成漂亮的 Terraform 模块,却不一定理解目标云厂商 IAM、网络和配额的生产限制。
因此,“测试通过”在基础设施项目里只能说明一件事:这个改动没有破坏已知检查。它不能证明这个改动在真实生产拓扑里安全。
二、AI 代码最大的风险,不是幻觉,而是验证债务
很多人谈 AI 编程,第一反应是幻觉。幻觉当然存在,但在严肃工程里,更系统性的风险是验证债务。
所谓验证债务,就是代码生成得越快,需要被理解、证明和维护的东西越多。PR diff 增大,reviewer 疲劳;抽象层数增多,未来排障困难;测试没有同步增加,CI 仍然绿;最终风险被推迟到生产环境兑现。
AI 代码还有一个特殊问题:缺少可追责的决策过程。
实习生写错代码,你可以问他为什么加这把锁、为什么选择这个缓存策略、为什么吞掉这个错误。答案也许不成熟,但至少存在一个可以被追问、被教育、被修正的人。AI 生成的代码不一样。它给你的是最终产物,不给你可靠的设计动机。reviewer 被迫做逆向工程:从一堆看起来合理的实现里反推它到底想解决什么问题。
这会让 Code Review 从“协作理解”变成“代码法医”。
在基础设施项目里,这尤其危险。因为真正重要的不是某一行代码是否语法正确,而是它是否改变了系统契约:
- 是否改变了默认行为?
- 是否影响升级兼容性?
- 是否破坏了已有配置语义?
- 是否增加了控制面压力?
- 是否改变了失败模式?
- 是否把局部失败扩大成全局失败?
- 是否让用户在生产环境里更难回滚?
这些问题不是 lint 能完全回答的,也不是基础单测能完整证明的。它们需要上下文、经验和系统推理。
所以 AI 时代的合入哲学不能是“让 AI 多写,人类少看”。正确方向应该是:让机器承担可机械化验证,让人类回到真正高价值的判断。
三、AI Review 不是替代人类,而是第一道自动化防线
合理使用 AI 做 PR Review,最好的定位不是“AI 批准合并”,而是“AI 帮人类提前扫雷”。
对于大型开源基础设施项目,更适合采用多层 review:传统工具先做确定性检查,AI agent 再做语义和上下文检查,人类 maintainer 最后判断架构、风险和项目方向。
一个较合理的流水线可以长这样:
flowchart TD
A[PR 提交] --> B[格式 / Lint / 类型检查]
B --> C[单元测试 / 集成测试 / E2E]
C --> D[安全扫描 / 依赖扫描]
D --> E[IaC / K8s Policy 检查]
E --> F[多 Agent AI Review]
F --> G[风险摘要与阻塞建议]
G --> H[Maintainer 人工 Review]
H --> I{是否高风险变更}
I -->|否| J[合入]
I -->|是| K[额外测试 / 设计记录 / 多人批准]
K --> J
这里有两个关键点。
第一,AI 不应该替代 Semgrep、Bandit、Trivy、Checkov、OPA/Gatekeeper、依赖漏洞扫描、类型检查、单测和 E2E。传统工具的优势是确定性、可复现、可解释。能用规则稳定发现的问题,就不要浪费大模型 token。
第二,AI 应该做传统工具不擅长的事:读 diff、读上下文、理解意图、识别跨文件影响、追问缺失测试、指出潜在失败模式、总结风险,让 maintainer 更快进入高价值判断。
这也是 Cloudflare 这类大规模工程团队实践里值得借鉴的方向:不是让一个通用 AI 评论 PR,而是把 review 拆成多个专业 agent,再由协调层去重、分级、决定哪些意见值得阻塞。
四、面向基础设施的多 Agent Review 应该怎么分工
大型基础设施项目的 AI Review 不应该只有一个“代码质量机器人”。一个通用 agent 很容易变成会说漂亮废话的 reviewer:指出命名、建议注释、重复 lint 的发现,却没有抓住真正危险的地方。
更好的方式是按风险域拆分。
1. Security Agent
重点看权限、注入、secret、认证授权、供应链、依赖升级、容器镜像、Kubernetes RBAC、Terraform IAM、网络策略。
它应该问:
- 是否扩大了默认权限?
- 是否把 secret 写进日志、配置或错误信息?
- 是否引入了不安全默认值?
- 是否让低权限用户影响高权限资源?
- 是否绕过了现有 policy?
2. Resilience Agent
重点看错误处理、超时、重试、幂等、降级、熔断、回滚、部分失败。
它应该问:
- 下游超时时会发生什么?
- 重试是否可能放大故障?
- reconcile 是否幂等?
- 中途失败会不会留下脏状态?
- 错误是否被吞掉,导致用户以为操作成功?
3. Concurrency Agent
重点看锁、goroutine、channel、watch/cache、共享状态、异步任务、竞态窗口。
它应该问:
- 是否存在读写竞态?
- 锁粒度是否导致死锁或性能瓶颈?
- goroutine 生命周期是否可控?
- context cancel 是否被正确传播?
- informer/cache 延迟是否会导致错误决策?
4. IaC / Runtime Agent
重点看 YAML、Helm、Kustomize、Terraform、Kubernetes manifest 的运行时后果。
它应该问:
- 渲染后的资源限制是否合理?
- 默认值是否适合生产环境?
- 是否缺少 readiness/liveness/startup probe?
- PodDisruptionBudget、affinity、toleration 是否符合高可用目标?
- plan/apply 后是否会破坏已有资源?
5. Compatibility Agent
重点看 API 兼容、配置兼容、数据迁移、版本升级、灰度发布、回滚。
它应该问:
- 是否改变了公开 API 或 CRD schema?
- 旧配置是否仍然可用?
- 升级路径是否明确?
- 新旧版本混跑会怎样?
- 回滚是否安全?
6. Test Gap Agent
重点不在“生成更多测试”,而在发现缺失的测试类型。
它应该问:
- 这个 PR 改变了哪个失败路径?
- 是否有负向测试?
- 是否覆盖了并发和资源限制?
- 是否需要 fuzz、chaos、load、upgrade/downgrade 测试?
- 是否需要基于历史 incident 增加回归用例?
最后由一个 Coordinator Agent 统一去重、聚合严重性、给出 blocking / non-blocking / question 三类结论。否则多个 agent 会把 PR 评论区变成噪音场。
flowchart LR
D[PR Diff + Repo Context] --> S[Security]
D --> R[Resilience]
D --> C[Concurrency]
D --> I[IaC Runtime]
D --> P[Performance]
D --> T[Test Gap]
S --> O[Coordinator]
R --> O
C --> O
I --> O
P --> O
T --> O
O --> M[结构化 Review 报告]
五、AI Review 必须吃到“强上下文”
没有上下文的 AI Review,只是一个会讲工程常识的陌生人。
它可能说得都对,但不一定对这个项目有用。对于大型基础设施项目,AI 必须接入项目上下文,否则很容易误报、漏报,或者提出违反项目历史设计的建议。
上下文至少应该包括:
- 仓库根目录的
AGENTS.md或等价工程约定。 - 构建、测试、lint、E2E、release 命令。
- 架构文档和模块边界。
- 公开 API / CRD / 配置语义。
- 历史 incident 和 postmortem。
- 过去被拒绝的设计方案。
- 关键 maintainer 的 review 评论模式。
- 已知兼容性约束和弃用策略。
- 生产环境 SLO、资源限制、部署拓扑。
我会强烈建议开源基础设施项目在仓库根目录维护一个 AGENTS.md。它不是给人看的 README 替代品,而是给 AI agent 的操作边界:怎么跑测试、哪些目录不能乱改、哪些变更必须写设计文档、哪些 API 不能破坏兼容、哪些文件生成后不能手改、什么情况必须请求 maintainer 人工判断。
一个最小可用版本可以包含:
# AGENTS.md
## Required Checks
- Run unit tests for touched packages.
- Run integration tests when controller/reconcile logic changes.
- Run IaC policy checks when manifests, Helm charts, or Terraform files change.
## High Risk Changes
Require human maintainer approval when changing:
- Public APIs, CRDs, config defaults, auth/RBAC, upgrade logic.
- Retry, timeout, cache, reconciliation, scheduling, failover behavior.
## Review Focus
AI reviewers must check:
- Failure paths, concurrency, resource leaks, rollback safety.
- Backward compatibility and production runtime impact.
- Missing tests for edge cases and negative cases.
## Forbidden Patterns
- Silent fallback that hides user-visible failures.
- Broad permissions as default.
- Unbounded retries or goroutines without cancellation.
这类文件越具体,AI Review 越不容易飘。
六、测试哲学也要升级:从覆盖率转向失败模式
AI 可以帮助补测试,但“让 AI 多写测试”本身不是答案。大型基础设施项目真正需要的是从覆盖率思维转向失败模式思维。
覆盖率回答的是:哪些代码被执行过?
失败模式回答的是:系统在什么条件下会坏?坏的时候是否可控?用户是否能理解?能否自动恢复?能否安全回滚?
对于基础设施项目,PR 模板和 AI Review 都应该要求作者说明测试覆盖了哪些失败模式,而不是只贴一句“tests passed”。
mindmap
root((基础设施 PR 测试))
正常路径
单元测试
集成测试
E2E
失败路径
下游超时
权限不足
配置缺失
部分资源创建失败
并发路径
多实例 reconcile
watch 延迟
竞态窗口
资源路径
内存限制
API QPS
连接池耗尽
升级路径
旧版本到新版本
新旧混跑
回滚
IaC 路径
plan diff
policy-as-code
渲染后 manifest
AI Review 在这里的价值很大。它可以根据 diff 自动生成一份“测试缺口报告”:这个 PR 改了哪些行为,已有测试覆盖了哪些路径,还缺哪些 negative case、并发 case、升级 case、IaC runtime case。
但最终是否必须补测试,仍然应该由人类 maintainer 根据风险决定。
低风险文档改动不需要重型流程;核心调度逻辑、鉴权、升级、数据一致性、IaC 默认值变化,则必须提高门槛。
七、合入哲学:PR 不只提交代码,还要提交决策
AI 时代,高质量 PR 的定义要变。
过去一个 PR 只要代码清晰、测试通过、review 通过,就可以合入。未来在大型基础设施项目里,这不够。尤其当 PR 明显使用 AI 大量生成或重构时,它还应该提交“决策材料”。
至少包括四件事:
- Intent:这个 PR 到底解决什么问题?
- Alternatives:为什么不选择其他方案?
- Risk:最可能出问题的地方在哪里?
- Validation:用什么证据证明它不会破坏生产?
这不是形式主义。它是在弥补 AI 代码缺失推理过程的问题。
一个基础设施 PR 模板可以这样设计:
## Intent
What production/user problem does this PR solve?
## Design Decision
Why this approach? What alternatives were rejected?
## Risk Surface
- Runtime behavior changed:
- Compatibility impact:
- Security/IaC impact:
- Rollback risk:
## Validation
- Unit tests:
- Integration/E2E tests:
- Failure-path tests:
- Upgrade/rollback tests:
- Manual verification:
## AI Usage
Was AI used for code generation or refactoring?
If yes, summarize what was generated and what was manually verified.
我不太喜欢那种“AI 生成代码必须羞耻标记”的做法。问题不在于是不是 AI 写的,而在于有没有被验证、有没有解释、有没有人为最终判断负责。
但我支持高风险 PR 披露 AI 使用范围。因为这能提醒 reviewer:这里可能存在大段看似合理但缺少历史上下文的改动,需要更关注设计动机和失败路径。
八、人类 reviewer 的价值会变高,不会变低
AI Review 做得越好,人类 reviewer 越不应该再花大量时间挑格式、重复 lint、问“这里为什么没判空”这种低级问题。
人类应该专注更难的判断:
- 这个方向是否符合项目长期架构?
- 这个抽象是否值得引入?
- 这个默认值是否会伤害生产用户?
- 这个行为是否和项目承诺的兼容性冲突?
- 这个改动是否让系统更容易解释、运维和回滚?
- 这个复杂度是否真的换来了足够收益?
换句话说,AI 不是让 maintainer 失去价值,而是逼 maintainer 从“代码校对员”升级为“系统风险判断者”。
这对开源项目尤其重要。大型基础设施项目的 maintainer 本来就长期过载:PR 多、issue 多、用户环境复杂、贡献者水平差异大。AI 如果只是制造更多 PR,会加重 burnout;但如果 AI 能先过滤低质量改动、压缩 review 噪音、总结风险、指出测试缺口,它就能真正帮 maintainer 把精力放回关键决策。
九、一个可落地的三阶段路线
如果我是一个大型开源基础设施项目的 maintainer,我不会一上来就自建复杂多 agent 平台。更现实的路径是分三步。
阶段一:先把确定性防线补齐
目标不是炫技,而是先减少低级风险。
- 补
AGENTS.md,明确 AI 和贡献者的工程边界。 - 强化 PR 模板,要求说明 intent、risk、validation。
- 接入 lint、type check、unit/integration/e2e。
- 接入 Semgrep、Trivy、Checkov、OPA/Gatekeeper 等确定性工具。
- 对 IaC、K8s manifest、RBAC、secret、镜像依赖建立 baseline policy。
- 要求 AI 生成的大 PR 拆小,否则不 review。
这一阶段的核心哲学是:不要让 AI Review 替你补工程卫生。
阶段二:引入 AI 作为语义审查层
当确定性检查稳定后,再引入 AI Review。
- 先从非阻塞评论开始,不直接卡合入。
- 让 AI 输出结构化报告,而不是散乱评论。
- 重点检查 failure path、concurrency、resource、compatibility、test gap。
- 对误报/漏报做反馈闭环,持续调整 prompt 和上下文。
- 大 PR、高风险目录、AI-generated PR 使用更强模型或更多 agent。
这一阶段的核心哲学是:AI 先做 reviewer 的助手,不做 merge gate 的主人。
阶段三:接入生产反馈,形成闭环
真正高级的 AI Review,不只是看代码,还要看生产事实。
- 将 Sentry、日志、告警、性能回归、incident、postmortem 关联到 PR。
- 让 AI Review 参考历史事故:类似改动过去是否导致过问题?
- 对生产事故反推测试缺口,自动生成回归测试建议。
- 对高风险模块建立专门 agent:调度、鉴权、IaC、升级、存储一致性等。
- 用指标衡量 AI Review:真实 bug 命中率、误报率、review 时间、事故减少情况。
这一阶段的核心哲学是:让生产经验回流到合入前。
十、我认为最终会形成的新规则
AI 时代的大型基础设施工程,最终大概率会形成几条新规则。
第一,代码生成不是稀缺能力,验证才是稀缺能力。
能写出代码的人和工具会越来越多,但能证明这段代码在复杂生产环境里安全的人会越来越少。
第二,PR 的最小单元不再是 diff,而是 diff + decision + validation。
只给代码不给决策过程的 PR,会越来越难被信任。
第三,AI Review 的价值不在“评论更多”,而在“让人类少看无价值信息”。
如果 AI 让 PR 评论区更吵,它就是失败的。如果 AI 让 maintainer 更快看到真正风险,它才是成功的。
第四,基础设施项目必须把运行时语义纳入 review。
YAML 不是文本,Terraform 不是模板,Kubernetes manifest 不是配置片段。它们最终都会变成真实权限、真实资源、真实网络、真实故障模式。
第五,高风险系统必须保留人类最终责任。
AI 可以建议,可以阻塞,可以生成测试,可以总结风险,但不能替人类承担生产事故后的责任。支付、金融、交易、云平台、集群控制面这类系统,合入权必须绑定清晰的人类判断。
结语:别让 AI 把工程变成垃圾吞吐竞赛
AI 让软件开发进入了一个很奇怪的阶段:我们第一次拥有了几乎无限的代码生成能力,却没有同时拥有无限的理解能力、验证能力和责任能力。
这就是大型基础设施项目必须警惕的地方。
如果团队只追求“AI 帮我写更多代码”,最终会得到更多 PR、更大 diff、更高 review 成本、更复杂系统,以及更多线上事故。
但如果团队把 AI 用在正确位置——自动化第一轮审查、发现测试缺口、补充语义分析、连接历史事故、降低 maintainer 噪音——它就可能成为基础设施工程里非常重要的一层安全网。
我的判断是:未来优秀的基础设施团队,不会是最会让 AI 写代码的团队,而是最会让 AI 参与验证、审查和合入决策的团队。
因为生产环境从不奖励“生成得快”。
生产环境只奖励一件事:改动被充分理解之后,仍然敢合入。
AI代码合入哲学:大型基础设施不能只追求生成速度
Loop Engineering:让 AI 自己沉淀上下文