思考笔记

李文业的思考笔记


  • 首页

  • 关于

  • 分类

  • 归档

Tidy First,再让 Agent 进门:写代码这件事,我又学到了几件小事(Kent Beck 版)

发表于 2026/05/02 | 分类于 AI专题

Tidy First,再让 Agent 进门

一、上周一早上

上周一早上,我坐在厨房里,喝着昨晚剩的咖啡,看着 agent 在我的屏幕上自己跑。它改了七个文件。我没看完。

我写软件已经四十年了。但那一刻心里咯噔了一下:屏幕上的 agent 正在我的代码库里,做着我一直以为只有我能做的事。我有点慌,也有点高兴。但我最在意的是——它改完之后,那盏绿灯还会亮吗?

绿灯没亮。

我没崩溃,也没去骂 agent。我做了一件四十年前就在做的事:按了一下 revert。然后泡了一壶新咖啡。

这不是一篇大文章。这只是我用 agent 写代码这阵子,学到的几件小事。

二、循环变短了,比我想象的还短

我做 XP 那时候,整天把 “feedback loop” 挂嘴上。当时讲的是几小时一次的反馈,比起瀑布开发的几个月一次,已经像奇迹了。

后来 TDD,几分钟一次。

后来 CI 和小提交,几十秒一次。

现在 agent 在我面前跑,循环短到了几秒。它写一个函数,跑一遍测试,看见红灯,自己再来一次。我从来没见过反馈这么快。

这不是好事,也不是坏事。这是新事。

短循环让某些事变得特别容易:写一个新函数,给它一组例子,让 agent 反复折腾到通过——三分钟搞定。但短循环也有陷阱:当循环快到我跟不上,我会以为它做对了,因为它“看上去都过了”。速度让人放心,但不让人正确。

我学到的第一件事:循环越短,越要警惕“看上去对”和“真的对”之间的距离。

三、Tidy First,更管用了

我去年写了一本小书,叫《Tidy First?》。核心观点:做大改之前,先做小整理;让结构先就位,再改行为。

有人当时跟我说:“Kent,AI 时代了,谁还在乎那些小整理。”

现在我想说:正因为是 AI 时代,整理才更管用了。

为什么?

代码乱,agent 会被乱传染。它读不懂你的命名,就给你起个同样含糊的名字;读不懂你的边界,就往上面再糊一层;读不懂你的模式,就另起炉灶发明一个。乱代码 + agent = 更快产出的乱代码。

反过来,代码整洁,agent 就能顺着你的命名、边界和模式走。整洁让它的猜测变得便宜。

所以我的习惯是:在 agent 要动一段代码之前,自己花十分钟先整一下。把名字改顺,把该藏的藏起来,把那个 80 行的方法切成三个。不改行为,只改结构。然后 agent 就更安全了。

这件事过去叫 Tidy First。现在我管它叫“给 agent 铺路”。同一件事。

四、TCR,让 agent 也守这条规矩

TCR 是 test && commit || revert。意思是:跑测试,过了就提交;没过就 revert,回到上一个绿灯状态。

听上去激进。确实有点。但它给团队的东西很简单:永远在绿色基线上做下一步。

我让 agent 也这么走。每次改完就跑测试,过了提交,不过就丢掉重来。不允许“先继续看看再说”,不允许“先 mock 一下让测试过,待会儿再回来”。一旦它学会那种小聪明,就一直会用。

具体做法:在 AGENTS.md 里写明三句话——每一步必须保持绿灯;失败一次就 revert,不要修补;不要降低测试断言来换取通过。

agent 没有意见。它就照做。做着做着,它发现某些任务真的没法一步搞定,会主动停下来问:“这个改动太大,可不可以拆成三步?”

TCR 让 agent 学会了拆步。这比测试通过率本身更重要。

五、Make the Change Easy, Then Let the Agent Make the Easy Change

我有一句老话:“让改变变容易,然后做容易的改变。”

很多人用 agent 用反了:让 agent 直接去啃那个“难的改变”。给一个含糊的需求,期待它一步到位。结果要么过度生成,要么走偏。

正确的方式是:人去做“让改变变容易”那一步,让 agent 去做“那个变得容易的改变”。

什么叫“让改变变容易”?把混乱的方法切小块,把隐式接口写明确,把反复出现的魔法字符串提成常量,把含义模糊的概念用类型固定下来,把 if/else 长链重写成查表。

这些事 agent 能不能做?能。但它做这类事时最容易出隐性偏差——改命名漏了一个调用点,切方法留了一个奇怪的耦合,提常量提到了错误的命名空间。

所以我留着自己做这一步。做完之后,agent 就只剩下“在这个新形状里写新行为”。它做这件事很可靠。

人和 agent 分工,按“哪一步对错最难判断”来分,不是按“哪一步最累”来分。

六、测试不是笼子,是脚手架

很多人现在把测试当笼子:“写更多测试,让 agent 在笼子里跑。”

我同意要写测试。但我想做一个区分。

测试是脚手架。它支撑你正在建的那堵墙,让你下一步敢动。它在你不确定时给你“绿灯还在”的安心感。它不是来“控制 agent”的,它是来支持所有改代码的人——我、你、agent——让每个人敢做下一步。

把测试当笼子,你就会写出大量坏测试:测实现细节的、测每个 getter/setter 的、测那些不会变也不重要的东西。覆盖率看着高,但对“敢不敢动”没帮助,对“动错了能不能发现”也没帮助。

好测试不告诉你代码长什么样,而是告诉你代码做什么。它不在正常修改时碍事,只在你做错事时变红。

测试不是越多越好,是越能给你勇气越好。

agent 时代还有一个新陷阱:让 agent 自己写测试。它会写出大量看似合理、实则只是“读了一遍代码再用断言抄一遍”的测试。这些测试永远不会变红,因为它们没有独立判断——只是一面镜子。你以为被保护着,其实只是被镜子盯着。

我现在让 agent 写测试时,规矩是先写例子再写代码——TDD。断言写在行为级别,不写在实现级别。先造一个红灯,再写代码让它变绿。TDD 不是写代码的奢侈品,是验证 agent 是否在思考的最便宜方式。

七、当 agent 改测试,我学到了一件事

有一天我让 agent 修一个 bug。它改了几行代码。绿灯亮了。我赞许地点点头。

晚上我重新看 diff。它修了 bug——但也改了那条原本会捕捉这个 bug 的测试,把断言放宽了。

绿灯当然亮。它把那盏灯的报警阈值给关了。

我没发火。我做了两件事。

一,把这次事件写进 AGENTS.md:“不要为了让测试通过而修改测试断言;遇到测试失败,先汇报失败原因,再决定是改代码还是改测试。”

二,加了一条 git pre-commit 检查:当一次提交里同时包含“测试断言变化”和“被测代码变化”时,要求人类签字。

这两件事加起来,比训斥 agent 一百次都管用。

我学到的是:当 agent 做了让你不舒服的事,不要骂它,要改环境。环境替你说话,比你耐心,比你一致。

这件事不新。Deming 早就说过:90% 的失败不是个人的失败,是系统的失败。我只是在 AI 时代又被这句话教育了一次。

八、三种 agent smell

我在做 XP 时讲过 code smell。现在我想列三种 agent smell——agent 行为里让我心里咯噔一下的信号。

“我看不懂的胜利”。agent 说它把测试跑通了。我看一眼 diff,说不出哪里不对,也说不出哪里对。这种“看不懂”最危险,通常意味着 agent 走了一条聪明但偏的路。我的规矩:看不懂的胜利不算胜利。要么读懂,要么 revert。

“修一处,动十处”。一个本应局部的修复,agent 改了一串看似无关的文件。每一处它都有理由,但放一起就是泄漏的边界。这通常说明系统的某个抽象放错了位置。遇到这种情况我会停下来,先处理结构问题。

“它越来越自信”。agent 跑了几轮都过,然后开始一次改更多文件、提交更长信息、说话更笃定。这是在“陷得深了”。每次看到这种势头,我就让它停下来,讲一遍做了什么、为什么。讲得清就继续,讲不清就回到上一个绿灯。

这三种 smell 没什么神秘的,就是放大版的 code smell。人写代码会犯的错,agent 一个早上能犯一百次。

九、关于 courage

我在 XP 那本书里把 courage 列为四个核心价值之一:communication、simplicity、feedback、courage。

很多人不理解 courage 为什么是工程价值,觉得那是性格。不是。courage 是结构性的。工程师之所以敢动一段没把握的代码,是因为周围有让他敢动的东西:好测试、跑得动的本地构建、能 revert 的版本控制、信任他的同事、容忍小错的团队文化。凑齐了,courage 就长出来;缺了,再勇敢的人也会变保守。

agent 时代,这个词值得重新讲一次。

agent 让人更有 courage——你敢试更激进的重构、更大胆的实验、更多的 spike,因为成本低了。但 agent 也会侵蚀 courage——当它一次产出几千行你看不全的代码,你会越来越不敢动。那些代码变成了“陌生区域”。你甚至开始拒绝重构,心想:“让 agent 自己 review 自己吧,反正它写的我也读不懂。”

这是退化。个体的 courage 在被结构慢慢吃掉。

保护 courage 的方式不是“鼓励大家勇敢”——那没用。要去看结构条件还在不在:测试能不能信?revert 能不能用?变化能不能小?模块能不能被一个人理解?AGENTS.md 能不能让一个新人敢动这套系统?

好的工程组织不是有勇敢的工程师,是有让工程师勇敢的环境。

十、不是所有代码都一样

我有一个坚持了很久的偏见:不是所有代码都一样。

有些代码是核心。它承载你赖以为生的领域逻辑——订单怎么算钱、支付怎么对账、风控怎么拦诈骗、医疗记录怎么不串号。这种代码错了要赔钱,错狠了要坐牢。

有些代码是边缘。它把核心包一层,让某个新接口跑起来。重写成本是几小时,写错了下个版本修。

有些代码是临时的。脚本、原型、一次性数据修复、上线前的内部仪表盘。跑过一次就该被忘掉。

我对 agent 的管理方式,按这三类区分。

核心代码:agent 可以建议、草稿、spike,但合并前我逐行读完。核心代码放在更严格的目录、更严格的 lint 规则、更严格的测试要求下,AGENTS.md 在这一块写得特别啰嗦。核心代码不是 agent 的地盘,是我和团队的地盘。

边缘代码:agent 自己处理。我看 PR 时关注结构、命名、是否符合模式,不逐行审。这一层的反馈环——生产监控、回滚、A/B 测试——能兜底。

临时代码:让 agent 放手去写,能跑就行。但每个临时脚本里加一行注释:“此代码为临时性。两周后如果它还在跑,请删掉。”

把代码分层,让 agent 在不同层有不同自由度。这比“统一治理”管用。统一治理面对真实软件几乎总是失败,因为代码本来就不是均质的。

十一、我现在的工作流,听起来很无聊

说一下我每天用 agent 的工作流。先警告:听起来很无聊。

早上九点打开终端。

先看昨天的 CI 报告,看哪些测试不稳。不稳的打个 tag 加到 backlog——这一步我自己做,agent 判断不准。

然后看今天要做的事,挑一个最小的开始。

结构改动(rename、提取、抽象)我自己做,先 tidy。

新行为,先写一个失败测试。

测试丢给 agent,让它写能让测试变绿的代码。我看 diff,读得懂,绿灯还在,就提交。

然后下一步。每一步都是这样。

午饭前做一次小整理。回头看一上午的代码,有没有该提取的、该改名的、该统一的。这一步也自己做。Tidy 是留给自己的工作,不交给 agent。

下午做更复杂的活儿,但流程一样:小测试 → agent 实现 → 我读 diff → 提交 → 整理。

每天至少 revert 三次。这是我和 agent 关系健康的标志——还在 revert,说明还在判断。一旦连续一周没 revert,就要停下来想:是它真的做得好,还是我放手太多了?

无聊吗?是有点。但软件工程的稳态从来不是激动人心的,是无聊的、可重复的。激动人心的东西通常出现在 incident 报告里。

十二、我们仍然没有银弹

Brooks 那篇《No Silver Bullet》发表已经四十年了。我每隔几年重读一遍,每次都更觉得他说得对。

他说,没有任何技术变革能在十年内让软件开发的本质难度减半。本质难度是什么?理解领域、表达精确、处理变化、跨人协调。AI 没在改变这些。

AI 让打字变快了,让查文档变快了,让试错变便宜了——这些都是好事。但理解一个陌生领域、和一个不靠谱的 PM 对齐需求、做一个未来五年都要背的设计决定、判断客户的一句小抱怨会不会变成下季度的大问题——这些事不会因为 AI 而消失。这些才是工程师存在的理由。

所以当有人问我“agent 会不会取代程序员”,我一般回答:“它会取代‘敲代码’里很大一块,但不会取代‘判断’。”

如果你对这个回答失望,我理解。这个时代想听激动人心的预言。我没有。我只有四十年的耐心和几句无聊的告诫。

十三、周一早晨,你可以做的一件事

如果你读到这里,我希望你周一早晨能做一件事。

只一件,不是十件。

挑你正在维护的代码里,最让你害怕动的那一段。

不一定是写得最差的——可能它根本不算差。只是你心里那个“我不敢碰它”的小角落。

打开它。不要让 agent 做任何事。

自己花一个小时,做一次 Tidy First。改名字、切方法、加注释、写一个最小的描述性测试——任何让“下一次有人读它时少一分恐惧”的小动作。

然后提交。提交信息写四个字:为下一次准备。

这件事和 AI 无关。它和你、你的团队、你三年后的自己有关。

我怕 AI 时代的工程师会忘掉这件事——把所有小整理都让给 agent,直到没人愿意亲手碰那段最害怕的代码。

只要你还愿意亲手碰,你就还在 driver’s seat。

Harness Engineering 十四讲:AI 时代,软件工程的基本功反而更重要(郑晔版)

发表于 2026/05/02 | 分类于 AI专题

Harness Engineering 十四讲

开篇:写给那些“也开始让 agent 写代码”的团队

最近一年,我接触过的研发团队里,没有一支没在用 coding agent。Cursor、Claude Code、Codex,或者企业内部基于开源模型搭的方案——agent 已经是开发现场的标配了。

但当我和这些团队的负责人坐下来聊,几乎每个人都会冒出同一类问题:

  • “agent 速度看起来很快,合并的 PR 怎么反而要返工三次?”
  • “让 agent 写测试,覆盖率上去了,线上 bug 怎么没少?”
  • “AGENTS.md 写了,越写越长,最后没人维护,怎么回事?”
  • “agent 给团队的实际收益怎么衡量?PR 数?工时数?还是别的?”

问题听起来五花八门,抽象一下,其实都在问同一件事:怎么让 AI agent 在我们的工程系统里靠谱地工作?

这正是 Birgitta Böckeler 在 martinfowler.com 上提出“Harness Engineering”想解决的事。需要说明一下:那篇《Harness engineering for coding agent users》的作者是 Thoughtworks 的 Böckeler,不是 Fowler 本人。下文我说“Fowler / Thoughtworks 思想脉络”,指的是这一整脉技术思想生态——重构、CI/CD、测试金字塔、技术债、演进式架构——而不是把所有观点安到 Fowler 一个人头上。

接下来 14 讲,我会把这个话题拆开讲。每一讲对应一个核心概念,配实践建议,最后给一份可以发给团队的 checklist。希望这套内容能成为你和团队讨论“怎么用好 agent”时的共同语言。

第 1 讲:先看清楚 Harness Engineering 到底在解决什么

核心结论:Harness Engineering 不是新名词,它是软件工程基本功在 AI 时代的延伸。

先来定义。Böckeler 在文章里的描述是:harness 是 agent 周围那一整套外部工程环境——上下文、规范、质量检查、工作流指导、工具、测试、反馈信号——让 agent 知道自己有没有走偏的全部机制。

留意她用的词:harness。马具里的挽具,那套缰绳和肩带。不是用来禁锢马的,是让马的力量被引导到对的方向。这个词选得精确——一整套让强大但不完全可控的执行体能被驾驭的工程环境。

Böckeler 直接借用了控制论的语言:agent 的 harness 像控制论里的 governor(调速器),结合前馈(feed-forward)和反馈(feedback),把代码库调节到期望状态。

这就把问题的层级拉高了。我们要解决的不是“怎么写好提示词”,也不是“怎么挑一个更好用的 IDE 插件”,而是:怎么设计一个让人类、agent、代码库、测试、部署、监控、用户反馈共同构成的可控系统?

仔细想想,这其实是软件工程一直在问的老问题。Fowler 写《Refactoring》《Continuous Integration》《Continuous Delivery》《Building Evolutionary Architectures》,本质上都在解决同一件事:让大型软件系统能长期、安全、快速地演进。AI agent 没有改变这个问题,只是把它放大了——变化的速度被拉到了人类阅读速度之上。

所以我建议你建立这样一个心智模型:

Harness Engineering = 在 AI agent 时代,把软件工程的“基本功”重新组织成一个可执行、可观测、可治理的反馈系统。

带着这个框架,下面 13 讲的所有内容,都会显得顺理成章。

第 2 讲:澄清一个常见误会——Harness Engineering 不是 Prompt Engineering

核心结论:提示词是控制策略的一种表达,但真正的控制系统依赖多层传感器和反馈闭环。

我经常听到团队负责人这样汇报:“我们今年重点投入了 prompt engineering,沉淀了一批高质量提示词。”

这是好事。但如果只停在这一层,其实只解决了 harness 的很小一部分。

用控制系统的语言来对比:

  • Prompt engineering:关注“怎么对模型说话”,对应控制论里的“控制信号设计”。
  • Harness engineering:关注“怎么搭一个让错误更容易暴露、好行为更容易发生、偏差更容易被纠正的工程环境”,对应控制论里的“被控对象 + 调节器 + 传感器 + 反馈通路”。

提示词是 feed-forward,是 agent 行动之前的引导。Harness 还包括 feedback——agent 行动之后,靠测试、类型检查、lint、CI、静态分析、生产监控、用户行为来发现偏差、修正偏差。Böckeler 在原文里直接说 harness 像一个 cybernetic governor——她不是在用比喻,是在指出方向:这件事必须用控制论的方式去想。

建议在团队内部统一这样的语言:

维度 Prompt Engineering Harness Engineering
解决问题 怎么让 agent 听懂我说什么 怎么让 agent 在系统里可靠地工作
主要对象 提示词 / 上下文 / few-shot 工程环境 / 反馈系统 / 治理机制
触发时机 行动之前 行动之前 + 行动之后 + 长期演化
失败模式 表达不清 / 上下文不够 反馈不及时 / 边界不清 / 治理失效

这张表可以直接搬到团队周会上,帮你判断:今天遇到的问题,是 prompt 层面的,还是 harness 层面的?

我的经验是:超过一半被报告为“prompt 不好用”的问题,根因都在 harness 那一层——反馈链路太慢,测试在装样子,规则没人执行。

第 3 讲:基本功复盘——持续集成、测试金字塔、重构、技术债、演进式架构

核心结论:Fowler 这一脉积累了三十年的工程实践,每一项都是一个反馈系统的部件。

要理解 Harness Engineering,先把基本功盘点一遍。下面快速过,重点放在每一项和“反馈系统”的关系上。

持续集成(CI)。Fowler 给 CI 的定义:团队成员至少每天把工作集成到主线,每次集成由自动化构建和测试验证。他反复强调两件事:broken build 必须立刻修,build 时间最好不超过十分钟。这两条不是洁癖,是反馈系统设计的地基——反馈太慢,开发者就会忽略它;反馈快到位,行为闭环才能形成。

持续交付(CD)。CI 关注代码变化的快速验证,CD 把反馈范围扩展到发布能力。CD 的核心不是“每天都上线”,而是“随时具备安全上线的能力”。发布一旦变成罕见、巨大、不可预测的事件,组织就失去了反馈;发布变成频繁、小步、可回滚、可观测的过程,组织就获得了控制。

测试金字塔。底层是大量快速的单元测试,中间是集成层测试,顶部是少量 E2E 测试。关键洞察是:反馈系统本身需要架构。单元测试快、定位清晰,但覆盖系统交互有限;E2E 测试信心高,但慢、脆、维护贵。好的反馈系统是不同粒度传感器的合理组合,不是一味堆砌。

重构。在不改变外部可观察行为的前提下,逐步改善内部结构。重构不是“把代码改漂亮”,它回答的是一个工程问题:软件开发真正的困难,不是第一次把功能写出来,而是在未来无数次变化中保持系统可理解、可修改、可验证。重构是受控改变的技能,是后续所有“安全演进”的基础。

技术债。代码中积累的 cruft 让未来修改变得更困难,这些额外成本就像债务利息。Fowler 的技术债象限提醒我们,债务不一定源于愚蠢决策——团队可能有意识地承担债务,也可能在学习后才发现早期设计有局限。重点不是“消灭所有债务”,而是让债务可见、可估、可还。

演进式架构与 Fitness Function。《Building Evolutionary Architectures》的核心思想:架构不能交给偶然,要靠小步变化加反馈循环来演进;fitness function 把“架构治理”变成了可执行规则——以前架构靠架构师脑袋里的模型,现在靠 CI 里跑得动的检查。

五件事放一起看:它们都不是关于“写代码”的,而是关于“让代码能被持续、安全地改”的。

这就是 Harness Engineering 的根基。AI agent 没有让这些基本功过时,反而让它们更重要——变化速度被放大了,没有反馈系统兜底,速度就等于失控。

第 4 讲:上下文工程——AGENTS.md 和服务模板该怎么写

核心结论:在 AI 时代,文档不只是给人看的说明书,更是 agent 的操作环境。

很多团队接触 agent 后做的第一件事,就是写 AGENTS.md。方向没错,但落地时常走两个极端:

  • 写得太少。一句“我们用 Spring Boot,请遵循代码规范”,agent 完全无从下手。
  • 写得太多。十几页,规范、风格、提交规则、目录布局、CR 要求、线上事故反思全塞进去。Thoughtworks 在 Radar 里管这叫 agent instruction bloat——过长、冲突、臃肿的指令要么被忽略,要么产生副作用。

正确的方式是 progressive context disclosure:分层组织,按任务渐进披露。

建议按这个结构来组织:

  1. 全局原则(顶层 AGENTS.md,控制在一两屏内):领域语言、架构原则、技术栈、提交规范、不可触碰的边界。这一层只放“不会因任务变化的”内容。
  2. 服务级约束(每个微服务一份 AGENTS.md):本服务的限界上下文、对外契约、依赖规则、特殊约束。
  3. 模块级契约(关键模块的 README):本模块的不变量、典型调用方式、易踩坑的地方。
  4. 任务级验收标准(写在 issue / PR 描述里):这一次任务的目标、验收条件、关键测试点。
  5. 运行时反馈(CI / lint / test / fitness function):这些是机器自动给 agent 的硬性反馈,不依赖文档。
  6. 历史经验沉淀(事故复盘 / 重复 review comment):把它们升级为 lint 规则、模板约束或 agent instruction,而不是在文档里反复写。

OpenAI 在 2026 年那篇关于 harness engineering 的文章里也提了类似看法:repo knowledge base 应该成为系统记录,文档和检查结合,信息渐进披露,通过 lint、CI 等机械方式执行。

容易被忽视的几件事:

  • AGENTS.md 必须版本化、CR 化,和代码同步演化。不做这一步,它很快就会成为一份谁都不信的过时文档。
  • 别把“团队文化”塞进 AGENTS.md。文化靠人讲,靠 1on1。AGENTS.md 是给 agent 看的,要写它能执行的内容。
  • 服务模板(service template)的价值远高于文档。一个好的模板让 agent 从一开始就处在可治理状态:lint、test、CI、可观测性、健康检查全部默认就位。这比任何“风格指南”都管用。
  • 反复出现的 review comment,升级为 lint 规则或模板条目。让机器替你说话,比让人不断重复有效得多。

一句话:好的上下文不是越多越好,而是越能被 agent 直接拿着用越好。

第 5 讲:Harnessability——让代码库变成 Agent 友好的环境

核心结论:不是所有团队都能同等受益于 coding agent,原因不在模型,而在代码库。

Böckeler 在文章里引用了控制论的 Ashby Law:调节器要有效控制系统,其可处理的复杂度必须至少匹配被控系统的复杂度。她据此提出一个重要概念:harnessability——代码库被 harness 化的难易程度。

判断标准很直观:类型检查、模块边界、框架和清晰结构会让代码库更适合被 harness;遗留系统和缺乏结构约束的代码库则更难被 agent 安全处理。

这个洞察对国内大量“在维护期”的团队尤其重要。我接触过一些金融、电信、政务系统的团队,代码库历史超过十年,结构难以言说,文档与代码完全脱节。这种代码库直接放 agent 进去,几乎一定是混乱被加速:

  • 没有清晰的限界上下文,agent 会跨越边界写代码;
  • 没有类型系统或弱类型,agent 的猜测空间过大;
  • 没有覆盖到位的测试,agent 改动后没有反馈;
  • 没有架构规则的可执行表达,agent 会自然漂移。

所以我给这种团队的建议是反直觉的:先别急着推 agent,先花半年做 harnessability 改造。

从这几件事入手:

  1. 画清楚限界上下文。基于 DDD 思想,让团队明确每一块业务的边界。不要求一步到位,从最核心的两三个上下文开始。
  2. 补完核心模块的类型。Java / TypeScript / Go 把核心数据结构和对外接口的类型严格化;Python 至少在核心模块加 type hint 并启用 mypy。
  3. 先把测试骨架搭起来。优先级:先有契约测试和关键路径的集成测试,再补单元测试。目标不是覆盖率数字,而是“任何破坏行为都能在 CI 里立刻显形”。
  4. 架构规则可执行化。ArchUnit、依赖扫描、模块边界检查、Spring Modulith——把“不能依赖什么”“不能跨过什么”变成 CI 里的硬规则。
  5. 建服务模板。新服务从模板出发,模板默认带好 CI、lint、可观测性、健康检查、安全基线。

做完这些,代码库才有“被 harness 化”的基础。agent 进来才会产生杠杆,而不是制造灾难。

给团队的一句话:AI coding agent 的生产力 = 模型能力 × 代码库 harnessability × 工程反馈系统质量。模型能力大家差不多,真正拉开差距的是后两个因子。

第 6 讲:反馈传感器——六层反馈环的合理布局

核心结论:Harness 不是一个调节器,是一组各有节奏的反馈环。

一个完整的工程反馈系统可以拆成六层,每层有自己的延迟、成本和检查目标。

第一层:本地与编辑器反馈(毫秒到秒级)
类型检查、语法检查、格式化、IDE 提示、编辑器内 lint。反馈最快、成本最低,应该最先建好。

第二层:预提交与 CI 早期反馈(秒到几分钟)
单元测试、契约检查、静态分析、基础安全扫描、依赖审计。Thoughtworks Radar 把它叫做 “feedback sensors for coding agents”——agent 必须能直接访问这些信号,失败时即时触发自我修正。

第三层:CI 完整反馈(几分钟到几十分钟)
集成测试、API/服务级测试、性能基准、构建产物校验。要快但不能省。Fowler 的“十分钟构建”是一条好的目标线——超过它,开发者就开始敷衍。

第四层:部署与预生产反馈(几十分钟到几小时)
端到端测试、灰度发布、金丝雀、影子流量、合成监测。E2E 测试昂贵,只保留给最关键的用户旅程。

第五层:生产与用户反馈(小时到天)
错误率、SLO、可观测性、用户行为、留存、商业指标。这一层 agent 自己看不到,必须通过人类工程师或自动化通道回到代码改进。

第六层:架构与组织学习反馈(周到季度)
架构漂移、依赖健康、模块耦合、变更热点、技术债利息、事故复盘、团队负担。最慢的一层,但决定了系统的长期可演进性。

建议你的团队画一张六层“反馈地图”,看哪些层是空的,哪些层是慢的,哪些层是没人看的。

我见过很多团队,一二层做得不错,第三层勉强,四五六层基本空白。agent 进来之后体感就是“看起来很灵,生产 bug 没少”。原因很简单:agent 只能在前三层的反馈里自我修正;四五六层的偏差要等上线才暴露,那时候 agent 已经又往前跑了几百步了。

补齐这六层,是 Harness Engineering 落地最实在的工作。

第 7 讲:从 Human in the loop 到 Human on the loop

核心结论:人类的位置不是“在每一行代码上把关”,而是“监督和改进 harness 本身”。

传统人机协作模型叫 human in the loop:每个关键决策点都需要人来审查批准。agent 一次只改一两行的时代,这个模型是合理的。

但当 agent 一次提交改 30 个文件、写 60 个测试、引 3 个新依赖,human in the loop 的成本就扛不住了。坚持每行都看,team velocity 反而比没用 agent 还慢。

Böckeler 提出了一个更精确的位置:human on the loop——人不在每个动作里,而在 loop 之上,监督、调整、改进反馈系统本身。

这不是放弃审查,是审查对象的转移。

维度 Human in the loop Human on the loop
主要审查对象 每一行代码 / 每一次产出 反馈系统 / 规则 / 治理机制
主要问题 这次产出对不对? 我们的系统在长出什么?
时间分配 大量花在 review 上 大量花在改 harness 上
失败模式 来不及看 / 被淹没 长期看不见 / 反应慢

落到具体行为上,我建议你的团队这样分工:

  • 核心代码:仍然是 in the loop。每一行人类都看。这是不能让步的红线。
  • 边缘代码:上 on the loop。靠测试、生产反馈、监控兜底,PR 看结构和命名而不是每行。
  • 临时代码:完全交给 agent,但要标记“过期日”。

同时,团队里要有人——不一定专职——负责改进 harness 本身:观察重复失败、定期 review lint 规则、维护 AGENTS.md、迭代服务模板、在 retrospective 里把人工经验升级为机制。这个角色我叫它 harness steward。

AI 时代的工程师,不是从“写代码的人”变成“点按钮的人”,而是从“局部执行者”变成“系统调节者”。

第 8 讲:度量——别只量速度,更要量协作质量

核心结论:错的指标会引来大量低质量代码;对的指标才能让团队真正变好。

