著名技术导师 Matt Pocock 访谈:AI时代软件工程进阶指南 把 AI 当“严厉的架构师”而不是打字机
Matt Pocock 把 AI 编程流程做成了开源技能库:用 grill-me 把需求问透,把工作拆成一个会话装得下的纵向工单,再由人守住架构和长期决策。
当大模型写代码的速度比人类快上百倍时,软件工程面临的挑战不再只是写不出代码,而是可能快速制造出难以维护的「代码大泥球」。面对这种情况,关键是不要让 AI 直接替你做主,而是让模型像架构师一样促使你把设计和方案想清楚。模型需要人把目标与判断标准传达给它,做决定的始终是工程师自己。
TypeScript 教育者 Matt Pocock 曾凭借 Total TypeScript 课程创下超过 250 万美元的销售额。但在大模型能力提升后,单纯讲解语法与实现细节的战术知识吸引力明显下滑。然而,当开发者尝试把真实业务交给自动化 Agent 时,往往容易遇到问题:模型容易曲解意图、臆造权限逻辑、堆砌同义反复的无效测试,甚至在上下文膨胀后破坏既有架构。
Matt 自己的转型历程正是这种变化的缩影。在投身软件行业前,他做了六年声乐老师;为了能在乡下远程工作,他自学编程入行,写的第一个作品是给学生分析嗓音频谱与共振峰的网页工具。他入行的优势在于多年教学练出的沟通能力:能把技术原理讲明白,晋升很快。这也是他后来做教学以及注重「如何向 Agent 表达意图」的基础。后来他全职做开发,并凭借 Total TypeScript 课程被广泛认知。随着大模型能力提升,单纯教授语法细节的课程收入明显下滑。他曾尝试转向制作「如何把 AI 接进应用」的课程,但收益未达预期。直到去年底假期试用前沿模型后,他根据自己的体验判断,模型的能力已经足够接手大部分局部的具体编码,开发者可以把更多精力放在系统设计与全局架构上。
完整节目可以在 YouTube 观看:The Pragmatic Engineer《AI Skills with Matt Pocock》,1 小时 36 分,可开自动字幕。下文各节附有配好中英字幕的精华片段。
为了解决这些失效模式,Matt Pocock 梳理出了一套开源技能库 mattpocock/skills,在 GitHub 上已超过 26 万星。这套方案并没有发明某种全新的「AI 原生理论」,而是将《程序员修炼之道》《软件设计哲学》《领域驱动设计》等经典软件工程著作中的核心原则,转化为能够约束和激发模型的具体工作流。
这套技能库主要解决什么
- 动手前把需求问清楚:
grill-me让 Agent 先追问业务取舍和架构决定,避免它自行填补关键假设。 - 把讨论沉淀成可执行任务:
to-spec将决定整理为规约,to-tickets再拆成能在单个上下文窗口内完成的垂直工单。 - 管理跨会话的大型项目:
wayfinder用地图、依赖关系和战争迷雾记录已经确定与尚未确定的工作,让新会话能够接着推进。 - 用真实反馈约束实现:实现技能要求先建立会失败的测试,再写代码并检查回归,减少同义反复的无效测试。
- 持续改善代码库结构:架构检查技能寻找浅模块、重复概念和不断增加的理解成本,把可执行的重构建议转成日常工单。
战术交给 Agent,战略留给人:为什么「智慧」反而没有变得更好学?
在 Matt 看来,AI 正在重塑软件工程中不同技能的相对价值。在日常教学中,编程可以拆分为两层:一层是语法细节与具体实现的「知识」(the what),另一层是探究设计原因与权衡的「智慧」(the why)。如今查阅具体语法的门槛大幅降低,但系统层面的工程思考并没有变得更容易——缺乏架构判断依然会遇到设计瓶颈。Matt 借用斯坦福大学教授 John Ousterhout 在《软件设计哲学》中的分野指出:专注于局部实现的「战术编程」(Tactical Programming)越来越适合交由模型辅助,而开发者需要把重心放在关注全局与系统演进的「战略编程」(Strategic Programming)上。
战略编程往往更难掌握,原因在于它的反馈周期很长。如果在一家公司只工作几个月就离开,早期的架构缺陷可能很久之后才会暴露。Matt 把战略编程比作调音台上的推子——例如一个推子代表「可部署单元数量」,推高是拆成微服务,推低是合并为单体。做架构决策类似调音,往往要等很长时间系统遇到瓶颈,才能验证当初的选择是否合理。在 Matt 看来,AI 提升了编码和验证的速度,客观上也加快了暴露设计缺陷的节奏,让战略层面的反馈周期缩短。
在 Matt 的工作流中,代码本身是 Agent 工作的环境,工程师的核心工作是维护和优化这个环境。下文的三道防线,是他针对战略编程总结出的具体做法——第一步就是在需求阶段通过提问把模糊决策理清。
从 Ralph 循环到有限状态机:技能到底是什么,又是如何诞生的?
确立分工后,Matt 把「让 AI 促使开发者做决定」整理成了一套可安装的技能。这套方法的雏形来自 Geoffrey Huntley 提出的「Ralph 循环」。传统做法常让模型先制定宏观计划再逐步落地,但 Agent 在编码遇到新情况时计划容易变形。Ralph 循环的做法是:给 Agent 设定明确目标,每次只执行离目标最近的一小步,随后清空上下文重置;系统状态保存在代码和本地文件(如 Markdown 清单)中,不依赖模型单次会话中的记忆。此前做应用集成的经验,让 Matt 更加关注上下文的数据结构、优先级以及清空时机。在他看来,这些执行循环本质上是由状态与事件驱动的流程,与他在 XState 中使用的有限状态机(Finite State Machine)原理相通。
在把自制状态循环应用到视频剪辑器等项目后,Matt 发现切回默认环境时效果会有落差。为了复用这些流程,他借用了工具生态中的载体——技能(Skills)。技能的形式很直观:本质上是一个包含若干 Markdown 文件的本地目录,安装后可通过斜杠命令在终端或对话中调用。这类技能在机制上分为两类:一类由模型根据上下文自主触发(Model-invoked),另一类由用户手动触发(User-invoked),grill-me 便属于后者。
看到社区中出现 Superpowers、Claude Code 插件以及 Garry Tan 的 GStack 等技能集后,Matt 将自己的工作流整理开源,该仓库随后成为他获星最多的开源项目,他也受邀在 AI Engineer 大会上以此为题发表演讲。在编写技能时,Matt 的原则是保持简明,便于人工阅读和检查。面对差异较大的实际业务,现成工作流很难直接适用所有场景;逻辑清晰直接,开发者才更容易按需修改和引入项目。
第一道防线:把 AI 当严厉的架构师,用设计树一轮轮拷问你
使用代码 Agent 时,常见的问题是预设模型能理解开发者的意图和权衡。如果只输入「帮我实现某个功能」,模型为了尽快输出结果,往往会自行推测未说明的细节,可能做出不合适的鉴权方式或数据结构选择。
应对方法是不让 Agent 立即写代码,而是让它向开发者反向提问确认需求(Grilling)。主持人 Gergely 尝试过:做一个简单的「邮件订阅校验接口」,被连续追问了 35 个工程细节:鉴权 Token 放在 Header 还是请求体?每天 1000 次的频率限制,是否严格卡在第 1000 次?
grill-me 的设计灵感来自 Claude Code 团队成员 Thariq 的建议:「让 Agent 在动手前先全面采访你」。固化为技能后,模型不仅能排查逻辑漏洞,有时还能提出不同的设计视角。Matt 提到,这种连续提问让他联想到早年工作中有经验的架构师追问方案的场景。虽然最终决策由开发者做出,但提问过程能暴露出未曾深思的技术盲区,促使人查阅资料并理顺逻辑。主持人 Gergely 认为,人机协作的关键在于保持开发者的主动思考;如果连对系统的理解也完全外包给模型,后续就容易积累维护隐患。
这套机制在底层将所有待确定的决策抽象为一棵设计树(Design Tree)。每一个父级决定的落定,都会解锁一批悬挂在下方的子问题。前置条件都已落定、眼下就能问的那批问题,叫作「前沿」。
在每一轮交互中,Agent 会将查证客观事实与提出决策问题区分开。如果一个问题依赖代码库中现有的文件结构、数据库字段或工具配置,Agent 会派子 Agent 自行查找,而不是把可通过工具获知的事实抛给开发者。只有涉及业务取舍或架构权衡的问题,才会列入本轮问题清单。
提问也有明确规范:把所有前置条件已满足的问题合并在同一轮提出,每个问题附带推荐答案,随后等待开发者回复。每次回答后重新计算设计树前沿,直到没有未明确的假设,提问流程才算结束。在前期把需求与判断标准对齐,有助于降低后续返工的成本。
-
第 1 轮 · 前沿:不依赖任何其他答案的问题
- 这个接口给谁调用?推荐答案:只给自己的活动报名系统用
- 返回什么?只回「是 / 否」,还是连订阅等级一起?推荐答案:只回是或否,少暴露信息
事实不问你:订阅数据存在哪、字段叫什么,派一个子 Agent 去代码里查
-
第 2 轮 · 调用方定了,这两个问题才能问
- 怎么认证?bearer token 放请求头,还是放进 JSON 请求体?推荐答案:放请求头,放 JSON 里不够安全
- 每天 1000 次的限流,要卡死在第 1000 次、多一次都不放吗?推荐答案:按调用方计数,超出直接拒绝
-
第 3 轮 · 限流口径定了,才轮到它
- 超出限额时返回什么,调用方怎么知道何时能再试?推荐答案:返回「请求过多」并附上重置时间
前沿清空、你确认双方理解一致,才进入下一步写规格(to-spec)。每个决定都由你拍板,Agent 只给推荐。
第二道防线:把任务压进 15 万 token 的聪明区,实行「白班规划、夜班施工」
模型支持的上下文窗口越来越大,但在工程实践中,上下文长度并不等于有效的推理能力。工程师 Dex Horthy 提过一个说法:上下文里存在「聪明区(smart zone)」和「笨区(dumb zone)」。
上下文里每个 token 都在争抢注意力,塞得越多,重要的信息越难被「听见」。Matt 的估计是,目前的前沿模型大约前 15 万 token 属于聪明区,跟窗口总共多大无关;超过之后质量会一点点往下掉。此时模型更容易忽略关键约束,开始丢失代码间的逻辑一致性。
要让 Agent 稳定工作,就必须把庞大的工程拆解成可以在 15 万 token 的聪明区内独立结项的微型会话。这套工作流通过两道工序完成转化:
规约沉淀(to-spec):将上一阶段拷问完成的对话上下文综合成一份需求规约。这份文档只记录用户视角的问题陈述、端到端的用户故事清单、对外暴露的测试接缝(Seams)以及明确排除在外的边界(Out of Scope)。规约中避免写入具体的文件路径或实现代码,以防这些实现细节在后续开发中过时。
切片建单(to-tickets):将规约进一步分解为一组相互声明阻塞关系的工单。每个工单都是一个垂直切片(Vertical Slice),同时贯穿数据模型、接口逻辑、用户交互与自动化测试,避开「先把所有数据表建完、再堆所有接口」的水平切分。每个切片的工作量限制在单一上下文窗口内,以便在全新会话中独立完成并验证。
当面对涉及全库共享符号的大范围重构时,切片规则会采用扩展-收缩(Expand-Contract)模式:第一张工单先在旧结构旁增加新形式,保持双轨并存;随后按模块分批迁移调用方,确保每个批次提交时持续集成都能通过;最后一张工单再移除旧形式。
这种流程形成了一种协作节奏:开发者在白天集中进行架构设计、需求对齐与工单拆分;随后把工单交由自动化执行循环在独立上下文中逐一完成。工程师减少了在多个终端窗口间频繁切换的负担,将精力更多放在前期的结构输入上。
第三道防线:用战争迷雾与活地图治理超大工程(Wayfinder 机制)
当面对类似「克隆一个完整支付平台」这种规模庞大的系统时,单次会话很难容纳完整的架构规划。如果一开始就试图把整个系统的所有细节规划清楚,很容易超出模型的有效上下文范围。
Wayfinder 技能通过引入即时战略游戏中的战争迷雾(Fog of War)隐喻,在工单追踪系统(如 GitHub Issues 或 Linear)中构建起一张动态演进的「活地图」。
## Destination(终点目标)
清晰定义该地图走向何方(一份可交接落地的规约、一项数据架构迁移决策)。
## Decisions so far(已落定决策索引)
- [工单标题](链接):一句话提炼该决策的核心结论,正文保留在子工单内,主地图不作冗余展开。
## Not yet specified(尚未具象的战争迷雾)
记录前方已经察觉到、但前置依赖尚未解决的模糊方向;随着前沿推进,它们会逐步具象化并毕业成独立工单。
## Out of scope(明确排除的范围)
任何超出当前终点目标的设计诉求,直接关闭对应工单并归档于此,不进入主路线图演进。
在地图之下,所有具体探索被拆分为四种类型化的子工单,每次会话只处理一个工单:
调研工单(Research):纯后台自主执行(AFK)。由派生的子 Agent 查阅外部文档、第三方接口定义或本地知识库,得出的关键事实以 Markdown 文件形式沉淀在分支中。
原型工单(Prototype):必须有人类参与(HITL)。针对「界面该长成什么样」或「复杂状态流如何运转」等无法仅靠抽象文字说清的问题,快速做出可交互的原型,或者几种不同方向的方案,供人类直观感受并敲定方向。
拷问工单(Grilling):必须有人类参与。针对具体的设计分歧,通过设计树逻辑与人类展开一轮深入对齐。
前置任务工单(Task):为了扫清后续决策障碍而必须先进行的实际操作(例如申请某个受限平台的接口权限、导入一批测试数据)。
这套机制的做法是:当前能够明确提问的环节,立即建单并标注依赖关系;看不清全貌的部分先保留在迷雾区域,不强行提前拆解。当一个工单完成后,结论以一句话索引形式追加到主地图中,原本模糊的设想再逐步细化为新的工单。
什么时候该先拷问,什么时候直接做?三档对齐策略与激进原型的解法
面对具体的业务需求,Matt 主要依据试错成本来决定对齐时机:如果任务逻辑复杂,一旦实现方向出现偏差,后续修正成本较高,就要在动手前进行对齐,将鉴权方式或接口数据结构等关键细节事先确定;如果是几行代码的小改动,则可以先让 Agent 编写,再通过审查工具或直接查看结果完成事后校验,这种方式处理简单任务更为直接。
基于这种成本权衡,他在工程实践中沉淀出了清晰的「三档对齐法则」:
- 第一档(微型任务):事后易于验证与调整的改动,不启用
grill-me,直接快速实现; - 第二档(单会话任务):工作量在单一会话内可完成、但逻辑关键的任务,调用
grill-me展开设计树对齐; - 第三档(多会话巨型任务):跨越多个会话、牵涉系统全局的复杂工程,启动
Wayfinder建立动态推进的活地图。
针对「这是否倒退回瀑布模型」的疑问,Matt 的做法是在正式制定规约前进行快速原型开发(Prototyping)。由于代码生成成本大幅降低,开发者可以让 Agent 快速产出几个不同版本的原型,直观对比交互和结构,选定合适方案后再细化规约。主持人也引用 Grady Booch 的观点指出,传统瀑布模型的问题在于规划与交付周期过于漫长,容易脱节;若在短周期内结合低成本原型辅助规划,能及时检验方案,与耗时数年的瀑布流程存在本质区别。
波动的新材料与文本接缝:Agent 擅长什么,又不擅长什么?
为什么几十年前的经典工程方法能够用于约束当下的 Agent?这与 Agent 擅长的处理机制有关。主持人 Gergely 援引形式化方法专家 Hillel Wayne 的观点指出,软件工程过去与传统工程学科的区别在于材料属性:传统物理材料存在公差与波动,而确定性代码在相同环境下运行结果一致;大语言模型则给软件开发引入了非确定性。Matt 认为,代码 Agent 之所以在编程中表现突出,核心在于软件开发的输入与输出主要是文本——代码、文档、提示词是文本,测试结果、类型检查与静态分析报告同样是文本,模型可以在这种文本反馈回路中快速处理和流转。
相对而言,Agent 较难直接评估无法充分文本化的感官与交互体验。例如界面的动态微调、动效曲线和实际手感,模型难以单凭代码推断真实的体验效果。因此在工程实践中,一种有效的做法是尽量把任务和规则转化为 Agent 易于处理的文本形式:包括格式化数据、清晰的断言与配置文件。Matt 也在尝试将自己常用的工具链路开放给 Agent,让模型通过标准文本协议来调用和协同。
激活先验:用经典工程概念充当模型的「引导词」
在形成这套工作流之前,Matt 曾尝试过规约驱动开发(Spec-driven Development),试图只维护一份需求规约文档,通过修改需求让 Agent 同步修改代码。但在实践中,多轮生成后代码质量逐渐下降。他意识到问题的关键在于反馈回路:如果缺乏严密的测试和明确的环境反馈,Agent 接收到的信号失真,生成的结果就容易偏离预期。
这促使他重新翻阅《程序员修炼之道》(The Pragmatic Programmer)。书中关于「软件熵」(Software Entropy)的论述提到系统容易随修改滑向混乱,而在缺乏约束时,Agent 也会加速软件熵的累积。书中提到的原则——如「别跑得比车灯还快」(Don't outrun your headlights)、「在反馈循环内工作」(Always work within your feedback loops)、警惕「巧合式编程」(Programming by coincidence)以及倡导「曳光弹」(Tracer bullets)——恰好对应了当前与 Agent 协作时所需的控制手段。
大语言模型在预训练数据中吸收了大量软件工程相关的经典文献。如果直接用口语下指令,模型容易输出笼统宽泛的回答;而如果在提示词中使用定义明确的经典工程术语,就能起到引导词(Leitwort)的作用:通过特定术语触发模型已掌握的工程实践模式。
| 核心引导词 | 思想来源 | 对 Agent 行为的具体矫正效果 |
|---|---|---|
| 曳光弹(Tracer Bullets) | 《程序员修炼之道》 | 改变「先建完全套数据库,再写全套业务逻辑,最后才连线测试」的做法;引导 Agent 每一轮打通一条从前端、接口到存储的细窄通路,尽早暴露跨层集成中的潜在问题。 |
| 深模块(Deep Modules) | 《软件设计哲学》 | 减少 Agent 碎片化地建立过多浅层包装文件;引导模型设计「对外接口简单、内部封装复杂实现」的深模块,降低后续会话的理解成本。 |
| 通用语言(Ubiquitous Language) | 《领域驱动设计》 | 促使模型在设计之初就将业务交互凝练为精确术语(如把课程管理里「幽灵课时转正,所在章节和课程也要跟着转正」这一串变化命名为「物化级联」),并把这些概念写入 CONTEXT.md,同一件事说起来短得多。 |
Matt 判断引导词起作用的信号,是 Agent 在推理过程里把这些词原样用回来,比如说「好,我把这个做成一颗曳光弹」,后面的做法也随之改变。
在领域驱动设计的实践中,这套方法建议建立一份专门的 CONTEXT.md 术语表,仅记录核心业务概念的定义,不掺杂具体实现细节、文件路径或临时草稿。当模型和开发者使用统一的术语时,可以减少上下文沟通成本,代码命名与接口设计也更容易保持一致。
守住工程质量:《记忆碎片》驱动开发、红绿测试与技术债
当代码生成速度加快后,若缺乏有效约束,代码质量容易快速滑坡,形成难以维护的代码库。在实践中,Matt 强调了两项保障代码健康的机制:
Matt 将 Agent 的工作特点比作电影《记忆碎片》:每次新会话都从零开始面对项目。人类开发者在熟悉的代码库中,往往依靠以往经验绕开隐藏的问题;而 Agent 没有跨会话的记忆,每次启动只能依赖当前的上下文与代码环境。因此,代码库本身的清晰度与一致性直接决定了 Agent 的推理质量。这与经典软件工程对整洁代码的要求一致。
针对 Agent 特点的测试驱动开发(TDD):Agent 虽然能处理较长的上下文,但无法脱离运行环境感知真实状态,有时会写出同义反复的无效测试(例如断言常量等于自身,或用与业务代码相同的逻辑计算预期值)。
为了防止模型作弊,必须要求 Agent 严格执行「红-绿-重构」循环,且测试必须建立在预先商定的公共接缝(Seams)上。在写入任何业务代码之前,Agent 必须先提供一份能够真实复现失败的测试用例,用失败证据证明改动的必要性;只有在绿灯通过后,才允许进行后续工作。
Matt 认为,TDD 最初是为人类有限的工作记忆设计的,让人被打断后能通过失败测试找回上下文;而 Agent 真正需要的是明确、客观的环境反馈。因此他在实践中依然使用 TDD,并要求 Agent 证明「在未做修改前该测试确实会失败」,以确保测试的有效性。这也关系到技术债:正如 YC 的 Jared Friedman 指出的,过去技术债多在大型项目中积累,Matt 则提到在 Agent 辅助下,小型项目若不加约束也会较快堆积质量问题。他的应对方式是明确分工:一个 Agent 负责编写实现,另一个自动审查 Agent 检查编码规范并排查无效测试,最终由开发者完成确认。
代码库架构的日常巡检与深化:对抗代码熵增不能依赖偶发的推倒重来。improve-codebase-architecture 技能专门找「浅模块」:接口复杂、实现单薄。它对可疑模块做「删除测试」:如果把它删掉,复杂度是被集中到一处,还是只是换了个地方?答案是「集中」,就说明这个模块值得动。
体检结果会自动渲染为一份独立的 HTML 可视化报告,利用 Mermaid 架构图清晰展示重构前后的模块深度对比,并标注出潜在改进点的推荐指数。开发者只需在晨间挑选值得深化的候选点,就能一键触发拷问循环,把架构优化平滑融入日常迭代。
人和团队怎么变:做 Agent 的园丁,给它装监控、搬上云端
在频繁使用 Agent 编写代码的团队中,工程师的工作重心有所转移:重点不再是逐行编写语法细节,而是转型为维护工程环境的「代码园丁」与平台建设者。通过设定质量规范、治理不良实践、完善自动化测试反馈,保障系统在持续变更中保持稳定。
当需要说服管理者在工程规范上投入资源时,Matt 认为有效的方式是为 Agent 建立可观测性(Observability):记录 Agent 执行的任务、成功率与失败率。由于调用模型产生实际成本,量化其产出比有助于评估工具价值。通过对比不同代码库中 Agent 的成功率,团队可以把表现较好仓库的工程规范与提示词复用到其他项目。Matt 自己每天会运行一次 improve-codebase-architecture 技能,挑选可行的重构建议转为工单;他建议开发者留出一部分时间(如 20%)维护工程环境与工作流本身。
在运行环境上,Matt 选择将开发工作流部署在远程云端。在他看来,云端环境便于团队协作与多终端接入,遇到分歧时可以共享会话,也可以与 Linear 等任务系统对接。在实际使用中,他可以通过移动端与远程 Agent 交互推进任务,或编排定时运行的后台任务。主持人 Gergely 补充道,像 Ramp、Stripe、Uber 等公司中,已有不少工程师将开发环境迁移至云端;主要例外是前端开发,仍依赖本地直观查看渲染与交互效果。
给新人和想跟上的人:战略判断力溢价、内省特质与「信息编排」
随着代码生成成本下降,编写具体实现的战术工作价值被压缩。面对「初级开发者如何成长」的问题,Matt 坦言目前行业还没有标准答案。过去初级工程师通常通过大量具体编码积累经验,逐步建立对系统设计的直觉;如果基础编码全部交给模型,传统的成长路径便会发生变化。在他看来,全局视野与架构层面的判断力,正在变得相对更有价值。
对希望提升能力的开发者,Matt 的建议是在实际开发中多尝试使用 Agent。例如调用 grill-me 辅助方案推演;如果他在自学编程写音频工具时有这类工具,模型就能帮他指出深层嵌套循环等性能问题。他认为重点不仅是看最终生成的代码,更要审视开发流程本身。Matt 认为重要的一项特质是内省(Introspection):能够审视自己的工作方式,并将工程流程转化为清晰的规则与结构。被问及推荐书目时,他提到了三本书:《程序员修炼之道》、John Ousterhout《软件设计哲学》,以及 Eric Evans《领域驱动设计》的前三章(重点在通用语言与领域建模)。
关于 AI 时代的编程教学,Matt 认为教学的核心价值在于挑选与编排(Curation)。单纯获取知识点并不困难,但面对复杂的知识网络,初学者容易理不清学习次序。导师的作用在于根据认知节奏,规划出负荷更低的学习路径,而这种针对学习路径的编排,正是目前单纯向模型提问较难替代的。
他的技能:怎么装、怎么挑、最值得先用的几个
Matt Pocock 开源的技能库 mattpocock/skills 遵循 MIT 开源协议,支持两种安装方式。两种方式二选一,切勿同时安装,否则会在环境中引入重复技能定义;其原生 Codex 插件仍在作者规划中,目前尚未发布:
方式一:Claude Code 官方插件。整套技能只读,随作者更新自动升级,适合开箱即用、不想自己维护的人。插件已上架 Claude Code 官方插件市场,不用先添加市场,在终端运行:
claude plugins install mattpocock-skills
也可以在 Claude Code 对话里直接输入 /plugin install mattpocock-skills。
方式二:通过 skills.sh 装进当前项目。技能文件会复制到项目里,能随意改,适用于任何支持技能的编码 Agent,适合要按自己项目调整规则的团队。在项目根目录运行:
npx skills@latest add mattpocock/skills
安装时会让你挑技能,务必勾上 setup-matt-pocock-skills;以后拉取作者的更新用 npx skills update。
这套技能在 Claude Code、Cursor、Codex、Copilot 等编码 Agent 里都能用;作者网站 aihero.dev/skills 按「什么时候用」给主力技能分了组,并有配套的七节邮件课。
官网列出 25 个主力技能,分成入门、主流程、打磨方案、日常维护、效率和参考六组,其中参考类多由其他技能在后台调用;GitHub 仓库连同杂项和还在做的一共 38 个。
最值得先用的几个
/grill-me:整个技能库里最出名的一个,机制在第一道防线讲过。它不需要代码仓库,不在本地写文件,聊的甚至不必是代码。脑子里冒出一个值得认真对待的想法,就开个新会话敲命令,让 Agent 连番追问,逼你在动手前把模糊设想磨成清晰的决定。
主流程按顺序用,规格和工单在第二道防线讲过:
/grill-with-docs:对齐方案,同时把领域术语和架构决策写进仓库的CONTEXT.md和 ADR。/to-spec:在同一会话里接着用,不再提问,把谈妥的共识写成需求规约,写明测试接缝和排除范围,发布成工单。/to-tickets:把规约拆成带阻塞依赖的曳光弹纵向切片工单,每张刚好装进一个全新的上下文窗口。/implement:每张工单开一个独立会话,测试先行地写代码、做类型检查、提交。/code-review:对照仓库的编码规范和原始规约,做双重审查。
/wayfinder:一个会话装不下的大工程用它,机制在第三道防线讲过。它只做规划、不写业务代码,把未知拆成调研、原型、拷问、前置任务四种决策工单,一次会话推进一张。适合全新项目或路线模糊的大重构,地图清空后再交给 /to-spec。
/prototype:解决「光靠说说不清」的设计问题。遇到状态流转或界面分歧,它会做出免编译、双击就能打开的 HTML 演示,或在真实路由里给出几种差异明显的界面方案。结论写进代码或 ADR,原型本身留在独立分支,不合进主分支。
/improve-codebase-architecture:代码库的架构巡检。它用「删除测试」找出接口复杂、实现单薄的浅模块,生成带推荐徽章的 HTML 报告,自己不改代码;你挑中某一处,它再发起拷问。适合每隔几天跑一次,或者在大改动前问一句「怎样让这次改动更容易」。
/diagnosing-bugs:对付顽固 bug 和性能回退。先找到一条能稳定复现失败的命令,再缩小复现范围、提出可证伪的假设、加带标记的调试日志,最后写一个防回退测试修掉问题,并清理现场。
/teach:把一个目录变成长期的教学工作区。它先把权威一手资料整理进 RESOURCES.md,再生成一节节带小测验的 HTML 课程,用学习记录决定下一课教什么。学一门新语言、熟悉新接手的代码库,都可以单独建一个仓库让它教。
grilling 技能提示词原文与意译
grill-me 真正驱动模型执行严苛面试的核心提示词,完整封装在底层 grilling 技能的指令文件中。下面是这个文件的英文原文(出处:mattpocock/skills 仓库,MIT 协议),可以直接复制:
---
name: grilling
description: Grill the user relentlessly about a plan, decision, or idea. Use when the user wants to stress-test their thinking, or uses any 'grill' trigger phrases.
---
Interview the user relentlessly until you reach a shared understanding. Map this as a **design tree**: every decision branches into the decisions that hang off it.
Work the tree in **rounds**. The **frontier** is every decision whose prerequisites are already settled: the questions you can ask _now_ without guessing at answers you haven't heard yet. Ask the whole frontier in one round: number each question and give your recommended answer. Then wait for the user's answers before the next round.
Format a round like so:
```
❓ **Q1** - **<question title>**: <question body, might be multiple paragraphs, including multiple choices>
➡️ <your recommended answer>
---
❓ **Q2** - **<question title>**: <question body, might be multiple paragraphs, including multiple choices>
➡️ <your recommended answer>
```
Each round the user answers reshapes the tree: settled decisions push the frontier outward and unblock questions that depended on them. Recompute the frontier and ask the next round. A question whose answer depends on another question still open in this round belongs to a _later_ round, not this one.
Finding _facts_ is your job, never the user's. When a frontier question needs a fact from the environment (filesystem, tools, etc.), dispatch a sub-agent to find it; don't ask the user for anything you could look up yourself. Don't block on it: a running exploration is an unsettled prerequisite, so only the questions downstream of it wait for the sub-agent to report; ask the rest of the frontier now. The _decisions_ are the user's: put each to them and wait.
The session is done when the frontier is empty: every branch of the design tree visited, nothing left silently assumed. Do not act on it until the user confirms you have reached a shared understanding.
提示词核心规则逐句意译与解析:
- 目标与建模:对用户发起不留情面的连续采访,直到双方达成完全一致的认知。将整个架构对齐过程映射为一棵设计树(Design Tree),每一个已落定的抉择都会分叉出挂在其下方的后续子决策。
- 分轮次推进与前沿计算:按「轮次(Rounds)」推进设计树。「前沿(Frontier)」指所有前置先决条件都已敲定的决策——即那些你当下无须凭空瞎猜就能直接抛给人类的问题。每一轮必须把整个前沿上的问题一次性全部提出:为每个问题编号并给出你的推荐选项,随后停下来静默等待用户作答,再开启下一轮。
- 标准提问排版:严格按照格式抛出问题,包含问题编号与标题(
❓ Q1 - <标题>)、详细背景描述及备选方案,并显式给出推荐答案(➡️ <推荐答案>),各问题间用分割线隔开。 - 动态重塑树形边缘:用户每一轮的回答都会重塑设计树:已确定的选择会将前沿向外推进一步,解锁原本因依赖未定而阻塞的下层问题。重新计算前沿并进入下一轮;如果某个问题的答案取决于本轮尚未敲定的其他问题,严禁抢跑,必须延后到未来的轮次再问。
- 严控职责边界(查事实 vs 做决断):查证客观事实是 Agent 自己的本职工作,不应由用户承担。当某个前沿问题需要运行环境(文件系统、本地工具等)中的事实支撑时,自行派生子 Agent 去查找,不向用户索取可通过工具查到的信息。调研过程不得阻塞整体节奏:正在进行的探索只作为未决的前置条件阻塞其下游分支,前沿上的其他无关问题正常抛给用户。主观价值抉择则交由用户决定:把选项摆在用户面前,等待决断。
- 终结退出条件:整场会话只有当前沿完全清空时才算结束——即设计树的各个分支都已覆盖,没有任何隐性假设被默认。在用户确认双方达成共识之前,不要据此动手。
相关仓库与资源清单
- aihero.dev/skills:作者官网的技能页,按阶段分组,每个技能有单独的介绍页。
- Superpowers:Jesse Vincent(GitHub 用户 obra)的 Agent 技能框架和软件开发方法论。GitHub 星数约 28.9 万,比 mattpocock/skills 还多,Matt 说自己是「第二多星的技能仓库」,排在它后面。
- GStack:Garry Tan 公开的自己那套 Claude Code 配置,23 个各有分工的工具,分别扮演 CEO、设计师、工程经理、发布经理、文档工程师和 QA。
- Ralph 循环(how-to-ralph-wiggum):Geoffrey Huntley 提出的 Ralph Wiggum 技巧,倡导单目标离散短循环、快速清空上下文重置状态并将事实留在本地文件中。
- Matt Pocock 的 AI Engineer 演讲:Matt Pocock 在 AI Engineer 大会上的演讲《Software Fundamentals Matter More Than Ever》,就是节目里提到的那一场。
- 经典工程推荐书目:《程序员修炼之道》(The Pragmatic Programmer)、John Ousterhout《软件设计哲学》(A Philosophy of Software Design),以及 Eric Evans《领域驱动设计》(Domain-Driven Design,重点精读前三章关于通用语言与领域建模的论述)。
AI Skills:把战术交给 Agent,把战略留给人
当写代码的速度提升百倍,软件工程的真正瓶颈不再是实现语法,而是如何避免快速堆砌出不可维护的「代码大泥球」。Matt Pocock 将经典工程思想转化为可执行的 Agent 技能工作流。
战术编程让位,战略判断溢价
大模型写代码的速度比人类快上百倍,但开发者尝试把真实业务交给自动化 Agent 时,往往容易遇到意图曲解、权限捏造与测试同义反复。系统层面的工程思考并没有变容易,缺乏架构判断依然会遇到设计瓶颈。
Matt Pocock 借用斯坦福大学教授 John Ousterhout 在《软件设计哲学》中的分野指出:专注于局部实现的「战术编程」(Tactical Programming)越来越适合交由模型辅助,而开发者需要把重心放在关注全局与系统演进的「战略编程」(Strategic Programming)上。战略编程宛如调音台上的推子,决定着微服务与单体、抽象层级与边界等深层取舍。AI 加快了编码与测试,客观上也缩短了战略缺陷暴露的反馈周期。
专注于局部的具体编码、语法推导与功能补全。输入与输出高度文本化,适合完全交由 Agent 在快速反馈回路中推进。
关注系统全局、模块深度与演进方向。做决定的始终是工程师,核心任务是为 Agent 打造清晰、整洁、可观测的代码环境。
代码本身是 Agent 工作的环境,工程师的核心工作是维护和优化这个环境。下文的三道防线,是他针对战略编程总结出的具体做法——第一步就是在需求阶段通过提问把模糊决策理清。
不让 Agent 擅自替人类做主,而是将其变为严苛的架构师。将模糊需求拆解为一棵「设计树」,每一轮集中抛出当前已解锁的前沿问题与推荐选项,直到所有业务分支对齐。
杜绝上下文膨胀导致的推理质量滑坡。先通过 to-spec 凝练出只包含测试接缝与边界的需求规约,再通过 to-tickets 切分成能在单会话窗口独立结项的垂直切片(曳光弹)。
单会话装不下的巨型系统不搞一次性全盘规划。在 Issue 系统构建包含「终点、已定决策、战争迷雾、排除范围」的活地图,把未知拆成调研、原型、拷问、前置四种微型工单渐进推进。
把 AI 当严厉架构师:设计树与前沿推进
如果只输入「帮我实现某功能」,模型往往为了快速闭环而自行臆造未说明的关键细节(如不合适的鉴权逻辑或脆弱的数据格式)。应对之道是不让 Agent 立即写代码,而是让它向开发者反向提问确认需求(Grilling)。
该机制将待定决策组织为一棵设计树(Design Tree):前置条件都已落定、眼下就能问的那批问题,叫作「前沿」。每一轮 Agent 会将前沿问题全部抛出并附带推荐答案,等待开发者回复后重新计算前沿,直到没有未明确的假设。
如果问题依赖代码库现有文件结构、数据库字段或工具配置,Agent 会派子 Agent 自行查阅,绝不向人类询问可以通过环境获知的事实。
只有涉及业务取舍、架构权衡与系统边界的关键问题才呈递给人类。开发者握有最终裁决权,避免将系统的核心理解外包给模型。
三档对齐法则:微型改动事后直接检验,不启动拷问;单会话关键逻辑调用 /grill-me 树形对齐;跨会话巨型工程则交由 Wayfinder 展开活地图。在正式写规约前,还可配合免编译的激进原型(Prototyping)直观验证交互,避开漫长的传统瀑布模式。
15 万 Token 聪明区与垂直切片工单
上下文窗口的单纯扩容并不等同于推理能力。工程师 Dex Horthy 指出模型上下文存在「聪明区」与「笨区」:目前前沿模型大约前 15 万 token 属于聪明区,超过之后注意力争抢加剧,模型容易遗忘关键约束并破坏代码间的一致性。
要让 Agent 稳定工作,必须实行「白班规划、夜班施工」,通过两道工序将宏观需求转化为能在 15 万 token 聪明区内独立结项的微型会话:
1. 规约沉淀(to-spec):将对齐共识转化为需求规约,只记录问题陈述、端到端用户故事、对外测试接缝(Seams)与明确排除的范围(Out of Scope),严禁写入易过时的具体代码行号或文件路径。
2. 切片建单(to-tickets):将规约进一步分解为一组相互声明阻塞关系的工单。每个工单都是一个垂直切片(Vertical Slice),贯穿数据、接口、交互与测试,杜绝「先建完所有表、再堆接口」的水平切分;大范围重构则采用扩展-收缩(Expand-Contract)双轨推进。
战争迷雾与活地图:超大工程的渐进治理
类似重构大型系统这种项目,单次会话根本无法承载完整规划。Wayfinder 技能借鉴即时战略游戏的「战争迷雾」隐喻,在 GitHub Issues 或 Linear 中维护一份动态演进的活地图:
地图中明确标定终点目标(Destination)、已落定决策索引(Decisions so far)、排除范围(Out of scope),以及尚未具象的战争迷雾(Not yet specified):记录前方已经察觉到、但前置依赖尚未解决的模糊方向;随着前沿推进,它们会逐步具象化并毕业成独立工单。
活地图之下派生四类独立执行的子工单:调研(Research,子 Agent 后台自主查证)、原型(Prototype,人机协同做可交互演示)、拷问(Grilling,对齐分歧)与前置任务(Task,扫清权限与数据依赖)。每次会话仅推进一张单,完成后回写一句话索引,前沿随之平滑延展。
引导词、红绿测试与《记忆碎片》驱动开发
Agent 在工作中如同电影《记忆碎片》的主角:每次启动新会话都从零面对代码库,没有任何跨会话的隐藏经验。代码库本身的清晰度与整洁度,直接决定了 Agent 的推理上限。
为了对抗代码熵增,Matt 总结了三项核心护栏:首先是用经典工程著作中的术语作为引导词(Leitwort),触发预训练语料中的最佳工程实践:
| 核心引导词 | 思想来源 | 对 Agent 行为的具体矫正效果 |
|---|---|---|
| 曳光弹 (Tracer Bullets) | 《程序员修炼之道》 | 引导 Agent 每一轮打通一条从前端、接口到存储的细窄通路,尽早暴露跨层集成中的潜在问题。 |
| 深模块 (Deep Modules) | 《软件设计哲学》 | 遏制碎片化的浅层文件包装;引导模型构建「接口极其简单、内部封装复杂实现」的深模块。 |
| 通用语言 (Ubiquitous Language) | 《领域驱动设计》 | 在 CONTEXT.md 固化核心业务名词(如「物化级联」),统一对话与代码符号,大幅压缩上下文体积。 |
其次是防作弊的 TDD 测试先行:Agent 无法脱离运行环境感知真实状态,极易写出断言常量等于自身的同义反复无效测试。在写入任何业务代码之前,Agent 必须先提供一份能够真实复现失败的测试用例,用失败证据证明改动的必要性;只有在绿灯通过后,才允许进行后续工作。
最后是架构日常巡检(improve-codebase-architecture):通过「删除测试」识别浅模块(若删除该模块,复杂度是被集中还只是换了地方?),生成可视化 HTML 报告,将系统重构平滑拆入日常晨会迭代。
成为代码园丁:内省特质与信息编排
当编码具体实现的战术成本急剧收缩,工程师的角色正由逐行编写语法的「砌砖工」转变为「代码园丁」与平台建设者。团队需要为 Agent 建立可观测性(记录任务成功率与失败率),并在云端环境中协同推进任务编排。
对于渴望提升核心竞争力的开发者,Matt 指出最具溢价能力的特质是内省(Introspection)——能够清晰审视自己的开发习惯,并将其固化为严格、可复用的工程规则。编程教学的核心价值也转向了挑选与编排(Curation):在泛滥的信息网络中,为初学者规划负荷合理的认知阶梯。
总结:人机协作的本质不是把决策与思考外包,而是用百年沉淀的经典工程方法筑起严密的轨道。让 Agent 在 15 万 token 的聪明区里充当高速施工队,而把设计树裁决、架构调音与环境治理始终牢牢握在工程师手中。