夜雨聆风学习资料网

ARTICLE · 1138143

他用了二十年,把软件工程纪律翻译成了 AI 的母语

他用了二十年,把软件工程纪律翻译成了 AI 的母语

GitHub 上有一个 69,000 星的仓库,1230 万安装量,却连一行可执行代码都没有。

它只装了一堆 Markdown 文件——每个不到 100 行,加起来也就几千字。但用了它之后,AI 写的代码突然不那么"AI 味"了:它会先问你"你想做什么",会在写测试前确认接缝在哪,会在 debug 时拒绝猜测。

这个仓库叫 mattpocock/skills,作者是 Matt Pocock。TypeScript 社区最知名的教育者之一,Total TypeScript 创始人,YouTube 订阅 19 万。

这篇文章不介绍"怎么用",而是讲一个更底层的问题:他到底把哪些工程纪律,用哪种方式,翻译成了 AI 能执行的语言?以及为什么这套翻译,正在被百万开发者当成"AI 编程的基本功"。

一、一个反直觉的现象:为什么 AI 写了那么多"对但没用"的代码

用 AI 编程的人大概都经历过这种挫败感:

"我明明说了要一个用户登录模块,AI 给了我一个带 JWT refresh token 的 OAuth 2.0 完整方案,用了六张表,写了三万行代码。"

"我问 AI 为什么这个 bug 没修好,它给我解释了一个两小时长的理论。它没有去复现它。"

"三个月后回看,代码库已经变成了谁也看不懂的一团泥球。"

这不是 AI 不够聪明,而是它太急了。它把所有已知能力一股脑堆上去,把"写代码"等同于"解决问题",把"代码跑通"等同于"需求实现"。

Matt Pocock 在仓库 README 里开宗明义:

软件开发中最常见的失败模式是对齐失败(misalignment)。你以为自己说清楚了,AI 也以为自己理解了,结果交付的东西和预期完全不是一回事。

——这是 AI 时代最普遍的工程问题,不是 AI 特有的。

这句话是关键。AI 没有创造新的失败模式,它只是把旧的模式放大了一百倍。需求没对齐、反馈循环断裂、代码熵增——这些是《程序员修炼之道》和《领域驱动设计》二十年前就写过的话。AI 时代的版本,只是把"人"换成了"agent"。

Matt 做的,就是把这套四十年的软件工程纪律,压缩成 28 个可执行的 Markdown 文件,让 AI 在动手之前先走一遍。

二、四条理论红线:他实际在约束 AI 什么

这个技能包的核心不是"很多技能",而是四条贯穿始终的理论红线。理解了这四条,整个体系就通了。

    

红线一:事实与决策分离

这是整个体系最重要的设计决策,出现在 grilling(盘问)技能里,几乎是逐字写的:

"Finding facts is your job, never the user's.
When a frontier question needs a fact from the environment,
dispatch a sub-agent to find it.
The decisions are the user's: put each to them and wait."

翻译成工程语言:查资料是 AI 的事,做决定是人的事。AI 去读文件、查 API、翻文档;但"该做哪个方案"、"seam 放哪里"、"这个重构值不值得"——这些决策权始终在人。

这条红线防止了两类失败:AI 替你做了你没要求它做的决策(自作主张),以及 AI 让你查了它自己能查到的东西(浪费你的时间)。

红线二:反馈循环先于假设

这是 diagnosing-bugs(诊断 bug)技能的第一原理。技能包里写得很强硬:

"如果你发现自己在看代码建理论而循环还没存在,停下:跳跃到假设是这个技能要防止的精确失败模式。没有变红的命令,不进入第二阶段。"

什么意思?调试一个 bug 之前,你必须先有一个能对这个 bug 变红的命令——一个失败测试、一个 curl 脚本、一个最小化复现脚本。没有它,所有的"我觉得原因是……"都是猜。