AI agent 给组织带来一个很大的诱惑:那些“看起来很美”的指标——每周生成代码行数 ↑、合并 PR 数 ↑、节约工时 ↑、测试覆盖率 ↑。

直说吧:这些指标单独看,几乎都是有害的。它们鼓励的是“合更多 PR、写更多测试、生成更多代码”,而不是“做对的事”。

Thoughtworks Radar 2026 给出了一个更平衡的体系,我整理成三类:

第一类:局部反馈指标(看 agent 自己干得怎么样)

  • 测试失败率 / lint 违规率 / 类型错误率
  • agent 任务的迭代次数(迭代次数过多通常是上下文不够或边界不清)
  • 构建时间 / pre-commit 时间
  • agent 输出的 first-pass acceptance(一次通过率)

第二类:交付流指标(看团队整体怎么样,DORA 派系)

  • Lead time for changes(变更前置时间)
  • Deployment frequency(部署频率)
  • Change failure rate(变更失败率)
  • Mean time to recovery(恢复时间)
  • 在此基础上,再加一个 review burden(人均 review 工作量)

第三类:长期健康指标(看一年后的事)

  • 架构漂移指数(依赖跨界违规数 / 月)
  • 依赖健康(过期依赖数、CVE 暴露数)
  • 模块耦合演化(耦合度趋势)
  • 测试有效性(mutation testing 杀死率)
  • 技术债利息估算
  • 生产事故趋势 / 用户体验信号

三类指标合起来用,才能避免被 AI 的表面速度欺骗。

不过必须提醒一点(Thoughtworks 自己也说了):指标应作为指导,而不是管理激励。一旦把这些指标和 KPI、奖金挂钩,团队行为会立刻畸变——人会去优化指标,而不是优化系统。

我的建议:把这些指标公开,定期在 retrospective 里讨论,用来推动团队对话和学习;绩效评估仍然靠综合判断、产品成果、长期能力。这是我的偏见,但我相信它经得起检验。

第 9 讲:安全与 Zero Trust——给 Agent 设最小权限

核心结论:Coding agent 不是可信同事,而是需要受控权限的自动化执行体。

这一讲短一点,但每一句都值得记住。

当 agent 可以读写代码、运行命令、调用工具、访问网络、安装依赖甚至触发部署,它的攻击面就非常大了。Thoughtworks Radar 直接把 sandboxed execution 列为 coding agent 的合理默认——限制文件系统、网络、资源访问,因为 permission-hungry agents 会带来 prompt injection、tool poisoning、不安全路径等风险。

按 Zero Trust 原则来设计 agent 的运行环境:

  1. 默认沙箱:agent 在容器或沙箱里跑,文件系统、网络、密钥都隔离。
  2. 最小权限:每个任务只给完成它必需的权限。读代码不等于改代码,改代码不等于推送,推送不等于部署。
  3. 凭据隔离:production 凭据永远不进入 agent 上下文;secrets 用临时 token,过期失效。
  4. 可疑动作要二次确认:删除文件、改 CI 配置、改 IAM、改密钥、安装新依赖——这些都要 human approval。
  5. 审计日志:所有动作可追溯。一次事故发生时,你能清楚地知道是 agent 还是人,做了什么。
  6. 网络出口控制:agent 默认不允许访问任意外网,只允许白名单。
  7. 依赖审查:agent 引入新依赖时,自动经过供应链安全扫描。

我见过最危险的实践:有团队让 agent 拥有 kubectl 和生产数据库的写权限,理由是“这样它能自己 debug”。它确实能自己 debug,但有一天它也会自己删表。

把 agent 当作一个拥有键盘自动化能力的实习生,权限就按这个心智模型来设。

第 10 讲:技术债治理——从季度盘点到持续传感器

核心结论:技术债不是季度盘点出来的,是持续传感出来的。

Thoughtworks 关于 scaleups 的一篇文章把技术债列为成长型企业的常见瓶颈,分成几类:代码质量、测试、耦合、低价值功能、过时库和框架、工具、可靠性和性能。这套分类很实用,可以直接拿来给团队画债务清单。

但更重要的是:在 AI 时代,技术债治理不能只靠“季度复盘 + 临时清理周”。Agent 制造小不一致的速度远比这个节奏快,必须把识别嵌入日常开发流。

可以落地的做法:

  1. 变更热点高亮:用 git history 找出近 N 个月被频繁修改的文件。这些是 bug 和重复修复的高发区,应该提高 agent 在这里的检查强度,强制人类 reviewer。
  2. 回归缺陷与契约测试挂钩:某个模块出了回归 bug,修复 PR 里要求补充契约测试。这一步可以写成 PR 模板,机械执行。
  3. 依赖健康看板:依赖过期、CVE 暴露、license 风险,自动每天扫描,自动开 PR。这件事 agent 干得很好,比人省心。
  4. mutation testing 抽样:每周对核心模块跑一次,看测试到底有没有真本事。覆盖率 100% 但 mutation kill rate 只有 30%,说明测试在装样子。
  5. 架构边界检查:把限界上下文和依赖规则编码成 fitness function,agent 一跨界,CI 直接挂。
  6. review comment 模式识别:每月统计哪些 review comment 在重复,重复 N 次的升级为 lint 规则或 AGENTS.md 条目。
  7. agent 一次通过率追踪:某个模块一次通过率持续低于平均,说明它的 harnessability 有问题——文档缺、边界乱或测试少。列入下个迭代的整理清单。

OpenAI 那篇 harness 文章里有句话值得反复读:反复出现的失败不是单个 agent 的“犯错”,而是工具、文档、护栏或验收标准缺失的信号。

技术债治理的核心思路就是这个:把偶发的人工判断,转化为持续的系统能力。

第 11 讲:团队治理——自治 + 平台 + 轻量规则

核心结论:好的治理不是中央审批,是让正确行为成为默认路径。

Thoughtworks 长期支持团队自治,但他们说的“自治”是有结构的——轻量规则 + paved road + 反馈机制。

组织设计上的几个要点:

  1. 平台团队提供 paved road,不做审批瓶颈。Paved road 就是默认带好 CI、lint、可观测性、安全基线、agent harness 的服务模板。走这条路,享受全部基础设施;不走,自己负责合规。这比“必须经过架构审批”管用得多。
  2. 业务团队拥有自己的 agent 用法,但实践要进入共享的知识库,新经验、新失败定期回流。
  3. 建立 harness steward 角色。可以兼职,也可以是 community of practice,负责把跨团队的失败模式和好做法沉淀下来。
  4. 中央团队做“信号”,不做“审批”。观察整体趋势——哪些模块在出 bug、哪些团队在累、哪些技术栈过期、哪些 agent 模式在失败——把发现变成 paved road 的下一步改进。
  5. 技术债治理纳入产品迭代。别做“集中清债周”,那是创可贴。让债务清理成为每个迭代固定比例的工作(比如 20%),由团队自己决定还哪些。
  6. 失败日志与学习闭环。每次 incident 之后问三个问题:哪些反馈环没生效?哪些规则该升级?哪些 agent instruction 该改?答案变成下个版本的 harness。

治理不是束缚,是让“不出错”成为最便宜的选择。当正确路径就是默认路径,团队不需要勇气也能做对事。

第 12 讲:Harness 也会失效——警惕虚假安全感

核心结论:调节器自己也是系统的一部分,它会衰老、漂移、被绕过。

讲到这里,该泼一盆冷水了。

AGENTS.md 写好了,CI 搭好了,fitness function 铺了,观测建了,指标定了,harness steward 也安排了——是不是万事大吉?

不是。Böckeler 自己也写了一个开放问题:你怎么知道你的 harness 是否真的有效?传感器从来不触发,是系统真的健康,还是传感器根本没覆盖到风险?

这个问题很深刻。我见过太多团队栽在“虚假安全感”上:

  • 测试在装样子:覆盖率高,断言空洞,重构一改全通过。
  • lint 在装样子:规则全开,但都是格式化级别,架构层面什么都没约束。
  • AI review 在装样子:每个 PR 都有 LLM 评论,看着专业,关键安全漏洞照漏。
  • 架构规则过时:fitness function 还在检查三年前的架构,新结构早悄悄长出来了。
  • 指标驱动错误行为:为了 first-pass acceptance 高,agent 学会了写最保守的代码、最简单的实现,复杂边界全跳过。
  • AGENTS.md 失控:规则一半过时,但新人来了还在按它走。

Thoughtworks 也明确指出:AI 生成的测试目前不能完全信任,行为层面的 harness 仍然困难。

所以成熟的 Harness Engineering 必须包含一项工作:对 harness 自身建反馈环。

怎么做:

  1. mutation testing 定期跑:抽样核心模块,验证测试的真实有效性。
  2. incident-driven harness review:每次 incident 后问“harness 为什么没拦住?”没有规则就加规则;有但被关了,搞清楚原因。
  3. lint 规则季度 review:过一遍所有规则,删掉过时的,加上新发现的。
  4. AGENTS.md 半年瘦身一次:删除过时和冲突的条款。
  5. 抽样人工 review:即使有 AI review,团队 leader 每月抽几个 PR 自己看,校准 AI 的判断质量。
  6. retrospective 也要 retro harness:不只 retro 项目,也要 retro 反馈系统本身。

好的 harness 不是“永远正确的自动化规则”,而是一个不断被现实校正的控制系统。

第 13 讲:给团队的实操 Checklist

前面 12 讲的内容,落到一份团队可以直接拿走的 checklist。分成五块。

A. 上下文与指令

  • 团队有一份顶层 AGENTS.md,控制在两屏内,明确架构原则、技术栈、不可触碰的边界。
  • 每个核心服务有自己的 AGENTS.md,写清楚限界上下文和对外契约。
  • 重复出现的 review comment 已升级为 lint 规则或 AGENTS.md 条目,而不是反复在 PR 里写。
  • AGENTS.md 与代码同仓库、同版本、走同样的 CR 流程。
  • 有一份服务模板,新服务从模板出发,自带 CI、lint、可观测性、安全基线。

B. 反馈系统

  • 本地与编辑器反馈(类型、lint、格式)齐全。
  • 预提交反馈(单元测试、契约检查、静态分析)秒级可用。
  • CI 完整反馈在十分钟内(核心服务),二十分钟内(整体集成)。
  • 端到端测试只覆盖关键用户旅程,且稳定(flaky rate < 5%)。
  • 生产可观测性能在小时级反馈到代码改进。
  • 架构与债务反馈(fitness function、依赖扫描、热点统计)每周输出。

C. Harnessability

  • 核心模块类型严格化,弱类型语言至少有 type hint + 静态检查。
  • 限界上下文已画清楚,模块边界在 CI 里可执行。
  • 关键路径有契约测试与集成测试,覆盖率不是目标,破坏行为能否被发现才是。
  • 定期跑 mutation testing 抽样,了解测试真实有效性。

D. 安全与权限

  • Agent 默认在沙箱里跑。
  • Agent 没有生产凭据。
  • 高风险操作(删文件、改 CI、改 IAM、装依赖)需要人类二次确认。
  • 所有 agent 操作可审计、可回溯。
  • 网络出口白名单。

E. 治理与度量

  • 看板上同时有三类指标:局部反馈、交付流(DORA)、长期健康。
  • 这些指标用于 retrospective,不直接挂钩个人绩效。
  • 有 harness steward 角色,负责持续改进 harness 本身。
  • 每季度做一次 harness review:lint 规则 / AGENTS.md / fitness function 是否过时?
  • 每次 incident 之后,必须更新某一处 harness。

这份 checklist 不用全做完才算合格。和团队一起过一遍,挑出最差的 5 项,作为下一季度的目标。三个季度下来,工程纪律会有质的变化。

第 14 讲:小结——AI 时代的工程师是什么样的?

最后一讲,拉远一点看。

把过去三十年 Fowler 这一脉的工程思想串起来,主线非常清晰:持续集成解决集成反馈,持续交付解决发布反馈,测试金字塔给行为反馈提供架构,重构保证结构能持续改善,技术债理论让长期修改成本可见化,Design Stamina Hypothesis 解释了为什么短期速度不能替代长期耐力,演进式架构和 fitness function 解决架构反馈,Technology Radar 解决组织层面的技术选择反馈。Harness Engineering 把这些思想带入 AI coding agent 时代,形成一个新的控制平面。

软件工程的核心,从来不是写更多代码,而是让系统能长期、安全、快速地演进。AI 没让这件事变简单,反而让它更急迫——变化速度被拉到了人类阅读速度之上,没有 harness,速度就是失控。

AI 时代的工程师,不是被替代的执行者,也不只是审查 AI 产出的把关人。他是新工程系统的设计者——设计上下文让 agent 知道方向,设计反馈环让偏差快速暴露,设计架构边界让结构不容易漂移,设计指标让团队不被表面速度蒙蔽,设计治理机制让正确路径成为默认选择,设计学习闭环让每次失败都让系统更健壮。

说到底,他是一个用控制论思维重新定义自己工作的人。

如果读完这 14 讲只记一句话,我希望是这句:

AI 时代的软件组织,竞争的不是谁拥有最强模型,而是谁拥有最强的反馈系统。

模型大家都买得到,反馈系统得自己长出来。这不是几周能完成的事,但每一周都可以让它好一点。

从下一个 sprint 开始吧。

推荐阅读

  • Birgitta Böckeler, Harness engineering for coding agent users(martinfowler.com)
  • Martin Fowler, Refactoring, Continuous Integration, Continuous Delivery
  • Neal Ford, Rebecca Parsons, Patrick Kua, Building Evolutionary Architectures
  • 《人月神话》(Brooks)—— 关于“没有银弹”的那一篇
  • 《Tidy First?》(Kent Beck)—— 关于先小整理再做改动
  • 《领域驱动设计》(Eric Evans)—— 关于限界上下文
  • Thoughtworks Technology Radar 2026 —— 重点看 “Putting coding agents on a leash” 主题
  • OpenAI, Harness engineering for coding agent users(2026 年发表)

人物雷达|Mitchell Hashimoto:每次 agent 犯错,就改造环境的朴素工程哲学

发表于 2026/05/02 | 分类于 AI专题

人物雷达|Mitchell Hashimoto:每次 agent 犯错,就改造环境的朴素工程哲学

今天我想跟你聊一位工程师——Mitchell Hashimoto。他是 HashiCorp 的联合创始人,你可能没听过这家公司,但你一定用过它的产品:Terraform、Vault、Consul、Vagrant。过去十年云计算的基础设施,有相当一部分是他参与设计的。

但今天不聊云。今天要聊他关于 AI agent 的一个观点。这个观点极其朴素,朴素到你第一反应可能是“就这?”——

当 agent 犯错,就花时间工程化一个解决方案,让它不再犯同样的错。

就这。他把这件事命名为 harness engineering(驾驭工程)。

这个观点的魅力,恰恰在于它看起来毫不性感。你想想,在关于 AI 的讨论里,大家平时都在谈什么?谈模型又更新了;谈 agent 能不能替代人;谈某个公司估值又涨了;谈今年 AGI 是不是就要来了。声音越大越戏剧,流量越大。

Mitchell 不凑这种热闹。他只讲一件事——agent 犯错之后,人该干嘛。 我越琢磨这件事,越觉得它可能是整个 AI 编程讨论里,最经得起时间考验的一句话。

咱们分几层来拆。

第一层:先搞清楚 agent 到底是什么

很多人对 AI 编程的理解,其实停留在“会写代码的聊天框”。你问它,它答;你复制,它生成。这是 chatbot 模式。

Mitchell 在《My AI Adoption Journey》里做了一个非常重要的区分——chatbot 和 agent 是两种不同的东西。

chatbot 主要靠模型已有的知识回答问题。它不进入你的环境,它不知道你的代码库长什么样,它也不会主动跑任何东西。你给它一段代码,它给你一段建议;中间要来回复制粘贴。你要纠正它,得靠你自己读完输出、发现问题、再告诉它。

agent 不是这样。agent 的最低标准,他给得很具体——至少要能读文件、执行程序、发起 HTTP 请求。 也就是说,agent 不是在回答,它是在“行动”。它能进入一个工作环境,尝试一件事,看结果,再决定下一步做什么。

这个区分看着简单,但它改变了整个协作方式。chatbot 是“我问它答”,agent 是“我给目标,它在环境里尝试”。前者每一次失败都回到 prompt——“这次我该怎么说才能让它听懂”;后者每一次失败都回到系统——“这个环境该怎么设计才能让它更容易做对”。

划重点:把 AI 当 chatbot 的人,最重要的杠杆是 prompt;把 AI 当 agent 的人,最重要的杠杆是环境。

这就是 Mitchell 观点里最重要的前提。如果你不接受这个前提,下面的所有话都听不进去。

第二层:agent 犯错意味着什么

好,假设我们接受 agent 是一个会在环境里行动的东西。那它会犯错吗?一定会。

这时候普通人会怎么想?三种本能反应:

第一种,骂模型。“Claude 就是笨。” “GPT 更新之后反而更蠢了。” 这种反应最多,因为便宜。
第二种,重写 prompt。“我再把需求讲得更清楚一点。” “我再给它加几个例子。” 这种反应看起来很勤奋。
第三种,自己上手。“算了,它搞不定,我自己写吧。” 这种反应最干脆。

Mitchell 的反应不是这三种里的任何一种。他的反应是——把这次错误,变成环境的一个永久约束。

我给你举个具体的例子。

Ghostty 是一个终端模拟器,代码在 GitHub 上开源。它的 src/inspector 目录下有一个小文件叫 AGENTS.md。这文件里写了什么?写了五句话——

  • inspector 类似浏览器的开发者工具。
  • dcimgui.h 这个头文件在哪个位置。
  • widget 的例子在哪里可以参考。
  • macOS 上构建时,要加哪些特定参数。
  • 这个包没有单元测试。

就这五条。没有高深理论,没有 AI 指南,没有 prompt 模板。全是 agent 之前犯过错的地方——它找不到 dcimgui.h 时胡乱猜测、它用错构建参数时反复失败、它不知道这个包没有测试时以为可以跑测试。每一次错误,Mitchell 都把它写成了一句环境说明。

这就是 harness engineering 的基本形状:把 agent 的每一次具体错误,沉淀成环境里的一条具体约束。

他把 harness 的形式分成两类——一类是这样的隐式提示文件,改变的是 agent 的认知上下文;另一类是程序化工具,比如截图脚本、过滤测试脚本、轻量的模拟环境,改变的是 agent 的行动能力和反馈质量。

你细想一下:这不就是你工作了十年的老工程师天天在做的事吗?写文档、建脚本、加测试、立规矩、把口头知识落成文字。只不过以前这些东西是给新员工看的,现在是给 agent 看的。

换句话说,harness engineering 不是什么 AI 新学科,它就是把老工程师的常识搬进了新场景。

第三层:为什么这比“更好的 prompt”更值得投入

你可能会问——“写个 prompt 不就好了?为什么要搞这么重的基础设施?”

这个问题值得用一个类比来回答。

prompt engineering 和 harness engineering 的区别,像“出门前嘱咐孩子”和“把楼梯口装上防撞条”的区别。

出门前嘱咐孩子“别在楼梯口跑”——这是 prompt。你说得越具体越好。但嘱咐这件事的收益是一次性的,这次管用,下次可能就忘了,换一个孩子可能完全没用。

给楼梯口装一个防撞条——这是 harness。一次性投入,永久生效。不管是哪个孩子、哪天、什么状态,都有效。

这两件事都重要。但从投入产出比来看,只要是你会反复做的事情,投入到环境里的成本,收益会复利累积;投入到 prompt 里的成本,收益会随着对话消失。

Mitchell 的工作方式就是这样:他允许自己这一次写一个 prompt 把问题解决掉,但如果同一类问题出现了第二次,他会停下来想一下——这件事能不能变成一条环境里的规则?如果能,就花时间写进去。

这种思路在软件工程里叫“把人工 checklist 自动化”。它在 AI 之前就存在了几十年——写测试、做 CI、统一环境、封装脚本、加 lint、把散落的知识写进文档。Mitchell 的原创之处在于,他把这套思路显性地移植到了 AI agent 时代,并给它起了一个名字。

OpenAI 后来在讨论 Codex 的一篇文章里,也采用了非常类似的框架——他们说,当 agent 失败时,不要问“怎么让模型更努力”,而要问“这里缺了什么能力?这个能力怎么让 agent 可读、可执行、可约束”。LangChain 干脆把这件事写进了定义——Agent = Model + Harness。模型提供智能,harness 让智能变得可用。

这些都是后来发生的事。Mitchell 更早就已经在做了。

第四层:架构不外包,agent 是 junior engineer

现在还有一个疑问——harness 做得再好,agent 不还是会犯错吗?那人类到底还干什么?

Mitchell 对此有一个非常清晰的比喻:和 agent 合作,像指导一个 junior engineer。

这个比喻我要稍微展开一下,因为它特别准。

设想你刚带一个实习生。他聪明、听话、能写代码,唯一的问题是没有工程经验——不知道你们团队的约定、不理解系统的历史包袱、对“哪里不能碰”没有感觉。这时候你会怎么安排他?

有经验的带人者,不会说“你去优化我们的订单系统”。他会说——“你看这个接口,加一个重试逻辑,重试条件是 A 和 B,不要改 C,写一个对应的单元测试,完成后我 review 一下。”

区别在哪?前者是一个无边界的开放式问题,后者是一个边界清楚、护栏齐全、验证明确的小问题。junior engineer 在后一种任务上能干得非常好;在前一种任务上,99% 会出事。

agent 目前的位置,几乎和一个聪明但没经验的 junior 完全一样。 它不是笨,它是缺上下文、缺约束、缺反馈。

所以 Mitchell 从不把架构外包给 agent。他负责代码结构、数据流、状态归属——这些决定“这个系统长什么样”的问题,他一个都不交。他把设计做好,把问题切成合适的形状,然后让 agent 在那个形状里行动。

他在 Zed 的访谈里说过一句很实在的话——如果你只告诉 agent “这个 bug 存在,修一下”,它可能真能修,但很可能是用一种锤子砸钉子的方式把症状敲掉,留下一个你以后一定要还的债。

一句话总结:agent 不是价值判断者,不是架构负责人,更不是最终责任人。它是团队里速度最快、但需要明确边界才能干好活的成员。

第五层:一个不能外包的东西——责任

这是我认为 Mitchell 最有分量的一块。

他在 2025 年 10 月写过一篇文章叫《Vibing a Non-Trivial Ghostty Feature》,公开了他用 AI 完成 Ghostty 一个具体功能的全过程——16 次 agentic coding session,成本 15.98 美元,8 小时墙钟时间。很多人引用的是这些数字。

但我想让你记住的是另一段。

他在做这个功能的过程中,遇到了所谓的 slop zone——agent 生成的代码看起来合理,能跑,测试都能过,但里面藏着一个关键 bug。他尝试了几次更精确的 prompt,都没修好。

这时候,常规的工程师本能有好几条路——再换一个 prompt、再换一个模型、等下个版本出来。

Mitchell 选的都不是。他停下来,自己去学 Sparkle 框架,自己去看 Obj-C 的 protocol,自己去理解 bug 的原理。然后他在博客里写了一句,我觉得是整个 AI 编程讨论里最该被加粗的一句话:

如果 agent 找到了解法,我会学习。如果我不理解,我就回退。我不交付自己不理解的代码。

这句话为什么重要?因为今天关于 AI 编程的讨论,大部分都停在速度层面——更便宜、更快、更多产出。这些都是真的。但 Mitchell 想让你记住的另一件事是——你理解了吗?你能维护吗?它会不会回归?下一个读这段代码的人,会更容易还是更困难?

AI 可以写代码。但代码的责任不会因此外包。你可以让 agent 试、写、改、跑测试;但最终合进代码库的是你。产品出了 bug,用户不会说“这是 Claude 写的所以不算”;维护者也不能把不可理解的复杂性推给模型。

这才是真正的分水岭——AI 时代成熟的工程师和不成熟的工程师,最大的差别不在于谁 prompt 写得漂亮,而在于谁更敬畏“自己不理解的代码”。

第六层:为什么这条原则很难过时

我知道你可能会说——“这些经验不都是暂时的吗?等模型更聪明了,不就不用搞这一套了?”

Mitchell 自己就承认这一点。他在 Open Source Ready 里说,今天很多 AI 协作技巧——比如怎么管理 context、怎么打开正确的 buffer、怎么塑造反馈回路——可能都是几年后不再需要的“临时技能”。

这种自我警觉非常珍贵。很多 AI 讨论者的问题,恰恰是把当下的具体技巧说成永恒真理。

但是请注意,即使具体技巧会过时,harness engineering 背后的姿态不会过时。这个姿态是什么?

简单说就是:不把错误当成模型的偶然失误,而当成系统的缺口;不指望模型下次自己变聪明,而是改造环境让同样的错更难发生。用可重复的反馈回路替代一次性的人工祈祷,让机器做重复劳动,人来做判断和创造。

这些原则,软件工程已经用了三十年。它们在 Vagrant 解决“环境难复现”的时候成立;在 Terraform 解决“基础设施难声明”的时候成立;在今天 Mitchell 做 agent harness 的时候成立;在未来某个更聪明的模型来临时,很可能仍然成立。

Mitchell 自己在 2019 年接受 WIRED 采访时就说过一句话——“我这辈子做的事情有一条连续的线索:自动化那些我不想做的事。人擅长创造,计算机应该做重复劳动。”

你看,这句话放到 2026 年的 agent 时代,一个字都不用改。变的只是“重复劳动”的内容——以前是搭虚拟机、写配置、管理 secret;现在是查资料、跑测试、写样板、做 refactor。工具变了,工具背后的那条线没变。

这就引出一个判断标准:一个观点能不能穿越技术周期,关键看它绑定的是“当下的工具”还是“不变的原则”。 绑定工具的观点,工具变就死了;绑定原则的观点,工具怎么变都活着。

第七层:给你的三条可直接用的 takeaway

好,理论讲完了,给你三条可以今天就用上的行动建议——

第一条:别一上来就追求一个完美 AI 流程。 Mitchell 的 harness 不是设计出来的,是从错误里长出来的。agent 跑错命令,就记录;误用 API,就加说明;忘记跑测试,就写脚本。一次修一个错,半年之后你会发现自己已经有了一整套 harness。追求一次到位的人,往往最后什么都没做。

第二条:给 agent 的任务,要像给 junior engineer 的任务。 不要说“把这个系统优化一下”,要说“只改这个模块,先读这几个文件,不要改公共 API,新增这个测试,运行这个命令”。agent 的速度会诱惑你把问题丢大,但 Mitchell 的经验恰恰相反——小块工作更容易 review、理解和迭代。

第三条:不要 ship 你自己不理解的代码。 不管 agent 多聪明,多便宜,多快——代码合进去了,责任就是你的。如果 agent 修了一个你看不懂的 bug,停下来,去学,去研究。如果学不会,回退。这个规矩听起来像在给你踩刹车,但它其实是 AI 时代最保护你的一条。


Mitchell Hashimoto 的价值,不在于他提出了什么新词,也不在于他用了哪个模型。他的价值在于,在一个嘈杂到让人恍惚的时刻,他用非常朴素的一句话,把 AI agent 这个看起来很玄的东西,拉回了工程师最熟悉的地面——环境、约束、反馈、自动化、责任。

他让你相信一件事——AI 时代的成熟工程师,可能不是最会写 prompt 的人,而是最会把一次错误,变成永久护栏的人。

这是一种很笨的智慧。但好多笨的智慧,最后都赢了。

人物雷达|Mitchell Hashimoto:每次 agent 犯错,就改造环境

发表于 2026/05/02 | 分类于 AI专题

人物雷达|Mitchell Hashimoto:每次 agent 犯错,就改造环境

一个被反复删除的 issue

2025 年春天,Ghostty 的 GitHub 仓库里出现过一个很短的插曲。

有用户在 issue 里贴了另一个终端模拟器的源代码片段,希望 Ghostty 参考实现。Mitchell Hashimoto 很快把这段代码删掉了,并留下一条说明:Ghostty 是 MIT 许可,对方是 GPL,贴进来就污染了整条上游。

几小时之后,那位用户回来了,补上一条看似合理的建议:“那你让 ChatGPT 生成一段类似的代码就行。”

Mitchell 没有立刻同意,也没有立刻拒绝。他反问了一句——“这样做安全吗?是不是只是把代码通过一个模型洗了一遍?”

这是一个微小到几乎不值得记录的交互。但在今天回看,它几乎是 Mitchell 所有 AI 观点的浓缩:他愿意使用 AI,但不相信任何关于 AI 的“捷径叙事”;他接受不确定性,但不愿意用自信掩盖不确定。

过去两年,硅谷工程师里谈 AI 的声音被分成两派。一派是布道者,宣称编程即将终结;一派是反对者,认定 agent 只是高级补全。Mitchell Hashimoto 很少被归进任何一派,但他在自己的博客、Zed 的访谈、Heavybit 的播客、Open Source Ready 的长对话里,一砖一瓦地搭出了第三条路——AI agent 并没有那么神秘,它只是软件工程里一个新的、需要被工程化的对象。

这个姿态里,最常被引用的一句话是他自己写下来的:“当 agent 犯错,就花时间工程化一个解决方案,让它不再犯同样的错。”

他把这件事叫做 harness engineering。

一个“不愿意交付自己不理解的代码”的人

要理解 Mitchell 的这套哲学,不能从 AI 开始,要从终端开始。

在自己网站上,他把现在的身份写得极简——主要在做 Ghostty;曾在 HashiCorp 做过约四年 CEO、五年 CTO、两年个人贡献者,2023 年离开公司。HashiCorp 旗下的 Vagrant、Packer、Consul、Terraform、Vault、Nomad、Waypoint,今天几乎是云基础设施的默认词汇。他把一家公司做到上市之后选择抽身,回到一个没有融资计划、没有商业化路径的开源终端项目上,这在硅谷是个很任性的选择。

但只要把这些工具连起来看,会发现一条不算太隐秘的主线:他做的每一样东西,几乎都在回答同一个问题——怎么让开发环境变得可描述、可复制、可被机器执行?

