第36章:学习和理解新项目 —— 用 teach 把陌生代码库读成一门课

"I poured my 10 years of teaching experience into a skill. It's called /teach, and it can teach you anything."

我把十年教学经验灌进了一个 skill。它叫 /teach,能教你任何东西。

—— Matt Pocock(@mattpocockuk),2026 年 6 月 9 日

我一直思考一个问题:AI 已经又快又好地帮我们写好代码了,反而程序员成了瓶颈。程序员需要耗费很长的时间去理解这些代码,以至于经常我们也不 review、不理解这些代码,无脑地接收了。

现阶段,我们还缺少一个让人类能够快速理解 AI 生成代码的方法,所以我也在思考这个问题,尝试使用各种架构图、流程图、UML 图去梳理代码的框架。最近我也看到 Matt 在介绍他的 teach skill。这一章先把研究的成果做一个粗浅的总结,未来几年有更成熟的途径后我再来回顾和更新。

第 2 章认识过 Matt Pocock——TypeScript 教学名家,Skills 系统「真正的工程,不是氛围编程」那套主张的提出者。这次他把自己十年教人写代码的经验,压进了一个叫 /teach 的 skill。本章就从这个 skill 讲起。

一个真实的场景:你接手一个陌生项目。github.com/Gitlawb/zero,一个现代终端 coding agent,68 个 internal 包,2700 行的主循环文件。这是一个新的开源项目,你要在这上面加功能、修 bug,甚至照着它复刻一个自己的 agent。

传统办法你我都熟:clone 下来,从 main 函数一路点进去,开十几个标签页,画一张越来越乱的手绘图,两周后勉强摸清一半,再过两周忘了前一半。这套流程在 AI 时代显得格外浪费。理解一个代码库恰恰是大模型最擅长的事之一:它读得比你快,记得比你全,还能随时回答追问。

问题在于,光让 agent「给我讲讲这个项目」得到的是一坨即用即弃的概述。听的时候懂了,关掉窗口就忘。这不叫学会,这叫 agent 学会了、你没有。

本章讲怎么把「让 agent 讲」变成「让 agent 教」——用三个 skill:/teach 把陌生代码库变成一门为你量身定制、能长期回看的课;/insight-diagram 把代码结构画成图;/architecture-diagram 负责把图渲染得专业好看。全程以一个真实的学习工作区 zero-learn 为例——它就是用这三个 skill 搭出来的。

36.1 读代码不等于学会

第 21 章的 Understand-Anything 把代码库变成知识图谱,第 22 章的 UML 新用途让 AI 反向生成图来帮它自己理解代码。这两章解决的是「让机器理解代码」。本章解决的是另一头——让人理解代码,而且是长期理解、能带走的理解。

这两件事不一样。机器理解代码是为了在这个 context window 里把活干对;人理解代码是为了在下个月、下个项目里还记得。前者要的是覆盖率和精确度,后者要的是留存率。

留存率是认知科学里一个被反复验证的现象。你读一遍讲解,当场能复述,这叫流畅度(fluency),一种「我懂了」的错觉。但一周后再问,全忘了,因为流畅度不等于存储强度(storage strength)。让知识留下来的是费劲地回忆:合上书自己推一遍、隔几天再考一次、把相关的几个概念混在一起练。听得顺没用。这套「合意困难(desirable difficulty)」正是 /teach 这个 skill 的设计地基。

换句话说:一个只会「讲」的 agent 在优化流畅度,一个会「教」的 agent 在优化存储强度。差别就在这里。

36.2 /teach:把代码库变成一门课

/teach 出自 Matt Pocock 的公开 skills 合集(github.com/mattpocock/skills,在 productivity/teach/ 目录下)。它的 SKILL.md 开头第一句就点明了它和普通问答的区别:

This is a stateful request - they intend to learn the topic over multiple sessions.

有状态、跨会话。这是整个 skill 的立身之本。普通对话是一次性的,关掉就没了;/teach 把当前目录当成一个教学工作区(teaching workspace),把你的学习状态沉淀成磁盘上的一组文件。下次再进来,agent 读这些文件就知道你学到哪了、偏好什么、下一步该教什么。

它还特意关掉了模型自动调用(disable-model-invocation: true)。只有你亲手敲 /teach 才进得去教学模式。学习是个需要主动发起的严肃动作,不该被 agent 顺手触发。

36.2.1 工作区的六种文件

一个 /teach 工作区由六类文件构成,各管一件事:

文件作用类比
MISSION.md为什么学、学成什么样、边界在哪项目的北极星
RESOURCES.md可信资源清单,教学的知识来源参考书目
NOTES.md教学偏好、学习者画像老师的备课笔记
learning-records/已被验证的关键理解,驱动下一课架构决策记录(ADR)
lessons/一课一个 HTML,教学的主产物讲义
reference/跨课复用的速查文档速查表 / 术语表

