副标题:harness engineering is not enough。熄灯工厂(没人读代码)为什么行不通——因为再多的循环也抬不动天花板:好设计没有快速的 oracle,RL 奖励不到它。
再多的 harness 工程或循环叠满,也无法解决一个本质上是模型训练的问题。harness 能抬高地板,但抬不动天花板。
"软件工厂"指把意图变成上线代码的端到端流水线。半个多世纪里,每一代都在试图把人从环里挤出去——直到熄灯工厂把最后那个人(代码审查者)也去掉。
自 2025 年底大家集体上车 AI coding 工具,Faros AI 的报告显示:PR 审查质量大幅下滑,事故和每开发者 bug 飙升。这是相关信号,方向上"感觉是对的"。
很多人说效果不好是"技能问题"——多花 token、别读代码就行。Dex 的反论:这不是 skill issue,而是模型训练问题。更多 review agent 和 token 能抓住低级错误(抬高地板),但天花板由 RL 教会模型的东西决定,而好设计是还不知道怎么教的东西。
Claude Code 一年从零做到 ~$4-9B 营收,赢在第一家在 harness 内 RL 模型——用即将发布的同一套工具训练。但让模型更擅长写代码的循环,瓶颈不在循环,而在"评分"——它往往任性到只有一个维度。
FAIL_TO_PASS + PASS_TO_PASS:修好了吗?没弄坏别的吗?——对侵蚀可维护性,零惩罚。以一个真实的 fastlane bug 为例。模型看不到 golden patch 或评分用的 test patch:
模型怎么到达正确答案不重要。测试过了就赢,但对代码库可维护性的侵蚀——到处套 try-catch、lazy 类型转换、复制粘贴——没有任何惩罚。
这是整件事最反直觉的地方。测试反馈是秒级的,所以 RL 能跑几百万个循环。但坏架构的代价函数以月、年计——它第一次显现,是在有人为改一行而打开那个文件的时候。而那个事故,无法 backprop 回导致它的决策。
如果一个模型能可靠地分辨代码好坏,它可能一开始就写出好版本了。但可维护性没有快速的 oracle,所以我们没法在 RL 里奖励它——于是模型继续产出测试能过、却悄悄侵蚀代码库的代码。
第一批试图给"可维护性"打分(而非停在 pass/fail)的 benchmark 正在出现,但 Dex 仍不打算把代码库押在任何一个上面——judge 模型只能走到这一步。
| Benchmark | 做法 | 局限 |
|---|---|---|
| SWE-Marathon | ~400 小时大任务("克隆整个 Excel"),复合奖励通道 | 仍未直接评设计 |
| DeepSWE | 构造现实里从未建过的大任务 | 解决污染,不解决质量 |
| Frontier Code | mutation testing + judge model 审查 diff 代码质量规则 | judge 模型只能走到这 |
mutation testing 的逻辑:如果模型写的"新测试"在修复前的代码上也能通过,那这个测试就是废的——没有真正验证任何东西。
不是放弃 AI,而是接受约束、把代码审查放回去、用前置规划把审查成本压下来。每一层都是一次本会在最贵的时刻(code review)才做的隐含决策。30 分钟规划省下几小时审查。
这是“垂直切片”最容易混淆的一点。区别不在“建什么”,而在落地节奏——是按技术栈一层层铺完再拼,还是先打通一条端到端最小路径、每步都能验证:
用同一个功能走一遍,体会每层到底“对齐了什么”——每一层都是一次本会在 review 时才被迫做的决策,提前到写代码之前。
① 产品评审 — 不碰技术,只钉用户视角:
别描述——直接画 mockup。一张粗糙的 HTML 截图(笔记列表 + 彩色标签 chip + 顶部筛选栏),比三段文字更能终结争论。易犯的错:一不留神漂进“用什么数据库”——记下来留给后面,回到用户看到的东西。
② 系统架构 — 组件之间怎么连,不进代码细节:
UI → API → NoteService → Store (POST → addTag → insert → 201 Tag 返回)
POST /api/notes/:id/tags { name: string } → { tag: Tag }
CREATE TABLE tag (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
note_id BIGINT REFERENCES note(id),
created_at TIMESTAMPTZ DEFAULT now()
)
③ 程序设计 — 最被低估:代码的形状(架构图管不到、agent 最易翻车处):
# 调用栈(diff 突出“变了什么”)
noteEditor
+ handleAddTag
+ TagClient.add(noteId, name) → POST /notes/:id/tags
+ refreshTagChips
# 文件树
+ src/note/tag-client.ts # 新 — 封装标签 API
~ src/note/note-editor.ts # 改 — 接入标签输入框
# 类型与签名
interface Tag { id: TagId; name: string; noteId: NoteId }
addTag(noteId: NoteId, name: string) -> TagId
④ 垂直切片 · 先打通端到端最小路径,每步能验证
① API 契约 + 假数据 ✅ curl 能打出标签
② 前端消费假数据 ✅ 浏览器能看到标签 chip
③ 接到真 NoteService
④ 接到真数据库
| 洞察 | 含义 |
|---|---|
| harness 抬地板,不抬天花板 | 天花板是 RL 教的,好设计还教不会 |
| 测试通过 ≠ 代码好 | 秒级反馈 vs 月级代价的时间错配 |
| 熄灯工厂必然失败 | 没有可靠验证器,代码库 3-6 个月开始崩坏 |
| 前置对齐是跨时代杠杆 | 现在要下沉到"程序设计"(类型/签名)这一层 |
| 垂直切片 > 水平计划 | 过程中可重新引导,而非在 2000 行另一头发现灾难 |
来源:Why Software Factories Fail — Dex (HumanLayer),基于 AI Engineer World's Fair 2026 keynote。Faros AI 数据图与 SWE-bench 评分流程图来自原文。