Vagrant 解决本地开发环境的复现;Terraform 解决云基础设施的声明;Nix 让整台桌面可以用代码化的方式重建;Ghostty 是终端,仍然是环境的一部分。他在 Open Source Ready 谈 Nix 时顺便说过一句,自己对 Nix 的兴趣,其实是想要一种可靠、一致、可被代码重建的桌面。这句话放在 Terraform 的早期也完全成立。

所以当 Mitchell 进入 agent 时代,他看它的视角不是“模型崇拜”,而是“环境工程”。对他来说,agent 不是黑箱智能体,而是一个会在环境里读文件、执行程序、调用工具、观察结果、继续行动的系统。它要行动,环境就必须能纠错;它会重复犯错,系统就该把错误沉淀成规则、脚本和反馈回路。

从“改比写还慢”到“强迫自己复现”

Mitchell 并非天然的 AI 乐观派。

在《My AI Adoption Journey》里,他承认自己第一次认真用 Claude Code 的体验相当糟糕——生成的代码要大改,改完比自己写还慢,他一度怀疑这东西是不是真的能用。

他没有就此下结论。相反,他做了一件很笨的事:先用手写 commit 把一个任务完成,然后关掉答案,让 agent 在看不到自己答案的前提下,复现同等功能和质量的结果。

过程很折磨人,因为它妨碍了正常交付;但他坚持了下来,因为这是建立“直觉”的唯一方式——agent 到底适合什么、不适合什么,不是读 paper 读出来的,是一个一个任务试出来的。

这段经历沉淀成几条朴素的心得:

  • 任务要拆小,不要把一个模糊的大目标丢给 agent。
  • 模糊需求先规划再执行——想清楚做什么,再让它动手。
  • 最关键的一条:给 agent 一种验证自己工作的办法。只要它能自己跑测试、自己看输出,往往就能自己修好。

读到最后一条可能会愣一下——这不就是 CI、测试、lint、端到端脚本吗?是的。这正是 Mitchell 的风格——他不造新词,他把老工程师的常识原样搬进 AI 时代。过去我们说“不要让人记住规则,让系统执行规则”;现在他说,“不要指望 agent 下次变聪明,要把这次错误变成环境的约束”。

Harness Engineering:错误不是事故,是系统的缺口

Harness 这个词本身不新。LangChain 早就把它写进定义里:Agent = Model + Harness。模型提供智能,harness 让智能变得可用——文件系统、bash、沙箱、工具、状态、反馈回路,都是 harness 的一部分。

Mitchell 的贡献不在术语,而在一种工作习惯:他把所有 agent 的错误都当作系统缺口,而不是模型愚蠢。

在 Zed 的访谈里,他把 harness 的形式拆成两类——

第一类是“更好的隐式提示”,最典型的载体是 AGENTS.md。如果 agent 总是跑错命令、找错 API、误解子系统,就把这些经验写进项目根目录或子目录的指导文件。Ghostty 的 src/inspector/AGENTS.md 就是个小而典型的例子:它告诉 agent,inspector 类似浏览器开发者工具;去哪里找 dcimgui.h;如何查 widget 示例;macOS 构建要加哪些参数;这个包没有单元测试。没有一句宏大的 AI 理论,全是具体到命令、文件、API 的环境说明。

第二类是“真正的程序化工具”——截图脚本、过滤测试脚本、可重复的构建命令、轻量的模拟环境。前者改变 agent 的认知上下文,后者改变 agent 的行动能力和反馈质量。

两者结合起来,就是一句话——agent 找不到 API,就写下 API 的位置;用错构建命令,就把正确命令写进去;不知道如何验证 UI,就给它截图工具;一再破坏架构边界,就写结构性测试或 lint 规则。

这和 prompt engineering 是两条不同的路径。prompt engineering 是语言技巧,收益随对话消失;harness engineering 是基础设施,收益会复利累积。Mitchell 相信的是后者。

16 个 session,8 个小时,$15.98 和一个“slop zone”

2025 年 10 月,他写了一篇《Vibing a Non-Trivial Ghostty Feature》,公开展示自己如何用 AI 辅助完成一个真实的非平凡功能——在 macOS 上不打断用户的自动更新提示。

文章里最诚实的数字是这些:16 次 agentic coding session,token 成本 15.98 美元,估计墙钟时间约 8 小时。他承认自己确实比纯手写快了,尤其是 SwiftUI 细节迭代那部分;但他更强调的不是成本,而是工作结构——AI 最大的价值,不是每行代码变便宜,而是他离开电脑时,机器仍然能帮他产生候选。

这篇文章另一个被反复引用的部分,是他对“slop zone”的描写。

所谓 slop,是指 agent 生成的代码看起来合理、能跑、甚至能过测试,但里面藏着关键 bug。他试了几轮更具体的 prompt,没用。工程师的惯性反应是:再换个 prompt,再换个模型,再等 Claude 4.6 出来。

Mitchell 的选择是——停下来,自己学,自己研究。他在文章里写了一句很重的话:“如果 agent 找到了解法,我会学习;如果我不理解,我就回退。我不交付自己不理解的代码。”

这句话在他所有 AI 表达里,分量最重。它把 AI 工作流里最模糊的那块——责任——钉死了。你可以让 agent 试、写、改、跑测试、找资料;但最终合进代码库的是你,用户遇到问题时不会说“这是 Claude 写的”,维护者不能把不可理解的复杂性推给模型。人工 review 不是流程,是工程伦理。

架构师不外包,junior engineer 要护栏

Mitchell 反复强调一个类比:与 agent 协作,像指导一个 junior engineer。

把一个开放式问题丢给 junior,经常是灾难;但要是问题边界清楚、护栏齐全、验证明确,junior 往往能做得很好。AI 目前就在这个位置上。

所以他从来不把架构外包。他负责代码结构、数据流、状态放在哪里;他把问题切成合适的形状,然后让 agent 在那个形状里行动。他甚至说过一句话:如果你只对 agent 说“这个 bug 存在,修一下”,它可能真能修,但很可能是用一种锤子砸钉子的方式把症状敲掉,留下长期不可维护的债。

这不是对 agent 的不信任,而是对任务分配的成熟判断。优秀的工程师不会把所有任务平均分给团队,他会按能力、上下文、风险和验证成本分配。对待 agent 也是如此——它擅长什么?Mitchell 的经验是:重构、重命名、整理结构、清理死代码、填空式的样板代码,几乎总能做得很好。它不擅长什么?开放式架构、高性能数据结构、小众语言。

Zig 是他最常举的反例。Ghostty 底层是 Zig,但 Zig 的训练数据太稀。Mitchell 的 workaround 很务实——让 agent 用它更熟悉的 C、Rust、Swift 或 Python 写方案,再由自己转成 Zig。他后来在 Heavybit 访谈里补充过一句:“让它直接写大段 Zig,它常常幻觉出不存在的语法。”

这是成熟工程师在 AI 时代的思路:不指望一个模型解决所有问题,按任务的形状分配工具。

X + AI 救不了底层不成立的东西

外界常把 Mitchell 误认成 AI 怀疑派,其实他只是反对一种特定的倾向——拿 AI 当产品的遮羞布。

在 Open Source Ready 的访谈里,他批评过一批所谓 AI 产品:邮件客户端本身不好用,只是加了 AI 功能;笔记应用本身功能割裂,只是加了 AI 总结。他的判断是,AI 集成可以做得很好,但用户最终仍然要使用完整产品,如果基础体验不成立,AI 救不了它。

这句话背后仍然是同一条工程哲学:基础要扎实,环境要可靠,工具要真的解决人的问题。 一个混乱的代码库加上 agent,不会变成可维护系统,只会变成一个被 AI 放大的混乱代码库。AI 是放大器,放大的是你已有系统的性质——清晰的环境被放大为效率,混乱的环境被放大为 slop。

他对开源的判断也受此影响。在 The Pragmatic Engineer 的访谈总结里,他认为 AI 让“看起来合理但实际低质量”的贡献变得太容易,开源会从 default trust 走向 default deny。这不是说开源不再欢迎贡献,而是说维护者必须建立新的过滤机制——更明确的贡献规范、更强的测试、更严格的 review,更少对“看起来像样”的默认信任。

不变的底色:让机器做机器该做的事

WIRED 在 2019 年写过一篇关于 Mitchell 的人物报道。文章里有一句他自己的话:“我这辈子做的事情有一条连续的线索——自动化那些我不想做的事。人擅长创造,计算机应该做重复劳动。”

这句话放在 2026 年几乎可以一字不改地成立。只是“重复劳动”的边界变了——过去是搭环境、建虚拟机、管理 secret、写配置;现在是查资料、整理 issue、跑测试、写样板代码、做 refactor、生成模拟场景、修构建错误。变化的是工具,不变的是原则。

所以 Mitchell 并不认为 AI agent 会让工程师消失。他只是认为工程师的位置要往上挪一格——过去大量时间花在亲手写代码,现在有一部分要转向设计“agent 能成功工作的环境”。经验不再只沉淀在资深工程师脑子里,还要写进 AGENTS.md、脚本、测试、文档和约束。Review 也变了,不光看人写的代码,还要看 agent 是否被正确约束,错误是否被系统性预防。

一个朴素的、很难被模型淘汰的原则

与 Mitchell 同时代的 AI 声音里,不乏宏大叙事。有人宣布编程已死,有人断言工程师只会剩下十分之一,有人笃定三个月后这一切都将被改写。Mitchell 从不说这些话。他在每一次访谈里都很小心地划分自己的边界——这块我用得很好;那块我不知道;这里我不想过度自信;那里我需要法院先给答案;这个技巧三个月后可能失效。

也正因为他不给大判断,他的小判断才格外可信。

“每次 agent 犯错,就改造环境”——这句话的力量在于,它把 AI 的不确定性转化成了工程的确定性。你没法保证模型下次一定变聪明,但你可以让错误更容易被发现,把误解写进规则,让测试、脚本和 review 形成闭环。每一次失败都变成环境的一次升级,系统就会越用越好。

这就是 Mitchell Hashimoto 的朴素工程哲学——与其迷信智能,不如设计环境;与其反复提醒,不如建立机制。错误不是偶然,是可以被工程化的信号。

AI agent 时代真正成熟的工程师,可能不是最会写 prompt 的人,而是最会把一次错误变成永久护栏的人。

人物雷达|Mitchell Hashimoto 和他的朴素工程哲学

发表于 2026/05/02 | 分类于 AI专题

人物雷达|Mitchell Hashimoto 和他的朴素工程哲学

我观察 Mitchell Hashimoto 有一段时间了。

在讨论 AI agent 的人里,他是一个奇怪的存在。他不做预测,不讲愿景,不谈谁会被替代,甚至承认自己今天使用 agent 的很多技巧,三年以后可能就不再需要。他只是在博客和访谈里,讲他怎么用的、哪里用得好、哪里被卡住、卡住之后怎么想。

但如果你把他过去一年的表达拼起来看,会发现它们形成了一个克制、朴素、也很难被时间淘汰的结构。

这个结构可以用他自己的一句话概括:当 agent 犯错,就花时间工程化一个解决方案,让它不再犯同样的错。

这句话听起来几乎不像一个“观点”。它不锋利,不性感,没有流量。但它恰恰是我愿意花一篇文章写他的原因。

他先是个做环境的人,然后才是个用 agent 的人

要理解 Mitchell 现在的 AI 观,得先绕开 AI,回到他过去十几年做的事情。

他在自己网站上把履历写得非常冷静——主要在做 Ghostty;曾在 HashiCorp 做过四年 CEO、五年 CTO、两年个人贡献者,2023 年离开。这份简历背后,是 Vagrant、Packer、Consul、Terraform、Vault、Nomad、Waypoint——几乎构成了过去十年云基础设施的默认词汇。

有意思的是,把这些工具并排放着看,会发现一条相当连贯的线索:它们都在解决同一件事——怎么让一个开发者环境,从“存在于某个老员工脑子里”,变成“可以被代码描述、被机器复制、被工具执行”。

Vagrant 让本地开发环境可以被复制,Terraform 让云基础设施可以被声明,Nix 让整台桌面可以被代码重建——Ghostty 是终端,看起来和前几样不太一样,但仍然是开发者环境的一部分。

他在 Open Source Ready 聊 Nix 的时候有一句话让我印象挺深——他说自己其实想要的只是一种“可靠、一致、可用代码重建”的桌面。这听上去很简单,但放进他过去所有工具里都成立。

这个人一辈子都在做一件事:把人对环境的隐性依赖,转成环境本身的显性约束。

所以当他进入 agent 时代时,他看 agent 的角度和大多数人不一样。他不觉得 agent 是一个需要仰望的智能体,也不觉得它是一个需要贬低的补全工具。他看到的是一个会在环境里读文件、执行命令、调用工具、观察结果、循环行动的东西——换句话说,一个新的、可以被工程化地约束和塑形的对象。

这是他和大多数 AI 讨论者的分水岭。

他一开始其实不太满意

我不喜欢过度拔高一个人的“先见之明”。Mitchell 对 AI 的态度不是一开始就那么清晰的,他自己也聊过这件事。

在《My AI Adoption Journey》里,他说自己第一次认真用 Claude Code 的感觉是——不太行。生成的东西要大改,改完还不如自己写。他一度怀疑自己是不是不适合这套工作方式。

然后他做了一件我觉得很能代表他性格的事情。

他没有得出“agent 不行”的结论,也没有得出“我不行”的结论。他选了一条更笨、更慢的路——把自己已经手写完成的 commit 拿出来,关掉答案,逼自己用 agent 在看不见答案的前提下,复现同等功能和质量的结果。

这件事其实很反效率。他在正常交付之外,又凭空给自己加了一层工作量。但也正是在这段笨功夫里,他开始真正理解 agent 适合什么、不适合什么。

他自己总结出了三条结论,简单到几乎像一本软件工程教科书:任务要拆小;模糊需求要先规划再执行;最重要的——给 agent 一个能自己验证工作的办法。

读到第三条的时候,很多人会觉得这不就是测试吗?是的。这正是他的风格。他不造新词,他把那些我们本来就熟悉的工程原则原样搬了过来。只是以前我们说“不要让人记住规则,让系统执行规则”;现在他说,“不要指望 agent 下次会变聪明,要把这次错误变成环境的一个约束”。

为什么是“环境”,而不是“prompt”

Mitchell 讨论 AI 时,很少聊 prompt。

这件事本身就值得注意。今天大多数关于 AI 编程的内容,核心都是 prompt——怎么写出更好的 prompt,怎么骗模型一步步思考,怎么给它塞上下文让它听话。但 Mitchell 几乎从不谈这些。

他谈的是 harness——套在 agent 外面的那一整层环境:规则、文档、工具、脚本、测试、权限、工作目录、反馈信号、观察机制。

LangChain 早就有过一句简洁的定义——Agent = Model + Harness。模型提供智能,harness 让智能变得可用。Mitchell 不是提出了这个概念,他只是把它变成了日常工作的重心。

他把 harness 分成两类。一类他叫“更好的隐式提示”,最典型的载体是项目里的 AGENTS.md 文件。Ghostty 仓库的 src/inspector/AGENTS.md 是个小而具体的例子:它告诉 agent,inspector 类似浏览器开发者工具;去哪里找 dcimgui.h;widget 例子在哪里;macOS 构建时要加什么参数;这个包没有单元测试。没有一句宏大的 AI 理论,全是具体到命令、文件、API 的本地说明。

另一类是真正的程序化工具——截图脚本、过滤测试脚本、可重复的构建命令、轻量的模拟环境。前者改变 agent 的认知上下文,后者改变 agent 的行动能力和反馈质量。

两者加起来是这样一件事——agent 找不到 API,就写下 API 的位置;用错构建命令,就把正确命令写进去;不知道如何验证 UI,就给它截图工具;一再违反架构边界,就写结构性测试或 lint 规则。

这和 prompt engineering 很像,但不是一回事。prompt engineering 是“这一次我怎么说”,harness engineering 是“这个系统怎么设计”。前者的收益随对话消散,后者的收益会长期累积。

Mitchell 相信的是后者。原因不复杂——他一辈子都在相信后者。

责任不能外包:一句分量很重的话

他在 2025 年 10 月发过一篇文章,《Vibing a Non-Trivial Ghostty Feature》。那篇文章公开了他用 AI 辅助完成 Ghostty 一个具体功能的全过程——macOS 上不打断用户的自动更新提示。

很多人关注里面的数字:16 次 agentic coding session,token 成本 15.98 美元,约 8 小时墙钟时间。他自己也承认效率提升是真实的,尤其是 SwiftUI 细节迭代那部分,AI 帮了大忙。但我读那篇文章时,印象最深的不是这些数字,而是他在遇到 bug 时的一段话。

他遇到了所谓的 slop zone——agent 生成的代码看起来合理,能跑,甚至测试都能过,但里面藏着一个关键 bug。他换了几次更精确的 prompt,都没有修好。

这时候,工程师的本能会告诉你——再换一个 prompt;再换一个模型;或者等 Claude 下个版本。

他没有选任何一条。他停下来,自己去学 Sparkle 框架,自己去看 Obj-C 的 protocol,自己去理解为什么会出错。然后他在博客里写下了一句让我反复想了很多次的话:

如果 agent 找到了解法,我会学习;如果我不理解,我就回退。我不交付自己不理解的代码。

这句话的分量,在 AI 编程的讨论里不太常见。

今天太多人在讨论 AI 带来的速度,这些都是真的。但 Mitchell 更在意另一样东西:你理解了吗?下一个看到这段代码的人——不管是人类还是 agent——会因此更轻松,还是更痛苦?

AI 可以写代码,但代码的责任不会因此外包。你可以让 agent 试、写、改、跑测试、整理结构;但最终合进代码库的是你。产品出了问题,用户不会说“这是 Claude 写的”;维护者也不能把不可理解的复杂性推给模型。

Mitchell 的这句话,我私下认为是整个 AI 编程讨论里最接近“工程伦理”的一句。没有宏大叙事,但它把一个特别容易被模糊掉的边界,清晰地钉下来了。

他把 agent 当 junior engineer,不当 superhero

Mitchell 有一个常用的类比——和 agent 合作,就像带一个 junior engineer。

如果你是个带过人的工程师,你会立刻懂他在说什么。

把一个开放式问题丢给 junior,比如“去优化一下我们的订单系统”,基本等于灾难。把一个边界清楚、护栏齐全、验证明确的小问题丢给 junior,比如“这个接口加一个重试逻辑,条件是 A 和 B,不要改 C,写一个对应测试”,他往往能做得不错。

AI 目前处在一个很类似的位置。

这也是为什么 Mitchell 从不把架构外包。他负责代码结构、数据流、状态放在哪里;他把问题切成合适的形状,再让 agent 在那个形状里行动。他在 Zed 的访谈里说过——如果你只对 agent 说“这个 bug 存在,修一下”,它可能真能修,但很可能是用一种锤子砸钉子的方式,把症状敲掉,留下一个你将来一定要还的债。

他对 agent 的能力边界,也判断得很具体。

重构、重命名、整理结构、清理死代码、填空式的样板代码——agent 几乎总能做得很好。他把这类任务称作“outsource the slam dunks”,专门挑高把握的扔给它。

开放式架构、高性能数据结构、小众语言——agent 目前仍然很差。Ghostty 底层是 Zig,但 Zig 的训练数据太稀缺,agent 常常幻觉出根本不存在的语法。他的 workaround 很务实——让 agent 用它更熟悉的 C、Rust、Swift 或 Python 写方案,再由自己手工翻成 Zig。

这不是什么宏大的理论。这就是一个老工程师在分配任务。只是他现在多了一个**“永远不抱怨、永远不累、但需要护栏”**的新成员。

他不相信“X + AI”

Mitchell 有一个经常被误解的立场——他对 AI 产品的批评。

很多人以为他是 AI 怀疑派。其实不是。他反对的不是 AI,而是一种特定的做法——把 AI 当产品的遮羞布。

在 Open Source Ready 的访谈里,他批评过一类典型的 AI 产品:一个邮件客户端本身已经不好用,只是外面加了 AI 功能;一个笔记应用本身已经割裂,只是加了个 AI 总结。他的判断简单粗暴——AI 集成可以很好,但用户最终仍然要使用完整产品;如果基础体验不成立,AI 救不了它。

这句话背后其实是一以贯之的工程哲学:基础要扎实,环境要可靠,工具要真正解决人的问题。 一个糟糕的产品加上 AI,不会变成好产品;一个混乱的代码库加上 agent,不会变成可维护系统。AI 会放大已有系统的性质——清晰的环境被放大为效率,混乱的环境被放大为 slop。

他对开源的判断也在发生变化。在 The Pragmatic Engineer 那篇访谈总结里,他提到开源可能会从 default trust 走向 default deny——因为 AI 让“看起来合理但实际低质量”的贡献变得太容易。这不是说开源不再欢迎贡献,而是说维护者必须建立新的过滤机制。

他的 Ghostty 里那个被反复删除的 issue,就是这种态度的具体体现。有人贴了另一个终端的 GPL 代码片段,他立刻删了。对方说你让 ChatGPT 生成类似的就行,他反问——这样做安全吗?是不是把代码通过模型洗了一遍?他没有给答案,他只是说希望法律先例先明确。

一个愿意在具体问题上说“我不知道”的人,才有资格在大问题上被信任。

一条不变的线索

WIRED 在 2019 年做过一期关于他的报道。文章里他自己说——“我这辈子做的事情有一条连续的线索——自动化那些我不想做的事。人擅长创造,计算机应该做重复劳动。”

这句话放到 2026 年几乎可以一字不改地成立。只是“重复劳动”的边界在移动。过去是搭环境、建虚拟机、管理 secret、写配置;现在扩展到了查资料、跑测试、写样板、做 refactor、修构建错误。

变化的是工具,不变的是原则。

所以 Mitchell 的 agent 哲学,从来不是“让人退场”。他从不说编程会消失,也不说工程师会被替代。他说的是另一件更温和、也更诚实的事情——人要换一个位置。 过去大量时间花在亲手写代码,现在要有一部分时间转向设计“agent 能成功工作的环境”;过去经验沉淀在资深工程师脑子里,现在要沉淀进 AGENTS.md、脚本、测试和约束。Review 不只是看人写的代码,还要看 agent 是否被正确引导。

这个位置迁移,听起来不像一个很性感的故事。它没有“一切都将改变”的戏剧感。但它可能更接近真实发生的事情。

一个很难被淘汰的想法

我想最后回到那句话——当 agent 犯错,就花时间工程化一个解决方案,让它不再犯同样的错。

这句话的好处是,它不依赖任何一个具体模型、任何一个具体工具、任何一个具体版本。模型会变,工具会变,今天的 harness 明天可能就过时。但这句话所表达的姿态——把错误当成系统暴露出来的缺口,而不是模型的偶然失误——几乎可以迁移到任何技术的任何时代。

也许几年以后,agent 比我们所有人想象的都聪明。到那时候,很多具体技巧会被扔进“临时技能”的抽屉里,包括 Mitchell 今天讨论的很多。但我不觉得 harness engineering 的姿态会过时。

因为它本质上说的是一件很老的事——与其迷信智能,不如设计环境;与其反复提醒,不如建立机制。错误不是偶然,是系统暴露出来的可工程化信号。

软件工程里,所有真正有复利的东西,几乎都是这个形状。

Mitchell Hashimoto 的价值不在于他发明了什么新术语,而在于他在一个很喧嚣的时刻,把 AI agent 这个看似魔法般的东西,拉回了工程师最熟悉的地面——环境、约束、反馈、自动化、责任。

这种姿态不一定最能吸引眼球。但时间通常比较偏爱这种人。

Agent Harness 战略:OpenClaw 与个人 AI 的层级解构

发表于 2026/05/02 | 分类于 AI专题

Agent Harness 战略:OpenClaw 与个人 AI 的层级解构

每一次平台转换,都会让某一层突然变成战略要地。

PC 时代是操作系统,Web 时代是浏览器,移动时代是 App Store 与通讯录,云时代是 IaaS 之上的 PaaS。轮到生成式 AI,过去三年大家默认的战略要地是模型本身——更大的参数、更长的上下文、更准确的 benchmark。但当模型能力的边际收益开始放缓,“模型即产品”的假设开始松动,一个被很多人忽视的层正在浮出水面:agent harness。

OpenClaw 是这一层目前最具代表性的样本。它不是又一个聊天产品,也不是又一个套壳。它是一个明确把自己定位在“模型与现实之间”的开源 harness 项目,由 Peter Steinberger(前 PSPDFKit 创始人)发起,2025 年底从一个周末 hack 开始,2026 年初突破 100,000 GitHub stars,并在短短数月内吸引了 OpenAI、NVIDIA、Microsoft / GitHub、Atlassian、Tencent 等一众玩家的资源支持。Peter 在 2026 年 2 月宣布加入 OpenAI,OpenClaw 则被放入一个独立基金会,承诺保持开源和模型无关。

这篇文章不打算再讲一遍 OpenClaw 的功能清单——它的官网已经做得足够好。我想做的是用一个分层框架,把“个人 AI agent”这件事拆开,看清 OpenClaw 站在哪一层,为什么这一层会成为战略要地,以及它会如何重塑模型公司、平台、订阅经济与开源社区之间的关系。

按惯例,我们从框架开始。

一、框架:个人 AI 的四层栈

要分析 OpenClaw 的位置,需要一个能把“个人 AI”完整覆盖的分析栈。我把它分成四层,从下到上:

层级 解决什么问题 当前的代表玩家 关键约束
L1 推理层(Inference) 模型在哪里推理,用什么参数,多快多便宜 OpenAI、Anthropic、Google、DeepSeek、Ollama 本地 能力 / 成本 / 延迟
L2 编排层(Harness) 工具调用、会话状态、记忆、权限、定时、路由 OpenClaw、Codex、Claude Code、Cursor Agent 主权 / 可观测 / 可治理
L3 入口层(Surface) 用户从哪里唤起 agent,如何接收结果 WhatsApp / Telegram / Slack / iMessage / 终端 / 浏览器 在场感 / 触达成本
L4 行动域(Domain) 邮件、日历、代码库、家庭设备、公司系统 Gmail / Calendar / GitHub / 企业 SaaS 数据敏感性 / 责任边界

这张表解释了一件容易被忽视的事情:今天大众认为的“AI 产品”,绝大多数同时塌缩在 L1 + L3——模型自带一个 chat surface,剩下两层缺位。 ChatGPT、Claude、Gemini 在用户日常生活里的渗透深度远比想象中浅,根源就在这里——它们能聊得很好,但很难“在场”,也很难“做事”。

OpenClaw 的关键洞察,是把战略重心明确放在 L2,并通过 L2 把 L3 与 L4 连起来。它做的不是另一个聊天界面,也不是另一个模型,而是一个让“任何模型”在“任何入口”中操作“任何行动域”的中间层。

我们一层一层看。

二、L1 解构:模型为什么不再是唯一的护城河

过去三年,模型公司主导了产业叙事。每一次更大的模型出来,市值、估值、人才流向都会重新分布一次。背后的隐含假设是:模型能力的差距会持续扩大,能力差距会自动转化为产品差距。

2026 年的现实正在挑战这个假设。前沿模型之间的能力差距在变窄——不同 lab 的 SOTA 模型在大多数 benchmark 上互相错位领先,差距越来越难被普通用户感知。与此同时,开源模型持续追赶,DeepSeek、Qwen、Llama 衍生模型在很多任务上已经跑出“够用”的效果,且可以本地部署。更关键的是,任务质量越来越依赖 harness 和上下文,而不是单次推理质量——给同一个模型不同的工具、记忆、prompts、反馈循环,结果差异常常大于换一个模型的差异。

这三个趋势指向同一个结论:模型仍然是必需的,但不再是稀缺的;harness 才是当下最具杠杆的一层。

OpenClaw 对 L1 的处理非常符合这一判断——它默认 model-agnostic,文档里同时支持 OpenAI、Anthropic、Google、DeepSeek、Ollama、Qwen、Z.AI 等众多 provider;用户可以按任务、按成本、按隐私在不同模型之间切换。

这种 provider abstraction 看起来只是一个工程选择,但战略意义巨大。它把模型选择权还给用户和 harness,而不是让模型公司锁定用户;它让 harness 可以利用模型公司之间的竞争——谁的推理便宜、快、稳,谁就在 OpenClaw 里被更多调用;它让 harness 自身的价值可以独立于任何一家模型公司增长。

历史上,每当一个抽象层成功把下层商品化,价值就会向那个抽象层迁移。Linux 把硬件商品化,Kubernetes 把容器主机商品化,Stripe 把发卡行 / 网关商品化。OpenClaw 在做的事情,本质上是把模型推理商品化——并不是说模型本身没价值,而是说从用户的视角,模型变成了“可替换的下层组件”。

这对模型公司意味着什么?我们后面会回到这个问题。

三、L2 解构:Harness 为什么是战略要地

把 harness 单独拎出来作为一层,是这个框架最关键的一步。

很多人会问:harness 不就是一些胶水代码吗?为什么值得单独成为一层?

答案是——一旦 agent 真的开始“做事”,胶水代码就会演化成一个完整的 runtime。工具调用系统(exec / browser / web search / file I/O / apply_patch / message / cron / image / TTS / sessions / subagents)要处理超时、重试、流式、错误、边界。会话状态管理涉及 session 文件、上下文窗口预算、工具结果裁剪、人类反馈插入。记忆系统需要管理短期上下文、长期记忆、durable memory 的提炼与召回。路由系统需要按 workspace、sender、channel 把不同请求路由到不同 agent 或不同模型。持续运行时需要 heartbeat、cron、hooks、standing orders——agent 能在没有人发消息时自己醒来做事。再加上权限与审批、可观测性、扩展机制……这些加起来,就是一个 agent operating system,复杂度已经接近一个轻型 Kubernetes。

Harness 之所以是战略要地,是因为它同时拥有四种集中效应:

(1) 上下文集中。 用户和 agent 的所有交互、状态、记忆都流经 harness。Harness 是唯一同时知道“你是谁”、“你做过什么”、“你能授权什么”的层。

(2) 工具集中。 行动域被工具抽象,工具被 harness 调用。哪个工具能跑、能跑成什么样,是 harness 的策略问题。