这套结构不是随便定的。它对应 skill 的教学哲学——深度学习需要三样东西:知识(Knowledge)从高可信资源里来,进 RESOURCES.md技能(Skills)通过高相关的互动课练出来,进 lessons/智慧(Wisdom)只能靠真实世界的实践和社区交流获得,这也是为什么 skill 会在合适的时候建议你去某个论坛或社区验证。

其中 MISSION.md 是重中之重。skill 反复强调:每一课都要挂到 mission 上。如果不理解你为什么学,教学就会飘:课程太抽象,agent 也没法判断下一步该教什么。所以第一次 /teach 时,如果 mission 不清楚,agent 不会开讲,第一件事是反问你为什么要学

36.2.2 最近发展区与合意困难

/teach 决定「下一课教什么」靠的是最近发展区(Zone of Proximal Development):每一课都要让你觉得「有点难,但够得着」。太简单浪费时间,太难吃光工作记忆。agent 怎么算这个区?读你的 learning-records,看你已经验证掌握了什么,再结合 mission,挑一个正好在边界上的东西教。

课程本身的设计处处是「合意困难」的落地:

还有个反直觉的分工:课程(lessons)几乎不会被回看,参考文档(reference)才会。所以课程负责「第一次学会」,可以长、可以有互动;参考文档是课程的压缩精华,为「日后速查」而生,要短、要能打印。术语表尤其重要:一旦建立,之后每一课都要遵守同一套术语。

36.3 zero-learn 实录:一门 20 课的 Zero 架构课

抽象讲完了,看真东西。zero-learn 就是一个跑了多轮 /teach 攒出来的工作区,学习对象是 Zero 这个 coding agent。

36.3.1 先立 mission,再开课

工作区根目录的 MISSION.md 定义得极其克制。它说清了三件事——为什么学学成什么样边界在哪

## Why
深入理解一个现代终端 coding agent 是怎么设计的——turn loop、
工具分发、权限/沙箱模型、上下文管理、TUI——通过读 Zero 的真实源码。
目标是从内部建立「一个 coding agent 到底怎么工作」的心智模型,
不是浮光掠影的走马观花。

## Success looks like
- 能把一个 prompt 端到端追踪:prompt → provider 流 → 工具调用 →
  工具结果 → 下一轮 → 最终答案,每一步都叫得出具体的 Zero 函数名。
- 能解释 Zero 怎么判断一个回合「结束了」还是「还要再来一轮」。
- 能解释一次危险工具调用的权限/沙箱判定路径。
- 我自己能画出一个可比的 agent 的最小架构。

## Out of scope (for now)
- 贡献 PR / 修 bug(这是学习,不是贡献)。
- provider 特定的 API wire 格式。
- 构建/发布工具链。

注意「Success looks like」里的每一条都是可验证的能力,不是「大致了解」。这直接决定了后面每一课的深度:既然目标是「叫得出每一步的函数名」,那课程就必须精确到 file:line,而不能停在「大概有个循环」。

配套的 NOTES.md 记的是学习者画像和教学偏好。它让这门课不像一份通用教程,而像为这一个人定制的私教:

## Learner profile
- 资深 Go 开发。不要解释 Go 语法、goroutine、channel、interface、
  module。要解释*架构决策*和*代码为什么长这样*。

## Preferences observed
- 课程必须用中文写。代码、标识符、file:line 引用保持原样,
  正文/测验/批注用中文。(第一课初稿用英文写完后,学习者要求改的。)

这两条偏好都是在教学过程中逐步观察到并记下来的:学习者纠正过一次,agent 就记进 NOTES.md,之后每一课都遵守。这正是 NOTES.md 的用途:把一次性的纠正沉淀成长期的教学契约。

36.3.2 一课一个零件

跑了多轮之后,zero-learn/lessons/ 里攒了 20 课,从 0001 编号递增,分成六组,覆盖一个 coding agent 的全部要害:

  1. 核心循环与上下文(01–05):主循环、工具执行闸门、上下文压缩、护栏、系统提示拼装
  2. 交互与持久化(06–08):TUI 桥接、会话落盘与时间旅行、会话回放
  3. Provider 与流(09–12):适配层、共享地基、流的抽干、重试路径
  4. 沙箱安全(13–14):判定链引擎、命令进笼子
  5. 会话拓扑(15–16):分叉 vs 子会话、专家子会话进度回流
  6. 工具系统与扩展(17–20):注册分发、MCP 接入、Skill 系统、Skill vs 用户命令

每一课只讲一个架构决定。拿第一课「Agent 主循环」举例,它的解剖结构完全踩在 skill 的设计原则上:

