写了 18 年代码,然后停手:合并 PR 从 200 涨到 300,bug 没跟着涨

有个开发者写代码写了 18 年,每天都写。
去年开始,他慢慢把 AI 塞进日常流程:往网页聊天框里贴一段代码要个第二意见,用英文描述一句查询,想不起正则语法就直接问模型。都是顺手的小抄,谈不上什么革命。
真正的转折点不是哪天看到一条惊艳的演示视频。是某一天他反应过来,把需求讲清楚,比亲手把代码敲出来还快。那天之后,将近二十年的习惯就断了。几个月过去,他越来越不想再碰键盘写代码。
他叫 Elio Capella Sánchez,在 Filestage 做事。他把这段经历写成了一篇文章,标题很直白:手写代码的时代结束了,永远结束了。
200 到 300 个合并 PR,bug 没变多#
光讲感受不够,得看数据。
Filestage 团队过去每月合并大约 200 个 PR。用上 AI 编程工具之后,这个数字涨到 300 左右,涨幅接近五成。关键是,进来的 bug 报告没有跟着涨。
每个开发者的成本是每月 20 美元订阅费。工具各人自选,有人用 Codex,有人用 Claude Code,有人用 Cursor。
50% 这个数字本身没那么重要,重要的是它背后站着一套护栏。作者说他们在 CI 上投入很多:lint、类型检查、重复代码检测、100% 测试覆盖、端到端测试。agent 每次改代码,这些检查都会跑一遍。PR 数上去了而缺陷没有同步上浮,靠的不是模型突然变聪明,是团队把验证这一层做厚了。这一点容易被忽略:很多人盯着模型换代,却不愿意花时间把测试和类型系统补齐。
他还提到一个转变。现在他觉得,不让 AI 先做一轮代码审查就直接合并,是不负责任的。他甚至开始认真琢磨一个问题:PR 只要过了所有检查、再拿到 AI 审查的通过,是不是就够格合并了。这个问题他还没下结论,但已经不再显得离谱。
一张 1986 年的剪报#
文章里配了一张 1986 年的旧剪报:一群数学老师举着牌子抗议计算器进课堂,牌子上写着,高年级之前不许用。
这类画面我们见过很多次。计算器、编译器、高级语言、框架,每一次抽象往上抬一层,都有人担心使用者会废掉。事后看,被替掉的从来不是思考本身,而是那些本该交给工具的机械动作。手写代码交出去之后,人剩下的事情变成把问题想清楚、把系统设计明白、把结果验对。哪一件都不轻松。
速度快了,瓶颈换了地方#
产出翻上去之后,第一个受不了的不是人,是基础设施。
他们的端到端测试实例要接收第三方的 webhook,结果撞上 Cloudflare 免费隧道的额度上限,CI 开始失败,工程师被卡住。共享开发数据库的并发连接数也不够用,只能加资源。
有意思的是解题方式。他用基础设施即代码的配置,加上开源的 FRP 隧道,把这个麻烦 vibe code 掉了,自己顺手写了方案。制造这次压力的工具,也帮着把瓶颈挪开。
这其实是个信号。写代码不再是瓶颈之后,吞吐的压力会顺着管线往下游挤,去挤测试环境、数据库、部署和审查。谁的工程底子薄,谁就先卡在这儿。这也解释了 CI 护栏为什么重要:基础不牢,高吞吐根本扛不住。
抽象还值不值得留#
这部分是作者跟 DHH 的分歧,也是全文里我最认同的一段。
DHH 在 Rails World 的主题演讲里说,agent 最终会从 Rust、C++ 往汇编甚至微码下沉。作者不同意,理由有三条。
- 输出越多,要对的细节越多。让模型产出汇编,等于让它去预测寄存器、偏移量和调用约定,这些活本来是编译器干的。
- 紧凑的表达能省上下文。
users.filter(u => u.active)几个 token 说清的事,翻成汇编要一大串。一个本来就塞满 20 万 token 的仓库,再展开成低级指令,只会更难理解。 - 抽象帮助推理。类型、函数、模块、所有权、数据结构,都在暴露意图和约束;全部下沉到汇编,这些信息基本就找不回来了。
还有一点很实际。我们本来就有 Clang 这类工具,能把源码确定性地翻成机器码。用概率推理去重做一遍确定性编译器做得又快又准的常规翻译,没必要。针对性地做汇编级优化可以另说,但不该把它当成整个系统的默认表示。
作者的下注是:LLM 到高级表示,再到确定性编译器,最后到机器码。他表示形式可能会变,但他相信,随着 agent 接手越来越大的系统,好的抽象会变得更有价值。
我同意这个方向。这里有个容易混淆的地方:模型擅长的是把意图翻译成某种表示,不是在最底层做算术。把这两件事分开看,抽象该留就留。agent 越能干,人越需要一套自己看得懂、能验证的表示。
文本文件之后,会是什么#
文章最后一段更像一个开放的提问。
作者说他一直对造软件的方式不满意。Bret Victor 那场《编程的未来》讲出了他的感觉:几十年前就有人探索过更好的可能,结果我们最后停在现在这套。数不清的括号和引号,争 tabs 还是空格,翻几百个文件去还原一个东西怎么跑。格式化和 lint 帮了点忙,可你还是得一边盯着系统的一小块,一边在脑子里装下整个系统。
他的设想是:既然 agent 能处理代码,那我们能不能直接跟逻辑、接口、数据模型打交道?UML 和实体关系图,能不能变成操作一个活系统的日常界面,随改动保持同步?他想从用例一路缩放进去,需要的时候再看到代码;想看到数据在系统里怎么流;还想把生产环境的信息也拉进这个视图:哪些路径真有人用、请求卡在哪、哪些分支从来没被执行过。
这个愿景不算新,Bret Victor 那代人就提过。变的是可行性。过去这种活的知识图谱要靠人手工维护,成本高到没人愿意做;现在 agent 有能力边改边同步,这件事第一次变得可行。具体长什么样没人知道,但方向值得盯。
写在最后#
18 年手写代码,然后停手。作者说他原以为自己清楚编程是什么感觉,现在他很好奇接下来会是什么感觉。
这篇东西打动我的,不是 AI 会不会取代程序员这种老问题。它讲的是一个更具体的变化:一个人把机械的那部分交出去之后,工作重心往哪儿挪。工具换代很快,愿意把验证做厚、把抽象留住、把注意力放到设计和判断上的人,会先尝到甜头。
参考来源:Elio Capella Sánchez,《Writing code by hand is over, forever》,2026 年 10 月 3 日,https://eliocapella.com/blog/writing-code-by-hand-is-over/