这个原则来自科学方法论里的"可证伪性",但被 Matt 写进了一个 AI 可以直接执行的指令里。AI 现在被要求:没有红的能力,不许建理论。

红线三:深模块先于泥球

codebase-design 技能定义了一套词汇——这是从 John Ousterhout 的《软件设计哲学》里提取的,但被严格化了:

术语
定义
禁止使用的同义词
Module
有接口和实现的任何东西(尺度不敏感)
unit, component, service
Interface
调用者需要知道的一切(不只是类型签名)
API, signature
Depth
接口处的杠杆率:每个接口单位承载多少行为
implementation/interface 行数比
Seam
可以改变行为而无需编辑该处的位置
boundary
Leverage
调用者从深度获得什么
—
Locality
维护者从深度获得什么
—

为什么禁止用 "component"、"service"?因为在 AI 时代,词汇漂移是代码库变成泥球的第一因。同一个概念在不同模块叫不同名字,AI 的导航能力直接归零。Matt 把"统一语言"(Ubiquitous Language,DDD 的核心概念)直接映射到 GLOSSARY.md 文件里,要求 AI 在每次操作前读取它。

这不是在"规定命名规范",而是在定义 AI 的认知坐标系。

红线四:阶段边界——何时清空上下文

ask-matt(路由器技能)定义了一个"smart zone"概念:模型在大约 150K token 的窗口内推理仍然锋利。一旦接近这个边界,不要在退化的状态下继续。

阶段边界处有五个选项:

选项
何时用
Continue
当前上下文仍然相关,零成本
/clear
当前上下文不再需要,直接清空
/handoff
任务要转移给新 agent、新目录、或同事
Subagent
紧作用域任务送到独立窗口,结果返回
/compact
压缩上下文并种入新会话(默认选择)

这个设计在 agent 时代是前所未有的。传统软件工程谈"什么时候重构",agent 时代谈"什么时候清窗口"——上下文窗口本身成了工程资源。

三、架构:两层调用模型如何避免"技能爆炸"

    

28 个技能听起来很多,但整个体系的复杂度被一个架构决策压住了:调用方向被锁死。

User-Invoked(用户键入才触发,编排层)
├── ask-matt          ← 路由器:不知道用哪个?先问它
├── grill-me          ← 无状态盘问
├── grill-with-docs   ← 有状态盘问 + 域建模
├── triage            ← issue 状态机
├── implement         ← 按 spec/tickets 实现
├── wayfinder         ← 超大项目规划
├── retro             ← 回顾
├── handoff           ← 会话交接
│
│  规则:user-invoked 可以调用 model-invoked,
│  但永远不能调用另一个 user-invoked
│
└── ▼ 只能向下调用 ↓

Model-Invoked(模型自动触发,纪律层)
├── tdd               ← red-green-refactor
├── code-review       ← 双轴并行子代理
├── diagnosing-bugs   ← 六阶段诊断
├── grilling          ← 底层盘问原语
├── domain-modeling   ← 域模型维护
├── codebase-design   ← 深模块词汇
└── research          ← 后台子代理研究

这个分层解决了一个实际问题:什么时候 AI 应该自动做,什么时候必须人来触发?

用户主动触发的(user-invoked)是"我要开始一个流程",AI 必须等你的指令。模型自动触发的(model-invoked)是"这件事符合触发条件",AI 发现场景匹配就调用。

两层之间有严格的调用方向:编排层可以调用纪律层,但纪律层永远不知道其他纪律层的存在。这就是为什么 grilling 被 5 个技能调用,但 grilling 自己从不主动调用其他技能——它是原语,不是流程。

四、五个核心技能,逐个拆开看

4.1 grilling:设计树 + 前沿机制

这是整个体系的核心原语,被 grill-me、grill-with-docs、triage、wayfinder、improve-codebase-architecture 五个技能内部调用。