36.3.3 课程的样子:一个能开 GitHub Pages 的站点

所有课程都是自包含的 HTML,共享 assets/course.css(统一排版)和 assets/quiz.js(测验控件)。这是 skill 的「组件复用」原则:第一课就该挣到一张共享样式表,之后每课都链它,于是 20 课看起来像一门课,而不是一堆各写各的一次性文件。

网站:https://colobu.com/zero-learn/

根目录的 index.html 是课程目录首页,按六组列出全部 20 课,每课配一句「钩子」概括。它刻意放在根目录,是为了能直接开 GitHub Pages 当站点首页。整个工作区还刻意放在 Zero 仓库之外(相邻的 zero-learn/ 目录),课程用相对路径 ../zero/... 引用源码,学习笔记不污染那份干净的 checkout。

这就是 /teach 的产出形态:一门可回看、可分享、可继续的课,关掉窗口也还在,不像普通对话那样即用即弃。想学下一块,回到 Zero 仓库敲 /teach <主题> 即可;不指定主题,agent 会读 learning-recordsMISSION.md,自己挑下一课。

36.4 /insight-diagram:把代码结构画出来

课程讲清了「一个回合怎么跑」,但纯文字讲控制流是费劲的。第 22 章说过,图是压缩过的理解。zero-learn/diagrams/ 里那些流程图和时序图,就是用 /insight-diagram 生成的。(/insight-diagram 出自 github.com/smallnest/goal-workflow,基于 /architecture-diagram 做渲染。)

/insight-diagram 干的事,一句话:分析任意代码库,自动生成 UML/架构图/流程图,再交给 /architecture-diagram 渲染成 HTML+SVG。它认识 17 种图,分结构性(静态)和行为性(动态)两大类:

类别图表
结构性(静态)系统架构图、类图、对象图、组件图、部署图、包图、复合结构图、剖面图
行为性(动态)流程图、用例图、活动图、状态机图、序列图、通信图、定时图、交互概览图、泳道图

其中系统架构图和流程图不算严格 UML,但最常用;默认推荐组合是 architecture + sequence + flowchart,三张图就能覆盖一个项目「长什么样、怎么调、怎么流」的骨架。

36.4.1 四步执行流程

/insight-diagram 的工作流很规整:

  1. 分析代码库:读 CLAUDE.md(如有)、扫源码结构、读入口文件、grep 接口定义和依赖注入,提炼出组件清单、调用关系、核心类型、主流程、部署拓扑。
  2. 选图:用 AskUserQuestion 分四组让你多选要生成哪些图。理解一个项目,你不需要 17 张图全画,挑要害的三五张。
  3. 逐个生成:对每张图,先读对应的示例文件examples/architecture.html 等),提取布局、节点样式、标注风格,再调 /architecture-diagram 渲染,存到 docs/<标识>.html
  4. 报告:列出生成的文件和每张图的简述。

36.4.2 「先读示例」这条铁律

第 3 步里「先读示例」是这个 skill 最关键的一条纪律,也是它对抗 AI slop 的核心手段。skill 的 examples/ 里放了 13 张已完成的图作为模板,SKILL.md 用加粗强调:「生成任何图表前,必须先阅读对应的示例文件」

为什么?因为如果不给参照,模型画图会往它的统计均值收敛:节点乱摆、箭头打架、信息密度失控,画出来一眼假。给它一张高质量示例,让它照着提取「布局策略、节点样式层级、标注风格、信息密度」,输出质量立刻稳定。这和第 40 章讲前端设计 skill 的发现是同一个道理:约束比自由更能提升 AI 的审美下限。

但示例只借样式,不借内容。SKILL.md 特意提醒:示例里的业务数据(一个虚构的风控系统)只是参照,生成时必须换成目标项目的真实架构信息:参考布局,不复制业务

skill 里还有一整段「防遮盖」规则:算每个元素的边界框确保不重叠、箭头画在节点下方、节点间留足间距、超长文字截断换行、图太挤就拆子图。这些都是从无数张画烂了的图里总结出来的经验,写进 skill 后就成了每次生成的默认纪律。

36.5 /architecture-diagram:图的渲染引擎

/insight-diagram 决定画什么/architecture-diagram 决定长什么样。它是最底层的渲染引擎,一个专门产出专业技术架构图的 skill(Cocoon AI 的开源项目 architecture-diagram-generatorgithub.com/Cocoon-AI/architecture-diagram-generator,MIT 许可),输出永远是单个自包含的 HTML 文件:内嵌 CSS、内联 SVG、除了 Google Fonts 不依赖任何外部资源、不需要 JavaScript,直接双击就能在浏览器里正确渲染。

它带一整套设计系统,而不是随手配色:

