大家有没有这种感觉——最近三个月,AI 写代码的速度已经快到让人不安了?
不是”写得好不好”的不安,是”我好像已经跟不上它了”的不安。
今天我想聊一件事:AI 没有取消软件工程,它只是把纪律从一种形式搬到了另一种形式。 如果你还用旧地图找新大陆,四个月后你会撞墙——有人已经撞过了,而且公开复盘了。
论点一:瓶颈从来不是生成,是验证(1.5 分钟)
先说一组数字。
AI 采用后,代码变动率涨了 861%,PR 审查耗时中位数涨了 441.5%,缺陷率从 9% 飙到 54%,零审查合并的 PR 增加了 31.3%。
日产出翻了 4 倍,但交付价值只涨了 12%。
这说明什么? 生成不是瓶颈,验证才是。你把漏斗的嘴加大,只会让颈部堆得更深。
现在的问题不是”AI 能不能写代码”——它能。问题是 agent 是高速生产者,人类是慢速消费者,中间没有背压机制。审查队列无限增长,结果只有两个:要么橡皮图章式合并,要么你自己成为瓶颈。
解法不是让人读得更快。 是在代码到达人类之前,让机器先验证尽可能多的东西。类型系统是第一层,测试是第二层,lint 和架构强制是第三层,人类审查是最后一层——只处理机器判断不了的东西。
一句话:一条 CI 门禁抓住的 bug,比一千行 prompt 指令多。Fix the environment, not the prompt.
论点二:全暗工厂会翻车,理解力债务不报警(1.5 分钟)
2025 年 7 月,HumanLayer 创始人 Dex Horthy 做了一个极端实验:全自动化暗工厂,人类完全不读代码。
四个月后关停。原因很具体——
生产环境崩了。任何高级 prompt 都定位不到根因。最后发现一个主键被错误路由贯穿了整个代码库。所有单元测试全程是绿的。
团队花了好几天在意大利面条代码里跋涉,又用了三周重新 onboard 一个”从未有人类读过”的代码库。
他修正后的判断是:“我不认为不看代码是对的。”
这里引出今天最重要的一个概念——理解力债务。
它不是技术债。技术债会通过构建变慢、依赖纠缠来报警。理解力债务制造的是虚假信心:代码看起来干净,测试是绿的,一切正常。直到某个最糟的时刻,清算悄然到来。
为什么测试抓不住它?因为当前模型的训练奖励函数只看一件事:测试通过了吗? 模型不会因为”留下了一个六个月后人类无法工作的代码库”而受惩罚。所以”模型更强了就不需要人看了”——至少在训练激励改变之前,是个幻觉。
论点三:新纪律怎么落地(1.5 分钟)
纪律没有消失,只是换了形态。旧纪律是:逐行手写、逐行阅读、对每一行负责。新纪律是:
第一,按风险分级。 不是所有代码都值得同等审查。一次性脚本跑通就行;产品逻辑审接口和不变量;认证、支付、数据迁移、并发——必须人类逐段看,没有商量余地。
第二,判断力前置。 200 行设计文档能把 PR 返工率从 50% 压到 5%。审查对象从”实现”上移到”意图→规格→接口→证据”这条链。
第三,把验证编进环境。 类型系统开到最严,测试一条命令跑通,架构边界用工具锁死。这些规则跨会话持久,比任何 prompt 都管用。
第四,代码本身要成为 agent 的基础设施。 文件不超过 500 行,函数 4–20 行,命名唯一可 grep,注释写 WHY 不写 WHAT。把这些写进 AGENTS.md / CLAUDE.md,agent 每次迭代都会读。
Clean Code 从”人的审美偏好”变成了”机器的技术约束”。那些被 move-fast 冲掉的 TDD / SOLID 纪律,现在是 agent 能否持续迭代的分水岭。
收尾号召(30 秒)
最后用 Dex Horthy 的一句话收尾——
“The hard, skilled job is deciding where to put each switch.”
为每个循环找到正确的灯开关位置。全暗,四个月推倒重来。全亮,你先成瓶颈。真正的工程手艺就在中间那个判断里。
这周大家可以做一个动作: 挑一个正在用 AI 写的模块,问自己两个问题——
- 这个模块的验证管道够不够硬?如果 agent 今晚提交了 PR,机器能拦住多少问题?
- 我对这个模块的系统理解,是活的还是已经蒸发了?
如果答案是”不太确定”,那灯该开了。
谢谢大家。
一页速查卡:从 Vibe Coding 到工程纪律
一句话总纲
AI 把纪律从「逐行手写和阅读」搬到了「写规格、设约束、建验证管道、在判断力最贵的地方留灯」。
代码免费了,但对系统的理解不能赊账。
核心数据(为什么必须变)
| 指标 | AI 采用后变化 | 来源 |
|---|---|---|
| 代码变动率 | +861% | Faros AI(22,000 开发者) |
| PR 审查耗时中位数 | +441.5% | 同上 |
| 缺陷率 | 9% → 54% | 同上 |
| 零审查合并 PR | +31.3% | 同上 |
| 日产出 vs 交付价值 | 4× 代码量,仅 +12% 价值 | GitClear |
根因:生成是宽口漏斗,验证是窄颈。中间没有背压(backpressure)机制,审查队列无限堆积。
风险分级表:灯该开还是关
| 级别 | 场景 | 人类介入程度 |
|---|---|---|
| 🟢 L1 放手 | 一次性脚本、原型、内部工具 | 跑通即可,不审 |
| 🟡 L2 半亮 | 产品逻辑、业务逻辑 | 审接口、不变量、边界情况 |
| 🔴 L3 必须亮 | 认证、支付、隐私、数据迁移、并发、长生命周期架构决策 | 逐段看,无商量余地 |
CI 门禁清单(从底到顶,逐层拦截)
┌─ 第1层:类型系统 ──────────────── 编译器即时抓整类错误
│ TypeScript strict / Rust / mypy
│
├─ 第2层:Lint + 架构强制 ───────── 命名、圈复杂度、依赖方向
│ ESLint / ArchUnit / dependency-cruiser
│
├─ 第3层:测试套件 ──────────────── 一条命令跑通,失败即阻断
│ 单元测试 + 集成测试 + 属性测试
│
├─ 第4层:覆盖率 + 变异测试 ─────── 抓"测试绿但逻辑漏"的情况
│
└─ 第5层:人类审查 ──────────────── 只处理机器判断不了的东西
架构漫步、意图审查、验收判断
原则:一条 CI 门禁 > 一千行 prompt 指令。Fix the environment, not the prompt.
判断力前置(最高 ROI 动作)
| 动作 | 效果 |
|---|---|
| Agent 启动前写 200 行设计文档 | PR 返工率 50% → ~5% |
| 审查对象从「实现」上移到「意图→规格→接口→证据」链 | 把”2000 行 diff 里找决策”变成”200 行计划里审决策” |
| 人类拥有外循环:agent 跑内循环,人判该不该合、后果谁担 | 保持对系统的高层理解,防理解力债务 |
AGENTS.md / CLAUDE.md 骨架(直接复制改)
# Agent 规则
## 文件与函数
- 单文件 ≤ 500 行;单函数 4–20 行
- 命名唯一且可 grep(返回 >5 个不相关结果 = 坏名字)
## 类型与测试
- 所有函数签名必须有显式类型标注
- 测试一条命令跑通;新增代码须带测试
## 注释
- 写 WHY 不写 WHAT:决策溯源、workaround 原因、已知坑
## 目录结构
- [列出你的约定,如 src/domain / src/infra / tests/]
## 禁止
- 不生成 >500 行文件
- 不提交无测试的代码
- 不改架构边界(见 dependency-cruiser 配置)
暗工厂 vs 亮工厂:决策矩阵
| 循环特征 | 模式 | 理由 |
|---|---|---|
| 检查廉价、高频、难伪造(类型/属性测试/红绿 oracle) | 🌑 暗 | 机器验证足够硬 |
| 错误代价高、只有人类能判断(微妙生产 bug、大爆炸半径架构) | 💡 亮 | 判断力不可替代 |
| 全系统从未有人读过 | ❌ 禁止 | 理解力债务会在第 4 个月清算 |
红灯警告(来自真实翻车)
- 🚨 全暗实验 4 个月后关停:生产崩溃,主键错误路由贯穿全库,所有单测全程绿,3 周重新 onboard 无人读过的代码库
- 🚨 模型训练只奖励测试通过,从不惩罚糟糕架构——”模型更强就不用看”在训练激励改变前是幻觉
- 🚨 理解力债务不报警:测试全绿 ≠ 系统被理解。结构腐蚀只在生产深夜宕机时结算
一句话收束
The hard, skilled job is deciding where to put each switch.
为每个循环找到正确的灯开关位置——这才是 2026 年的软件工程手艺。