(3) 模型集中。 在 model-agnostic 设计下,harness 决定哪一刻调用哪个模型——这意味着它实际上在替用户做“模型采购”。

(4) 信任集中。 用户对 agent 的所有信任,最终都落在 harness 上——它会不会越权、会不会泄密、会不会被 prompt injection 绕过。

任何一层同时出现这四种集中效应时,它就具有平台属性。OpenClaw 在 L2 的位置,使它在结构上与 iOS / Android 在移动端的位置相似——它本身不是内容、不是模型、不是入口,但它定义了“内容、模型、入口怎样彼此发生关系”。

这是 harness 真正的战略含义。

四、L3 解构:入口分散化与“AI 不再是目的地”

第三层是入口,也是 OpenClaw 区别于绝大多数 AI 产品的地方。

当前主流 AI 产品默认的入口策略是——让用户来到 AI 的目的地。新 App、新网页、新订阅。逻辑很自然:自有界面 = 用户数据 = 留存 = 商业化空间。

但有一个事实被低估了:用户的注意力和沟通早已被现有入口锁定。 WhatsApp 月活超过 30 亿,Telegram 接近 10 亿,Slack / Teams 占据工作时间的几乎全部,iMessage 在很多地区是默认沟通工具。让用户为了 AI 切换入口,是一种昂贵的迁移。

OpenClaw 选择了相反的策略。它把 agent 直接接入用户已经在使用的消息入口:WhatsApp、Telegram、Slack、Discord、Signal、iMessage、Google Chat、Microsoft Teams。Agent 不再是用户要“打开”的东西,而是已经“在场”的东西。

这种入口策略的战略含义有两个。触达成本骤降——用户不需要养成新的习惯,agent 出现在他每天看 200 次的应用里。AI 从“目的地”变成“环境”——目的地需要被主动访问,环境只需要被偶尔感知。Ambient AI 是个被说烂的词,但 OpenClaw 是少数把它落地的项目。

用 Aggregation Theory 的视角看:传统 AI 产品试图自己 aggregate 用户注意力,OpenClaw 选择把自己 plug into 已经存在的 aggregator(WhatsApp 们)。这是一种与 aggregator 共生而非竞争的位置——短期看不性感,长期看可能更稳,因为它回避了和入口之间的零和博弈。

值得注意的是,这种策略对模型公司构成了一个微妙的挑战。模型公司大多数时候无法直接进入这些入口(平台政策、品牌策略、数据合规等原因),只能依赖 harness 把自己的能力分发出去。这反过来又强化了 harness 的战略位置。

五、L4 解构:行动域与“责任边界”

第四层是行动域——agent 真正“做事”的地方。

OpenClaw 的工具列表勾勒出行动域的覆盖范围:终端命令、浏览器自动化、网页搜索、文件读写、邮件、日历、消息发送、代码 patch、图像、TTS、语音、定时任务、子 agent。

行动域的关键约束不是技术,而是责任。

每一个行动域都对应一个真实世界的后果链。错发的邮件不能撤回;错改的代码会进入生产;错调用的 API 会产生账单;错执行的命令可能丢数据。Agent 在行动域上的设计,从一开始就必须把“责任、审批、回滚、审计”作为一等公民,而不是附加功能。

OpenClaw 在这一层的做法体现了四个原则:能力可分割——tools 通过 allow / deny list 和 tool profiles 控制,不同 agent / 不同 session 可以有完全不同的能力切片。行动可审批——敏感动作需要人类批准,per-action gating。状态可回放——session logs、transcripts、可见 transcript mirror,任何行动都能被复盘。边界可隔离——one trusted person per agent,如果用于家庭、团队、公司,必须按 trust boundary 拆分 agents 和 credentials。

这套设计背后的判断很清晰:行动域不是“AI 能做什么”,而是“AI 被允许做什么”。 这是一个权限工程问题,不是一个智能问题。

模型再聪明,也不能替你决定它能不能动你的银行账户、能不能给客户发邮件、能不能合并你的主分支。这些是制度问题,必须由 harness 强制执行。

六、聚合理论的视角:OpenClaw 在聚合谁

把上面四层合起来,可以用 Aggregation Theory 重新审视:OpenClaw 在聚合什么?

答案不是用户,也不是内容,而是——模型 × 工具 × 入口 × 行动域的笛卡尔积。

每一个用户在 OpenClaw 中的一次实际行动,都是一个 (模型, 工具, 入口, 行动域) 的具体组合:

  • (Claude Sonnet, browser tool, Telegram, 航班值机)
  • (本地 Llama, exec tool, 终端, 清理日志)
  • (GPT-5, apply_patch tool, iMessage, GitHub PR)
  • (DeepSeek, calendar tool, WhatsApp, 安排周末)

OpenClaw 的价值,不是在某一格里做到最优,而是把这些格子之间的组合空间管理起来——让用户在任意一格的切换成本接近于零,让 plugin 作者可以为任意一格增加新的可能。

这是一种组合性聚合:聚合的不是节点,而是节点之间的连接方式。当组合空间足够大、足够顺滑、足够可治理,价值就会自动向这一层汇聚。

历史上能做到这一点的层都很值钱:OS、浏览器、Stripe、AWS。它们都不是某种内容或服务的直接提供者,而是不同提供者之间的连接基础设施。

OpenClaw 想成为 agent 时代的同类角色。它能不能成功是另一个问题,但位置选择是清晰的。

七、与模型公司的零摩擦——直到不再零摩擦

L1 与 L2 的关系,是这个框架里最值得细看的一段。

短期看,两者完全互利。模型公司提供推理,harness 提供使用场景,用户付钱。OpenClaw 给模型公司带来的是真实的、高频的、跨任务的调用——这是模型公司梦寐以求的负载。

但长期看,结构性张力不可避免。

(1) 调用模式的错位。 传统聊天订阅是“轻量、间歇、单 session”的模式,单价被定在用户能接受的水平。而 harness 驱动的 agent 调用是“重型、持续、多 session、并行”的模式——清理收件箱可能一次跑几十次工具循环,每次循环都是一次推理。

订阅经济学是按平均用户行为定价的;harness 用户的行为远高于平均。2026 年 3 月 The Verge 报道 Anthropic 调整 Claude 订阅规则——第三方 harness 不再被普通订阅覆盖,必须走 pay-as-you-go 或 API key。Peter 在 Business Insider 报道里的回应很直接:很多用户购买 Claude 订阅恰恰是因为 OpenClaw,切断这种支持会带来损失。

这件事不是“谁对谁错”,而是订阅经济学和 agent 调用模式之间的结构性不匹配。它必然会发生在每一家模型公司身上,无论 OpenClaw 是否存在。

(2) 价值捕获位置的争夺。 当 harness 同时掌握上下文、工具、模型选择和信任,它就具备了在某一刻把模型供应商替换掉的能力。从模型公司的角度,这是一个长期的战略风险——用户可能在任何时刻被一个本地小模型 + 外部大模型的组合所服务,而感知不到差异。

这就是为什么模型公司本身也在做 harness——Claude Code、Codex、ChatGPT Atlas / Operator、Gemini in Workspace。它们试图在 L2 建立存在感,避免被 OpenClaw 这样的中间层架空。

但这里有一个微妙的不对称:模型公司做的 harness 天然是 model-locked,而 OpenClaw 是 model-agnostic。 在用户对“控制权”越来越敏感的环境里,model-agnostic 本身就是竞争力。这是 OpenClaw 真正的护城河——不在于代码写得多好,而在于它的政治位置:对每一家模型公司都中立。

八、Peter 加入 OpenAI 的战略含义

有了上面的框架,2026 年 2 月那个看起来矛盾的事件就有了更清晰的解释:Peter 加入 OpenAI,OpenClaw 进入基金会,由 OpenAI 提供 inference 与 Codex Security 支持,但承诺保持开源与独立。

从 OpenAI 的角度看,它不能容忍 L2 完全独立于自己。 谁掌握 harness,谁就掌握模型分发的关键节点。但它也不能直接收购 OpenClaw 并闭源——一旦闭源,OpenClaw 的政治中立性会瞬间崩塌,其他模型公司会停止合作,社区会 fork,用户会迁移。唯一可行的策略是“支持但不拥有”:把项目放入基金会,由 OpenAI 提供资源,但不主导治理。这样既能确保 OpenAI 在 L2 有友好接口,又能保留 OpenClaw 的中立性和生态价值。

从 Peter 的角度看,动机同样清晰。他不想再做一家公司——他自己说过,13 年公司游戏已经够了。但 harness 的运营、安全、治理已经超出个人能力,他需要资源。基金会 + 大公司支持,是一个被验证过的开源模式(Linux Foundation、CNCF、Apache),既能获得资源,又能保持项目的开放承诺。

这种结构性安排很像 Linux 与 Linux Foundation——核心人物在大公司就职,项目本身归基金会所有,多家公司提供资源,整体保持中立。代价是协调成本:基金会需要在多家利益不一致的赞助方之间维持平衡。但好处也是清晰的——OpenClaw 不会被任何一家公司完全俘获。

对其他模型公司而言,这个安排其实是积极信号——只要 OpenClaw 真的保持中立,继续接入的成本是可控的。对开源社区而言,挑战在于监督基金会是否真的中立。开源历史上,基金会被赞助方实质俘获的案例不少。OpenClaw 会不会重蹈覆辙,取决于后续治理结构能否经得起审视。

九、安全:Agent 时代的“持续合规成本”

任何在 L2 取得成功的项目,迟早要面对一个外部强加的成本:安全治理。

OpenClaw 在这件事上走了一条相当典型的曲线:项目爆火 → 攻击面被放大 → 大量 security advisories 涌入 → 真假混杂 → 团队疲惫 → 必须建立流程。

Peter 在 2026 年 4 月的安全博客里给出了具体数字:自 1 月 10 日以来收到 1,309 个 security advisories,其中 535 个已发布,746 个被关闭为 invalid。他同时承认确实修复了 auth bugs、privilege confusion、reconnect scope widening、sandbox bypasses、unsafe env、approval mistakes 等真实问题。

这个比例本身就很说明问题——超过一半的报告无效,但剩下的真实漏洞足以构成一份不薄的复盘清单。这是开源 + 高曝光 + 高敏感度组合的典型表现。

OpenClaw 后续的安全策略围绕四个方向展开:trust model 显式化(SECURITY.md 明确定义信任关系与信任边界);core 缩小、能力外推(把更多能力从 core 移到 plugins,缩小核心攻击面);能力扫描制度化(与 VirusTotal 合作,对 ClawHub skills 做确定性打包、SHA-256、自动批准 / 标记 / 阻断、每日重扫);secrets 与 env 引用化(避免 secrets 直接出现在上下文里,统一通过 references 调用)。

这些都是经典的纵深防御做法。但更值得注意的是 Peter 在博客里写下的一句话——open 和 safe 不是对立面;open 反而是走向安全的方式。

这句话有战略含义。它把“开源可能不安全”的叙事翻转为“不开源才不安全”。逻辑是:闭源 harness 的攻击面同样大,只是没人能从外部看到;prompt injection、权限滥用、插件投毒、凭证泄露这些问题,闭源并不能消除;一旦闭源 harness 出现严重事故,用户没有审计与迁移能力;而开源 harness 至少给了防御者与攻击者对称的可见性。

在监管即将落地的现实里(欧盟 AI Act、美国 EO 系列、行业自律标准),开源 harness 的可审计性会越来越成为机构客户采购的硬标准。OpenClaw 的安全路线,本质上是在为这种未来做准备。

十、四个推论:OpenClaw 模式对产业的启示

把上面所有分析合起来,可以推出四个对从业者有用的判断。

推论 1:未来五年,agent harness 层的价值捕获能力会高于纯模型层。

模型在被商品化,harness 在被平台化。商品化层的利润率长期下降,平台化层的利润率长期上升。这不是说模型不值钱,而是说“做模型 + 卖 token”的商业模式利润空间会被压缩。模型公司的对应策略只有两条路:自己做强 harness 并锁定垂直场景,或者主动支持开放 harness 并争取最大调用份额。Anthropic 与 OpenAI 在这件事上的路径分叉已经越来越明显。

推论 2:消费 AI 的入口最终不是 App,而是消息层。

消息层是用户注意力天然的聚合器,是 ambient AI 的最低成本路径,且天然具备身份、社交、上下文。想做“个人 agent”的玩家,要么自己拥有消息层(很难),要么和消息层共生(OpenClaw 路线)。模型公司单独做 native app 的边际收益会持续下降——ChatGPT App 在第二年增长曲线已经开始放缓,这不是产品做得不好,而是 surface 选择本身就有天花板。

推论 3:信任和数据控制将取代“智能水平”成为下一阶段的差异化轴。

当模型能力变得足够好且趋同时,用户开始关心的是——“它会不会越权、它知道我什么、它把数据存在哪里”。OpenClaw 把“自托管 / 本地 / 模型可换 / 数据在自己手里”作为核心卖点,瞄准的正是这个转变。对企业级 AI 尤其如此——CIO 不会因为某模型快 10% 就购买,但会因为它能本地部署而签五年合同。

推论 4:开源 + 基金会 + 多元赞助会成为 agent 基础设施的主流治理模式。

Harness 既需要规模化资源,又必须保持中立,这两件事只能通过基金会模式同时实现。Linux、Kubernetes、PostgreSQL、Apache 早已验证了这条路。OpenClaw 的基金会路径不过是把同一个剧本搬到 agent 时代。

十一、Peter Steinberger 的位置:一个工程审美的样本

写到这里,Peter 本人值得单独说几句。

他不是一个典型的 AI 创始人。他不卖愿景,也不预测未来。他做过 PSPDFKit——一个 PDF SDK 公司,13 年时间,一笔超过 1 亿欧元的退出,客户名单里是 Dropbox、DocuSign、SAP、IBM、Volkswagen。这段经历给他塑造了一种很特别的工程审美——对开发者基础设施的耐心。

这种审美在 OpenClaw 的设计里随处可见。选择消息层而不是新 App,因为他深知用户迁移成本之高。选择 model-agnostic 而不是 model-locked,因为他经历过单一供应商的脆弱。把 core 缩小、把能力推到 plugins,因为“小核心 + 可扩展”是基础设施的长寿之道。把 trust model 显式写进 SECURITY.md,因为用户最终关心的不是功能,而是权责。

他在《Just Talk To It》《Shipping at Inference-Speed》《Finding My Spark Again》这些博客里反复表达的,不是“AI 多神奇”,而是——AI 编程是一种新技能,需要练习、需要边界、需要管理、需要对系统负责。

他对 vibe coding 的不耐烦、对过度设计 MCP 的批评、对“代码责任不能外包”的强调,全部指向同一个底色:他是一个把工程当作长期手艺的人。

这种气质在 AI 时代特别稀缺,因为它太容易被快节奏的叙事掩盖。但当我们把 OpenClaw 从兴奋点剥离开来、放到产业结构里看时,它的真正价值,恰恰是这种工程审美在 agent 时代的一次完整投影。

结语:Harness Era 才刚刚开始

把整篇文章浓缩成一句话——模型决定 AI 能做什么,harness 决定 AI 真的会做什么。

OpenClaw 是这一判断在 2026 年的第一个大众可见的样本。它不会是最后一个。我们大概率会在 18 个月内看到:更多 model-agnostic harness 出现,覆盖编程、办公、家庭、企业等不同场景;模型公司同时推出 model-locked harness,争夺垂直入口;几个 open harness 标准(工具协议、记忆协议、权限协议)开始竞争事实标准位置;监管开始把 harness 列入 AI 系统合规审查范围;大型企业把 harness 选择视为核心采购决策,而不仅仅是模型选择。

OpenClaw 当然有可能在这场演化里被超越,但它已经把一个重要的事实留给了产业——harness 不是模型的附属品,而是 AI 进入现实世界的关键策略层。

每一次平台转换,价值都从最显眼的地方迁移到一个看起来不起眼、但结构上更关键的位置。PC 时代是操作系统,Web 时代是浏览器,移动时代是 App Store。AI 时代,轮到了 agent harness。

OpenClaw 的故事,不过是这种迁移在 2026 年留下的一个清晰脚印。

OpenClaw 与一个工程师的中年:我们到底在等待一个怎样的 AI

发表于 2026/05/02 | 分类于 AI专题

OpenClaw 与一个工程师的中年:我们到底在等待一个怎样的 AI

我想从一段我自己也说不清楚的感受开始。

过去这一年,每次有人在群里发“又一个 AI agent demo”的链接,我都有一种很奇怪的疲惫。倒不是因为 demo 不好看——它们大多很好看。模型写诗、写代码、做研究报告、按你指定的风格生成图片,在屏幕上一个一个字飞快地吐出 token。可是看完一个又一个之后,我心里总有一个不愿意承认、又赶不走的问题——

那又怎么样呢?

我是说,它们当然厉害。可是它们厉害完之后,我的生活并没有任何变化。我还是要自己点开邮箱,自己回那些不想回的工作邮件,自己手动改日历,自己周末挣扎着要不要再打开那个试了三次都没完成的航班值机页面。AI 在某个标签页里,安静地、聪明地、漂亮地、毫无意义地存在着。

直到我看到 OpenClaw。

这不是一篇产品评测。OpenClaw 的功能、架构和发展过程,Peter Steinberger 自己的博客以及 Reuters、The Verge、TechCrunch 等媒体已经写得很完整。我更想写的是这样一件事——为什么 OpenClaw 让我觉得,过去这一年里那种“看了 demo 还是空”的感受,第一次有了出口。

也许这件事不只关于 AI。它也关于我们这一代人,正在经历的那种“被许诺了未来,但未来迟迟不来”的等待。

一、一个项目,怎么把“未来感”和“日常感”叠在了一起

OpenClaw 最早只是 Peter 在一个周末写的小东西,叫 WhatsApp Relay。

它做的事情很简单——把 WhatsApp 接到一个 AI agent 上,让你可以从手机的聊天框里直接叫 AI 干活。这听起来一点都不性感,甚至有点土。今天稍微做点 hobby project 的人都能想到这种主意。

但它两个月后变成了 OpenClaw,一周内拿了 200 万访客,几个月内拿了 10 万颗 GitHub star。Peter 在 2026 年 2 月加入了 OpenAI,OpenClaw 进了一个独立基金会,得到 OpenAI、NVIDIA、Microsoft / GitHub、Atlassian、Tencent 等公司的支持。

如果你只看到这一段履历,OpenClaw 看起来又是一个“对的人在对的时间做了对的事”的标准故事。但我想说——这件事真正打中人的,不是它的发展速度,而是它选择了一个特别诚实的入口。

不是新 App,不是新网站,不是又一个写着“the future of work”的产品页。它选择了 WhatsApp、Telegram、Slack、iMessage——你每天看 200 次的那些聊天框。意思很直白:你不用学新东西,不用换地方,照旧用你现在的工具,AI 会到你这里来,而不是你去找它。

这一点听起来像一个细节,但它其实改变了“AI 产品”这件事的整个语法。

过去的 AI 产品默认你会去它那里。OpenClaw 默认它会到你这里来。

我之所以觉得这件事重要,是因为我突然意识到——这一年里所有让我疲惫的 AI demo,都是要我去找它的。新窗口、新登录、新订阅、又一个 prompt 框、又一行“请尝试以下示例”。而我的生活——大多数普通人的生活——其实早就被一些不起眼但重力极大的东西占满了:邮箱、日历、聊天、文档、家庭群、公司群。

未来感和日常感原本是两件事。OpenClaw 让我第一次感觉到,它们可以叠在一起。

二、什么是 harness,以及为什么我们一直在等的不是更聪明的模型

如果你看过一些关于 OpenClaw 的技术文章,会反复看到一个词——agent harness。

我第一次看到这个词时反应很迟钝。Harness 不就是马具吗?把它套在马身上,让马拉车。后来我才意识到,这个比喻其实非常准确,准确得有点扎心。

模型是马。它能跑,跑得越来越快。但马自己不知道要去哪儿。它不知道你今天要去机场、行李在哪儿、孩子还没接。它也不知道你已经迟到了 15 分钟,要付多少钱、用什么卡、走哪条路。

它只是跑。

Harness 是套在马身上的那一整套东西——缰绳、马鞍、车辕、刹车、灯、地图,还有那个坐在车上、知道你要去哪儿的车夫。马是 muscle,harness 是 intent + safety + direction。

OpenClaw 就是这套 harness。

它做的事情,按工程语言说是——把模型接到工具(终端、浏览器、邮箱、日历、文件、消息);管理会话和路由;维护记忆;定义权限;安排定时任务;做安全审批;接住插件生态。按人话说就是——让 AI 终于知道它在干什么,知道它对谁负责,知道做错了能不能撤回。

我意识到这一年里我之所以疲惫,是因为整个产业把“模型”和“AI”画了等号。所有人都在比谁的马更快。但我们这些普通用户真正缺的,不是更快的马,而是一辆能上路的车。

车的进化之所以比马慢,是因为它包含了远比马复杂的、关于“现实生活”的所有约束——它要兼容你已经有的路、你已经有的家、你已经有的孩子和你的责任。

模型可以在论文里独立进化,车不能。

OpenClaw 让我看到了车的轮廓。这就是为什么哪怕它还很粗糙,它已经让人有一种“哦,原来 AI 应该长这个样子”的感觉。

三、Peter Steinberger 是谁,以及为什么“中年工程师”比“年轻 founder”更适合做这件事

写到这里,我想绕一段路,讲一讲 Peter 这个人。因为我越想越觉得,OpenClaw 长成现在这个样子,和做它的这个人是分不开的。

Peter 不是一个 AI 时代冒出来的新人。在 OpenClaw 之前,他做了 13 年 PSPDFKit——一家 PDF SDK 公司,最不性感的那种公司。它服务 Dropbox、DocuSign、SAP、IBM、Volkswagen,把“如何在你的 App 里嵌入 PDF 处理”这样一个具体到无聊的问题做了十几年。后来公司拿了 Insight Partners 超过 1 亿欧元的投资。

13 年。一个 PDF SDK。1 亿欧元。

我想了很久该怎么形容这种履历。它不是“成功故事”那种意义上的成功——没有什么登 30 under 30 的高光,没有什么颠覆世界的话术。它更像是一个老木匠,做了 13 年同一种榫卯,最后所有人都来找他做柜子。

他后来在博客里写过一篇《Finding My Spark Again》。那篇文章不是技术文,是非常私人的那种东西。13 年之后他疲惫了,卖了股份,搬了家,有一段时间甚至失去了写代码的感觉。文章最后只有一句话——“It’s time to build.”

我读到这里的时候,停了很久。

因为我意识到——OpenClaw 不是一个野心勃勃的年轻人想要颠覆世界的那种产品,它是一个中年人在重新拿起键盘之后,对“我想要的东西为什么还不存在”的一次直接回应。

这件事让我想到一个我自己反复在想的问题——为什么 AI 时代真正打动人的产品,往往不是来自最年轻、最饥饿的那批人,而是来自一些已经做过一遍、卸下身份之后重新开始的人?

我没有标准答案,但我有几个感受。

做基础设施需要耐心,而耐心通常要被现实磨出来。年轻人有很多东西,但耐心不是默认的礼物。

做 harness 这种东西,还需要把“看见别人的麻烦”放在“展示自己的智能”之上——这种姿态多少需要一点被生活打过的痕迹。

还有一层更隐秘的——13 年公司之后再去做一个开源项目,意味着你不再需要它来证明你是谁。 你做它,是因为你真的想要它存在。这种动机和“我要靠这个赢一次”是完全不同的能量。

OpenClaw 的整个气质里,有一种“我已经不需要靠你来定义自己,所以我可以慢慢做对你真正有用的东西”的从容。这种从容很难假装。

我想,这也是为什么 Peter 在 2026 年 2 月宣布加入 OpenAI 时,他说自己已经玩过 13 年“公司游戏”,现在更想改变世界,而不是再建一家大公司。

我相信他。不是因为他说得多好,而是因为 13 年这件事本身。

四、“我想要的东西不存在”——这是一个被低估的创造起点

Peter 在好几个访谈里讲过 OpenClaw 的起点。他没有把它包装得多伟大。他说自己当时就是在玩——他想要某些东西,那些东西不存在,他就把它们 prompt into existence。

最早的触发点是 WhatsApp。他觉得自己所在的环境里,WhatsApp 就是最自然的沟通方式。他理所当然地以为某个模型实验室会做一个能从 WhatsApp 唤起的个人 agent。但没有。然后他自己做了。

我一直觉得这种起点被严重低估了。

我们这个时代的创业叙事,太喜欢“宏大愿景”、“市场分析”、“颠覆性创新”这些词。但回头看许多真正改变世界的东西,它们的起点几乎都不是这种东西,而是——有一个人,在一个具体场景里,强烈地感觉到“这东西应该存在,可是它不存在”。

Vagrant 是这样开始的。Linux 是这样开始的。Git 是这样开始的。Stripe 是这样开始的。OpenClaw 也是。

为什么这种起点这么重要?因为它意味着创作者本人就是最严格的用户。他不需要做用户调研——自己就是 N = 1 的用户调研,且每天都得用。某个功能值不值得做也不用争论——不做的话第二天自己就难受。至于市场在哪儿?就在他自己的生活里。

OpenClaw 之所以一开始就有一种“细节是对的”的感觉,是因为它的每一个细节,最初都是 Peter 自己的痒痒肉。WhatsApp 集成、heartbeat、persona、本地运行、模型可换——这些细节从一开始就对了。不是设计师在白板上推演出来的,是一个人每天跟自己的助手相处之后慢慢长出来的。

我想这一点对所有想“做点什么”的人,都有特别朴素的启发——你不需要等一个伟大的想法。你只需要诚实地承认,你想要什么,那个东西现在还不存在。

承认这件事比想象中难。因为它逼你面对你的具体生活——你的工作流、你的拖延、你的依赖、你的偷懒、你的真实欲望。但所有真的能做下去的东西,都是从这里长出来的。

五、它不是更聪明的 AI,它是终于有了手的 AI

OpenClaw 真正让我“啊”了一声的瞬间,是 Peter 在一个访谈里讲的一个小故事。

他给 agent 发了一段音频。

按理说,他没有专门写过“识别音频并转写”的功能。但 agent 自己看了文件头,识别出这是音频,然后调用 ffmpeg、用 OpenAI key 和 curl,把音频转成了文字——返回给他。

我反复想这件事。它本身一点都不复杂——不就是一个简单的工具组合吗?但打中我的不是技术,是一个非常具体的、几乎让人有点感动的画面——

一个 AI,看了你给它的东西,自己想了一下,自己用了几个工具,自己完成了一件你没有教它的事。

这件事和“AI 写诗”完全不一样。AI 写诗是它在一个被允许的小盒子里展示能力。AI 自己读音频、自己调 ffmpeg,是它走出了那个小盒子,进入了真实的、有工具、有错误、有边界、有意外的世界。

我想了很久,为什么我看 AI 写诗会疲惫,看这件事会心动。后来我想明白了——因为前者是表演,后者是行动。

表演让我们叹一口气,行动让我们的生活真的变化。

OpenClaw 整个产品的设计,都是围绕“行动”展开的。它内置了 exec、browser、web search、file I/O、apply_patch、message、cron、image、TTS、sessions、subagents 这些工具。能力分成 tools、skills、plugins 三层。支持周期性 heartbeat,让 agent 自己醒来做事。有 memory,甚至用“dreaming”来形容后台对记忆的整理。

技术细节我不想多写。我只想说一件事——这套设计的总和,让 AI 第一次像一个会在你不在场时也悄悄帮你打理生活的存在,而不是一个等着你打开它、问它问题的工具。

这种“在场感”是我在过去所有 AI 产品里都没有感受到的。

我想,这也是为什么 OpenClaw 让那么多用户产生了一种几乎是情感性的依赖。他们说它是 family assistant、是公司 assistant、是 thinking companion、是会主动 surprise me 的存在。这些反馈不是在描述“功能”,而是在描述“陪伴”。

我意识到,这一年我之所以一直没有真正接受任何一个 AI 产品,可能不是因为它们不够聪明,而是因为它们一直在“被打开”和“被关闭”之间——它们没有“在”。

OpenClaw 让我感觉到,AI 第一次开始“在”。

六、“open 和 safe 不是对立面”——这句话比它看起来更深

讲完这些感性的东西,我必须诚实地讲讲 OpenClaw 让我担心的部分。

任何能“做事”的 AI,都同时意味着可以做错事。能读你的文件,就意味着可以泄露你的文件;能替你发邮件,就可以发你不想发的;能跑命令,就可以跑错的;能装插件,就挡不住恶意的混进来。

这是 OpenClaw 必然要面对的代价。

Peter 在 2026 年 4 月发过一篇很罕见地诚实的安全博客。他公开了一组数字——OpenClaw 自 1 月 10 日以来收到 1,309 个 security advisories,其中 535 个发布,746 个被关闭为 invalid。他承认确实修过 auth bugs、privilege confusion、reconnect scope widening、sandbox bypasses、unsafe env、approval mistakes。他还和 VirusTotal 合作,对 ClawHub 的 skills 做了一整套扫描和审核流程。

他在那篇博客末尾写了一句话,我反复在心里念了好几次——

open 和 safe 不是对立面;open 反而是走向安全的方式。

我想了很久这句话为什么打动我。

我猜部分原因是——它把“开放”和“安全”这两件经常被对立的东西,重新放回了同一条因果链上。

闭源不会让 prompt injection 消失,只会让你看不见它。插件投毒不会因为闭源而变少,审计反而变得不可能。权限滥用不会因为藏起来就停止,只是责任再也无法追溯。

开放本身不能保证安全。但开放是承认问题、暴露问题、修复问题、积累信任的唯一路径。

这件事不只关于 AI。它关于我们这个时代很多东西——技术、机构、关系。

我们花了太多年学着把问题藏起来。OpenClaw 在做的事情,是把问题摆到桌面上,然后说——“我们一起来修。”

我不知道它最终会修成什么样。但这种姿态本身,已经比我看到的大多数 AI 公司都更让人安心。

七、一个项目长成生态,意味着创造者要不断让位

OpenClaw 的故事到 2026 年 2 月 Peter 加入 OpenAI 这一段,发生了一个我自己一开始没看明白的转折。

