Simon Willison 最近记录了一次小范围但很有代表性的 AI 编程实践:他让 Claude Code 为自己的“博客转 newsletter”工具增加一种名为 beats 的内容类型,结果代理基本一次完成,直接生成了可审查的 PR。新闻点不在于 AI 又写出一段查询语句,而在于这次协作把一个更实际的问题说透了:当开发者能提供参照实现、运行方式和验收标准时,AI 代理开始像维护工程的助手;如果这些条件缺位,它就很容易退回到猜。

代码改动不复杂,流程设计才是核心事实

这次任务的目标很具体:修改 blog-to-newsletter.html,让工具像博客 Atom feed 一样纳入 beats,同时只保留带说明文字、不是草稿的内容。Claude Code 最终完成的关键工作,包括补 SQL 查询、加入 UNION ALL 逻辑、过滤 note 为空的记录、排除 is_draft = 0 以外的内容,以及补齐 beat 类型到展示名称的映射。

如果只看结果,这就是一次常规维护。难点不在代码量,而在上下文分散在不同位置:一部分规则在 newsletter 工具里,另一部分定义在 Willison 的 Django 博客代码库里,还有一部分要靠博客首页和 feed 的实际输出做核对。AI 代理之所以能把事做对,是因为它拿到的不是一句笼统需求,而是一套可以追溯的工作路径。

这里最值得下判断的地方是:这不是“模型自己理解了业务”,而是“开发者把业务线索组织成了代理能执行的任务”。很多团队把成功归因于模型能力升级,实际更该归因于任务设计是否可验证。Willison 这次给出的,是一个比“写个函数”更接近真实软件维护的样本。

短提示词能成功,不是因为神奇,而是因为里面藏着三层约束

Willison 给 Claude Code 的提示并不长,但信息密度很高。他要求代理先把另一个仓库 simonw/simonwillisonblog 克隆到 /tmp,目的是读取 beats 的定义方式,而不是把那个仓库直接卷进修改里。接着,他让代理运行本地服务,再借助浏览器自动化去检查页面结果,并把生成内容与线上博客页面做对照。

这三层约束分别对应三个常见失误点:

  • 没有参照实现,代理只能猜数据结构
  • 没有运行环境,代理只能停留在静态改代码
  • 没有对照标准,代理无法判断“改完是否真的符合预期”

很多人把这类案例理解成“提示词越来越重要”,这个说法太粗。更准确的判断是,提示词正在从需求描述变成工作流编排。谁能告诉代理去哪里找定义、用什么命令验证、拿什么结果比对,谁就更容易拿到稳定输出。反过来看,如果一个项目连人都说不清如何验收,换成代理也不会更顺。

对独立开发者来说,这类能力会直接改变待办事项的取舍。过去那些要翻两三个仓库、顺手跑一下页面、最后再人工比对的碎维护,常常因为麻烦被拖延;现在只要系统边界清楚,这类工作更可能被真正做完,而不是一直躺在 issue 里。

公开说法偏向“代理更自主”,行业现实仍是“系统越清楚,效果越稳定”

过去两年,GitHub Copilot、Cursor、Codeium 这类工具已经把“局部补全”和“在 IDE 里改几处代码”做成日常。Claude Code、Devin、OpenHands 想证明的则是另一条路线:代理不只补代码,还能读仓库、跑命令、执行测试、提交 PR。Willison 的案例属于后者,但它也刚好暴露了这条路线的真实边界。

用一个简单对照就能看清差别:

路线代表工具能力上限现实限制
补全型GitHub Copilot、Codeium快速生成局部代码很少真正理解跨文件和跨仓库关系
IDE 代理型Cursor、Windsurf批量修改、重构、解释上下文验证过程常依赖开发者自己补足
任务代理型Claude Code、Devin、OpenHands读仓库、跑命令、做端到端修改对环境、权限、测试和参照实现高度敏感

公开叙事更爱强调“自主”。行业现实是,代理越接近执行完整任务,就越依赖外部条件。Willison 维护的是一套相对整洁的个人系统:仓库公开、数据结构稳定、网页结果可访问、feed 可核对。这些条件对代理极其友好。很多企业项目没有这样的基础:权限隔离、内部依赖、陈旧脚本、缺测试、文档断裂,都会让同样的方法大幅失效。

这也是历史参照里最容易被忽略的一点。过去自动化测试、CI、基础文档常被视为工程卫生;在代理时代,它们开始变成生产力前提。没有这些基础设施,AI 代理不是不能用,而是会从“可交付助手”退回到“偶尔有用的建议器”。

真正受影响的不是所有人,而是两类已经有系统的人

最先受影响的是独立开发者和小团队维护者。因为他们常有这些特点:代码库规模可控、系统边界由自己掌握、上线链路短、改动目标明确。像 Willison 这次这种“把另一处已存在的逻辑迁移过来”的工作,会优先被代理吃掉。实际动作层面的变化是,原本可能要推迟一周的维护项,现在更可能在当天就被安排给代理先做一版,再由人审 PR。这会让小团队重新调整工具使用习惯,减少纯补全型工具的停留时间,把更多任务交给能跑命令和做验证的代理。

第二类是工程管理者,但影响不是“少招人”这么简单。更现实的动作是,团队会开始补验收脚本、补最小测试、整理仓库边界,因为这些直接决定代理的可用性。采购上也会更谨慎:如果一个团队的代码库没有测试、内部服务又封闭,盲目上任务代理的回报未必高,采购节奏反而可能延后,先把内部工程条件补到能让代理工作的位置。

我的判断是,这类案例短期内不会改变软件开发的核心分工,但会改变哪些维护任务值得进入排期。过去很多“麻烦但不难”的工作被人推迟,是因为切换上下文太费劲;现在只要有参照和验收,代理能先把 60 到 80 分做出来,人再补最后的判断。这个变化很具体,也足够现实。

这次案例的启发,不是教人迷信提示词,而是提醒先把系统整理好

Willison 的文章有一个很重要的克制之处:他展示的不是“AI 独立完成复杂工程”,而是一项边界明确、参照充分、验证路径清晰的维护任务。这种案例比炫技 demo 更有价值,因为它告诉开发者,什么条件下代理真的能用,什么条件下只是看起来能用。

如果要把经验压缩成一句话,那就是:代理的上限,往往先被你的系统清晰度决定,再被模型能力决定。一个有公开仓库、有稳定结构、有对照结果、有基本测试的项目,能把代理用成工具;一个规则散落在聊天记录、口头习惯和遗留脚本里的项目,再强的模型也只能频繁试错。

这也是为什么这次新增内容类型支持值得写。它表面上只是一个小改动,实质上是在回答一个更大的问题:开发者该怎样把 AI 从“会说代码”变成“能参加维护流程”。Willison 给出的答案不是更会写提示词,而是更会提供参照、约束和验收。