真正工程师的技能
我每天使用的代理技能,用于做真正的工程——而不是随性编码。
开发真实应用程序很困难。像GSD、BMAD和Spec-Kit这样的方法试图通过掌控过程来提供帮助。但这样做时,它们剥夺了你的控制权,并使过程中的错误难以解决。
这些技能被设计为小巧、易于适应和可组合。它们适用于任何模型。它们基于数十年的工程经验。随意摆弄它们,让它们成为你自己的。享受。
如果你想跟上这些技能的变更以及我创建的任何新技能,你可以加入我的时事通讯,与其他约6万名开发者一起:
为什么存在这些技能
我构建这些技能是为了修复我在Claude Code、Codex和其他编码代理中看到的常见故障模式。
#1:代理没有做我想做的事情
“没有人确切知道他们想要什么”
David Thomas 和 Andrew Hunt,《程序员修炼之道》
问题。软件开发中最常见的故障模式是误解。你认为开发人员知道你想要什么。然后你看到他们构建的东西——意识到他们根本没有理解你。
这在人工智能时代也是如此。你和代理之间存在沟通鸿沟。解决方案是进行一场拷问环节——让代理就你正在构建的内容向你提出详细问题。
解决方案是使用:
/grill-me— 用于非代码用途/grill-with-docs— 与/grill-me相同,但增加了更多好东西(见下文)
这些是我最受欢迎的技能。它们帮助你在开始之前与代理对齐,并深入思考你正在进行的更改。每次想要做出更改时都每一次使用它们。
#2:代理过于啰嗦
使用统一语言,开发者之间的对话和代码的表达都源自同一个领域模型。
Eric Evans,《领域驱动设计》
问题:在项目开始时,开发人员和他们的软件服务对象(领域专家)通常说着不同的语言。
我与我的代理也有同样的紧张感。代理通常被扔进一个项目,并被要求随着进展搞懂行话。所以他们用一个词就能说清楚的地方用了二十个词。
解决方案是共享语言。它是一个帮助代理解码项目中使用的行话的文档。
示例
以下是一个来自我的course-video-manager仓库的CONTEXT.md示例。哪个更容易阅读?
之前:“当课程某一节中的一堂课被‘实体化’(即在文件系统中分配了一个位置)时会出现问题”
之后:“物化级联出现问题”
这种简洁性在每次会话中都得到回报。
这内置于/grill-with-docs中。它是一个拷问环节,但有助于你与AI建立共享语言,并记录难以解释的决策到ADR中。
很难解释这有多强大。它可能是这个仓库中最酷的技巧。试试看吧。
提示
共享语言除了减少啰嗦外,还有许多其他好处:
变量、函数和文件使用共享语言进行一致命名
因此,代理更容易导航代码库
代理在思考上花费的令牌也更少,因为它可以使用更简洁的语言
#3:代码不工作
“始终采取小而有意的步骤。反馈的速度就是你的速度限制。永远不要承担太大的任务。”
David Thomas 和 Andrew Hunt,《程序员修炼之道》
问题:假设你和代理在构建内容上达成一致。当代理仍然产生糟糕的结果时会发生什么?
是时候审视你的反馈循环了。如果没有关于代码实际运行方式的反馈,代理将盲目飞行。
解决方案:你需要常见的反馈循环组:静态类型、浏览器访问和自动化测试。
对于自动化测试,红-绿-重构循环至关重要。这是代理先编写一个失败的测试,然后修复测试的地方。这有助于给代理一致的反馈水平,从而产生更好的代码。
我构建了一个/tdd技能,你可以插入任何项目。它鼓励红-绿-重构,并为代理提供了关于什么构成好测试和坏测试的充分指导。
对于调试,我还构建了一个/diagnosing-bugs技能,它将最佳调试实践封装成一个简单的循环。
#4:我们构建了一个泥球
“每天投资于系统的设计。”
Kent Beck,《解析极限编程》
“最好的模块是深层的。它们允许通过一个简单的接口访问大量功能。”
John Ousterhout,《软件设计哲学》
问题:大多数使用代理构建的应用程序都复杂且难以更改。因为代理可以极大地加快编码速度,它们也加速了软件熵。代码库以空前的速度变得复杂。
解决方案是一种激进的新方法,用于AI驱动的发展:关心代码的设计。
这内置于这些技能的每一层:
/to-spec在创建规格之前询问你正在接触哪些模块
而且关键是,/improve-codebase-architecture 帮助拯救一个已经变成泥球的代码库。我建议每几天在你的代码库上运行一次。
总结
软件工程基础比以往任何时候都更重要。这些技能是我将基础知识浓缩成可重复实践的最佳努力,帮助你交付职业生涯中最好的应用程序。享受。
参考
这些技能在一个轴线上划分——谁可以调用它们。用户调用的技能只有在你输入它们时才可到达(例如/grill-me);它们的工作是编排。模型调用的技能可以由你调用,或在任务适合时由代理自动调用;它们持有可重用的纪律。用户调用的技能可以调用模型调用的技能,但绝不能调用另一个用户调用的技能。
工程
我每天用于编码工作的技能。
用户调用
ask-matt — 询问哪种技能或流程适合你的情况。一个针对此仓库中用户调用技能的路由器。
grill-with-docs — 拷问环节,同时构建项目的领域模型,锐化术语,并内联更新
CONTEXT.md和ADR。triage — 通过分类角色的状态机移动问题。
improve-codebase-architecture — 扫描代码库中可深入的机会,将其呈现为可视化的HTML报告,然后对你选择的任何一个进行拷问。
setup-matt-pocock-skills — 为此仓库配置工程技能(问题跟踪器、分类标签、领域文档布局)。在使用其他工程技能之前,每个仓库运行一次。
to-spec — 将当前对话转换为规格并发布到问题跟踪器。无需面试——只是综合你已经讨论过的内容。
to-tickets — 将任何计划、规格或对话分解为一组追踪子弹任务,每个任务声明其阻塞边缘——以文本形式写入本地文件,或作为真实跟踪器上的本地阻塞链接。
implement — 构建规格或一组任务所描述的工作,在预先约定的接缝处驱动
/tdd,并在提交前以/code-review结束。wayfinder — 规划一大块工作,超过一个代理会话可以容纳的工作量,作为问题跟踪器上的调查任务共享地图——一次解决一个,直到通往目的地的道路清晰。
模型调用
prototype — 构建一次性原型来回答设计问题——一个可运行的终端应用程序用于状态/逻辑问题,或者几个可以从一个路由切换的截然不同的UI变体。
diagnosing-bugs — 针对难以处理的错误和性能回归的有纪律的诊断循环:重现 → 最小化 → 假设 → 检测 → 修复 → 回归测试。
research — 针对高信任度的原始来源调查一个问题,并将发现捕获为仓库中的引用Markdown文件,作为后台代理运行。
tdd — 具有红-绿-重构循环的测试驱动开发。一次一个垂直切片构建功能或修复错误。
domain-modeling — 积极构建和锐化项目的领域模型——将术语与词汇表进行挑战,用边缘案例场景进行压力测试,并内联更新
CONTEXT.md和ADR。codebase-design — 用于设计深层模块的共享纪律和词汇:一个小接口背后的大量行为,放置在干净的接缝处,可通过该接口测试。
code-review — 自某个固定点以来的差异进行两轴审查:标准(是否遵循仓库的编码标准,加上Fowler的坏味道基线?)和规格(是否忠实实现了原始问题/PRD?),作为并行子代理运行,这样两者不会互相污染。
生产力
通用工作流程工具,非代码特定。
用户调用
grill-me — 对一个计划或设计进行无情的面试,直到决策树的每个分支都被解决。
handoff — 将当前对话压缩成一个交接待办文档,以便另一个代理可以继续工作。
teach — 在多个会话中向用户教授新技能或概念,使用当前目录作为有状态的教学工作空间。
writing-great-skills — 编写和编辑优秀技能的参考资料:使技能可预测的词汇和原则。
模型调用
grilling — 对一个计划或设计进行无情的面试,直到决策树的每个分支都被解决。
grill-me和grill-with-docs背后的可重用循环。