机制是这样的:

  1. 把设计问题映射为一棵决策树——每个决策是树的一个节点,每个节点依赖于它的前置决策
  2. 每轮只问"当前前沿"上的问题——即前置依赖已确定的决策
  3. 每个问题附推荐答案(降低用户负担,但不是替你决定)
  4. 事实由 AI 派子代理去查,不阻塞其他前沿问题
  5. 直到前沿为空(所有分支都走过)才结束

"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."

grilling/SKILL.md

"Nothing left silently assumed"——没有遗留任何静默假设。这一句是整条链路的验收标准。

4.2 tdd:seam 确认 + 三大反模式识别特征

传统的 TDD 技能包通常只写"红绿重构"四个字。Matt 的版本多了一个关键步骤:在写第一个测试之前,先确认 seam(接缝)的位置。

## Seams: where tests go

A seam is the public boundary you test at.
Tests live at seams, never against internals.

Test only at pre-agreed seams.
Before writing any test, write down the seams under test
and confirm them with the user.
No test is written at an unconfirmed seam.

为什么这一步这么重要?因为测试设计本身就是一个设计决策。如果你先写了一堆测试,这些测试隐含的接缝选择就成了既成事实,后面的代码设计被测试结构绑架了。

此外,每个反模式都有"识别特征"(tell),不是教科书定义,是从真实 debug 中提炼的判据:

反模式
识别特征
实现耦合测试
重构后测试挂了,但行为没变
自明测试
断言用同样的方式重算预期值,永远不能与代码产生分歧
水平切片
先写所有测试再写所有实现,测试验证的是"想象"的行为

4.3 code-review:双轴并行,防止一轴掩盖另一轴

这是技术含量最高的一个技能。核心设计:Standards 和 Spec 两个轴,由两个并行子代理独立审查,结果不合并、不重排。

"A change can pass one axis and fail the other: code that follows every standard but implements the wrong thing → Standards pass, Spec fail. Code that does exactly what the issue asked but breaks the project's conventions → Spec pass, Standards fail. Reporting them separately stops one axis from masking the other."

code-review/SKILL.md

在 AI agent 时代,这个设计特别重要。Agent 可能完美遵循仓库的编码规范,但做错了事;或者做对了事,但破坏了项目约定。两个轴分开报告,就是防止"看起来都对,合在一起全错"。

Standards 轴还携带了一个 Fowler 坏味道基线(12 条),每条有"是什么→怎么修"的精确判据,且明确标注"仓库规范优先于基线"——即基线是默认值,项目自己的规范可以覆盖它。

4.4 diagnosing-bugs:六阶段,最硬的技能

这是整个技能包里最重型的一个(约 100 行),也是最体现工程纪律的:

阶段
核心要求
1. 构建反馈循环
一个能对这个 bug 变红的命令,紧、红、快、可无人值守运行。没有它,不进入下一段。
2. 复现 + 最小化
循环必须产生的是用户描述的那个失败,不是"附近的"失败。最小化到每个元素都是承重的。
3. 假设
生成 3-5 个可证伪的假设,展示给用户。单假设锚定是失败的根源。
4. 仪器化
每个探针映射到 Phase 3 的具体预测。一次只改变一个变量。所有调试日志打唯一前缀,结束一次 grep 清理。
5. 修复 + 回归测试
回归测试写在修复之前(如果有正确的 seam)。如果没有正确的 seam,"这本身就是发现"。
6. 清理
原始复现不再复现;所有 DEBUG 日志已删除;正确的假设记录在 commit 消息里。

第六阶段的最后一个要求——"正确的假设记录在 commit 消息里,让下一个调试者学到"——这是一个很成熟的工程习惯,被写进了 AI 的指令里。

4.5 wayfinder:迷雾规划,反直觉但正确

这是整个技能包里最"反项目管理"的一个:刻意不完整的规划。

传统项目管理要求 WBS(工作分解结构)尽可能完整。Wayfinder 恰恰相反——它维护一张"地图"(单个 issue),里面有一个叫 "Not yet specified"(迷雾)的章节,专门放"还没看清、无法 ticket 化"的部分。