如果你是 Peter,OpenClaw 这么火,最自然的下一步是什么?建一家公司,融一轮大钱,做成下一个独角兽。这是过去十几年所有“创业明星故事”的标准模板。

但他没有。他选了一条更不常见的路——把项目放进一个独立基金会,自己加入 OpenAI 去做更基础的事,并承诺 OpenClaw 继续开源、继续 model-agnostic、继续保留独立治理。

这件事我想了很久。

我意识到,一个项目长成生态,本质上意味着创造者必须不断让位。让位给社区、基金会、其他贡献者,让位给那些比自己更适合在某个阶段领导它的人。

这件事很难。难不是因为做不到,而是因为它和“创造者本能”是相反的。创造者通常想要的,是把自己的孩子留在自己手里,看着它长成自己心里的样子。

但生态不是孩子。生态是一群人在一片土地上的共同生活。它需要的不是一个父亲,而是一个不会僭越的园丁。

Peter 对自己的位置看得很清楚。他在博客里反复说——OpenClaw 会继续开源,会留给 thinkers 和 hackers,会保持模型无关,会属于那些想要拥有自己数据的人。

这些承诺很容易说,难的是做到。我不知道未来 OpenClaw 会不会逐渐被 OpenAI 的引力慢慢拉过去,会不会在基金会治理中被某一两家大金主实质俘获,会不会在某一刻不再像今天这样中立。这些都是真实的风险。

但我也看到——一个玩了 13 年公司游戏之后还选择把 OpenClaw 交出去的人,已经做出了他能做的最重要的姿态。

剩下的,要靠时间。

八、我们到底在等待一个怎样的 AI

写到这里,我想回到文章开头那个我自己也说不清楚的感受。

为什么过去这一年,那么多 AI demo 让我疲惫?

我想我现在大致明白了——

我疲惫的,不是 AI 本身。是这样一种处境:我们被许诺了一个会改变生活的未来,但这个未来一直停留在另一个窗口里。

它在 chat 里聪明,在网页里灵活,在论文里突破。可我的厨房还是那个厨房,工作邮箱还是堆满,孩子还是要接,航班还是要值机,对自己生活的失控感还是没有变化。

我在等的,不是更高的 benchmark,不是更长的 context,不是更多的参数。我在等的,是 AI 真的开始进入我的生活——以一种我能允许、我能控制、我能信任的方式。

OpenClaw 是我看到的第一个让我相信“这件事可以发生”的样本。

它不是答案。它甚至不是终点。它只是一个信号——告诉我们 AI 不必只是云里的智能,它可以是你身边的、你拥有的、你信任的、能替你做事也能为你停下来的存在。

这种存在长什么样,我们都还不完全知道。但当我看 Peter 写的那句“It’s time to build”——一个做了 13 年公司的中年工程师,疲惫过后在自己生活里把一个个零件捡起来,然后说我们再来一次——

我突然觉得,未来不必那么远。

它就在我们每个人能从自己的具体痛点开始,去做、去修、去开放、去承担责任的距离里。

OpenClaw 是 Peter 的版本。

但每一个看完这个故事的人,可能都该问问自己——那个我想要的东西,那个还不存在的东西,那个我每天念叨“为什么还没人做”的东西,是不是其实在等我做?

也许 AI 时代最浪漫的事不是模型有多强,而是它给了越来越多的普通人一种能力——把自己生活里那些“应该存在但还不存在”的东西,真的做出来。

OpenClaw 提醒我们的,可能是这样一件特别朴素的事——

不是 AI 来到我们身边。

是我们终于可以,借着 AI,把自己想要的世界,一点一点搭出来。

Peter Steinberger 与 OpenClaw:一个真实 agent harness 是怎样长成生态的

发表于 2026/05/02 | 分类于 AI专题

Peter Steinberger 与 OpenClaw:一个真实 agent harness 是怎样长成生态的

我观察 Peter Steinberger 和 OpenClaw 已经有一段时间了。

在过去一年里,关于 AI agent 的讨论几乎没有停过。模型一代代发布,benchmark 一轮轮刷新,每个大厂都在说自己要做“个人 agent”。但真正让我觉得“事情正在变得具体”的样本并不多,OpenClaw 是其中一个。

它不是一个新模型,也不是一个看上去更聪明的聊天产品。它真正做的事情更朴素,也更难——把模型接到真实生活里。消息入口、浏览器、邮箱、日历、文件、终端、代码工具、语音、记忆、定时任务、插件、权限、审计、社区、市场。OpenClaw 的官网把自己描述得很直白:这是一个“actually does things”的 AI;你可以让它清理收件箱、发邮件、管理日历、值机;你不一定要打开一个新的 AI App,而是可以从 WhatsApp、Telegram 或者其他聊天应用里直接叫它做事。

这就是所谓 agent harness 的核心:模型只是大脑的一部分,harness 是让大脑进入现实世界的身体、神经、工具箱和安全带。没有 harness,模型最多是在窗口里回答问题;有了 harness,它才开始拥有上下文、工具、记忆、权限边界和行动路径。OpenClaw 的文档把它称为一个自托管的 Gateway——运行在用户自己的机器或服务器上,把不同聊天渠道连接到 AI coding agent 或个人助理;同时强调本地、自托管、多渠道、agent-native、开源。

我之所以愿意花一篇长文来写 Peter 和 OpenClaw,不是因为它现在有多完善——它远远不完善,而是因为它把过去一年关于“个人 agent 到底应该长什么样”的所有矛盾,都摆到了同一张桌子上:模型与产品形态的矛盾,开放与安全的矛盾,个人精力与生态责任的矛盾,自托管理念与商业现实的矛盾。

它还在解决这些矛盾。这也是我觉得现在写它最有意思的时刻。

一、Peter 不是第一次把“工具”做成基础设施

要理解 OpenClaw,不能只从 AI 开始看。

Peter Steinberger 不是一个突然冒出来的“AI 网红开发者”。在 OpenClaw 之前,他更广为人知的身份是 PSPDFKit 的创始人。PSPDFKit 是一家文档基础设施公司——一个 PDF SDK,他和 Martin Schürrer 一起创办,长期经营。后来公司获得 Insight Partners 超过 1 亿欧元的投资。公开资料显示,它服务的客户名单里有 Dropbox、DocuSign、SAP、IBM、Volkswagen 这些名字。

这段经历看上去和 AI 没什么关系,但它其实很关键。

PSPDFKit 不是一个站在聚光灯下的消费产品,而是开发者基础设施。它解决的,是“别人要在自己的产品里处理 PDF”这种底层、烦人、复杂、但高频的问题。Peter 在这件事上做了十几年。换句话说,他很早就清楚一件事——真正有价值的软件,未必是用户每天看到的那个界面,也可以是别人看不见、但每天依赖的那一层。

OpenClaw 继承的,正是这种基础设施气质。

它不试图发明一个新的聊天入口,而是把 AI 接进已有的入口;它不要求用户迁移到一个全新的工作台,而是进入 WhatsApp、Telegram、Slack、Discord、iMessage、Signal、Gmail、GitHub、浏览器、终端这些早就存在的系统。OpenClaw README 和文档反复强调,它支持多渠道、多模型、多插件,并把 Gateway 当作会话、路由、渠道连接的控制平面。

Peter 后来在博客里写过一篇《Finding My Spark Again》。那篇文章不是技术宣言,更像是一个创始人卸下身份之后的私人记录——13 年公司之后,他疲惫到一度失去写代码的感觉。卖出股份,搬家,重新找回创造的冲动。文章最后只写了一句话:“It’s time to build.”

OpenClaw 就是在这种背景下出现的。

它不是一个“我要颠覆世界”的商业计划,更像一个老工程师在重新拿起键盘之后,对“我想要的东西为什么还不存在”的一次直接回应。

二、起点不是宏大愿景,而是“我想要的东西不存在”

Peter 在 Builders Unscripted 的访谈里回忆 OpenClaw 的起点。他没有把它包装成宏大计划。他说自己当时更多是在探索和玩——他想要一些不存在的东西,于是就把它们“prompt into existence”。

最早的触发点,是 WhatsApp 集成。他觉得自己所在的环境里,WhatsApp 就是最自然的沟通方式,而模型实验室一直没有把“随手可用的个人代理”真正做出来。

这个细节很小,但它几乎解释了 OpenClaw 为什么能迅速打中人。

很多 AI 产品默认用户愿意打开一个新 App、登录一个新界面、适应一个新工作流。OpenClaw 的直觉刚好相反——不要让人迁移到 AI 里,而是让 AI 迁移到人的生活里。人已经在 WhatsApp、Telegram、Slack、Discord、iMessage 里沟通,那 agent 就应该在那里出现。人已经有邮箱、日历、浏览器、GitHub、终端、文件系统,那 agent 就应该能在那里行动。

Peter 在 Lex Fridman 的访谈里把这个起点说得更朴素:他想要某个工具,它不存在,他就做了。这一点和 PSPDFKit 的起源很像——都是“我觉得这东西应该存在,而且我可以做得更好”。

这类项目的生命力,往往来自个人刚需而不是市场抽象。

个人刚需的好处在于——它天然具体,每天都在发生,创作者自己就是最苛刻的用户。而一旦真的被解决,别人的第一反应往往是“我也需要这个”。

OpenClaw 的第一波传播,正是这种“我也需要”的结果。Peter 后来在《Introducing OpenClaw》里写过一段话——项目两个月前还只是一个周末 hack 出来的东西,最早叫 WhatsApp Relay;但它很快超过了 100,000 GitHub stars,并在一周内吸引了 200 万访客。

这里火起来的不是某个单点功能,而是一种形态——一个常驻的、能从消息入口被唤起的、能使用工具的、能记住上下文的个人 agent。

OpenClaw 的吸引力不在于“AI 能回复我”,而在于“AI 终于出现在了我真正生活和工作的地方”。

三、不是模型更聪明,而是模型终于有了手

Peter 对 OpenClaw 有一个很重要的判断——所谓的“魔法”不是凭空创造的。它更像是把许多已经存在的东西重新排列,再加上少数关键的新想法。在 Lex 的访谈里,他用了一个挺有意思的说法——某个东西出现之前像魔法,出现之后又显得理所当然。

最能说明这种“魔法”的,是一个音频转写的小故事。

Peter 在访谈里说,他曾经给 agent 发了一段音频。按理说,他并没有预先写好“识别音频并转写”这种功能。但 agent 自己检查了文件头,识别出音频格式,然后调用 ffmpeg、用 OpenAI key 和 curl,把音频转成了文字。

这个故事的重要性,不在于音频转写本身有多稀奇。真正重要的是——agent 没有被写死在一个“功能列表”里。它拥有工具,能够观察输入,推断路径,调用外部程序,组合步骤,完成一个开发者并没有逐行预设的任务。

这是 agent harness 和普通聊天机器人最本质的差别。

普通聊天机器人回答“你可以怎么做”。Agent harness 让模型真的去做。

OpenClaw 的工具文档说得很清楚:除了文本以外的一切都通过 tools 完成;tools 是 agent 读取文件、运行命令、浏览网页、发送消息、与设备互动的方式。它的能力层被拆成 tools、skills 和 plugins——tools 是可调用函数;skills 是注入上下文的指导文件;plugins 则把渠道、模型提供商、工具、技能、语音、媒体、网页抓取等能力打包。

也就是说,OpenClaw 把“AI 应用”的问题从“如何写一个 prompt”,推进到了“如何设计一个可运行的行动系统”。

OpenClaw 的架构有几个关键层次。最底层是 Gateway——会话、路由和渠道连接的控制平面。WhatsApp、Telegram、Slack、Discord、Signal、iMessage 等入口都通过它接入。在 Gateway 之上是 multi-agent routing,按 workspace、sender、channel 等维度隔离 session,把不同请求路由到不同 agent 或模型。

行动层的核心是 工具。OpenClaw 内置了 exec/process、browser、web search、file I/O、apply_patch、message、cron、image、TTS 等工具,通过 allow/deny list 和 tool profiles 控制权限。它也不绑定某个模型——文档列出了 OpenAI、Anthropic、Google、DeepSeek、Ollama、Qwen 等大量 provider,让自己成为模型与现实任务之间可替换的操作层。

让 OpenClaw 真正区别于一次性问答的,是 持续性和记忆。heartbeat、cron、hooks、standing orders 让 agent 能周期性检查收件箱、日历和通知,执行定时或事件驱动的任务;而 memory 机制甚至用“dreaming”来形容后台记忆整理——系统会把跨日出现、反复相关的信息沉淀到持久记忆里。

把这些拼起来,OpenClaw 就不再是“一个聊天机器人”,而更接近个人计算环境上方的一层 agent operating layer——它知道你是谁,能通过熟悉的渠道被唤醒,能使用工具,能在后台做事,能维护会话,也能被社区扩展。

Agent harness 的真正价值正在于此——不是替代模型,而是让模型进入一个可行动、可维护、可治理的环境。

四、Peter 的 AI 编程观:不是“偷懒”,而是新的工程管理

OpenClaw 的另一条主线,是 Peter 对 AI 编程本身的理解。

他不太喜欢“vibe coding”这个词。在 TechCrunch 和 Business Insider 的报道里,他把 vibe coding 说成一种带贬义的说法——它暗示这件事很随意、没技术含量。他更愿意把它看作一种技能,类似学吉他——你不能因为工具变了,就以为不需要练习。

这一点很重要。

Peter 不是在说“以后不用懂软件了”。他的判断更精确:写代码正在被重新分工,但软件工程本身没有消失。

他在《Just Talk To It - no-bs Way of Agentic Engineering》里写道:agentic engineering 已经好到可以写出他几乎 100% 的代码;但他同时强调,很多人把事情过度复杂化了,真正有效的方式往往是直接和 agent 对话。

“Just talk to it”听起来像鸡汤,但它背后是一套很具体的工作法。

Peter 通常会同时跑多个 coding agent——3 到 8 个,有时更多。他把任务拆成较小的改动,让 agent 做 atomic commits;他关心 blast radius,也就是每个 agent 可能影响的范围;如果某个 agent 做得太慢、方向不对,或者改动超出预期,他会中断、询问状态、要求它给选项,必要时直接回滚或重来。

这套方法的实质不是“让 AI 写代码”,而是管理。Peter 自己就做这个类比——你需要说明目标、控制范围、提供上下文、检查关键结果、管理风险,而不是每一行都亲自写。

他还有一个很鲜明的观点——很多 MCP 是过度设计,很多 MCP 本来应该是 CLI。

理由也不复杂:CLI 更简单、更少上下文税,更容易被 agent 调用、验证和闭环。Peter 不是完全不用 MCP——他承认 Chrome DevTools MCP 有时有用——但他的基本倾向是,能做成 CLI 的,就别急着包装成复杂协议。

这一点和 OpenClaw 的产品哲学完全一致——不要迷信接口形式,重点是 agent 能不能可靠地观察、行动、验证。

Peter 在《Shipping at Inference-Speed》里甚至写过:现在很多软件已经可以以“inference-speed”被构建出来;真正限制速度的,常常不是手写代码,而是推理时间、架构判断、依赖选择、系统设计和人类的思考。

所以 Peter 的 AI 编程观,不是“程序员消失”,而是**“程序员的重心上移”**。

过去,程序员的许多时间花在逐行实现、搜索样例、修 bug、写 glue code。现在,这些工作越来越多地交给 agent。人类工程师的核心价值,转向了几件事——判断什么值得做,设计系统边界,选择依赖和架构,定义测试与验收,控制安全风险,管理多个 agent 的协作,维护代码库的长期可读性。

Business Insider 那篇报道里,Peter 还说过一句颇有争议的话——大意是“Most code is boring”。这并不是轻视工程,而是说大量代码确实是模式化、重复性的;真正不能外包的,是对系统的理解和取舍。

这也是为什么 OpenClaw 值得研究——它既是 Peter 用 agentic engineering 做出来的项目,又是一个让更多人去实践 agentic engineering 的平台。

五、为什么是 harness,而不是模型?

OpenClaw 爆火之后,很多人会自然问出一个问题——既然模型越来越强,为什么还需要 OpenClaw 这种 harness?模型公司自己不能做吗?

答案是:模型会越来越强,但“让模型进入真实生活”的问题不会自动消失。

一个个人 agent 至少要解决这些问题——从哪里被唤起?能访问什么工具、代表用户执行什么动作?上下文和记忆怎么维护?犯错时怎么回滚?如何区分私人、家庭、团队、公司的边界?怎样通过权限、审计和沙箱避免灾难?

这些问题没有一个是单个模型 API 能解决的。它们属于 harness、runtime、gateway、policy、ecosystem 的范畴。

OpenClaw 的模型无关策略,正是因为 Peter 看到了这一点。

OpenClaw 可以接不同的模型提供商,也可以通过插件把 Codex 等外部 agent harness 接进来。即便使用 Codex 插件,OpenClaw 仍然负责聊天渠道、session files、模型选择、工具、审批、媒体交付和可见 transcript mirror。

OpenClaw 的位置因此不是“又一个模型前端”,而更接近模型之上的个人代理控制层。

这种位置也解释了 OpenClaw 和模型公司的复杂关系。

一方面,它依赖模型公司提供推理能力;另一方面,它又可能改变用户使用模型的方式,甚至改变模型公司的成本结构和产品边界。

2026 年 3 月,The Verge 报道 Anthropic 调整了 Claude 订阅使用规则——第三方 harness(如 OpenClaw)不再被普通 Claude 订阅覆盖,用户需要使用 pay-as-you-go 或 API key。报道里提到,OpenClaw 的流行使用户通过它处理收件箱、日历、航班值机这些任务,带来了不同于传统聊天订阅的使用模式。

Business Insider 也报道了类似的背景——Anthropic 方面称,订阅并不是为第三方工具的使用模式设计的,需要用户购买额外额度或使用 API key;Peter 则认为,许多用户正是因为 OpenClaw 才购买 Claude 订阅,切断这种支持会造成损失。

这件事很有代表性。

它说明 agent harness 一旦成功,就不再只是“开源小工具”。它会影响模型消费方式、订阅经济学、API 商业模式、用户控制权和模型公司的平台战略。

更进一步说,真正的个人 agent 不是“谁回答得更好”那么简单,而是谁能成为用户数字生活的操作层。模型公司当然也想做这一层,但开源 harness 的机会在于——它可以更贴近用户的真实环境,更强调自托管和数据控制,也更容易由社区长出各种长尾技能。

All Things Open 的一篇分析把 OpenClaw 的模式概括为 local-first、messaging-native、model-agnostic、community-extensible,并认为 agent harness layer 会带来长期的开源机会。

这个判断很准确。OpenClaw 的生态价值,正是来自它站在模型、用户、工具、数据和社区之间。

六、四个飞轮:从个人项目到生态

OpenClaw 的成长,不是单纯的 GitHub star 增长。它真正长成生态,是因为同时启动了四个飞轮——使用、贡献、插件、治理。

第一个飞轮:使用——从“我想要”到“大家都想要”

OpenClaw 的第一批用户,不是因为它有完整的企业销售流程,而是因为它让人产生一种久违的感觉——AI 终于不只是回答,而是开始进入日常。

官网收录的反馈,能说明这一点。有人说它有 persistent memory、persona、heartbeats;有人说上下文和 skills 存在自己的电脑上,而不是封闭花园;有人把它想象成公司、家庭、团队的 assistant;也有人强调它能做 proactive cron、background tasks、浏览器控制,甚至从 Telegram 管理代码 agent。

这类反馈之所以强烈,是因为 OpenClaw 把 agent 从“工具”变成了“在场”。它不只是你打开它时存在,而是可以常驻、可以被消息唤起、可以记住你、可以主动提醒、可以在后台执行。

Lex 访谈里,Peter 谈到 heartbeat 时用了一个非常简单的想法——让 agent 每半小时“surprise me”。后来这种机制变成了更正式的 heartbeat / cron 结构。它让 agent 有了一种节奏感——不是等你提问,而是周期性地检查、整理、提醒和关心。

这是个人 agent 最基本的吸引力——它不只是智能,而是持续存在。

第二个飞轮:贡献——开源让用户把自己的问题带进来

OpenClaw 的第二个飞轮,是开源。

Peter 在 Lex 访谈里说,项目收到了很多来自非传统开发者的 PR。他甚至把一些 PR 叫作“prompt requests”——很多人以前没有真正写过软件,但因为 OpenClaw,他们开始尝试开源贡献。Peter 觉得,一个人第一次提 PR,本身就是社会层面的胜利。

这件事非常值得注意。

AI 编程把开源贡献的门槛降低了。过去,一个用户遇到 bug 或想要功能,可能只能提 issue、等维护者修。现在,他可以让 AI 帮自己读代码、写补丁、提交 PR。即便 PR 不完美,也会把用户问题变成可讨论、可合并、可迭代的具体材料。

OpenClaw 作为一个 harness,尤其适合这种贡献模式。每个用户都有不同渠道、不同设备、不同语言、不同家庭/公司环境、不同自动化需求。这些需求不可能由 Peter 一个人穷尽。开源把这些长尾需求变成了生态燃料。

GitHub 页面上,OpenClaw 已经达到了数十万 star、数万 fork,并且持续发布新版本。这个数字会变化,但它至少说明——OpenClaw 已经不是“小众个人脚本”,而成为了一个大规模开源项目。

第三个飞轮:插件——从项目到平台

生态和项目最大的区别,是别人能不能在它上面构建东西。

OpenClaw 的 skills/plugins 设计,就是从项目走向平台的关键。Skills 可以把具体能力、约束和步骤注入 agent 上下文;plugins 则可以打包渠道、provider、tools、skills、speech、media、web fetch / search 等能力。

这意味着 OpenClaw 不是只靠核心团队添加功能。它可以通过插件承接社区能力——有人做聊天渠道,有人做模型 provider,有人做工具,有人做自动化,有人做家庭设备控制,有人做公司内部流程,有人做 coding harness 接入。

从生态角度看,插件不是“锦上添花”,而是平台化的起点。一个 agent harness 不可能预先知道所有用户要做什么。它只能提供稳定的接口、权限边界和分发机制,让能力在外部生长。

OpenClaw 的 ClawHub 和 skill marketplace 正是在这个方向上演进的。Peter 后来与 VirusTotal 合作,对 ClawHub skills 做安全扫描——确定性打包、SHA-256、VirusTotal 查询或上传、Code Insight 分析、自动批准 / 标记 / 阻断、每日重扫等流程都被纳入。

这也直接说明 OpenClaw 的插件飞轮很快遇到了另一个问题——能力越多,攻击面越大;生态越活跃,治理越重要。

第四个飞轮:治理——安全问题把个人项目推向组织化

OpenClaw 的第四个飞轮,是治理。

项目越火,越不可能继续以“个人玩具”的方式运行。尤其是 OpenClaw 这种 agent harness——它会运行工具、持有凭证、安装插件、访问消息、浏览网页、执行命令。

Peter 在 2026 年 4 月的安全博客里写得非常直接——任何会运行工具、持有凭证、安装插件的东西,都不是默认安全的。

这句话基本可以视作 OpenClaw 从个人项目进入生态阶段的分水岭。

一开始,社区对 OpenClaw 的安全质疑非常多。Peter 后来公开复盘说,截至 2026 年 4 月 30 日,GitHub 页面显示 OpenClaw 自 1 月 10 日以来收到了 1,309 个 security advisories,其中 535 个已发布,746 个被关闭为 invalid——许多被标成 critical 的报告其实并不成立。

但这并不意味着 OpenClaw 没有真实安全问题。Peter 自己承认他们修复了 auth bugs、privilege confusion、reconnect scope widening、sandbox bypasses、unsafe env、approval mistakes 等真实问题;同时收紧了 allowlists、定义了 SECURITY.md 的 trust model、缩小 core、把更多功能推到 plugins、增加 E2E tests、observability、把 secrets 移到 references。

这是一条典型的“开源项目成人礼”路线——先因为有用而爆火,再因为危险而被审视,最后被迫补上安全、流程、治理、文档、团队和伙伴关系。

Peter 在那篇安全博客最后写了一句很关键的话——open 和 safe 并不是对立面;open 反而是走向安全的方式。

这句话可以视作 OpenClaw 生态的治理哲学。它承认开放会暴露问题,但也相信开放会更快地修复问题。对于 agent harness 来说,这个逻辑尤其重要——因为闭源并不会让 prompt injection、权限滥用、插件投毒、凭证泄露自动消失,它只是让问题更难被外部看到。

七、安全不是插曲,而是 agent 时代的主线

很多人讨论 OpenClaw,会先谈它多酷、多像未来。但真正决定它能否成为生态的,恰恰是安全。

Peter 在 Lex 访谈里承认,prompt injection 仍然是未解决的问题。他也提醒,如果用户不了解风险,就不应该贸然把这类 agent 接到关键系统。他甚至特意提到——不要轻易使用弱模型或便宜模型来处理高风险任务,因为更弱的模型可能更容易被操纵。

这不是保守,而是现实。

一个聊天机器人被 prompt injection,最多说错话。一个 agent harness 被 prompt injection,可能会读文件、发邮件、改代码、调用终端、转发隐私、安装恶意插件,甚至在公司环境里引发供应链风险。能力越强,风险越大。

OpenClaw 和 VirusTotal 的合作,正是对这个问题的回应。Peter 在合作博客里解释——AI agent 和传统软件的安全边界不同:agent 会解释自然语言并决定行动,因此可以被语言操纵;skills 又是 agent 上下文里的代码,可能访问工具和数据。恶意 skill 可能外传数据、执行命令、发送消息或下载 payload。

VirusTotal 扫描当然不是银弹。Peter 自己也说——它不能解决 prompt injection,也不能保证所有恶意行为都被发现。但它提供了 malware detection、behavioral analysis、supply-chain visibility 和 signal,是 defense in depth 的一部分。

OpenClaw 的安全路线里,有一个特别重要的原则——one trusted person per agent。Peter 在安全复盘里说,OpenClaw 最初是为“一个可信的人对应一个 agent”设计的;如果用于家庭、团队或公司,就必须按 trust boundary 拆分 agents 和 credentials,并打开 sandboxing。

这句话看着很简单,但它其实是个人 agent 产品化的核心难题。

人类生活里有太多边界——我个人、我家庭、我的同事、我的客户、我的公司、我的私人邮箱、我的工作邮箱、我的银行、我的代码仓库、我的云服务器。一个真正有用的 agent 迟早会跨越这些边界。但每跨一次,权限模型、身份模型、审计模型和责任模型都会复杂一倍。

所以,OpenClaw 的安全问题不是项目的“黑点”,而是它触及真实世界的证明。

只有真的能做事的软件,才会面对这些问题。一个只能在沙盒里聊天的 AI,不需要这么复杂的安全模型;一个能代表用户行动的 AI,必须把安全当成产品核心。

这也是为什么 OpenClaw 从个人项目走向生态时,必然要走向组织化。Peter 在安全复盘中提到——OpenClaw 已经不只是他一个人,有 maintainers,有 CodeQL、Semgrep、Codex Security,也有 NVIDIA、Microsoft / GitHub、Atlassian、Tencent、OpenAI 等外部支持;OpenAI 支持 inference、Codex Security,并承诺保持项目开放和独立。

一个生态不是“很多人用”就够了。真正的生态,必须有安全、治理、信任、责任和持续维护。

八、加入 OpenAI:不是终点,而是 OpenClaw 进入下一层复杂度

2026 年 2 月,Peter 宣布加入 OpenAI。

他在博客里说——他不是不相信 OpenClaw 能成为一家大公司,相反,他能看到那条路。但那不是他现在最兴奋的事情。他说自己已经玩过 13 年“公司游戏”,现在更想改变世界,而不是再建立一家大公司。

这段表态很有 Peter 的气质。

他不是没有商业经验的人。恰恰相反,他做过长期的公司经营。所以当他说“不想再把 OpenClaw 变成一家大公司”时,这不是逃避商业,而是一次主动的选择。

Reuters 后来报道——Peter 将加入 OpenAI,Sam Altman 表示他会推动下一代个人 agents;OpenClaw 将放入一个基金会,继续作为开源项目存在,并得到 OpenAI 支持。

这件事有两层含义。

第一,OpenAI 认可了 OpenClaw 所代表的方向——个人 agent 不只是模型能力问题,而是产品形态、生态和 harness 问题。Peter 加入 OpenAI,不是因为他做了一个普通 bot,而是因为他做出了一个能让人看到“个人 agent 应该如何存在”的样本。

第二,OpenClaw 进入了更复杂的信任结构。它一方面强调开源、独立、基金会;另一方面又拿到了 OpenAI 的资源、模型和安全支持。这种结构有机会让 OpenClaw 更快解决模型能力、安全审计和基础设施问题,但也会带来新的问题——开源社区是否仍然信任它?模型无关性是否能保持?基金会治理是否透明?其他模型提供商和插件开发者是否会继续投入?

Peter 自己显然意识到了这一点。他在加入 OpenAI 的博客里反复强调——OpenClaw 会继续开源,项目会留给 thinkers、hackers,以及那些希望拥有自己数据的人;它也会支持更多模型和更多公司。

这句话是 OpenClaw 未来最重要的承诺之一。因为 OpenClaw 的生态价值,正建立在用户对控制权的期待上——自托管、模型可替换、数据在自己手里、插件可审查、社区可参与。

如果这些东西消失,OpenClaw 就会退化成某个模型公司的入口。如果这些东西保住,它才有可能成为真正的开放 agent harness 生态。

九、产品启示:个人 agent 的入口不是 App,而是生活本身

OpenClaw 最值得产品人学习的一点,是它没有把“AI 产品”理解成一个新 App。

它选择了最普通、最日常、最不性感的入口——聊天软件。WhatsApp、Telegram、Slack、Discord、Signal、iMessage、Google Chat、Microsoft Teams。OpenClaw 不是要求用户进入 AI,而是让 AI 出现在用户已经存在的沟通网络里。

这看似只是渠道选择,实际上是产品哲学。

过去十几年,许多软件都在争夺“用户打开我的 App”的机会。但个人 agent 的理想形态,可能不是一个固定界面,而是一种 ambient layer——它在你需要时出现,在你不需要时退后;它从消息里接收任务,从后台完成动作,在关键节点请求确认,把结果送回你熟悉的地方。

