「我们不再手写代码」:Rails 之父 DHH 的 Agent 时代宣言
Rails 之父 DHH 在 Rails World 宣布 37signals 已“不再手写代码”。本文拆解 2025 年 11 月的拐点、转向原生应用与 Rust 的动作、同一信源里的反方证据,以及给 vibe coding 读者的三条判断。

导读:Ruby on Rails 之父 DHH 在 Rails World 主题演讲上宣布:37signals 已经停止手写代码。在这家 27 年历史、以软件工艺著称的公司里,手写代码如今是一种"异常状态"——就像 Sentry 里蹦出一个 bug。宣言、转折点、以及同一信源里自带的反方证据,都在这篇里。
一句宣言:"我们不再手写代码"
这可能是 2026 年 AI 编程话题里最具象征意义的一幕。9 月最后一周的 Rails World 主题演讲上,Ruby on Rails 的创造者 David Heinemeier Hansson(DHH)宣布了一个决定:37signals 已经停止手写代码。原话是这样说的:
"We're done writing code by hand."
在他的描述里,手写代码如今在 37signals 是一种"exceptional state"——例外状态。他给的比喻很有味道:手写代码出现,就像在 Sentry(错误监控工具)里看到一个 bug。"这里出问题了,为什么 Agent 没能产出我们想要的东西?"——这句话不是程序员的牢骚,而是一种新的工程信号:凡是需要人亲手写的地方,都意味着自动化链条里有一处断裂。
为什么这句话有分量?先看谁在说话。37signals 是一家 27 年历史的公司,盈利、不融资、独立运营,更重要的是它在行业里以软件工艺和代码质量著称。DHH 本人是程序员文化里"把代码当手艺"这一派的旗手——他写过《重来》(Rework),抨击过"工厂式开发",亲手把 Rails 打造成最强调优雅的 Web 框架。当一个"手艺人教主"宣布手艺退场,这个宣言就不是一个追热点的 startup 在喊口号,而是一次行业地震。
他甚至连自己的身份都重新定义了:"I have retired from being a professional programmer."(我已经从职业程序员的身份上退休了。)时间点是大约 4 到 5 个月前——也就是 2026 年 3 月左右。在此之前,他说自己花了 "a quarter of a damn century chiseling code by hand"——四分之一个世纪,亲手凿代码。注意"chiseling"这个词:凿、雕刻,手艺人的动词。现在他把它放进了过去时。
转折点:2025 年 11 月 24 日,"Kodak Brownie"时刻
DHH 给 Agent 时代的到来定了一个具体日期:2025 年 11 月 24 日,也就是 Anthropic 发布 Opus 4.5 的那一天。他把这一天称为行业的"Kodak Brownie"时刻——"the inflection point for the age of agents",Agent 时代的拐点。
这个比喻值得展开说说。柯达 Brownie 相机(1900 年推出)把摄影从专业暗房手艺变成"按下快门"的大众行为:技术门槛崩塌,产量爆炸,但"好照片"的标准反而被重新发明了一次。DHH 的意思很直白:Opus 4.5 就是编程界的 Brownie——它不是让写代码更快一点,而是让"写代码"这件事本身从手艺变成了按快门。拐点之前,Agent 是玩具和辅助;拐点之后,Agent 是默认生产方式,人只是例外。
判断句他直接扔了出来,一句比一句狠:
"Writing code by hand is no longer an economically productive enterprise for the vast majority of programmers."
翻译一下:对绝大多数程序员来说,手写代码在经济上已经不再是一件划算的事。这不是说手写代码质量差,而是说它的"经济性"输了——同样的时间,Agent 能产出更多、更便宜的代码,经济理性会碾压一切情怀。
另一句更触及本质:
"Abstractions don't make quite the same sense in the age of agents… the price of repetition has gone to near zero."
抽象不再那么有意义了,因为重复的成本已经趋近于零。过去几十年软件工程的核心智慧——DRY(不要重复自己)、抽象、复用——建立在一个前提上:重复很贵,人的时间更贵,所以要用抽象来消灭重复。但如果 Agent 写十遍和写一遍的成本几乎一样,抽象的价值主张就变了。这不是说抽象死了,而是说我们发明抽象的那套经济学假设,正在被改写。
他们已经把公司改造成什么样
宣言如果没有组织动作配合,就是演讲修辞。37signals 的动作有三件,每一件都反常识:
第一,拥抱原生 iOS 和 Android 应用。37signals 以前只做 Web 版应用,对原生 App 一向敬而远之。原因很现实:原生开发成本高,需要两套代码、两套技能栈,一个小而盈利的团队玩不起。但现在 Agent 让这个等式变了——如果 Agent 能同时产出两个平台的代码,"小团队做原生"就从奢侈变成了常规操作。这是对"团队规模决定产品形态"这个旧约束的直接拆除。
第二,后端服务从 Ruby 迁向 Rust。这句话从 DHH 嘴里说出来尤其有冲击力——他是 Ruby 世界的教父,Rails 就是他写的。现在他说:"agents write good enough Rust."(Agent 写的 Rust 已经够好了。)想想这句话的潜台词:语言选型的标准变了。以前选语言要看团队熟悉度、生态、招聘市场;现在标准是"Agent 擅长写什么"。Rust 以难学、借用检查器折磨人著称,但对 Agent 来说,编译器的严格恰恰是好事——报错越精确,Agent 的自我修正就越有效。人类觉得难的语言,Agent 可能觉得正合适。
第三,Web 应用保留 Rails。这不是恋旧,而是有技术理由的:Rails 的"约定优于配置"设计对 Agent 特别友好。目录结构固定、命名有规矩、最佳实践写在框架里——Agent 不需要在一个自由散漫的代码库里猜意图,框架已经把意图钉死了。这给所有框架作者提了一个新 KPI:你的框架对 Agent 友好吗?下一个十年的框架竞争,可能首先是"Agent 可读性"的竞争。
同一期通讯里的反方弹药:事情没那么简单
有意思的是,披露这场演讲的同一期 The Pragmatic Engineer 通讯里,紧跟着就给了两发反方弹药。这让"手写代码已死"的叙事没法被写成一篇营销稿。
第一发:匿名大厂工程师的 rant。一位在大厂工作的工程师(通过 voxium 匿名发声)描述了自己的日常:spec(需求文档)、代码、测试、PRD,全是 Claude Code 生成的。他每天工作 12 到 13 个小时,干的事情是 "just to press enter"——只是按回车。他的总结只有一句:
"Nobody is thinking anymore."
没有人再思考了。这是对 DHH 宣言最锋利的反驳:如果 Agent 负责写,人负责按回车,那么"思考"这个环节到底还在不在?DHH 说手写代码是"异常状态",这位工程师说"思考"正在变成异常状态。当生成的代码量超过任何人能 review 的量,"人在回路里"就变成了一句空话——人只是在流程图上占了个位置,实际上什么都没把关。
第二发:Uber Eats 的翻车现场。就在同一周,Uber Eats 上线的一个新功能带着至少三处低级 bug 直接到了用户面前,其中一处是界面上赫然写着 "Choose up to 999"(最多选 999 个)。这种错误,任何一个认真看过一眼界面的 QA 都能拦下来。它出现在线上,只说明一件事:很可能根本没有人认真看过。疑似"无人 QA"的一次上线,给"Agent 全权负责"的叙事泼了一盆带着生产事故味道的冷水。
把这两件事和 DHH 的宣言放在一起,画面就完整了:Agent 时代的生产力是真的,拐点也是真的,但"没人思考、没人 QA"的组织病,也是真的。问题从来不是"Agent 行不行",而是"组织里还剩多少真正负责的人"。
判断:给 vibe coding 读者的三条启示
读到这里,vibe coding 的读者(也就是你,我的朋友)最该问的不是"DHH 对不对",而是"这对我写代码的方式意味着什么"。三条判断,供参考:
1. 把"手写"从默认动作降级为"异常信号"
DHH 最有操作价值的不是那句宣言,而是 Sentry 的比喻。别把它当修辞,当工作流用:下次你忍不住要亲手写一段代码时,先停三秒,问自己——为什么 Agent 没搞定?是 prompt 没说清楚?是上下文没给够?还是这个问题本身就不该由 Agent 做?前两种情况,修你的 prompt 工程;最后一种,才是你亲手写的正当理由。久而久之,你会得到一张属于自己的"必须手写"清单——这张清单越短,你的 Agent 化程度越高。DHH 的 37signals 把这张清单压缩到了"异常状态",这是目标,不是起点。
2. 选 Agent 友好的技术栈,而不是你情怀的技术栈
37signals 保留 Rails、迁移到 Rust 的逻辑,翻译成个人开发者的语言就是:选型标准里要加一条"Agent 写这个顺不顺手"。约定优于配置的框架(Rails、Next.js 的 App Router 约定、严格的 TypeScript 工程)让 Agent 少猜、多对;类型系统严格的语言(Rust、TypeScript strict 模式)让 Agent 的自我修正有抓手。反过来,一个靠"口口相传的潜规则"运转的老代码库,对 Agent 是地狱——它猜不到那些没写下来的东西。所以 vibe coding 的第一生产力,有时候不是更好的 prompt,而是更"Agent 可读"的项目结构。
3. 永远不要解雇 QA——哪怕 QA 是你自己
这是 Uber Eats 那三处 bug 和那位"按回车 13 小时"的工程师留给我们的教训,也是 DHH 宣言里没展开说的另一半:37signals 敢说"不再手写",是因为他们有 27 年的工程纪律打底——code review 文化、测试传统、对"什么算好代码"的共识。Agent 放大的是你已有的工程习惯:习惯好,它产出好代码;习惯烂,它以十倍速产出烂代码,还附赠"看起来很对"的幻觉。
对个人开发者来说,规则可以简化成一句话:Agent 可以替你写,但不能替你负责。"Choose up to 999"这种 bug,拦下来的成本是 30 秒的人眼;放过去的成本是一次公开翻车。vibe coding 不是"vibe 一下就行了",vibe 是起点,ship 之前的最后一眼,永远得是人的。
还有一个容易被忽略的细节:DHH 说的是 "the vast majority of programmers"(绝大多数程序员),不是所有人。他给这个命题留了例外——那些定义问题、设计系统、做最终判断的人。vibe coding 的读者天然站在这个例外里:你不是在流水线上写 CRUD 的人,你是一个人就是一支团队的人。对你来说,Agent 不是替代者,是杠杆。杠杆的问题从来不是"要不要用",而是"支点放在哪"——支点就是你的判断力。判断力越强,杠杆越长。
最后说个冷知识式的对照:DHH 选"Kodak Brownie"做比喻,其实藏着警告。柯达发明了数码相机,却被数码相机杀死——因为它把新技术当成了旧生意的点缀。编程行业现在站在同样的岔口:把 Agent 当"更快的自动补全"用的人,和把它当"新的生产方式"用的人,五年后会在完全不同的位置。37signals 选了后者,代价是亲手埋葬自己 25 年的手艺。vibe coding 的你,入场时手里就没有需要埋葬的东西——这是你的优势,别浪费了。
所以,DHH 的宣言到底该怎么读?把它读成两句话:第一句是事实判断——Agent 写代码的经济性已经赢了,逆潮流手工打造一切的人会越来越少;第二句是价值判断——"不再手写"不等于"不再思考",恰恰相反,当写代码的成本趋近于零,思考、判断、品味这些写不出来的东西,第一次变成了程序员真正的稀缺品。那位匿名工程师说"nobody is thinking anymore",DHH 会说:那正是你要解决的问题——把思考从"怎么写"搬到"做什么、为什么这么做"上。
手写代码的时代结束了。动脑子的时代,才刚刚开始。
评论 (0)
原始来源
相关文章

联想天禧 AI 自研代码智能体框架 TianxiCode 搭配 DeepSeek-v4.1-Flash,在 SWE-bench-Live Lite 分榜以 71% 解决率登顶全球第一,并通过官方 Verified 审核。本文解读这项“真实工程”评测为何更难、“框架>模型”论点的含金量,以及它给 vibe coding 实践者的三点启示。

OpenAI 官方博客《Advancing computer use with Ironclad》标志着范式转移:Computer Use 从通用能力展示转向按应用定制训练。首款在 Ironclad 任务上训练的前沿模型 GPT-6 Astra,在 11 道专家设计的合同任务(每道 8~50 条评分标准)上拿到 55.0% 对 41.6%,单次估计耗时从 37.0 分钟降到 19.2 分钟。护城河正在从模型搬到「合作伙伴名单」——而 OpenAI 正在公开招募下一批软件公司。

菲尔兹奖得主陶哲轩牵头"人类数学协会"发表联合声明,敦促全球数学家停止与 OpenAI 合作,抗议其一次性公开 700 多份 AI 生成的数学证明。图灵奖得主杨立昆则称这是数学进入新时代。一场关于"可读性 vs 解题能力"的论战撕裂了数学界——而这正是 vibe coding 时代每个人的切身问题。