它还把画图的坑写成了硬规则:箭头 z 序(先画箭头后画节点,让线走到节点背后)、遮罩(半透明节点下先垫一层不透明底矩形,别让箭头透出来)、间距(垂直至少 40px,消息总线放在间隙里别压节点)、图例位置(必须放在所有边界框外,不够就撑高 viewBox)。

回头看 zero-learn/diagrams/ 里那九张图,用的正是这套深色设计系统:slate-950 底、JetBrains Mono、脉冲绿点、青翠紫琥珀的语义配色、底部三张摘要卡。agent.Run 循环流程图单轮时序图TUI 处理序列图……每一张都是一个自包含 HTML,配合对应课程一起看。第一课顶部那个「配套架构图」callout,链的就是它们。

有意思的是 /insight-diagram/architecture-diagram 在配色上的一个张力:/architecture-diagram 原生是深色主题,而 /insight-diagram 在调用它时会强制切成 light Claude 风格(暖白底、terracotta/sage 配色、Inter 字体)。同一个渲染引擎,套不同的皮。zero-learn 的图走的是深色原生风,说明这里更贴近 /architecture-diagram 的默认审美。两条路都通,看你要哪种视觉。

36.6 三个 skill 的分层

把三个 skill 摆到一起,大致是三层,各有各的活:

Skill管什么一句话
/teach教学法学什么、按什么顺序学、怎么让它留下来
/insight-diagram画什么分析代码库,决定该出哪几张图
/architecture-diagram怎么画把一张图渲染成专业的 HTML+SVG

这是典型的关注点分离。/teach 站在最上层,它知道你的 mission、你的进度、你的最近发展区,于是它决定「这一课需要一张主循环的时序图」;它把「画什么」的活派给 /insight-diagram/insight-diagram 分析完代码、定下图的内容和类型,再把「怎么渲染」的活派给 /architecture-diagram

不过下面两层的边界没那么干净,/insight-diagram/architecture-diagram既重叠又分工的关系,值得说清楚。分工那半边好理解:前者是分析器加编排器,读代码、让你选画哪几张、覆盖 17 种 UML 和流程图,自己不动手渲染;后者是纯渲染引擎,给它图的内容就吐一个自包含 HTML,自带那套深色设计系统,不分析代码也不问你画什么。重叠那半边容易被忽略:两者都产出 HTML+SVG,画图的底层纪律(防遮盖、箭头 z 序、半透明节点垫底、间距、图例位置)几乎是重复的,/insight-diagram 把这几条又抄了一遍。更明显的重叠点是「系统架构图」这一种图两边都能出,你直接调 /architecture-diagram 就得到一张架构图,走 /insight-diagram 时 architecture 也只是它 17 种图里的一种,最后照样甩给 /architecture-diagram 渲染。

所以准确的说法是:/architecture-diagram 是被 /insight-diagram 内含的那一层,两者在「渲染架构图」这件事上重叠,区别在一个管选题加分析、一个管渲染。上一节那个配色张力正是这层重叠的副产品:同样是架构图,/architecture-diagram 原生深色,/insight-diagram 调它时却强制切成 light 风,同一个引擎、同一种图,两个入口给你两种皮。

好处是每一层都能单独用。你不学习、只想给现有项目补几张架构图,直接 /insight-diagram 就行(第 8 章的 goal-workflow 里它就是这么当 bonus skill 用的)。你手头已经有图的内容、只想要漂亮渲染,直接 /architecture-diagram。三者组合起来,才是「把一个陌生项目学透并留档」的完整链路。

这也呼应了本书反复出现的一条主线:好的 AI 能力是一组各司其职、可组合的 skill,拼起来用。一个大而全的 prompt 想一口气全包,反而做不到。第 2 章 Mattpocock 讲 skill 是真正的工程、第 16 章 agent-skills 把工程纪律结构化、第 25 章 autoreview 把审查做成绕不过的关口——都是同一个思路。/teach + /insight-diagram + /architecture-diagram 是这个思路在「学习理解」这件事上的落地。

36.7 什么时候用,用哪个

「理解一个项目」在本书里出现过好几次,工具也不止一个。别用混了:

判据很简单:产物是给谁看的、要不要留得住。要 agent 干活用前三个;要你自己在下个月还记得,用 /teach。而 /insight-diagram + /architecture-diagram 是横切的可视化底座,谁都能调。

一个实用组合:接手陌生项目时,先 /insight-diagram 出三张骨架图(architecture + sequence + flowchart)建立全局观,再 /teach 立 mission、逐课深入要害模块。图给你广度,课给你深度。

36.8 本章小结

留言板

欢迎在此分享你的想法!评论通过 GitHub Issues 存储,需要 GitHub 账号登录。