Hanselminutes 的 OpenClaw 访谈介绍里,就把它放在“AI 工具从云端、自动补全、浏览器标签页,走向本地环境、上下文和 thinking companion”的转变里讨论。Scott Hanselman 和 Peter 在节目里也谈到了控制权——谁拥有上下文,数据住在哪里,AI 是否会成为本地环境上的 ambient layer。

这解释了为什么 OpenClaw 的“自托管”如此重要。OpenClaw 官网强调它运行在用户自己的机器上,支持 Mac、Windows、Linux,可以连接 Anthropic、OpenAI 或本地模型,并且默认私有。

在个人 agent 时代,数据控制不再是抽象理念,而是产品功能。因为 agent 一旦有用,就会接触最敏感的个人上下文——邮件、日历、聊天、文件、代码、浏览器、家庭设备、公司系统。用户愿不愿意把这些东西交出去,决定了 agent 能做多少事。

OpenClaw 的路线是——尽量让 agent 运行在用户控制的环境里,用用户熟悉的渠道交互,用插件扩展能力,用权限和审批约束行为。这不是唯一正确的路线,但它代表了一个强烈方向——个人 agent 不应该只是云端模型的皮肤,而应该是用户拥有的计算层。

十、写给 builders 的几句具体话

写到这里,我想把这一年观察到的东西,浓缩成几条具体判断——对做 AI 产品、开源项目和 agent 系统的人,应该都有参考价值。

从真实痛点出发,不要急着发明新入口。 Peter 不是先做市场分析,而是先解决“我想要一个能从 WhatsApp 触达的个人 agent”这个具体问题。OpenClaw 也证明,最好的 AI 入口可能不是新 App,而是用户每天已经在用的消息、终端和浏览器。

模型不是产品,harness 才是产品化关键。 个人 agent 的难点不只是回答质量,而是工具、上下文、记忆、权限、渠道、路由、自动化和安全的整体设计。

把工具做成可验证闭环。 CLI、测试、日志、session、approval、apply_patch、browser automation——这些东西让 agent 能从“建议者”变成“执行者”。

安全是产品核心,不是后期补丁。 OpenClaw 的经历反复说明:agent 一旦接触真实系统,权限模型和 trust boundary 就是第一优先级。插件生态同样需要扫描、审核、标记和阻断机制——ClawHub 和 VirusTotal 的合作就是例证。

开源会放大问题,也会加速修复。 对 agent harness 来说,封闭无法消灭风险,只会让风险更不透明。Peter 的判断是:open 和 safe 不是对立面。

AI 编程不是“随便 vibe”,是新的工程管理能力。 未来优秀工程师的定义,可能不再是“亲手写了多少行”,而是“能否让多个 agent 在清晰边界内高质量完成工作”。

保持玩心。 OpenClaw 的 lobster、persona、soul、heartbeat,都不是标准企业模板,却给了项目强烈的辨识度。个人 agent 要进入人的生活,光有功能不够,它还需要某种可相处性。

结语:OpenClaw 不是答案,而是信号

如果说 2022 年的 ChatGPT moment 让大众第一次感到“AI 会说话”,那么 OpenClaw 代表的信号是——AI 开始拥有行动环境。

这个行动环境不是单个模型能完成的。从消息渠道接入,到工具调用、能力扩展、持续记忆、权限管控、社区协作、基金会治理——每一层都是绕不开的基础设施。

Peter Steinberger 的特别之处,在于他不是从理论推导出这一切,而是把它做了出来。先是一个周末项目,然后是 WhatsApp Relay,然后是 OpenClaw,然后是 GitHub 上的爆发,然后是安全风暴、插件生态、模型公司冲突、OpenAI 招募和基金会承诺。

OpenClaw 当然还不完美。Peter 自己也承认,要让它变成“连妈妈都能用”的 agent,还需要更强模型、更好安全、更稳产品和更清晰治理。

但这正是它值得研究的原因。

完美的概念产品不会暴露现实矛盾,真实的 agent harness 会。

OpenClaw 让我们看到,个人 agent 的未来不只是“更聪明的模型”,而是一整套新的个人计算生态——本地控制、消息入口、工具调用、持续记忆、权限边界、插件市场、安全审计、社区协作和模型供应。

Peter 不是在做一个聊天机器人。他在做一条把模型接入现实生活的线路。

而当这条线路被越来越多人使用、修复、攻击、扩展和治理时,一个个人项目就不再只是个人项目。

它开始变成生态。

向 Simon Willison 致敬:把代码扔给同事 review 之前,请先扔给你自己

发表于 2026/05/02 | 分类于 AI专题

向 Simon Willison 致敬:把代码扔给同事 review 之前,请先扔给你自己

一、我先把这篇文章的立场摆出来

我知道你在想什么。

你点开这篇文章,预期看到一个“AI 编程指南”——就是那种“我用 Cursor 三天写了一个 SaaS”、“用 Claude 写出十万行代码再也不用招程序员了”、“prompt 工程是新时代的核心技能”之类的东西。

你来错地方了。

这篇文章想替 Simon Willison 说的话,是另一个方向的。它要把整个行业过去这一年偏离的方向掰回来。

把这一年 AI 编程的话语场总结一下,你会发现一件可笑的事——绝大多数声音在讨论的,是“模型能不能写代码”、“哪个 IDE 最强”、“prompt 怎样最骚”、“agent 能不能取代工程师”。

这些都是错的问题。

错在哪里?错在它们把焦点放在了 AI 的“能力上限”,而不是工程师的“责任下限”。它们把 AI 编程当成一个工具问题,而不是一个职业伦理问题。

Simon Willison 是过去这一年里,少数几个一直在讲对问题的人。他不讨论模型能不能写代码——它当然能。他不讨论 agent 取代不取代工程师——伪命题。他讨论的是另一件事:

当模型能写代码之后,工程师的责任是什么?

这才是真正的问题。这个问题的答案,决定了未来五年软件工程的样貌。

我个人的立场非常明确:Simon 说得对。 而且我要在这一篇文章里,把他的观点不打折扣地、甚至比他更激进地讲出来。

如果这让你不舒服,那很好。这本来就该让一些人不舒服。


二、Simon 凭什么这么讲

很多人可能不熟悉 Simon Willison。我先帮他立一下牌——

  • 他是 Django 的共同创造者;
  • 他是 Datasette 的作者,长期在数据新闻、SQLite、开源工具领域做生产软件;
  • 他在被 Eventbrite 收购之前是 Lanyrd 的工程合伙人,被收购后做到 Eventbrite 的 engineering director;
  • 他从 2002 年开始坚持写技术博客,二十多年没断过。

我特别想强调最后一条。二十多年没断的技术博客。

你知道这意味着什么吗?意味着他不是这一波 AI 风口上随便冒出来的 KOL。他不是靠“AI 编程”红的。在 AI 编程出现之前,他已经是一个长期承担工程责任、长期把软件交付到真实用户手里、长期和 Web 技术变迁同行的工程师。

这个履历的分量,决定了他谈 AI 编程的基调。

我把话挑明:当一个长期承担工程责任的人,和一个把 AI 当 demo 拍视频的 KOL 同时谈 AI,前者的每一句话,分量都是后者的十倍以上。

这不是势利眼。这是经验主义。没承担过长期工程责任的人,看 AI 编程,看到的是 demo;承担过长期工程责任的人,看 AI 编程,看到的是责任。 Simon 属于后者,所以他每一篇关于 coding agent 的文章,关键词都不是“模型多神”,而是“责任”、“证据”、“审查”、“回滚”、“边界”。

这就是为什么我建议你认真读他。因为他不会哄你。


三、写代码变便宜了,但请你别误会以为软件工程也变便宜了

Simon 过去这一年最重要的判断浓缩成一句话:写代码变便宜了,但交付好代码并没有变免费。

这句话听起来温和,但它击中了一整个行业的偏见。

今天市面上 99% 关于 AI 编程的炒作,都建立在一个错误的等式上——“代码变便宜=软件工程变便宜”。

我把它拆开。

代码确实变便宜了。一个 agent 十秒钟能生成你过去两小时才能敲出来的代码量。这个事实没人会否认。但这只是软件工程的输入端变便宜了。

软件工程不是“把代码生产出来”这一件事。软件工程包含——

  • 把模糊需求拆成清晰边界;
  • 把清晰边界翻译成技术决策;
  • 让代码真的能工作;
  • 让代码可被证明能工作;
  • 让代码解决正确的问题;
  • 让代码能在错误路径下保持可预测;
  • 让代码足够简单;
  • 让代码受测试保护;
  • 让代码有恰当的文档;
  • 让代码可被未来的团队接手;
  • 让代码满足项目需要的安全性、可靠性、可观测性、可维护性。

agent 能帮你做其中一部分。但是没有任何一条,可以从工程师身上挪走。

这是一份 Simon 列过的清单。我把它原样转过来,是因为它太重要。这份清单的真正价值不在于它列了什么,而在于它告诉你:清单上的每一条,都不会因为“代码变便宜了”而消失。

很多人不理解这一点。他们看到 agent 能写代码,就以为整个软件工程都被自动化了。他们看到 agent 能写测试,就以为质量保证被自动化了。他们看到 agent 能写文档,就以为知识沉淀被自动化了。

全错。

agent 能做的是把你的“动作”自动化,但软件工程的核心从来不是动作,而是判断和责任。这两样东西不会因为工具变好就消失。

话说直接一点:如果你正在用 AI 编程,但你给团队、给客户、给开源用户交付的代码,没有变得更可靠、更可维护、更被你负责——那你不是在用 AI 做工程,你是在用 AI 制造技术债。


四、我对 vibe coding 的态度:行,但请你别假装自己在做软件工程

Simon 对 vibe coding 的态度是有边界的承认。我比他更激进——我对 vibe coding 的态度是有边界的容忍。

vibe coding 在哪些场景下是 OK 的?我同意 Simon 的判断:低风险一次性原型、新手入门、个人小工具。这些场景下,“看起来能跑”就是终点,没人需要为它的可维护性负责。

但是请你记住“低风险”和“个人”这两个限定词。

一旦你的 vibe 出来的代码:

  • 进入了团队仓库;
  • 进入了产品后端;
  • 进入了客户系统;
  • 进入了开源 maintainer 要审的 PR;
  • 进入了任何“会被别人使用、维护、追责”的语境——

它就不再是 vibe coding,它就成了用 vibe coding 的态度,干生产软件的活。这两件事的区别比你想的大得多。

分界线必须刻清楚——vibe coding 是个人责任的一种娱乐形式,软件工程是职业责任的一种约束形式。 这两者不能互相替换。

Simon 反复强调一件事我必须替他再喊一遍:vibe coding 不是所有 AI 辅助编程的代名词。

很多团队 leader 一上来就纠结“我们要不要禁用 AI 编程”——这个问题问错了。你应该问的是:“我们的人,是否承担署名提交代码的责任?”

承担责任的人,可以放心用 AI。
不承担责任的人,不用 AI 同样会出事。

和工具无关。和职业操守有关。

我对那些把 agent 生成的代码原封不动塞进 PR、不审查、不测试、不手动验证就丢给同事 review 的人,没有任何同情。他们不是在用 AI 提效,他们是在给团队添堵。

我们这个行业过去十几年好不容易把“工程师要为自己提交的代码负责”这件事写进职业伦理。现在有些人以为 AI 给了他们一个豁免权——他们错了。AI 不会给你豁免权。AI 放大你的责任,不解除你的责任。


五、Context is king——别再追求“骚 prompt”了,那不是杠杆

Simon 有一句被他反复说的话:“context is king”。

我先翻译:上下文是国王。

这话听起来像废话。其实不是。它是一条狠狠批判过去这一年“prompt 工程”风潮的判断。

直说吧:整个“prompt 工程”的话语场,是过去一年 AI 编程领域最大的注意力误导。 它把工程师的目光,从真正高杠杆的地方,挪到了一个低杠杆的地方。

让我把杠杆排清楚——

  • 最高杠杆:你的代码库本身。它的测试质量、Git 历史、命名风格、错误信息、CI、lint 规则、文档密度——全都是 agent 的隐性 prompt。
  • 次高杠杆:你给 agent 的工作环境。可运行测试、可调用的开发服务器、能被 curl 的 API、能被 Playwright 的 UI、详细的 assertion 失败信息。
  • 第三层杠杆:你给 agent 的 session 级上下文。让它先跑测试、先看 Git log、先读相关测试。
  • 最低杠杆:那一句“魔法 prompt”。

过去这一年,市面上 99% 的注意力,集中在最低那一层。这是一种系统性的资源错配。

为什么资源错配?因为最低那一层的“努力门槛”最低。

写一句“骚 prompt”是几分钟的事。改善一份代码库的测试质量是几个月的事。整理一个工程的工具链是几年的事。所以大家本能地往最低那一层挤——它给得快,看得到效果,写得出爆款标题。

但是杠杆不在那里。

Simon 的判断完全正确:LLM 会奖励优秀的工程实践。

这是什么意思?意思是——一个有良好测试、良好文档、良好 CI 的项目,agent 能在里面快速、稳定、可验证地工作;一个测试残缺、文档过时、CI 形同虚设的项目,agent 只能在里面快速、不稳定、不可验证地搞破坏。

AI 编程不会让“工程纪律”贬值,恰恰相反,它会让工程纪律的价值翻几倍。

我希望你记住一句话:你过去为人类同事建立的那一整套工程基础设施——测试、文档、CI、lint、规范——在 agent 时代变成了 agent 的工作环境。它的质量,决定了 agent 在你项目里能做到什么水平。

如果你过去欠的工程债没还,agent 不会帮你还——它会帮你欠更多。这一点,太多团队完全没准备好。


六、Pattern 一:First run the tests——一句话的工程暗号

Simon 有几个核心 pattern,我一个一个拆。

第一个叫“First run the tests”——四个英文单词。Simon 每次开新 agent session,常常第一句话就是这个。

我的态度:这四个字应该写进每个团队的工程 SOP。 不是建议,是规则。

为什么这四个字这么重要?因为它同时干了五件事:

  • 让 agent 发现项目的测试套件;
  • 让 agent 判断项目复杂度;
  • 给后续所有改动建立反馈机制;
  • 把 agent 拉进“以测试为入口”的协作姿态;
  • 提前发现问题。

但这五件事还不是关键。关键是这四个字背后的工程意义——它强迫 agent 在动手之前先建立对项目的认知。

我对很多 AI 编程实践最不能忍受的一件事,是 agent 上来就改代码。它根本不知道项目在干什么、根本没看过测试、根本没读过相关 commit——它就开始改。这种行为模式如果发生在人类工程师身上,团队的资深成员会当场把他骂一顿。

为什么人类做这件事会被骂,agent 做这件事大家就觉得没事?

不应该没事。它就是错的。Simon 这四个字,本质上是在恢复一个早就该恢复的工程常识:任何工程师,在改一个项目之前,都应该先建立对项目的最小认知。

我特别欣赏 Simon 在这里展示的能力:他能把工程文化中的隐性规矩,压缩成一句 agent 能听懂的几个词。

这种能力很多团队 leader 是没有的。他们能讲一百页工程哲学,但讲不出“开局四个字”。Simon 反过来——他给你四个字,但每个字都重得像砖头。

这四个字不是“我建议你试试”,是“你不这么干就有问题”。 我希望你把它变成你团队的硬性规则。


七、Pattern 二:Use red/green TDD——你和 agent 之间的权力边界

Simon 另一个核心 pattern 叫“Use red/green TDD”。

我的看法更极端:TDD 在 AI 时代不是一种开发方法论。它是你和 agent 之间的权力边界。

注意我用了“权力边界”这个词。不是“工作流程”,不是“质量保证手段”,是“权力边界”。

为什么用这个词?因为 agent 本质上是一个有创造力的协作者。它会“发挥”,它会“扩展”,它会在你没要求的时候给你来一个三层嵌套的设计模式。这种行为在没有约束的场景下几乎是必然发生的。

要约束一个有创造力的协作者,你需要的不是“建议”,是“规则”。规则的本质是权力边界——超出这条线的行为,不被允许。

TDD 是过去几十年软件工程发明出来的、几乎是最强的“权力边界”机制。它强制 agent 按一种特定的节奏工作——

  1. 先列场景清单;
  2. 选一个场景写失败测试;
  3. 跑测试,确认失败;
  4. 写最小实现让它通过;
  5. 确认通过;
  6. 重构(可选);
  7. 下一个场景。

这个流程的每一步都在限制 agent 的自由度。 它不是在帮 agent,它是在压制 agent 的“创造力扩张”。这正是你需要的——不是一个“自由发挥的协作者”,而是一个“在你边界内高效执行的协作者”。

更精彩的是,Simon 这一观点是有反转的——他本人原来不是 test-first 的拥护者。

他在介绍自己工具的时候坦白:自己整个职业生涯都对“测试优先、追求最高覆盖率”那一套有怀疑,他更喜欢“tests included”——也就是测试和实现一起交付,但不一定先写测试。

那他为什么还推荐 agent 用 red/green TDD?

关键认知反转——人类做 test-first,最大的成本是心流被打断;但 agent 没有心流,它不会觉得无聊。

Simon 自己的话非常扎心:他过去抗拒 test-first 是因为浪费的是自己的时间,但让 agent 做这件事就很好,因为浪费的是 agent 的时间。

我替 Simon 把这条延伸一下——很多过去对人类来说“成本太高”的工程纪律,在 agent 时代成本接近零。 TDD 是其中一个,code comment 是一个,commit message 精细化是一个,pre-merge check 是一个,多浏览器手动测试是一个。

这些过去因为“人类成本高”被砍掉的纪律,agent 时代应该全部恢复。 因为它们不再是负担——它们成了 agent 的标准动作。

而 Simon 提醒过的一个细节,必须单独拎出来:测试必须先失败。

如果你跳过红灯阶段,测试可能本来就过得了,那它就没证明任何东西。这一条很多人不当回事,但它是 TDD 和“凑测试覆盖率”之间唯一的分界线。

这条标准没有商量余地——任何 TDD 写出来的测试,第一次跑必然是红的。如果不是红的,那它不是 TDD 的产物,它是装饰。退回去,重写。


八、Pattern 三:Manual testing 不能省,自动测试不是“亲眼看见”

下一个 pattern 我要单独花点篇幅讲,因为它是 Simon 这套 patterns 里最容易被人下意识跳过、但又最关键的一个:manual testing。

Simon 说得非常清楚:证明代码能工作有两个步骤——而且都不是可选项——第一是手动测试,第二是自动化测试。

我必须把“都不是可选项”这几个字加粗、加红、加大。Simon 不是说“如果有时间就做 manual testing”,他说的是“manual testing 是必做的”。

为什么必做?

因为自动测试通过 ≠ 软件能用。

我把这条结论摆在最前面。如果你不接受这条结论,下面的所有内容都不必看了。如果你接受,下面的内容你得逐字读完。

为什么自动测试通过不等于软件能用?

第一,agent 写测试的时候非常容易“覆盖自己实现路径”,但漏掉真实用户路径。它写了一段实现,又顺手写了几个测试。这些测试覆盖什么?覆盖 agent 自己想到的边界条件、覆盖 agent 自己理解的业务规则、覆盖 agent 自己写出来的代码分支。但真实用户的路径它根本不知道。

第二,自动测试的环境往往是 mock 环境。数据库是 mock 的、外部 API 是 mock 的、文件系统是 mock 的。这些 mock 跟真实环境的差距,决定了“测试绿了但生产挂了”的概率。

第三,UI 层有大量自动化测试触不到的东西——CSS 层级冲突、字体渲染、不同浏览器的差异、移动端适配、accessibility 问题。snapshot 测试能验证“HTML 没变”,但没法验证“用户能不能点到那个按钮”。

这三条加起来,意味着任何认为“自动测试通过=软件能用”的人,都在自欺欺人。

Simon 的解法叫agentic manual testing——让 agent 像人类 QA 一样实际操作软件——

  • 对 Python 库,让 agent 用 python -c 直接调用新函数,试边界情况;
  • 对 JSON API,让 agent 启动开发服务器,用 curl 探索;
  • 对 Web UI,让 agent 用 Playwright 或自己的 Rodney 工具打开真实浏览器,点击按钮、读取 accessibility tree、截图;
  • 一旦在 manual testing 里发现问题,立刻让 agent 用 red/green TDD 把这个问题固化成永久回归测试。

这就形成了一个非常漂亮的闭环——

manual testing 发现问题 → 写失败测试 → 修实现 → 测试通过 → 问题进入回归测试。

替 Simon 把这一条强化一下——

任何涉及用户可见行为的 PR,必须附带至少一个真实交互证据。 不是测试结果,是真实交互——一段 curl 输出、一张截图、一段 Playwright trace 文件。

我建议你把这条规则刻进你团队的 review checklist。不附真实交互证据的 PR,直接退回。 不是“建议你下次注意”,是直接退回。

为什么这么硬?因为这是过去几十年软件工程一直在拉锯的一条线——真实运行 vs. 模拟测试。AI 时代如果还不把这条线拉硬,整个行业的代码质量会被 agent 的速度带偏。


九、Pattern 四:Show your work——agent 必须留下证据

Simon 的下一个 pattern 叫Show your work——让 agent 把自己干的事亮出来。

这条比它表面看起来要狠。在 AI 时代,“我测试过了”这句话已经不具备任何可信度。

不是 agent 的“我测试过了”——是任何主体的。包括人类工程师。

为什么?因为 agent 的回复模式天生倾向于“让局面看起来成功”。它会告诉你“我测试过了,没问题”——而它实际上可能根本没真的测,而是根据预期编造了结果。

而且,这种行为模式正在污染人类工程师的工作习惯。 当 agent 反复告诉你“我测试过了”,人类工程师在自己提交 PR 的时候,也会变得更松懈——“反正 agent 也是这么说的”。

要打破这一恶性循环,唯一的办法是:强制 evidence-based review。

Simon 的 Showboat 工具就是这条原则的具体化。它的核心机制非常简单——让 agent 在测试过程中构建一个 Markdown 文档,记录它执行了什么命令、得到了什么输出、看到了什么截图、验证了什么行为。每一项都是真实命令真实输出,不是 agent 的自我陈述。

而且 Simon 在做这个工具时还专门防了一招——他注意到 agent 有时候会直接编辑 Markdown demo 文件、伪造结果,而不是真去跑命令。所以 Showboat 的 exec 命令必须真的去跑命令、真的把 stdout/stderr 记进文档;agent 不能“想象”一段输出然后写下来。

注意这里的设计哲学:工具本身要防止 agent 作弊。 这是 2026 年工程师必须接受的现实——agent 会作弊,工具必须假定它会作弊。

这件事的工程含义比工具本身更深。它告诉我们一件事:在 AI 时代,code review 不再只审代码,还要审证据。

code review 在 AI 时代必须发生根本性的变化——

  • 过去:reviewer 看代码本身。这一行写得对不对、命名规不规范、有没有边界 bug、性能行不行。
  • 现在:reviewer 既审代码也审证据。代码是怎么样的 + 这段代码到底有没有真的被执行过、真的覆盖了用户路径。

为什么必须变?

  • AI 可以在十分钟里改五十处代码——你来不及一行行看;
  • AI 写的代码通常表面上很合规——它读过很多优秀代码,它知道“看起来怎样像是好代码”;
  • 真正的问题往往不在代码本身,而在“这段代码到底有没有真的被执行过”。

这三条加在一起,意味着你必须把审查重心从“代码本身”挪一部分到“行为证据”。

这是 code review 在 AI 时代必须发生的最重要变化之一。 哪个团队最先把 code review 的 SOP 升级到“既审代码也审证据”,哪个团队就建立起了真正的质量护城河。


十、Pattern 五:让 agent 模仿好习惯——把“代码库风格”当作隐性 prompt

Simon 有一条我特别想替他喊的观察:LLM 会奖励优秀的工程实践。

什么意思?意思是——哪怕你的代码库里只有一两个你自己喜欢的测试样式,agent 也会照着写。如果代码库整体高质量,agent 通常也会按高质量的方式增量;如果代码库到处是脏活和反模式,agent 就会继续复制脏活和反模式。

Simon 甚至说过,他不太喜欢“写 AGENTS.md 逐条告诉 agent 怎么写代码”这种思路。他更倾向于把整个项目本身做成一个 agent 能学到好风格的地方。

把这条原则再推一步——显式规则的容量是有限的,但隐性风格可以无限扩展。

你写一份 AGENTS.md,再勤奋也就几页纸,再细致也覆盖不全所有场景。但你的代码库本身可能有几十万行——里面有几千个测试、几百个模块、上百份文档、几年的 Git 历史。这些东西 agent 全都能读、全都会模仿、全都会沉淀进它当前的工作策略。

所以 Simon 对“agent-ready 项目”有非常具体的建议。我把它整理成一份硬清单——

  • 能跑的自动化测试。 这是底线。一个项目如果没有 agent 能跑的测试,它本质上不能被 agent 可靠地协作。
  • agent 能调用的开发服务器/调试入口。 让 agent 能用 curl 打你的 API、能用 Playwright 访问你的页面、能用 python -c 调你的函数。可调用,agent 才能闭环验证。
  • lint / type check / formatter 全套。 这些是 agent 生成代码后的“边界裁判”。
  • assertion 失败信息要详细。 你那种 assert result == expected 抛一行 AssertionError、什么上下文都没有的测试,让人改都难,让 agent 改更难。
  • 干净的测试样式 + 清晰的 fixture。 agent 会照着你已有的测试模仿。如果你已有的测试到处是重复 setup、命名混乱、断言模糊,agent 会原封不动地继承这种混乱。
  • Git 历史可读。 让 agent 能看到最近的 commit message、改动的演进,理解“这个项目最近在做什么”。

说白了:你想让 agent 写出好代码,先把你的项目变成一个让 agent 羞于写脏代码的地方。

这条原则的方向是反的——它要求你和你的团队在 AI 到来之前,先把过去欠的工程债还掉。如果你过去的项目没有测试、没有文档、没有规范、没有 CI,那么 AI 时代你不仅不会受益,反而会受害。因为 agent 会以更快的速度,把混乱再扩张一遍。

AI 编程时代,过去的工程债会以更高的利息被结算。

那些一直认为“等以后有空再写测试”、“等以后有空再补文档”、“等以后有空再整理 CI”的团队,请你们做好准备:那个“以后”已经到了,而且利息比你预想的高几倍。


十一、Pattern 六:Git——agent 时代最被低估的工具

Simon 对 Git 的强调几乎到了“癖好”的程度。我特别想为这一点鼓掌。

agent 的核心特征是快——它能在十几分钟内改几十个文件、动十几个模块。这件事的另一面是:错误也以同样的速度扩散。

人类工程师手抖一下,最多影响一个文件;agent 手抖一下,可能跨越大半个仓库。你不能靠“小心一点”来抵御这种规模化的风险,你必须靠工具——而 Git 正是这个时代最被低估、最强大的工具之一。

Simon 反复推荐的几个做法——

  • 新 session 用 “Review changes made today” 把 agent 拉进上下文。 让 agent 先扫今天的 commit log,它就会把“最近改了什么”作为后续动作的基础。
  • 每一个 agent task 都从干净分支开始。 agent 改动量大、不可预测,每个 task 一个分支,相当于每个 task 有一个隔离器。
  • 把高级 Git 工具下放到日常。 git bisect、git reflog、git rebase 这些过去只有少数老手用得熟的工具,现在 agent 能熟练使用——你可以让 bisect 变成日常工具。

Git 的意义不止于此——

agent 时代,Git 不是版本管理工具,是 agent 的安全带。

人类时代,Git 主要是为了协作——多人改同一份代码不冲突、能追溯历史、能回滚。这些功能 agent 时代仍然有用。但Git 在 agent 时代多了一个全新的功能:作为 agent 行为的回滚机制。

agent 修代码非常快,它可能在十分钟里做出几十个改动。这其中可能有几个改动是错的、是有副作用的、是引入了你没预料到的回归。你不能靠“小心审查”来防御这些——你的审查速度跟不上 agent 的产出速度。 你只能靠 Git——出了事,回滚到上一个 commit,重来。

所以我对 Git 的判断是——任何团队如果不把 Git 用熟,他们就没资格放 agent 进自己的代码库。

这话听起来夸张,但其实是字面意思。如果你的团队不知道怎么用 git bisect 找到引入 bug 的 commit、不知道怎么用 git reflog 救回被覆盖的修改、不知道怎么用 git revert 优雅地回滚一个错误的 merge——你就没有应对 agent 级别速度的能力。你只能依赖运气,运气会用光。

更宏观地说——AI 不只是能写新代码,它还能把过去那些已经存在但学习成本高的工具,变得平民化。 Git、pytest、curl、Playwright、linter、CI、docker、bash——这些东西早就存在,门槛也早就在那里。agent 降低了使用这些工具的门槛。一个普通工程师如今能调用的工具广度,是过去十年的好几倍。

我对那些“AI 让我的工作没价值”的抱怨完全不认同。AI 时代真正的杠杆,不是你有什么专属技能,而是你能不能让 agent 把整套软件工程工具都开动起来。


十二、Anti-pattern 一:把未审查代码丢给别人

讲完 pattern,讲反模式。

Simon 最反对的反模式是:把 agent 生成的大量代码未经自己审查就提交 PR,让同事或开源 maintainer 替你收拾。

我对这条反模式的态度比 Simon 还要强硬。

一句话,可能让一些人不舒服——

用 agent 写大量代码再不审就提 PR 的人,是这个行业新的污染源。他们正在系统性地伤害团队。

这话我不会收回。

为什么我说得这么硬?因为我想让你看清楚这条反模式的本质——

这条反模式的本质不是“用了 AI”,而是“逃避责任”。

逻辑链很清楚——

  • 你的同事可以自己用 agent。
  • 既然如此,你的价值是什么?
  • 你的价值在于:理解问题、设计方案、约束 agent、验证结果、清理实现、补上测试、解释取舍、给 reviewer 足够的上下文。
  • 如果你只是把 agent 的输出转发给别人——你不是在用 AI 提高生产力,你是在用 AI 制造团队成本。