## Fog of war

The map is deliberately incomplete:
don't chart what you can't yet see.

Beyond the live tickets lies the "fog of war":
the dim view of decisions you can tell are coming
but can't yet pin down.

Resolving a ticket clears the fog ahead of it,
graduating whatever's now specifiable
into fresh tickets, one at a time.

判据非常精确:"工单 vs 迷雾"的测试是你能否此刻精确陈述问题,而不是你能否此刻回答它。能陈述→工单,不能→迷雾。

这在 agent 时代是正确的,因为迷雾在工单解决后才清晰。硬要提前 ticket 化,浪费 token 和认知。"Wayfinding is about finding the way, not charging at the destination"——是找路,不是冲向目的地。

五、它为什么受欢迎:五个具体原因

    

69K Stars、12.3M 安装量、单技能最高 706K 安装(grill-me)。这个数字背后有五个原因,按重要性排序:

1. 抓住了根本矛盾,不是"更多技能"

市面上的 AI 编程工具(Devin、Cursor Agent、GSD/BMAD/Spec-Kit)都在解决"让 AI 更自动"。Matt 做的是反方向:让 AI 在自动之前先停下来对齐。这个取舍,才是大多数开发者真正需要的。

2. 小而精,可组合,不锁定流程

整个技能包没有"必须按顺序执行"的强制流程。你可以只装 3 个技能(tdd、diagnosing-bugs、grilling),也可以全装。GSD/BMAD 试图 own 整个流程,结果"过程 bug 难修"。Matt 的技能是原子,30 秒装完。

3. 不依赖特定模型

技能是纯 Markdown,不是 API 调用。Claude、Codex、Cursor、任意 agent 都能用。这是可移植性的核心——你不会被锁在某个工具链里。

4. 从实战提炼,不是教科书

每个技能都有"识别特征"(tell):实现耦合测试的特征是"重构后测试挂了但行为没变";非确定性 bug 的目标是"提高复现率而非干净复现";仓库没有 guardrail 是"常设错失机会,不是中性默认"。这些判据不是从定义推出来的,是从真实的 debug 会话里抠出来的。

5. 作者背书 + 自我实践

Matt Pocock 在 TypeScript 社区有极高影响力(190K 订阅、60K newsletter 读者),他说的东西自带传播力。但更重要的是这些技能是他自己每天在用的。"Skills for Real Engineers. Straight from my .agents directory."——不是理论框架,是实战工具。

六、值得知道的三个局限

局限一:假设存在 issue tracker

多个技能(triage、to-tickets、wayfinder、improve-codebase-architecture)假设项目有 issue tracker,并通过 docs/agents/issue-tracker.md 配置。对于纯本地、个人项目,需要先运行 /setup-matt-pocock-skills 多走几步。本地 markdown 追踪器是支持的,但配置摩擦比"开箱即用"大。

局限二:子代理机制因 agent 而异

implement-spec 的并行子代理功能("runs implementer subagents across the ready frontier for maximum concurrency")依赖 agent 的 subagent 能力。Claude Code、Codex、Cursor 的子代理机制差异较大,同样的 skill 措辞在不同 agent 中效果可能不一致。

局限三:in-progress 桶的噪音

in-progress/ 桶有 7 个 Beta 技能,其中 writing-beats、writing-fragments、writing-shape 是写文章用的,与工程主线无关。装在工程 agent 里会增加上下文噪音。技能包明确标注"可随时消失",但实际使用中你会看到它们。

七、与其他 AI 工程方案对比

维度
mattpocock/skills
GSD
BMAD
Spec-Kit
设计哲学
原子可组合
全流程
全流程
全流程
用户控制度
高(选择何时用哪个)
中
低
中
过程 bug 可修性
高(每个技能独立)
低
低
中
模型依赖
无(纯 markdown)
高
高
中
学习成本
低(按需装)
高
高
中

