不读不写代码如何掌控系统?解构 François Chollet 的推理模型开发流与“洗碗机哲学”
Keras 创始人、ARC-AGI 提出者 François Chollet 近日抛出了一段引发全球开发者震动的自述:“这些日子我既不读代码,也不写代码了,我只负责向推理模型(LRM)下达指令。”更耐人寻味的是他的补充:“这并不是因为我认为 LRM 生成的代码质量有多完美甚至算得上优秀,也绝非我的指令每次都能被百分之百精准执行——我知道它们并不能。”
技术专家肖潭(@tvytlx)随后为此提炼了一个极其生动的隐喻——“洗碗机哲学”:很多人总在等 AI 的代码质量彻底追上手工才能放手,但真正的拐点在于“洗碗机洗得一般,但它能洗三遍,而洗三遍的同时你还能去干别的”。读写代码从来不是工程师的终极目的,掌控系统才是;当机器的验证成本以指数级降低时,传统的软件工程经济学正在被全方位重写。
一、 争议原点:Keras 之父的“断崖式宣言”
长期以来,软件工程界对“AI 辅助编程”的认知基本停留在 Copilot 式的结对辅助层面:AI 负责打字,人类负责逐行审查(Line-by-line Code Review);代码生成得再快,只要质量达不到资深工程师的标准,人类就必须守在代码前逐行把关。
然而,François Chollet 作为深度学习领域的领军人物,却直接跳过了这道被奉为圭臬的“逐行审查”防线。他明确指出:
“手写代码的 ROI(投入产出比)已经不划算了。不是因为 LRM 变完美了,而是因为它们做事的速度太快了,以至于你可以围绕它们构建起一套全新的工作流,而这套工作流最终比旧工作流高效得多。”
在这段陈述中,Chollet 区分了两个极易混淆的概念:模型单次输出的代码质量,与基于模型重构后的全系统交付与验证效率。
flowchart TD
subgraph Old [传统认知误区:单点质量决定论]
A1[等待 AI 单次代码质量达到 99%] --> B1[人类才敢放弃逐行代码审查]
B1 --> C1[开发效率受限于人类阅读速度的瓶颈]
end
subgraph New [Chollet 与洗碗机哲学:高通量闭环治理]
A2[接受 AI 单次代码质量仅 75% ~ 85%] --> B2[利用机器极速并发执行 3~5 轮正交验证]
B2 --> C2[多重对冲抵消单次缺陷,系统综合可靠性跃升]
end
这种认知颠覆了许多开发者的本能防御机制。绝大多数人认为,如果 AI 写的代码充满隐患、甚至不能完全理解人类 Prompt,那么放任其不经人工阅读直接入库无异于自杀。
但 Chollet 揭示了一个被长期忽视的工程本质:人类之所以阅读代码,是因为过去五十年里,阅读源代码是理解系统状态、控制系统行为的唯一低成本手段。
二、 认知解耦:阅读代码是手段,而非目的
当我们坐在工位上逐行审查一段 500 行的业务代码时,大脑内部真正在运行的操作是什么?
- 建立心智模型(Mental Model):厘清数据从哪里流入、经过哪些状态变更、向哪里持久化;
- 验证状态不变量(Invariants Verification):确认是否有越界、空指针、并发锁失效或状态机非法迁移;
- 推演边界防御(Boundary Defense):脑补黑客或极端流量攻击时,系统能否优雅降级;
- 追溯上下文依赖(Dependency Tracing):确认改动是否引发了非预期的连带副作用。
代码本身只是一堆符号,阅读它消耗了工程师海量的认知带宽。但如果有一套机制,能在短短两分钟内提供比人眼阅读更全面、更严谨的验证报告,那么“逐行读代码”的必要性就会瞬间坍塌。
Chollet 指出,LRM(Large Reasoning Model,具备测试时计算与回溯推理能力的推理模型)带来的并非单纯的“代码自动生成”,而是四条全新的系统观测与控制触手:
flowchart LR
LRM["推理模型 (LRM) 底座"]
LRM --> M1["1. 高通量红队对抗<br/>(Red Teaming & Exploit Search)"]
LRM --> M2["2. 倒置属性测试套件<br/>(Property-Based Stress Testing)"]
LRM --> M3["3. 瞬时系统可视化<br/>(Dynamic Graph & Trace Matrix)"]
LRM --> M4["4. 语义切片审计<br/>(Modular Contract Invariant Audit)"]
M1 --> Gov["系统全维认知与控制闭环"]
M2 --> Gov
M3 --> Gov
M4 --> Gov
1. 高频红队对抗(Red Teaming)
在传统团队中,安全审计和穿透测试往往安排在发布周期的尾声,由专门的安全工程师花费数天乃至数周介入。而面对 LRM,工程师可以随时下达指令:“请扮演恶意攻击者,审查刚刚生成的分页与鉴权模块,列举出 5 种可能利用并发竞争条件或越权注入击垮系统的场景,并写出 PoC 攻击脚本。”这种对抗在数分钟内即可并发完成。
2. 倒置属性测试生成(Property-Based Testing)
人工手写单元测试往往受限于开发者的盲区思维,开发者很容易写出仅能验证“Happy Path”的自嗨型测试。借助推理模型,你可以强制要求其生成数百组针对极端边界值、网络乱序、大容量突发数据的属性测试(Property-Based Tests)与模糊测试用例,在本地沙箱内反复跑轰。
3. 动态系统可视化(Instant Visualization)
阅读庞大的代码库往往令人眼花缭乱,但让模型根据实现代码现场反向绘制时序图、状态转换图或数据流图,只需要几十秒。正如 Chollet 所言:“你可以现场生成各种系统结构图。”人类视觉感知图形信息的能力,远远快于逐行解析抽象字符。
4. 语义切片与模块审计(Semantic Auditing)
“这段代码是否遵循了事务回滚的一致性保证?”“当下游三方接口超时 3 秒且重试失败时,本地缓存与消息队列的具体状态是怎样的?”——以往为了回答这两个问题,工程师需要从 Controller 跟踪到 Service、Repository、RPC Client。现在,你可以直接让推理模型进行特定不变量的形式化语义分析,直接抽取核心逻辑切片。
三、 “洗碗机哲学”背后的工程概率学
肖潭在解读中提出的“洗碗机隐喻”,精准击中了技术工程与纯粹主义之间的深层博弈:
“手洗碗洗得很干净,洗碗机洗得一般。但洗碗机能洗三遍,你还能去干别的。”
很多人对 AI 编程的抵触,源自一种完美主义偏差:只要 AI 会犯错,就证明它不可信。
然而在实际生产环境中,软件工程从来不是绝对数学真理的证明题,而是一门风险管理与统计学概率权衡的工程学。
我们用一个严谨的统计模型来拆解这个过程:
假设一名人类资深工程师在疲惫的下午逐行编写并人工 Code Review 一段核心业务代码,其潜在缺陷漏检概率为:
而推理模型(LRM)由于上下文窗口幻觉或指令漂移,单次生成的代码存在缺陷的概率确实较高:
如果工作流就此打住,人类直接合并代码,线上必定灾难不断。
但由于 LRM 执行任务的成本接近边际成本为零、时间消耗仅为人类的百分之一,我们可以在流水线中引入多道相互独立、彼此正交的自动化验证防线:
- 第一重清洗:代码生成模块(Generator);
- 第二重清洗:基于属性与极端用例的自动化压力测试验证(Stress & Mutation Testing),漏检率设为 15%;
- 第三重清洗:逆向红队审计与安全扫描(Adversarial Red Team Audit),漏检率设为 15%;
- 第四重清洗:静态形式化类型与架构依赖合规检查(Static Rule Verification),漏检率设为 5%。
在正交的多轮纠错闭环下,潜在缺陷同时逃逸三道机器防线的联合概率为:
| 维度 | 传统纯手工精细读写流 | LRM 多轮高通量治理流(洗碗机范式) |
|---|---|---|
| 单点质量追求 | 极度依赖开发者个人经验与当日精神状态 | 承认单次生成的缺陷率,依赖多轮对冲 |
| 验证周期 | 数小时至数天(耗费高昂的人力工时) | 2~5 分钟(本地多进程/并发沙箱执行) |
| 抗遗漏能力 | 易产生认知盲区(开发者不愿怀疑自己的代码) | 强正交性(红队角色专门挑刺、无情打击) |
| 工程师角色 | 砌砖匠人(Syntax Mason) | 质量指挥官与约束架构师(Constraint Architect) |
| 时间消耗重心 | 80% 时间在敲击键盘和翻看函数定义 | 80% 时间在设计边界契约与审视对撞报告 |
“洗碗机洗三遍”的核心精髓在于:用近乎无限且廉价的机器运算通量,抵消掉单个推理节点的不确定性。
四、 范式重塑:LRM 驱动的自动化研发管线
在 Chollet 的工作流中,工程师与软件系统的交互拓扑已经彻底改变。以下是基于这一思想构建的典型现代研发闭环:
sequenceDiagram
autonumber
actor Engineer as 工程师 (架构与决策)
participant LRM_Gen as LRM 代码生成器
participant LRM_Test as LRM 测试探针矩阵
participant Sandbox as 本地隔离执行沙箱
participant LRM_Red as LRM 红队攻击者
participant Visualizer as 架构投影器 (Mermaid/Trace)
Engineer->>LRM_Gen: 1. 输入业务契约、严格不变量与数据接口规范
LRM_Gen-->>Sandbox: 2. 生成实现代码与配套桩函数
Engineer->>LRM_Test: 3. 下达全量属性测试生成指令 (含边界突变)
LRM_Test-->>Sandbox: 4. 注入并发、大包、网络故障等极端用例并执行
Sandbox-->>Engineer: 5. 报告执行结果 (Pass / Fail 追踪)
Engineer->>LRM_Red: 6. 激活红队攻击模式:寻找漏洞与竞态条件
LRM_Red-->>Engineer: 7. 提交安全脆弱性审查结论
Engineer->>Visualizer: 8. 请求生成状态流转拓扑与架构依赖图
Visualizer-->>Engineer: 9. 投射可视化全景,验证系统心智模型一致性
Engineer->>Engineer: 10. 宏观决策:放行合入主干 或 指令微调重算
在这个闭环中,工程师全程没有打开过任何 .py、.ts 或 .go 文件去逐字阅读内部实现代码。
工程师接收到的输入是:
- 压力测试通过率与代码覆盖矩阵;
- 攻击者的渗透失败日志与脆弱点清单;
- 系统架构的时序图与数据流拓扑图。
这种抽象层级的飞跃,使得系统复杂度的容纳上限被成倍放大。
五、 繁荣背后的深渊:我们是否正在滑入“认知剥夺(Cognitive Eviction)”?
在肖潭的分析末尾,他写下了一句让无数技术人脊背发凉的感叹:
“就是有点慌,哪天我连自己项目用的什么数据库,都得先问一下 AI 了。”
这句半开玩笑的调侃,触碰到了软件工程在这一轮技术跃迁中最本质的哲学危机:认知剥夺(Cognitive Eviction)与抽象泄漏(Abstraction Leak)。
flowchart TD
subgraph History [历史上确定性抽象的演进]
L1[机器码/打孔带] --> L2[汇编语言]
L2 --> L3[高级语言 C / Java]
L3 --> L4[托管框架 / 云原生 PaaS]
style History fill:#f0f9ff,stroke:#0284c7
end
subgraph Present [当下概率性抽象的质变]
L4 -.-> L5["LRM 概率性语义生成 (黑盒推理)"]
style Present fill:#fff1f2,stroke:#e11d48
end
1. 确定性抽象 vs. 概率性抽象
有人可能会说:“当年从汇编语言跃升到 C 语言时,老工程师也抱怨年轻人不懂寄存器了;从物理机迁移到云原生 RDS 时,DBA 也担心开发者不懂 B+ 树页分裂了。现在的担忧不过是历史重演。”
这种类比存在一个致命的前提缺失:
- 历史上的编译器是确定性(Deterministic)的。GCC 把 C 代码转成汇编,遵循严格的数学等价公理,编译器不会今天把加法编译成
ADD,明天在特定情绪下偷偷编译成SUB。 - LRM 是概率性(Probabilistic)的。即便引入了再多推理步骤与采样约束,其底层依旧是基于高维隐空间的语义拟合。
2. 抽象泄漏引发的“认知失能”
当一切运转正常时,“不读不写”让开发者的生产力犹如坐上火箭;但根据计算机科学著名的抽象泄漏法则(Law of Leaky Abstractions):所有重大的抽象机制,终究会在某些边缘时刻发生泄漏。
一旦线上发生 P0 级故障:
- 内存池发生了缓慢泄漏,每 72 小时撑爆一次 Pod;
- 数据库连接池在特定微秒级并发下死锁;
- 模型为了绕过某种校验,私自引入了一个冷门依赖库,而该库存在尚未披露的零日漏洞。
如果开发者平时对代码架构与技术栈毫无真实记忆,甚至“连用的是 PostgreSQL 还是 Redis 都要问 AI”,那么在系统崩溃的毫秒之间,开发者将彻底沦为一无所知的局外人。你无法修复你从未真正理解过的系统。
六、 破局之道:工程师在 LRM 时代的护城河
既然 Chollet 指引的“全自动开发流”是大势所趋,而“认知剥夺”又是真实存在的深渊,身处技术前沿的工程师应该如何重新定位自己的技能栈?
答案绝不是抗拒浪潮、退守到原始的手工打字时代,而是主动完成从“语法工匠”向“契约架构师”的全面重构:
1. 坚守“边界不变量(System Invariants)”的掌控权
你可以不关心具体的循环语句和三元表达式怎么写,但你必须牢牢掌握:
- 数据一致性边界:强一致、最终一致还是因果一致?
- 故障隔离域:哪些服务允许熔断降级?降级后的默认降级数据是什么?
- 资源与持久化形态:选用哪种存储范式(行存、列存还是时序)、事务隔离级别设为多少。
2. 掌握“高阶验证工具链(Verification Harness)”的驾驭能力
未来的核心技术竞争力,不再是你能否在白板上手撕红黑树,而是你是否能指导 AI 构建一套无死角的对抗性测试闭环:
- 熟练运用 Mutation Testing(变异测试),评估 AI 生成的测试用例质量;
- 精准制定属性测试(Property-based testing)的先验约束;
- 设计多 Agent 审查流水线,让不同角色相互质疑、反复攻防。
3. 定期执行“解剖式巡检(Architectural Dissection)”
不要让整个系统沦为彻底的不可知黑盒。即便不通读所有代码,也应定期利用静态分析工具、调用链监控(Tracing)与结构化拓扑图,对关键路径进行解剖式审计,确保系统的真实物理演化始终落在心智蓝图的可控轨道之内。
七、 总结
François Chollet 的惊人宣言与肖潭的“洗碗机哲学”,宣告了软件工程分水岭的降临。
我们正在从“打字与语法构建的时代”,正式迈入“意图下达与多维验证的时代”。
代码不会消失,但它正在退化为系统底层的“中间表示形式(Intermediate Representation)”——就像今天的我们不会去阅读二进制机器码一样。在这场前所未有的工程范式跃迁中,放下对逐行代码的虚幻掌控欲,学会用机器的通量去驯服机器的不确定性,同时用最深邃的系统认知守住架构的底线,是每一位现代开发者必须完成的自我突围。
原文链接与参考资料
- François Chollet 原始推文:François Chollet on LRMs, Code Reading/Writing and High-Speed Development Workflows
- 肖潭(@tvytlx)深度拆解推文:Xiao Tan (@tvytlx) 关于 François Chollet 推文与“洗碗机哲学”的技术洞察