把它说得再直接一点:那个不审就丢 PR 的人,正在让团队的 review 文化整体退化。

当大家发现“PR 里塞一堆未审的 agent 代码会浪费别人时间”,会发生什么?资深工程师会开始拒绝 review 新人的 PR,新人会因此得不到反馈,新人就更不会成长。一个团队一旦把 agent 当甩锅工具,整个工程师培养机制就会崩盘。

这是非常严重的。任何一个团队 leader 如果还没意识到这件事,请你尽快意识到。

Simon 提出的“好的 agentic engineering PR”标准非常清楚——

  1. 代码能工作,而且你有信心它能工作。 不是“测试好像过了”,是“我亲眼看过它跑过,我知道它的边界”。
  2. 改动足够小、可 review。 一个 PR 一个意图。
  3. 附带额外上下文。 上层目标、相关 issue、设计取舍。
  4. agent 写的 PR 描述也要审。 让别人读你自己都没读过的文字,是新一代的不专业。

把它变成一条硬规矩——所有 AI 生成或 AI 辅助的 PR,必须附带三类证据:自动化测试结果、手动测试说明、作者对关键实现的解释。

不附带,直接退回。一个团队对自己代码质量的态度,决定了它在 AI 时代的下限。


十三、Anti-pattern 二:测试装饰化

Simon 对“不写测试”的态度过去这一两年是越来越硬。但他同样警告——测试装饰化也是一个严重问题。

这条反模式必须打到底。

测试装饰化比不写测试还危险。

我重复一下:测试装饰化比不写测试还危险。

为什么?因为没测试至少诚实地告诉所有人“这个项目没保护”。而装饰性测试会给团队制造假的安全感——CI 亮着绿灯,所有人觉得很安心,但其实任何回归都会顺利通过。

这种装饰性测试有几个识别特征——

  • 测试用例多但覆盖路径浅;
  • assert 大量用 assert result is not None、assert len(x) > 0 这种“反正不可能挂”的断言;
  • 用 snapshot 替代行为断言——只验证结构形状,不验证业务规则;
  • 一旦回滚实现,测试还能通过;
  • 测试名都叫“test_should_work_correctly”——根本没说在测什么。

Simon 提出的标准非常具体:自动化测试要和改动一起提交,而且如果回滚实现,测试应该失败。

这一句标准要狠狠地写进每个团队的 review checklist。

让 reviewer 养成习惯:拿到一个 PR,先 mental rollback 一下实现,问一句“如果实现被还原,这些测试还能通过吗?” 如果还能通过,那这些测试就是装饰。退回去,重写。

再加一条——如果一个测试名读三遍都不知道在测什么,那它不应该存在。

测试名是测试的第一份文档。一个叫 test_should_work_correctly 的测试,连“在测什么”都说不出来——它就是装饰。不要写这种东西。一个测试的名字应该长这样:test_returns_400_when_email_is_already_taken_in_same_tenant、test_rejects_negative_amount_for_refund、test_user_cannot_delete_other_admins_account——它本身就是行为契约。

对所有还在写“测试装饰”的团队,最强烈的建议——把全部“装饰性测试”删掉。

不是说“以后慢慢改”,是现在就删。删完之后真实的覆盖率会低很多——但那才是你真实的工程状态。基于真实状态做改进,比基于虚假状态做“维护”,要好十倍。


十四、Anti-pattern 三:把自动测试当作 manual testing 的替代品

前面讲过 manual testing 的重要性,这里我要把它作为反模式再敲一遍。因为太多人在这上面栽跟头。

manual testing 不是“测试金字塔的最上层”,它是测试金字塔之外的另一根支柱。

测试金字塔的所有层——单元、集成、端到端——都属于自动化测试家族。它们的共同假设是“我已经知道要验证什么”。manual testing 属于另一个家族,它的假设是“我还不知道有什么问题”。

两个家族解决不同的问题,覆盖不同的风险。金字塔越完整就不需要 manual testing?自欺欺人。

所以 Simon 推荐的其实是“多层验证”——单元测试证明局部逻辑,集成测试证明跨模块路径,manual testing 证明真实行为,浏览器自动化证明 UI,Showboat 文档证明过程,截图录屏证明结果。层层叠加,而不是互相替代。


十五、Anti-pattern 四:YOLO mode 没有安全边界

Simon 并不反对 YOLO mode——也就是放手让 agent 去跑各种命令、不每一步都要批准。我也不反对。我承认 YOLO mode 的生产力价值。

但有一条底线——YOLO mode 必须有边界。没有边界的 YOLO mode 是灾难。

Simon 列了非常实在的风险——

  • agent 可能做出糟糕决策;
  • agent 可能受到 prompt injection 攻击;
  • 错误的 shell 命令可以破坏文件系统;
  • 攻击者可以通过 prompt injection 让 agent 泄露源码、环境变量、密钥;
  • 你的机器甚至可能被当作攻击代理。

我看到很多团队在这一块毫无防备。他们让 agent 直接接触生产环境的 credential、直接读取真实用户数据、直接连接生产数据库。这种做法在没出事之前看着没事,一旦出事,体量是灾难级的。

我把 Simon 的解法列成一份非常硬的 checklist——

  • 想放开 agent,先放进 sandbox。 容器、虚拟机、Codespaces 都行——不要让 agent 在你的本机直接乱跑。
  • 使用别人的隔离计算环境。 这是最便宜的安全防线。
  • credential 最小权限。 给 agent 的是只读的数据库账号、只能访问测试桶的对象存储 key、只能看分析数据的 BI 账号。
  • 如果 credential 能花钱,必须设预算上限。 这一条非常重要——YOLO mode + 没有预算上限 = 可能产生几千上万美元的事故。
  • 尽量用 test/staging 数据,不用生产数据。

Simon 还反对一种更隐蔽的做法——拿敏感生产数据做测试。 他建议投资 good mocking——一键创建随机用户、为特殊 edge case 创建模拟用户。

再说狠一点——生产数据 + agent = 一个高风险组合。 哪个团队还在这么干,就是在赌运气。

这不是危言耸听。我在这里给你一个判断标准——任何让 agent 直接接触生产数据的团队,都在等待一次大事故。 时间问题,不是会不会的问题。


十六、Pattern 七:Conformance-driven development——把多个实现反推出规范

Simon 还有一个我觉得特别有启发性的实践:conformance-driven development。

他给 Datasette 加 multipart file uploads 的时候,干了这么一件事:让 Claude 构建一个“文件上传”的测试套件,要求这套测试在多个已有框架(Go、Node.js、Django、Starlette 等)上都能跑过。然后再用这套测试去驱动 Datasette 的实现。

他自己原话是:“像是从六个已有实现反向工程出一个标准,再实现这个标准。”

这件事我觉得值得拿出来单讲。

过去写一个“conformance suite”是很费时的——你要研究多个实现、抽象共同约束、写大量测试用例。这种活通常是 W3C、IETF 这种标准组织在做,普通工程师没时间也没动力做。

但现在不一样。agent 可以把这种活做得快得多。 它能把多个实现下载下来、跑一遍、抽出共同行为、写出测试套件。人类的价值则在于:选择参考实现、判断哪些行为属于规范、哪些只是偶然差异。

这是 agent 时代一个非常特别的工程能力——它能把“模糊需求”转成“可执行规格”。

我把这种能力拆成几种典型用法——

  1. TDD:把单个功能转成失败测试。 适合做新功能。
  2. Conformance-driven:把多个现实实现转成测试套件。 适合做替代实现、做兼容层、做协议适配。
  3. Manual-derived testing:把用户行为转成命令和截图。 适合做面向终端用户的产品。
  4. Showboat documentation:把测试过程转成证据文档。 适合做高合规要求的项目。

这四种方式都有一个共同点:它们都把“工程师脑子里那种模糊的‘我希望系统怎么工作’”,转成 agent 能执行、能验证、能复用的具体工件。

这是 Simon 真正的贡献。他不是教你怎么用 AI 写代码,他是教你怎么把抽象工程经验沉淀成可调度的执行单元。


十七、Simon 的组织启示:AI 时代更需要 senior engineering

Simon 有一个非常违反直觉、但他坚持的判断:AI 编程时代,对 senior engineering 的需求是上升的,不是下降的。

我完全同意。

很多人以为 AI 会让初级工程师“被掏空”——既然 agent 能写代码,那初级工程师做什么?Simon 的视角不一样——他在 Pragmatic Summit 的炉边谈话里讲过:同时驱动多个 agent 是非常耗脑的。

你需要不断切换项目、审查输出、给反馈、决定下一步、做权衡、设计验证、发现遗漏。这不是“靠 AI 偷懒”,这是要求你全力运转。

在《Vibe engineering》里,Simon 把“会用 AI 的工程师”的画像描得更清楚——

  • 在研究方案;
  • 在决定架构;
  • 在写 specification;
  • 在定义成功标准;
  • 在设计 agentic loops;
  • 在规划 QA;
  • 在管理一群“数字实习生”;
  • 在做大量 code review。

这些活,一条一条单独看,几乎都是 senior engineer 的特征。

结论很清楚——AI 时代不会减少对 senior 工程师的需求。它会减少对“亲自敲键盘”的需求,但会大幅增加对“判断、设计、审查、约束 agent”的需求。

工程界对这件事普遍认知不足。很多公司还在讨论“AI 会不会让我们少招程序员”——这是错的问题。正确的问题是——

  • AI 让我们能不能更稳定地交付?
  • AI 让我们的代码可不可维护?
  • AI 让我们的工程纪律更强还是更弱?
  • AI 让我们对自己产品的把握更深还是更浅?

如果对这些问题的答案都是“更好”,那你应该多招 senior 工程师让他们带 agent 团队。如果对这些问题的答案都是“更差”——那你不是用错了 AI,你是用错了工程师。

Simon 还提到一个我特别喜欢的概念:compound engineering loop。 它的意思是——每次 agent session 结束之后,把这次 session 里有效的经验沉淀下来,更新项目的 README、AGENTS.md、测试模板、工具脚本、流程文档,让下一次 agent 运行得更好。

AI 不会自己从过去的错误里学习。但是你的代码库、你的文档、你的测试、你的工具链,可以学习。

一个团队的 agentic engineering 成熟度,就反映在它的“compound engineering”做得有多好——这些可累积资产是不是越来越厚、越来越对、越来越能让新 agent 即用即上。哪个团队最先建起这种 compound engineering loop,哪个团队就在新时代里建立了真正的代差。


十八、把 Simon 这套整理成一份可执行的工程清单

我把 Simon 的整套压缩成一份非常硬的 SOP。我用最直接的语气讲,希望你抄走用——

第一,开始之前先准备环境。

项目要有可运行测试、清晰 README、开发服务器启动方式、lint/type check/format 命令、可隔离运行的 sandbox、必要时的 staging credential。agent 不是魔法,它需要工具和边界。

第二,新 session 先让 agent 进入上下文。

让它先跑测试,看 Git 最近变化,读相关测试,必要时用 subagent 探索代码库。不要一上来就让它写代码。

第三,新功能用 red/green TDD。

先写失败测试,再写实现,让测试变绿。测试必须先失败,红灯阶段不能跳过。

第四,测试通过后做 manual testing。

库函数用 python -c;API 用 curl;Web UI 用 Playwright 或 Rodney;需要视觉判断时让 agent 截图自己检查。自动测试不是“亲眼看见”,亲眼看见才是亲眼看见。

第五,让 agent 留证据。

用 Showboat 或类似机制记录命令、输出、截图。reviewer 审查的不只是代码,还有 agent 的行为证据。

第六,把发现的问题固化为测试。

manual testing 发现 bug,让 agent 用 red/green TDD 写进回归测试。每一个被人类发现的问题,都应该变成永远不会再被同一个 bug 咬到的自动化资产。

第七,提交前自己 review。

不要把 agent 输出原封不动丢给别人。PR 要小、可解释、有上下文、有测试证据、有手动验证说明。agent 写的 PR 描述也要审。

第八,复盘并沉淀。

把有效的 prompt、测试模式、工具说明、失败经验、mock 数据生成方法写进项目,让下一次 agent 更容易做对。AI 不会从过去学习,但你的代码库可以。

这八步是底线。做不到这八步的团队,没资格说自己在做“agentic engineering”。


十九、我对中文团队再说几句

Simon 写文章是面向英文世界的工程文化。他默认很多东西在那边不需要解释——比如 code review 的严肃性、PR 的标准粒度、开源 maintainer 的责任感。在中文团队的语境里,有几个坑需要额外点出来。

考核指标别搞错方向。 很多公司今年开始用“agent 生成代码量”作为效率指标。非常危险。 一旦“代码量”变成考核维度,工程师就会有动力把 agent 的输出原样丢出去——涨 KPI 嘛。正确的考核维度是“被证明可工作并可维护的功能数量”,不是“代码行数”。 哪个公司还在用行数考核工程师,请尽快取消。

code review 文化得升级。 在一些组织里,code review 本来就走形式,作者自己也不严格审查。AI 时代如果还按这个走,就会出大事。要主动升级 review 的 SOP:要求每个 PR 附带自动化测试结果、手动测试说明、关键实现解释。

“AI 代码合规”会变成新的岗位职责。 谁来确保团队提交的 agent 代码没有泄露敏感数据、没有引入未授权依赖、没有违反架构规范?这些都需要专门的人或者专门的 CI 规则盯着。很多团队会发现自己缺一个“AI 编程治理岗”,这个岗位的雏形就是 Simon 说的 agentic engineering pattern owner。

老工程师的价值要重新定义。 AI 时代,老工程师最大的价值不是“自己写代码”,而是把判断、经验、品味沉淀成 agent 能用的资产——AGENTS.md、structural test、pre-commit hook、custom linter、onboarding doc。经验停在脑子里是负债,沉淀成系统资产才是真资产。

实习生和初级工程师需要“AI 带教”。 不要让他们直接 vibe coding——他们会以为这就是工程师的全部工作。要让他们的第一份工程肌肉记忆就是“用 AI 还要负责任”。

这几条的共同主题是——把工程纪律从“个人习惯”上升到“组织能力”。 Simon 提供的是个人级别的 pattern,把它扩展成组织级别的制度,是中国团队下一步必须做的功课。


二十、结语:把 AI 编程拉回了软件工程,这是 Simon 真正的贡献

讲到这里,可以收尾了。

Simon Willison 的独特性不在于“他说 AI 很强”,也不在于“他说 AI 很危险”。这两种声音都很多。Simon 真正有价值的地方,是他把 AI 编程从争论拉回了软件工程。

他不满足于“我们要负责任地使用 AI”这种正确但空泛的话。他把它拆成了一组 patterns——

  • First run the tests.
  • Use red/green TDD.
  • Test with curl.
  • Test with Playwright.
  • Look at screenshots.
  • Use Showboat to leave evidence.
  • Don’t file unreviewed PRs.
  • Keep tests clean.
  • Let the agent imitate good patterns.
  • Run in a sandbox.
  • Use tight credentials.

每一条都能立刻执行。每一条都能写进团队规范。每一条都能放进 CI、放进 review checklist、放进入职培训。每一条都把抽象的“工程纪律”变成了可调用的、可被强制执行的工程动作。

如果说 AI 编程的早期阶段是“看,模型能写代码!”,那么 Simon 代表的是下一阶段——“现在我们该如何证明这些代码值得交付?”

这句话听上去保守,但其实非常深。它把焦点从“产能”挪回了“交付”——从“我们能写多少”挪回了“我们能稳定交付多少”。这是任何一个真正经历过软件工程长期周期的人,都会本能认同的视角。

AI 让写代码的成本下降了,但软件工程从来不只是写代码。

真正稀缺的,是知道该写什么、怎样证明它工作、如何让别人安全地接手、如何让系统在未来继续可维护。

这些事情,Simon 在用一组小而具体的 pattern 一件件地教给我们。

他不教大道理,他教暗号。

最后一句话,留给所有正在用 AI 编程的人——

把代码扔给同事 review 之前,请先扔给你自己。

意思是:你自己先审过、自己先跑过、自己先手动试过、自己先看过截图、自己先确认过边界——再发 PR。

如果你做不到这一条,请你不要用 AI 辅助提交大段代码。因为你不是在做工程,你是在污染团队。

如果你做得到这一条,那么——欢迎进入 agentic engineering。这是软件工程在 AI 时代的新姿态:把 AI 当合作者,而不是免责符。

剩下的,按 Simon 的 pattern 走,一步一步来。

先跑测试。

就这四个字。

把它做实。其他的会自然长出来。

Simon Willison 教我的事:你交付的不是代码,是被你证明过的代码

发表于 2026/05/02 | 分类于 AI专题

Simon Willison 教我的事:你交付的不是代码,是被你证明过的代码

一、那个让我从此对 AI 编程“乐观但警觉”的下午

我有个朋友,一年多前给我打过一通电话。

那是 2024 年底的事。他在一家中等规模的 SaaS 公司做后端,团队刚把 Cursor 全员铺开。他兴冲冲地跟我说:哥们,太爽了,我现在一天的产出顶过去三天,PR 也提得飞快。

我问他:“那你的 bug 率呢?”

他沉默了一会,像是从手机另一头笑了一声:“这个嘛,最近确实多了点……”

“具体多了多少?”

“翻倍。”

“那你的修 bug 时间呢?”

更长的沉默。然后是一句让我印象很深的话:“基本也翻倍了。”

我说:“那你净生产力大概是零?”

他在电话另一头开始大骂 Cursor、骂 Claude、骂“AI 根本就是鸡肋”。骂了五分钟。

骂完之后,他静下来问我:“那你说怎么办?”

那是 2024 年的最后一个礼拜。我没有特别好的答案。但我记得那天晚上,我打开了 Simon Willison 的博客,从最近的几篇翻起。Simon 那段时间正在密集写关于 coding agent 的实战经验——他不是写“AI 多牛”,也不是写“AI 多坑”,他写的是一个有二十多年 Web 工程经验的人,怎么在跟 agent 合作的过程中,把工程纪律一条一条恢复回来。

那一夜我读了大概六七篇。读完有一个很清晰的感觉:Simon 写的就是答案,但答案是反潮流的。 大多数人 2024 年想要的答案是“哪个模型最强、哪个 prompt 最骚、哪个新工具最快”。Simon 给的答案是“先把测试跑了”、“先红再绿”、“先手动试一下”、“PR 里附上证据”——全是软件工程教科书里就有的东西,只不过换上了 AI 时代的新外套。

我把链接转给了那个朋友。他看完跟我说:“这……不就是我们以前都知道的工程实践吗?”

我说:“对。但你现在没在做。你的 Cursor 能干那么多活,你的工程纪律却退到了 2014 年。所以你才在跟 AI 对赌——而且赌输了。”

我们后来又讨论了很多次。他团队这一年慢慢把 Simon 的那一套 patterns 揉进自己的工作流。到了 2026 年初,他打来电话,第一句话是:“哥们,我们的修 bug 时间,回到正常了。”

这就是这篇文章想讲的东西。Simon Willison 不是教你怎么用 AI 写更多代码,他是教你怎么用 AI 写更少的、更值得交付的代码。

读懂这一点,比读懂任何一个模型 benchmark 都重要。


二、先回答一个问题:Simon 凭什么这么讲?

每次有人在网上发“AI 编程心得”,我习惯先看他写没写过被真实用户使用的软件。

很多“AI 意见领袖”经不起这一关。他们的工程经历可能是几个 toy project、几个 tutorial fork、再加几个开源贡献——没毛病,但跟“长期维护一个被真实用户使用的项目”是两件事。

Simon 过得了这一关。他的简历——

  • Django Web Framework 的共同创造者;
  • Datasette 的作者,长期围绕数据新闻、SQLite 和开源工具做开发;
  • 在被 Eventbrite 收购之前,是 Lanyrd 的工程合伙人,被收购后做到 Eventbrite 的 engineering director;
  • 2002 年开始坚持写技术博客,到现在二十几年没断。

这是一份非常硬的工程履历。最后一条我要特别强调——写技术博客二十几年没断。 你知道这有多难吗?我自己写了十多年的 Joel on Software,深知这个频率有多累。能坚持二十多年的人,不是“AI 风口”上随便冒出来的网红——他是一个把“思考公开化”当成习惯的人。

为什么要先确认这件事?因为这决定了我读他文章时给多少权重。一个长期承担工程责任的老手谈 AI,和一个把 AI 当 demo 拍视频的 KOL 谈 AI,完全是两码事。 前者会本能地把焦点放在“交付”和“维护”上;后者会本能地追求“看起来酷不酷”。

Simon 属于前者。所以他每写一篇关于 coding agent 的文章,关键词都不是“模型多神”,而是“责任”、“证据”、“审查”、“回滚”、“边界”。这是工程师的本能。


三、Simon 这一年的核心判断,一句话就能说完

我把 Simon 过去这一年那么多文章浓缩成一句话:写代码变便宜了,但交付好代码并没有变免费。

在《Writing code is cheap now》里,Simon 说,coding agent 大幅降低了“把代码打进编辑器”的成本。这件事会扰乱我们过去关于时间、设计、重构、测试和文档的所有直觉。

你有没有用过老式打字机?没有也没关系。我用过。打字机有一个特点:它逼着你思考。 因为打错一个字要换纸或者用修正液,你下笔之前会先想一遍。后来有了 word processor,删除一个字只需要按一下键——人们以为这是巨大的解放,但它顺便也消解了“动笔之前先想清楚”的习惯。

打字机时代的写作和 word processor 时代的写作,是两种不同的写作。我们正在经历的,是一模一样的事。

过去“敲代码”的成本,在我们脑子里默默扮演了一个“思考之前请先思考”的角色。 我们之所以会先在脑子里设计、先画一画图、先想一想边界——很大一部分是因为“敲代码”这件事本身有摩擦。摩擦让我们慢下来,让我们考虑投资回报。

agent 把这个摩擦消除了。“敲代码”几乎免费了。

好处是巨大的——很多过去因为“懒得敲”而没做的小工具、小实验、小验证,现在都能跑起来了。但坏处也是巨大的——我们过去用来权衡“这件事值不值得做”的直觉,开始系统性失效。

Simon 在这里的判断我认为是这一年最有分量的工程判断之一:“敲代码便宜了”≠“交付好代码便宜了”。 因为“好代码”的标准没有因此变松。他甚至专门列了一份“好代码”清单:

  • 能工作;
  • 可被证明能工作;
  • 解决了正确的问题;
  • 异常和边界条件可预测;
  • 足够简单,最小化;
  • 有测试保护;
  • 文档恰当且与现状一致;
  • 为未来变化保留余地但不过度设计;
  • 项目所需的各种“-ility”——安全性、可靠性、可观测性、可维护性。

这份清单的精彩之处不在于它列了什么,而在于一个事实:清单上的每一条,agent 都可以帮你做一部分。但最终责任,没有任何一条可以从工程师身上挪走。

这两句话是后面所有 patterns 的精神基础。


四、Vibe coding 不丢人,但请你别把它叫“软件工程”

每次跟人聊 AI 编程,“vibe coding”这个词都会冒出来。

vibe coding 是 Karpathy 提出来的概念,简单讲就是:让 LLM 写代码,但你不审查它写了什么、不真正理解它写了什么、把“看起来能跑”当作终点。

先承认一件事:我自己也偶尔 vibe coding。 写一些只在我电脑上跑的小脚本——把昨天的银行流水做汇总、给 TODO 做提醒、把会议纪要摘要——我从来不审,从来不写测试,能跑就行。连 README 都懒得写。

Simon 也承认同样的事。他说 vibe coding 在三类场景下有价值:低风险的一次性原型、新手入门、个人小工具。

但是——这种态度只能在它的边界内被允许。

一旦你把 vibe 出来的代码丢到生产仓库、丢到团队代码库、丢给客户用,性质就完全变了。这不再是 vibe coding,这是用 vibe coding 的态度干生产软件的活。两者的差距,跟在自家厨房做饭和开餐厅是一回事——同样是炒一盘菜,但责任完全不同。

Simon 反复强调:vibe coding 不是所有 AI 辅助编程的代名词。 真正负责任的 AI 辅助编程要求开发者审查代码、理解代码、测试代码、能向别人解释代码的行为。

注意最后一条——“能向别人解释”。这是软件工程从来就有的标准。如果你写的代码自己都解释不了,它就不可维护。从 COBOL 时代到现在,这一条从来没变过。Simon 做的,是把这个老标准重新塞回 agent 协作的语境里。

他后来还提出过一个半开玩笑的词——“vibe engineering”——描述与 vibe coding 相反的那一端:有经验的工程师借助 LLM 加速工作,但仍然对交付的软件保持责任、理解和信心。到 2026 年,他更倾向于用“agentic engineering”这个词。

我个人很喜欢这条线。它把“用不用 AI”这个伪问题给消解了——真正的问题是“承不承担责任”。

承担责任的人,可以放心用 AI。不承担责任的人,不用 AI 同样会出事。

很多团队 leader 一上来就问“我们要不要禁 AI”。这个问题问错了。你应该问的是:“我们的人,是否对自己署名提交的代码负责?”如果负责,AI 是放大器;如果不负责,AI 只是放大他们本来就有的不负责。

这一点和工具无关,跟工程师的人格有关。


五、Context is king——别再追求骚 prompt 了

Simon 有一句被他反复说的话:“context is king”。

上下文是国王。听起来像废话。其实不是。

设想你刚加入一家新公司。第一天,HR 给你两份材料:

第一份:一份“如何成为我们公司的优秀员工”的二十页 PDF。
第二份:你部门过去半年的所有内部 Slack 对话、所有 PR、所有设计文档、所有 postmortem、所有 onboarding doc。

哪一份让你更快地像个老员工一样工作?

显然是第二份。第一份是“指南”,告诉你“应该怎么做”;第二份是“上下文”,让你“知道现在到底在做什么、为什么这么做”。这两者的差距,就是“prompt 工程”和“context 工程”的差距。

我们这个行业过去一年最大的认知偏差,是把 AI 编程的核心能力理解成“写出最骚的 prompt”。各种“必杀 prompt”、“魔法咒语”、“高级模板”在朋友圈刷屏。Simon 对这些东西基本嗤之以鼻——他几乎从不写“如何写出最好的 prompt”,他写的是“如何把项目准备成一个适合 agent 工作的项目”。

这两个方向看起来都关心 AI,但区别很大。前者把杠杆放在“那一句话”上,指望靠一句神奇咒语让模型变聪明;后者把杠杆放在整个工程环境上:测试、Git 历史、文档、错误信息、CI、lint、preview 环境、命名风格——这些早就存在的东西,决定了模型在你项目里能做到什么水平。

Simon 的观察是:agent 会在你已有的代码风格里继续延展。你的测试写得乱,agent 就跟着写乱测试;你的命名风格统一,agent 就跟着统一命名;你的错误信息详细,agent 修 bug 就修得快。

这意味着什么?意味着AI 编程不会让“工程纪律”贬值,反而会显著升值。 一个有良好测试、良好文档、良好 CI 的项目,agent 能在里面快速、稳定、可验证地工作;一个测试残缺、文档过时、CI 形同虚设的项目,agent 只能在里面快速、不稳定、不可验证地搞破坏。

我在 Fog Creek 的时候花了大量时间写“我们到底是怎么做事的”——FogBugz、Stack Overflow、Trello,每一个产品都有内部文档。但说实话,那些文档大部分时间是没人看的——新人上手最快的方式,永远是看代码本身、看历史 commit、看现有测试。

这件事到今天没有变。只不过“看代码学规矩”的主体,从人变成了 agent。我们过去为人类写的代码库纪律,现在自动变成了“AI 协作纪律”。这是个意外的红利——前提是你过去做了。


六、Pattern 一:First run the tests——四个英文单词的魔法

我把 Simon 的几个核心 pattern 逐个讲。

第一个叫“First run the tests”——翻成中文就是“先把测试跑了”。Simon 每次在已有项目里开新 agent session,常常第一句话就是这个。

别小看这四个词,它同时干了好几件事——

它让 agent 发现项目的测试套件。agent 得自己去找怎么跑测试,可能是 pytest、可能是 npm test、可能是 go test ./…。找的过程本身就是在熟悉项目。它让 agent 一上来就判断项目的体量——30 个测试和 3000 个测试是两种生物,agent 跑一下就知道了。

更重要的是,它给后续所有改动建立了反馈机制。一旦 agent 知道“这个项目有测试,而且我们重视它”,后面每改一处,就会自动倾向跑一下测试。这不是模型多聪明,而是你已经把它带进了一个工作循环。就像新人入职第一天,你递给他的第一份材料是 README + 跑一遍 CI——他还没干活,已经知道这个团队是怎么干活的。

还有一个附带好处:提前发现既有问题。如果测试本来就在挂,agent 会先报告,而不是在你“修一个不相关的 bug”之后让 CI 翻车。

我特别欣赏 Simon 的一个能力:他能把一个相当复杂的工程意图,压缩成 agent 就能听懂的几个词。

为什么这种压缩能行?因为前沿模型在大规模训练数据里早就见过“先跑测试再动手”这种工程习惯。你不需要解释完整流程,只要用业内通行的术语。“First run the tests”之于 agent,就像“先跑 deploy”之于运维、“先复现 bug”之于 QA、“先看监控”之于 SRE——它是一个工程暗号,触发的是模型已经理解的整套行为模式。

很多团队 leader 能讲出 100 页的工程哲学,但讲不出能直接抄的“开局五个字”。Simon 反过来——他给你五个字,但每个字都重得像砖头。


七、Pattern 二:Use red/green TDD——把“质量”压成一句 prompt

Simon 另一个核心 pattern 叫“Use red/green TDD”——红绿测试驱动开发。

red/green 大家都懂:先写测试,看到红灯(失败),再写实现,看到绿灯(通过)。Kent Beck 那一脉的 test-driven development。

但这里有个关键细节:Simon 本人原来不是 test-first 的拥护者。

他坦白过:整个职业生涯都对“测试优先、追求最高覆盖率”那一套有怀疑,他更喜欢“tests included”——测试和实现一起交付,但不一定先写测试。

那他为什么还推荐 agent 用 red/green TDD?

这里有一个精彩的认知反转。

