写代码的成本趋近于零,Simon Willison:软件工程的重心该换了
解读 Simon Willison《Agentic Engineering Patterns》
Simon Willison 是 Django 联合创造者,也是 AI 辅助编程领域最高产的实践者之一。2026 年初起,他持续更新一份名为《Agentic Engineering Patterns》的指南,系统总结自己每天高强度使用 Claude Code、Codex 等编码 Agent 的方法论。这份指南的价值不在于追逐工具热点,而在于它试图回答一个更根本的问题:当写代码的边际成本趋近于零,软件工程的重心应该放在哪里。
一、定义:Agentic Engineering 不是 Vibe Coding
Willison 的定义链条很清晰:Agent 是“在循环中调用工具以达成目标的软件”;编码 Agent 的决定性能力是执行代码——不能运行代码的 LLM 只能产出建议,能运行代码的 Agent 才能迭代出“可证明能工作”的软件。
由此,人类工程师的职责从“写代码”迁移到三件事:为 Agent 配备合适的工具,以恰当的粒度定义问题,验证并迭代结果。
他刻意与 Andrej Karpathy 提出的“vibe coding”划清界限。Vibe coding 指“忘记代码存在”的原型式编程,产出的是未经审查的代码;agentic engineering 则是把 AI 产出提升到生产标准的工程实践。两者需要不同的词汇,因为它们是不同的东西。
二、经济学基础:代码便宜了,好代码没有
整份指南建立在一个判断之上:写代码的成本趋近于零,这颠覆了软件行业几十年形成的几乎所有权衡直觉。
宏观层面,项目估算、功能取舍的逻辑变了——过去一个功能必须“赚回”昂贵的开发时间才值得做,现在这个门槛大幅降低。微观层面,“值不值得重构这个函数”“要不要为这个边界情况写测试”“能不能做个调试界面”这类每天上百次的小决策,答案都在翻转。
但 Willison 紧接着划出了边界:交付代码几乎免费,交付好代码依然昂贵。他给出的“好代码”标准包括:能工作、被验证能工作、解决的是正确的问题、优雅处理错误路径、简洁、有测试保护、文档与实现同步、不妨碍未来演进、满足可访问性与安全性等非功能性质量要求。Agent 可以协助其中大部分,但判断“当前项目需要哪部分好”的责任仍在人身上。
由此得出一个行为准则:每当直觉说“这不值得花时间做”,就随手发一个异步 Agent 任务。最坏的结果不过是浪费一点 token。
三、囤积已验证的方案
这是整份指南中最具杠杆效应的模式。工程师的核心资产之一是知道“什么是可能的”,并且有可运行的代码作为证据——“理论上可行”和“亲眼见过它跑起来”是两回事。
Willison 本人通过博客、TIL 站点、上千个 GitHub 仓库和单文件 HTML 工具集来囤积这类方案。Agent 时代,这种积累的复利被急剧放大:一个技巧只需攻克一次,之后可以让 Agent 抓取示例、克隆仓库、跨项目搜索,把两个已有方案重组成新方案。
他的案例很有说服力:把 PDF.js 渲染代码和 Tesseract.js OCR 代码两段旧笔记放进同一个 prompt,几分钟内就得到一个可用的浏览器端 PDF OCR 工具。个人知识库因此从“备忘录”变成了 Agent 的高价值输入资产。
四、用 AI 产出更好的代码,而不是更差的
针对“AI 导致代码质量下降”的普遍担忧,Willison 的立场是:用 Agent 交出更差的代码是一种选择,不是必然。
路径有三条。
第一,从源头避免技术债。大量技术债——API 设计缺陷、命名错误、重复代码、巨型文件——属于“概念简单但耗时”的修复,这正是异步 Agent 的理想任务:后台运行,以 PR 形式评审,好就合并,差就丢弃。改进成本已经低到可以对代码坏味道零容忍。
第二,用廉价原型做技术选型。与其争论某个技术是否适用,不如让 Agent 搭建仿真环境、跑压测。实验成本趋近于零后,可以并行验证多个方案再择优,避免在规划阶段犯下最贵的错误。
第三,复合工程循环。LLM 本身不会从错误中学习,但人可以通过持续更新给 Agent 的指令和工具链,让整个系统获得“学习”的能力。每个项目结束后复盘,把经验沉淀回指令——小改进会复利。
五、唯一的重罪:把未审查的代码甩给别人
Willison 点名的头号反模式是:提交自己都没审查过的 Agent 产出。未经亲自验证就把上千行代码丢给评审者,等于把工作转嫁给他人——“评审者自己也能 prompt 一个 Agent,你的价值何在?”
他给出的合格 PR 标准:代码确实能工作且提交者有把握;变更足够小,多个小 PR 优于一个大 PR;附带解释高层目标的上下文;连 Agent 生成的 PR 描述也要亲自审;最好附上手动测试记录、截图或视频,证明自己做过功课。
六、理解机制:上下文是稀缺资源
指南用一章拆解了编码 Agent 的构造:LLM 是无状态的 token 补全机,对话历史每轮全量重放,所以对话越长越贵;工具调用的本质是“模型输出特定格式文本,外壳程序解析执行,结果回注对话”;系统提示词是 Agent 行为的隐形骨架;推理能力让模型花更多 token 思考,对调试尤其有效。核心机制简单到几十行代码即可实现——理解这一点,才能正确评估 Agent 的能力边界。
这一视角直接解释了子 Agent 的价值:上下文窗口是稀缺资源(上限约百万 token,但二十万以内质量更好)。子 Agent 用全新上下文执行探索、跑测试等 token 密集型任务,只把结论带回主上下文。Willison 同时提醒:不要过度拆分专家子 Agent,主 Agent 在 token 充裕时完全能自己审查和调试——子 Agent 的核心价值是保护主上下文,而非角色扮演。
七、验证闭环:从测试到证据
这是全书最实操的部分,逻辑层层递进。
Red/Green TDD。先写测试、确认失败、再实现到通过。这直接防御 Agent 的两大常见病:写出不工作的代码,和写出没人用的代码。“Use red/green TDD”是模型已经内化的纪律压缩短语。
“First run the tests”。对已有项目开会话时的第一条 prompt,一石三鸟:迫使 Agent 搞清测试如何运行,之后大概率持续运行;测试规模成为项目复杂度的代理指标;把 Agent 置入测试心态。
Agentic 手动测试。核心原则是“未被执行过的代码,永远不要假设它能工作”,且测试全绿不等于功能正确。手段按场景分层:Python 用 python -c 试边界情况,API 用 curl 探索,Web UI 用 Playwright 等浏览器自动化工具,并让 Agent 用自己的视觉能力查看截图验证界面。手动测试发现的问题,再用 red/green TDD 固化进自动化测试。
Showboat 模式。让 Agent 把测试过程记录成证据文档——命令和真实输出同时记录,从机制上防止 Agent“写出它希望发生的结果”。这回应了一个深层问题:如何确认 Agent 真的完成了工作,而不只是声称完成了。
八、偿还认知债
Willison 提出了一个少有人讨论的概念:认知债。当 Agent 写的代码成为人不理解的黑盒,人就失去对系统的推理能力,其危害与技术债同构。
偿还方式有两种。一是线性走读:让 Agent 生成带真实代码片段的讲解文档(片段用命令提取而非手抄,防止幻觉)。他用这种方式学习自己 vibe code 出来的 SwiftUI 应用——把“AI 代写”转化为主动学习的机会,这是对抗“AI 让人变懒”的具体答案。二是交互式解释:让 Agent 把算法做成可步进、可调速的动画,例如用词云布局算法的动画演示,让“阿基米德螺线放置”从一句报告术语变成直觉理解。
九、Prompt 的元技巧
指南后半部分逐句拆解了真实 prompt,其中可迁移的技巧包括:
给 Agent 验证手段比给详细规格更重要。一句“用浏览器自动化工具测试你的工作,这是测试用文件”,让 Agent 自己发现并修复了 CSS bug。
用代码库代替自然语言描述需求。“克隆我的博客源码作参考,模仿 Atom feed 的逻辑”,比详细描述业务规则高效得多;让 Agent 克隆到 /tmp 则可防止参考代码混入提交。
信任模型的品味,保留修正权。不指定所有参数细节,让模型先选,不满意再迭代。
过程中轻量干预。在 Agent 工作途中插入追加指令,而非推倒重来。
附录的私人 prompt 还展示了他的使用边界:表达观点、署名的文字必须自己写,LLM 只做校对和辅助。