Matt 在 README 里对全流程方案的批评很直接:

"Approaches like GSD, BMAD, and Spec-Kit try to help by owning the process. But while doing so, they take away your control and make bugs in the process hard to resolve."

README.md

八、理论从哪里来:不是凭空设计的

理解这个技能包的"人格",需要知道它的理论来源。每一条红线背后都有经典著作的影子:

技能/概念
理论来源
核心引用
grilling / 对齐
《程序员修炼之道》
"No-one knows exactly what they want"(没人确切知道自己要什么)
统一语言 / GLOSSARY.md
《领域驱动设计》(Eric Evans)
"With a ubiquitous language, conversations among developers and expressions of the code are all derived from the same domain model"
small deliberate steps
《程序员修炼之道》
"The rate of feedback is your speed limit. Never take on a task that's too big"
每天投资设计
《XP 探索》(Kent Beck)
"Invest in the design of the system every day"
深模块 / 杠杆率
《软件设计哲学》(John Ousterhout)
"The best modules are deep. They allow a lot of functionality to be accessed through a simple interface"
Fowler 坏味道基线
《重构》(Martin Fowler, 第 3 章)
12 条坏味道,每条有"是什么→怎么修"
one-way / two-way door
Amazon 决策理论(Bezos)
可逆决策(two-way)和不可逆决策(one-way)风险等级不同

这不是学术项目,但它的理论基础是扎实的。每一条技能指令都是对某一条经典原则的可执行化翻译。

九、实际怎么用:30 秒装完,5 分钟上手

    
# 安装(两种方式选其一)

# 方式一:Claude Code 官方插件市场(订阅式更新)
claude plugins install mattpocock-skills

# 方式二:skills.sh(可编辑,本地拥有文件)
npx skills@latest add mattpocock/skills

# 初始化(每个仓库跑一次)
/setup-matt-pocock-skills
# → 问你要用哪个 issue tracker(GitHub/GitLab/本地文件)
# → 问 triage 标签规范
# → 问文档保存位置

日常工作流(主流程):

有想法 → /grill-with-docs(盘问 + 域建模)
      → /to-spec(对话变成 spec)
      → /to-tickets(拆成 tracer-bullet tickets)
      → /implement(按 ticket 驱动 /tdd)
      → /code-review(双轴审查)
      → /retro(改进 agent 环境)

不需要全用。三个最高频的组合:

  • 对齐类
    :/grill-me(无状态)或 /grill-with-docs(有状态),每次开始前跑一遍
  • 调试类
    :/diagnosing-bugs,遇到硬 bug 或性能回归时
  • 审查类
    :/code-review,提交前或 PR 合并前

十、结论:它不是在让 AI 更强,而是在让 AI 更守纪律

mattpocock/skills 的本质,是把软件工程 40 年的纪律翻译成 AI 时代的可执行指令。它没有发明新的工程原则,它做了一件更难得的事:把这些原则写成 AI 能读、能执行、能遵守的格式。

三条最重要的理念,浓缩成一句话:

对齐先于行动(grilling):在写代码之前把设计树走完

反馈先于假设(diagnosing-bugs):没有变红的命令前,不许建理论

深模块先于泥球(codebase-design):每天都投资设计,而非事后重构

加上"事实与决策分离"这条红线,构成了一个完整的 AI 工程方法论。它不追求自动化,它追求在自动化的边界上保留人的判断权。

这就是为什么 69,000 个开发者 star 了它:不是因为它让 AI 更聪明,而是因为它让 AI 终于开始守规矩了。

测评基于 2026-10-07 仓库 main 分支内容。技能包仍在活跃开发中(in-progress 桶有 7 个 Beta 技能,implement-spec 最近毕业到 engineering 桶),结论可能需要随版本更新修正。仓库:github.com/mattpocock/skills,MIT 协议,总安装量 12.3M(skills.sh 统计)。 

相关学习资料