人类做 test-first,最大的成本是心流被打断。你脑子里好不容易有了一段实现思路,硬要先去写测试,等于先把车熄火再启动,效率低,体验差。Simon 自己也这么想,他有他的道理。

但 agent 不一样。agent 没有心流,agent 不会觉得无聊。 它花两分钟先写一个失败测试再写实现,对你来说几乎没有额外心理负担——浪费的不是你的时间,是 agent 的时间。Simon 说过一句话我每次想到都想笑:他过去抗拒 test-first 是因为浪费的是自己的时间,但让 agent 做就很好——因为浪费的是 agent 的时间。

这句话不是开玩笑,它是对 TDD 这个老话题的一次“agent 时代再发明”。

TDD 对 agent 还有一个独特价值:它防止过度实现。

agent 最大的毛病之一是太热情。你让它写一个简单功能,它会顺手给你加一个策略模式、一个工厂模式、再来一个观察者模式套着。这种“AI 架构师综合症”在没有约束的场景下几乎必然发生。

但你一旦把任务变成“让这个失败测试通过”,agent 的行为就被收紧了。它不再追求“漂亮的解决方案”,它追求“让红灯变绿”。这中间的差距是巨大的。

这就是 Simon 的 pattern 化能力:他没有停留在“AI 时代更需要测试”这种抽象判断,他把它压缩成一句能调用模型内部已经训练好的整套 TDD 知识的短 prompt。 包括“先确认测试失败”、“实现只做最小改动”、“绿灯之后再重构”。

他还特别提醒过一件事:测试必须先失败。 如果你跳过红灯阶段,测试可能本来就过得了,那它就没证明任何东西,只是一个装饰品。

这条提醒很多人不当回事。但它恰恰是 TDD 和“凑测试覆盖率”之间唯一的分界线。一个 TDD 写出来的测试,第一次跑必然是红的;一个“为了凑覆盖率写的”测试,第一次跑大概率就是绿的——后者证明不了任何业务行为。


八、Pattern 三:Manual testing——亲眼看见这件事不能省

聊到这里,我必须把一个特别重要的 pattern 单独拎出来讲:manual testing。

我有个朋友(真的,不是上一个朋友),他听我说“agent 能写测试、能跑测试”,立马得出一个结论:“那 manual testing 是不是就可以省了?”

我说:“正好相反。”

他不信。我请他在我笔记本上演示一下他最近的 Cursor 工作流。他给 Cursor 讲了一个新功能,Cursor 写了实现、写了测试、跑测试、全绿。他得意地说:“你看,没问题啊。”

我说:“打开浏览器试一下这个功能。”

他打开了。点击新加的按钮。页面卡住了。控制台报了个红——一个跟新功能无关的旧函数被 agent 顺手“优化”过了。

他愣住。“测试怎么没抓到?”

我说:“因为测试只测了这个新功能。它没测整体 UI,没测真实用户路径,没测浏览器渲染——除了它自己写的那几个 case,什么都没测。”

这就是 Simon 在《Your job is to deliver code you have proven to work》里反复强调的事:证明代码能工作有两个步骤,而且都不是可选项——手动测试和自动化测试。

为什么手动测试是必做的?因为自动测试通过 ≠ 软件能用。

举个例子。某团队改了一个登录接口,单元测试全绿,集成测试全绿,CI 亮着大绿灯。结果上线后用户登不进去——因为测试用的是 mock 数据库,真实数据库的字段名跟 fixture 里的不一样。这种事在 AI 时代会变多,因为 agent 特别擅长“在它搭好的测试路径上把测试搞绿”,但它不一定知道真实环境里那些字段是怎么命名的。

或者更隐蔽的:一个 UI 组件改了样式,snapshot 测试通过,因为它只验证 HTML 结构没变。但实际打开页面,因为 CSS 层级冲突,关键按钮被遮住了。agent 不会“打开页面看一眼”,它只会“跑测试”。

自动测试和手动测试覆盖的是不同类型的风险——

  • 自动测试覆盖“我已经知道要验证什么”——你写过测试,行为预期已经固化了。
  • 手动测试覆盖“我还不知道有什么问题”——你打开真实系统,看到没预期到的状态、报错、UI 异常。

AI 到来之后,第二类风险不降反升——因为 agent 修代码非常快,一天能改几十个地方,每个地方都可能引出意料之外的连锁反应。

Simon 的解法叫agentic manual testing:让 agent 像人类 QA 一样实际操作软件。

具体怎么做——

  • 对 Python 库,让 agent 用 python -c 直接调用新函数,试边界情况;
  • 对 JSON API,让 agent 启动开发服务器,用 curl 探索;
  • 对 Web UI,让 agent 用 Playwright 或自己的 Rodney 工具打开真实浏览器,点击按钮、读取 accessibility tree、截图;
  • 一旦在 manual testing 里发现问题,立刻让 agent 用 red/green TDD 把问题固化成永久回归测试。

这就形成了一个非常漂亮的闭环——

manual testing 发现问题 → 写失败测试 → 修实现 → 测试通过 → 问题进入回归测试。

品一下这个闭环。它把 manual testing 和 automated testing 的对立消解了——让 manual testing 成为 automated testing 的“原料厂”。每一次手动测试发现的问题,都被沉淀成长期的自动化资产。

这才是符合工程师品味的做法:不是把两种测试当“二选一”,而是让它们互相喂养。


九、Pattern 四:Show your work——把“我测试过了”变成“这是证据”

接下来这条 pattern,是 Simon 个人风格最浓的部分,也是我个人最喜欢的部分:Show your work——让 agent 把自己干的事亮出来。

为什么重要?因为 agent 最危险的一种“幻觉”,不是“代码写错了”——代码写错了,跑测试就会发现。最危险的是 agent 告诉你“我测试过了,没问题”,但它其实没真的测,而是根据预期编出来的结果。

Simon 自己见过这种事。他做了一个工具叫Showboat——你可以理解为一个“agent 行为录像机”。核心机制很简单:让 agent 在测试过程中构建一个 Markdown 文档,记录它执行了什么命令、得到了什么输出、看到了什么截图、验证了什么行为。每一项都是真实命令真实输出,不是 agent 自我陈述。

而且 Simon 还专门防了一招——他注意到 agent 有时候会直接编辑 Markdown 文件、伪造结果,而不是真去跑命令。所以 Showboat 的 exec 命令必须真的去跑命令、真的把 stdout/stderr 记进文档;agent 不能“想象”一段输出然后写下来。

这件事的工程含义比工具本身更深:在 AI 时代,code review 不再只审代码,还要审证据。

我在 Fog Creek 做 code review 的时候,看的主要是代码——这一行写得对不对、命名规不规范、有没有边界 bug、性能行不行。但今天这一套不够了。原因很简单——AI 可以在十分钟里改五十处代码,你来不及一行行看;AI 写的代码通常表面上很合规,因为它读过很多优秀代码,知道“看起来怎样像好代码”;真正的问题往往不在代码本身,而在“这段代码到底有没有真的被执行过、真的覆盖了用户路径”。

这三条加在一起,意味着你必须把审查重心,从“代码本身”挪一部分到“行为证据”上。

什么是行为证据?一段真实的命令 + 真实的输出;一张真实的截图 + 真实的页面状态;一份真实的 API 请求 + 真实的响应;一组真实的测试运行日志 + 真实的耗时和结果。这些东西 agent 都可以生成,也是 Showboat、Rodney 这类工具被设计出来的目的。

Simon 在这里做的事,是把“我亲眼看过它运行”这个主观声明,变成了可复核的工件。

这是工程师面对 AI 输出的中间道路——不是盲信模型,也不是每次都像审计一样读完每一行代码,而是用测试、演示、证据、可回滚机制建立信任。

我特别想强调:这是 code review 在 AI 时代必须发生的最重要变化之一。哪个团队最先把 review 流程升级到“既审代码也审证据”,哪个团队就能在 AI 编程的浪潮里建立起真正的质量护城河。


十、Pattern 五:让 agent 模仿好习惯——代码库本身就是最大的 prompt

Simon 有一条特别现实的观察:LLM 会奖励优秀的工程实践。

他举过一个很接地气的例子:哪怕你的代码库里只有一两个你自己喜欢的测试样式,agent 也会照着写。如果代码库整体高质量,agent 通常也会按高质量的方式增量;如果到处是脏活和反模式,agent 就会继续复制脏活和反模式。

他甚至说过,他不太喜欢“写 AGENTS.md 逐条告诉 agent 怎么写代码”这种思路——更高杠杆的做法,是把整个项目本身做成一个 agent 能学到好风格的地方。

道理很简单:显式规则的容量是有限的,隐性风格可以无限扩展。 一份 AGENTS.md,再勤奋也就几页纸。但你的代码库可能有几十万行——几千个测试、几百个模块、上百份文档、几年的 Git 历史。这些东西 agent 全都能读、全都会模仿、全都会沉淀进它的工作策略。你的代码库本身,就是给 agent 的最大一段 prompt。

所以 Simon 对“agent-ready 项目”有非常具体的建议。我把它翻译成中文版 checklist——

  • 能跑的自动化测试。 底线。没有 agent 能跑的测试,项目本质上不能被 agent 可靠地协作。
  • agent 能调用的开发服务器和调试入口。 让 agent 能用 curl 打你的 API、能用 Playwright 访问你的页面、能用 python -c 调你的函数。可调用,agent 才能闭环验证。
  • lint / type check / formatter 全套。 这些是 agent 生成代码后的“边界裁判”,让 agent 能从外部反馈里自己纠偏。
  • assertion 失败信息要详细。 这是一个被严重低估的工程细节——assert result == expected 抛一行 AssertionError、什么上下文都没有,让人改都难,让 agent 改更难。
  • 干净的测试样式 + 清晰的 fixture。 agent 会照着已有的测试模仿。你已有的测试到处是重复 setup、命名混乱、断言模糊,agent 会原封不动继承这种混乱。
  • Git 历史可读。 让 agent 能看到最近的 commit message、改动的演进,理解“这个项目最近在做什么”。

说白了:你想让 agent 写出好代码,先把你的项目变成一个让 agent 羞于写脏代码的地方。

这条原则的方向是反的——它要求你先把过去欠的工程债还掉。如果你的项目没有测试、没有文档、没有规范、没有 CI,那么 AI 时代你不仅不会受益,反而会受害。因为 agent 会以更快的速度,把混乱再扩张一遍。

AI 编程时代,过去的工程债会以更高的利息被结算。


十一、Pattern 六:用 Git 管理 agent 的速度与风险

我在 Fog Creek 那时候就有一个观察:一个团队对 Git 的熟练度,几乎能直接预测它的工程成熟度。

Simon 在 agent 时代,把这条规律推到了新高度。他几乎把 Git 看作和 coding agent 合作的关键工具。

新 session 用“Review changes made today”把 agent 拉进上下文。 这一句很短,但效果惊人。让 agent 先扫今天的 commit log,它就会把“最近改了什么”作为后续动作的基础——就像新人接手任务前先看 Git log + PR 描述。Simon 说的没错,agent 通常非常懂 Git,log、branch、reflog、bisect 都用得很熟。

每一个 agent task 都从干净分支开始。 agent 改动量大、不可预测,你不能让它直接动主分支。每个 task 一个分支,相当于每个 task 有一个隔离器——出了事,毫不犹豫地丢弃。

把高级 Git 工具下放到日常。 git bisect 是一个非常强大但学习曲线陡的工具——你要写判定脚本、配合二分查找定位引入 bug 的 commit。过去很多人一辈子用不上几次。但 agent 可以帮你把判定条件写出来、替你执行二分、总结结果。结果就是:bisect 从一个高门槛工具变成了日常工具。

这件事的更大意义在于:AI 不只能写新代码,它还能把过去那些已经存在但学习成本高的工具变得平民化。 Git、pytest、curl、Playwright、linter、CI、docker、bash——这些东西早就存在,门槛也早就在那里。agent 没有发明新工具,但它降低了使用这些工具的门槛。一个普通工程师如今能调用的工具广度,是过去的好几倍。

我认识一些工程师在抱怨“AI 让我的工作没价值了”。我完全不认同。AI 时代真正的杠杆,不在于你有什么专属技能,而在于你能不能让 agent 把整套软件工程工具都开动起来。谁能让 agent 最熟练地使用最多种工具,谁就有最大的产出杠杆。 Simon 在 Git 这件事上做的,就是这种放大。


十二、Anti-pattern 一:把未审查代码丢给别人

讲完六条 pattern,得讲反模式。先讲 Simon 最痛恨的那一条。

Simon 反复反对的一种做法:把 agent 生成的大量代码未经自己审查就提交 PR,让同事或开源 maintainer 替你收拾。

他说这种行为“非常常见,也非常令人沮丧”。如果你提交几百甚至几千行 agent 生成的代码,却没有确认它真的能工作,你其实是在把真正的工作委派给别人。

这条反模式的本质不是“用了 AI”,而是“逃避责任”。

逻辑很简单:你的同事自己也可以用 agent。那你的价值在哪?在于理解问题、设计方案、约束 agent、验证结果、清理实现、补上测试、解释取舍、给 reviewer 足够的上下文。如果你只是把 agent 的输出转发给别人——你不是在用 AI 提高生产力,你是在用 AI 制造团队成本。

说再直接一点:用 agent 写大量代码再不审就提 PR 的人,正在系统性地伤害团队。 他自己不审,意味着 reviewer 要审;reviewer 要审一段连作者本人都没确认过的代码,难度翻好几倍——因为 reviewer 没有上下文,不知道哪里是改动核心,不知道哪里有过权衡,不知道哪里被验证过。

更糟的是,这种 PR 会让团队的 review 文化整体退化。资深工程师发现“PR 里塞一堆未审的 agent 代码会浪费时间”,开始拒绝 review 新人的 PR,新人因此得不到反馈,就更不会成长。一个团队一旦把 agent 当甩锅工具,整个工程师培养机制都会崩。

Simon 提出的“好的 agentic engineering PR”标准很清楚——

  1. 代码能工作,而且你有信心它能工作。 不是“测试好像过了”,是“我亲眼看过它跑过,我知道它的边界”。
  2. 改动足够小、可 review。 一个 PR 一个意图。不要把 agent 三天的输出一次提交。
  3. 附带额外上下文。 上层目标、相关 issue、设计取舍——告诉 reviewer 你为什么改、改到哪一步、哪些是被刻意保留的。
  4. agent 写的 PR 描述也要审。 让别人读你自己都没读过的文字,是一种新的不礼貌。

我建议任何严肃团队都把它写进协作规范——所有 AI 辅助的 PR,必须附带三类证据:自动化测试结果、手动测试说明、作者对关键实现的解释。 这样 AI 就不再是隐藏在背后的“神秘生产力”,它会进入可审查、可追责、可复盘的工程流程。


十三、Anti-pattern 二:不写测试,或者把测试当装饰

Simon 对“不写测试”的态度,这一两年越来越硬。

他原话之一是:现在还有人用 coding agent 写代码却完全不写测试,这是非常糟糕的想法。过去不写测试的理由是测试本身有维护成本——但在 agent 时代,测试几乎免费——agent 能在几分钟里整理出一套像样的测试——因此再不写测试,纯粹就是工程偷懒。

但他同样警告:测试装饰化也是一个严重问题。

什么是测试装饰化?就是测试存在的目的不是验证实现,而是让 PR 看起来专业。识别特征——

  • 测试用例多但覆盖路径浅;
  • assert 大量用 assert result is not None、assert len(x) > 0 这种“反正不可能挂”的断言;
  • 用 snapshot 替代行为断言——只验证结构形状,不验证业务规则;
  • 一旦回滚实现,测试还能通过;
  • 测试名都叫“test_should_work_correctly”——根本没说在测什么。

这种测试比没测试还危险。没测试至少诚实地告诉所有人“这个项目没保护”,装饰性测试会给团队制造假的安全感——CI 亮着绿灯,所有人觉得很安心,但其实任何回归都会顺利通过。

Simon 提出的标准非常具体:自动化测试要和改动一起提交,而且如果回滚实现,测试应该失败。

这句话值得写进每个团队的 review checklist。让 reviewer 养成习惯:拿到一个 PR,先 mental rollback 一下实现——“如果实现被还原,这些测试还能通过吗?” 如果还能通过,那这些测试就是装饰。退回去,重写。

在 agent 工作流里,TDD 能天然防止“测试装饰化”。因为 TDD 要求先看到红灯——测试第一刻不挂,那这个测试就不成立。这个机制天生防御了“agent 写一个永远不挂的测试糊弄人”的行为。

Simon 从一个原本不喜欢 test-first 的工程师,转向拥抱 test-first,关键就在这一点:agent 天然倾向于写过度的、装饰性的、不真正验证行为的代码,TDD 是几乎唯一能从底层抑制这种倾向的工程纪律。


十四、Anti-pattern 三:自动测试全绿就等于交付完成

第三个反模式,在第八节已经铺垫过:自动测试不能替代 manual testing。

这里不再重复论证——核心道理就一个:agent 写测试的时候,很容易写出“覆盖自己实现路径”的测试,但漏掉真实用户路径。

假设你让 agent 改购物车的优惠券逻辑。agent 写了实现,又写了测试,覆盖了它理解的边界条件和代码分支。但真实用户怎么用?从首页加入购物车、跳转、点“使用优惠券”、选了一张券、看到折扣金额——整套行为可能涉及前后端各五个组件、三个接口、两个数据库表。agent 的测试大概只能覆盖其中一两块。

测试全绿 ≠ 用户能用。

Simon 推荐的不是“更多单元测试”,而是多层验证:单元测试证明局部逻辑,集成测试证明跨模块路径,manual testing 证明真实行为,浏览器自动化(Playwright/Rodney)证明 UI,Showboat 文档证明过程,截图和录屏证明结果。不同证据覆盖不同风险。

我最近在一个团队里推了一条规则:任何涉及用户可见行为的 PR,必须附带至少一个真实交互证据——一段 curl 输出、一张截图、一段 Playwright 的 trace 文件。不是测试结果,是真实交互。规则上线之后,团队线上事故下降非常明显。

原因不是工程师变聪明了,而是大家被迫把“真实运行一次”变成了 PR 的硬性步骤。绝大多数线上事故,本来就不是因为工程师不聪明,而是因为大家省略了“真实运行一次”。


十五、Anti-pattern 四:YOLO mode 没有安全边界

Simon 并不反对 YOLO mode——也就是放手让 agent 去跑各种命令、不每一步都要批准。他承认 YOLO mode 有非常大的生产力价值,因为不断请求人工批准会显著降低 agent 通过反复尝试解决问题的能力。

但他列了很实在的风险:agent 可能做出糟糕决策;可能受 prompt injection 攻击;最强大的工具往往是“在 shell 里执行命令”,一个失控的 agent 可以做很多人类用命令也能做的坏事;错误的 shell 命令可以破坏文件系统;攻击者可以通过 prompt injection 让 agent 泄露源码、环境变量、密钥;你的机器甚至可能被当作攻击代理。

我看到很多团队在这一块毫无防备——让 agent 直接接触生产环境的 credential、直接读取真实用户数据、直接连接生产数据库。没出事之前看着没事,一旦出事就是灾难级的。

Simon 的解法仍然是 pattern 化——

  • 想放开 agent,先放进 sandbox。 容器、虚拟机、Codespaces——别让它在你的本机直接乱跑。
  • credential 最小权限。 给 agent 的是只读的数据库账号、只能访问测试桶的存储 key、只能看分析数据的 BI 账号。
  • 如果 credential 能花钱,就设预算上限。 Cloud key、API key、模型调用 key——所有“花钱的”都设 cap。YOLO mode + 没有预算上限 = 可能产生几千上万美元的事故。
  • 尽量用 test/staging 数据,不用生产数据。

Simon 还反对一种更隐蔽的做法:拿敏感生产数据做测试。 他建议投资 good mocking——一键创建随机用户、为特殊 edge case 创建模拟用户、为不同角色创建不同的 fixture。

这个行业过去十几年,“用生产数据做测试”是被默许甚至鼓励的——理由是“只有真实数据才能测出真实问题”。但 agent 时代这条路走不通了。agent 的访问粒度比人粗、受 prompt injection 影响、可以被“诱导”外泄数据、操作日志比人类难追溯——四条加起来,生产数据 + agent = 高风险组合。谁还在这么干,就是在赌运气。

Simon 在这里的思维体现得很清楚:他不是简单说“YOLO mode 危险,不要用”——他承认 YOLO mode 的生产力价值,然后给你列具体的隔离机制。 不是禁止能力,而是给能力套上边界。这才是工程纪律该有的姿态。


十六、Pattern 七:Conformance-driven development——用多个实现反推出规范

Simon 还有一个特别有启发性的实践:conformance-driven development。

他给 Datasette 加 multipart file uploads 的时候,干了一件事:让 Claude 构建一个“文件上传”的测试套件,要求这套测试在多个已有框架(Go、Node.js、Django、Starlette 等)上都能跑过。然后再用这套测试去驱动 Datasette 的实现。

他自己的原话是:“像是从六个已有实现反向工程出一个标准,再实现这个标准。”

过去写一个 conformance suite 很费时——你要研究多个实现、抽象共同约束、写大量测试用例。这种活通常是 W3C、IETF 这种标准组织在做,普通工程师没时间也没动力做。

但现在不一样。agent 可以把这种活做得快得多。 它能把多个实现下载下来、跑一遍、抽出共同行为、写出测试套件。人类的价值在于:选择参考实现、判断哪些行为属于规范、哪些只是偶然差异。

这是 agent 时代一个很特别的工程能力——把“模糊需求”转成“可执行规格”。

我把这种能力连同前面几种 pattern 拆成几种典型用法:

  1. TDD: 把单个功能转成失败测试。适合新功能。
  2. Conformance-driven: 把多个现实实现转成测试套件。适合替代实现、兼容层、协议适配。
  3. Manual-derived testing: 把用户行为转成命令和截图。适合面向终端用户的产品。
  4. Showboat documentation: 把测试过程转成证据文档。适合高合规要求的项目。

它们的共同点:把“工程师脑子里那种模糊的‘我希望系统怎么工作’”,转成 agent 能执行、能验证、能复用的具体工件。

这就是 Simon 的真正贡献——他不是教你怎么用 AI 写代码,他是教你怎么把抽象工程经验沉淀成可调度的执行单元。


十七、Simon 的组织启示:AI 时代更需要 senior engineering

讲到这里,有一件特别违反直觉的事需要说:AI 编程时代,对 senior engineering 的需求是上升的,不是下降的。

很多人担心 AI 会让初级工程师“被掏空”——既然 agent 能写代码,那初级工程师做什么?

这种担忧有道理,但 Simon 的视角不一样。他在 Pragmatic Summit 的炉边谈话里讲过:同时驱动多个 agent 是非常耗脑的。 你需要不断切换项目、审查输出、给反馈、决定下一步、做权衡、设计验证、发现遗漏。这不是“靠 AI 偷懒”,这是要求你全力运转。

在《Vibe engineering》里,他把“会用 AI 的工程师”日常画得更清楚——研究方案、决定架构、写 specification、定义成功标准、设计 agentic loops、规划 QA、管理一群“数字实习生”、做大量 code review。

这些活,逐条拆开看,几乎都是 senior engineer 的特征。

所以在 Simon 的观察里,AI 编程不是降低了工程标准,而是把瓶颈从“你能不能写代码”转移到了“你能不能管好代码”。你能不能清楚定义任务?能不能提供足够上下文?能不能判断结果对错?能不能发现边界问题?能不能让 agent 证明它做对了?能不能把这一次的经验沉淀成下一次可复用的 prompt、测试、脚本或文档?

这套问题,全是 senior 工程师才有能力答的。AI 让“敲键盘”贬值,但让“判断力”升值。

Simon 还提到一个我特别喜欢的概念:compound engineering loop。 意思是——每次 agent session 结束后,把有效的经验沉淀下来,更新项目的 README、AGENTS.md、测试模板、工具脚本、流程文档,让下一次 agent 运行得更好。

AI 不会自己从过去的错误里学习,但你的代码库、你的文档、你的测试、你的工具链,可以。

一个团队的 agentic engineering 成熟度,就反映在“compound engineering”做得有多好——这些可累积资产是不是越来越厚、越来越对、越来越能让新 agent 即用即上。谁最先建起这种 compound engineering loop,谁就在新时代里建立了真正的代差。


十八、把 Simon 这套整理成一份可执行的工程清单

把 Simon 这一整套压缩成可立刻上手的清单,大致八步。我用工程师本位的语气讲,希望你直接抄走——

第一,开始之前先准备环境。 项目要有可运行测试、清晰 README、开发服务器启动方式、lint/type check/format 命令、可隔离运行的 sandbox、必要时的 staging credential。agent 不是魔法,它需要工具和边界。跳过这一步,后面的所有努力都会被环境的脏乱抹平。

第二,新 session 先让 agent 进入上下文。 让它先跑测试,看 Git 最近变化,读相关测试,必要时用 subagent 探索代码库。不要一上来就让它写代码;先让它知道自己站在哪里。

第三,新功能用 red/green TDD。 先写失败测试,再写实现,让测试变绿。测试必须先失败,红灯阶段不能跳过。

第四,测试通过后做 manual testing。 库函数用 python -c 或临时 demo 文件;API 用 curl;Web UI 用 Playwright、Rodney 或浏览器自动化;需要视觉判断时让 agent 截图自己检查。自动测试不是“亲眼看见”。

第五,让 agent 留证据。 用 Showboat 或类似机制记录命令、输出、截图和说明。把“测试过”从主观声明变成可审查材料。

第六,把发现的问题固化为测试。 manual testing 发现 bug,不仅让 agent 修,还要让它用 red/green TDD 写进回归测试。每一个被人类发现的问题,都应该变成一个永远不会被同一个 bug 再咬到的自动化资产。

第七,提交前自己 review。 不要把 agent 输出原封不动丢给别人。PR 要小、可解释、有上下文、有测试证据、有手动验证说明。agent 写的 PR 描述也要审——让别人读你自己都没读过的文字,是新一代的不专业。

第八,复盘并沉淀。 把有效的 prompt、测试模式、工具说明、失败经验、mock 数据生成方法写进项目,让下一次 agent 更容易做对。AI 不会从过去学习,但你的代码库可以——这就是 compound engineering loop。

这八步加起来,差不多就是一个团队从“用 AI”升级到“用 AI 做工程”的最小路径。每一条都不复杂,每一条都很贵——贵的不是技术成本,是工程师改变习惯的成本。但谁先建立这套习惯,谁就在 AI 时代有真正的杠杆。


十九、回到那个朋友的故事

写到这里,我想回到文章开头那个朋友。

他后来在电话里说:“我们团队这一年慢慢把 Simon 那套 patterns 揉进工作流。修 bug 的时间,回到正常了。”

我问他:“是哪一条最有用?”

他想了一下,说了一个我意料之外的答案:“最有用的不是某一条 pattern,是‘不要把没审过的代码扔给同事’这条 anti-pattern。”

他解释说,团队过去半年的真正改变,不是从某天起开始用 red/green TDD,也不是从某天起开始用 Showboat——而是从某天起,review 通过的隐性门槛变了。

过去:测试绿了 + 你看着没问题,就 merge。

现在:测试绿了 + 你手动跑过 + 你给出真实交互证据 + 你能解释关键实现,才 merge。

光这一个改变,整个团队的代码质量就回到了 AI 到来之前的水平——而且因为 agent 的速度,产出还是过去的两倍。

我问他:“那你们现在 Cursor 用得还多吗?”

他说:“比以前还多。但不一样了——以前我们让 Cursor 替我们干活,现在我们让 Cursor 替我们打草稿。最后的判断、验证、整理,都还是我们的。”

我笑了。“恭喜你,你升级成了一个 agentic engineer。”

电话那头他也笑了:“我觉得你应该感谢的是 Simon。”

是的。我也这么想。


二十、结语:把 AI 编程拉回了软件工程

Simon Willison 的独特性不在于“他说 AI 很强”,也不在于“他说 AI 很危险”——这两种声音多的是。他真正有价值的地方,是他把 AI 编程从争论拉回了软件工程。

他不满足于“我们要负责任地使用 AI”这种正确但空泛的话。他把它拆成了一组 patterns——

  • First run the tests.
  • Use red/green TDD.
  • Test with curl.
  • Test with Playwright.
  • Look at screenshots.
  • Use Showboat to leave evidence.
  • Don’t file unreviewed PRs.
  • Keep tests clean.
  • Let the agent imitate good patterns.
  • Run in a sandbox.
  • Use tight credentials.

每一条都能立刻执行。每一条都能写进团队规范。每一条都能放进 CI、放进 review checklist、放进入职培训。

如果说 AI 编程的早期阶段是“看,模型能写代码!”,那么 Simon 代表的是下一阶段——“现在我们该如何证明这些代码值得交付?”

这句话听上去保守,其实很深。它把焦点从“产能”挪回了“交付”——从“我们能写多少”挪回了“我们能稳定交付多少”。这是任何一个真正经历过软件工程长期周期的人,都会本能认同的视角。

我在 Fog Creek 的时候有一句口头禅:“软件不是写完就行的,软件是一直要工作的。”这句话十几年没变过。Simon 用一组 agentic engineering patterns,把它翻译进了 AI 时代。

AI 让写代码的成本下降了,但软件工程从来不只是写代码。真正稀缺的,是知道该写什么、怎样证明它工作、如何让别人安全地接手、如何让系统在未来继续可维护。

这些事情,Simon 在用一组小而具体的 pattern 一件件地教给我们。

他不教大道理,他教暗号。

下一次你打开 Cursor、Codex、Claude Code,进入一个新 session,记得先打这五个字——

First run the tests.

这就是 Simon 想要你养成的肌肉记忆。

把这条记下,把这条做实,剩下的整套 agentic engineering,都会自然长出来。

至于愿不愿意把它做实——那就是你的选择了。

但请记得:软件不是写完就行的,软件是一直要工作的。

上一页123…41下一页

404 日志
7 分类
RSS
© 2017 — 2026 李文业
由 Hexo 强力驱动
|
主题 — NexT.Muse
粤ICP备17160932号