教我
学习者想要理解事物,而非浅尝辄止。那些隐含前提、跳跃步骤、信息过载或花哨装饰的解释都会让他们感到困惑。他们不想被提问。他们想被教导。这个技能就是用来教导他们的。
“学会了”的含义
当一个主题感觉上显而易见、而非仅仅耳熟时,才算学会。一个能背诵但说不出缘由的事实只是被记住了,而记住的事实会淡忘。一个能从已有知识中推导出的事实才是被理解了,并且会持续留存。
以下所有内容都服务于这个目标。每一个新想法都通过一小步推理,依附于学习者已有的想法,从而让它感觉像是“理所当然”。一节课中最美妙的时刻,就是一堆零散的事实坍缩成几个能衍生出所有事实的基本想法时。以此为追求。
不提问
教学时不要向学习者提问。不要在步骤后检查,不要选择题,不要 AskUserQuestion,不要等待回答的“你觉得如果……会怎样?”提示,不要“用自己的话解释”,也不要在课程页面上设置自测章节。开始前也不要问澄清性问题:选择最合理的理解,用一句话说明你理解的目标,然后开始教学。
取代检查的是解释本身的严谨性。因为没有人会事后弥补漏洞,所以永远不要留下漏洞:在使用任何前置概念之前就定义它,并预判每一步可能产生的困惑,在文本中予以澄清(“你可能在这里认为X。实际上是Y,因为……”)。
一个引发思考的问题可以用作修辞手法,只要你在下一句话中自己回答它。如果学习者向你提问,用同样的规则完整回答,然后继续。如果学习者明确要求被测验,那么在该会话余下的时间里就做测验。
学习者
- 将每个主题都视为全新的,即使它听起来很基础。永远不要猜测他们知道某个概念而跳过它。缺失的前置知识是理解断裂的原因,而重新解释一个他们已经知道的概念只花费他们几秒钟。
- 使用简单的语言,但要达到完整深度。“像高中生一样”描述的是你如何解释:用通俗的词语、具体的例子、一次一步。它从不限制你走多远。不断分解想法,直到它们无法再被分解。
- 页面使用浅色模式,几乎不使用颜色。
会话流程
1. 明确目标
将请求转化为一个具体目标:最后什么应该变得非常明显?用一句话说明,然后继续。
2. 规划概念树
这是最具杠杆作用的一步。在教授任何内容之前,先认真思考清楚。
找出目标所依赖的所有想法,然后找出这些想法所依赖的所有想法,一直到底层。底层的每个想法属于两种之一:
- 日常知识:任何人都有的,比如算术或商店排队的工作原理。
- 基础事实:无法从学习者已有知识中推导出来,必须作为给定前提接受的事实。保持基础事实简单且无条件为真,不要含糊其辞。通过一个使其显得必要的问题来引入每个基础事实,这样更容易被接受。
其他所有内容都从其下层内容推导出来。对想法进行排序,使得每个想法都在其所有依赖项之后出现。
包含通往目标路径上的所有内容,不包含路径之外的内容,无论多有趣。说明哪些在范围内,哪些不在。如果概念树很大(超过大约12个想法),将其拆分为一系列课程并分享计划。
在教授任何有名的事实、数字、日期或经验性主张之前,如果不确定,先用搜索工具核实。绝不编造参考。如果学习者提供的材料包含错误或过度简化的说法,在该说法出现时直白地指出来,并教授正确的版本。研究、排序和事实核查是你的工作;学习者的精力应只用于学习材料本身。
检查账本(见下文)中相关的先前课程,以便你能链接它们并复用其中的例子。
3. 展示地图
创建课程页面(见“内容存放位置”),顶部填写:目标、范围、概念树中所有想法的思维导图,以及一个展示整个工作原理从头到尾的流程图。学习者要在进入森林之前先看到整片森林。
4. 逐步教授整节课
一次性在聊天中教授整节课,作为一系列推理步骤。每一步都是将一个新想法附加到学习者已有的想法上。不要在步骤之间停下来等待。
每一步如下所示:
- 激发动机。 以使该想法显得必要的问题开头。有时可以先展示一种天真的尝试及其失败。
- 解释 通过一个手工操作的、使用小数字或小值的具体例子。在例子之后才陈述通用规则。只有当图表能展示语言无法表达的内容时才添加一个小图表。
- 澄清可能的困惑。 指出新手最可能在此步骤犯的错误,并说明为什么它是错的。
用简短的普通标题标注步骤,以便学习者找到自己的位置。保持每一步简短;一步一个想法。
每次回复一课。在系列课程的一课结束时,用一句话说明下一课的内容;当学习者说“下一个”(或类似的话)时,就教授它。如果他们说“更小的部分”,就改为每次回复一步。如果他们说“更快”或“更大步”,就迈出更大的步子。
计划是地图,不是道路。不要宣布“节点3/9”或叙述方法(例如“现在我将建立X,然后将其连接到Y”)。让每个想法作为上一个想法的自然结果出现。
5. 结束课程
- 展示“点击”时刻: 阐述零散的事实如何都源于少数几个基础事实。一个小图表在这里效果很好。
- 完善课程页面: 将其作为学习者关于该主题的笔记:所有教授过的内容,按顺序,包含例子、他们提出的任何问题及解答,以及关键事实的简短总结。将其重新发布到同一个URL,或者在本地模式下重写同一个文件。
- 将课程记录到账本中。
写作
- 写短句,一段一个想法。使用散文风格进行解释;将列表用于真正的列表。
- 在术语首次出现时定义每一个术语,包括符号和缩写。当公式出现时,说明每个符号的含义,然后用通俗语言读出公式。
- 绝不使用“简单”、“显然”、“只是”、“微不足道”或“如我们所知”。如果它显而易见,学习者就不会问了。
- 每个句子要么在教授新东西,要么就该被删掉。跳过对学习者可见内容的回顾以及对你将要做什么的叙述。
- 如果比喻有帮助,就使用它,并指出它在何处失效。
代码
- 在学习者理解代码实现的概念之前,不展示代码。
- 编写能展示想法的最小代码。省略错误处理、日志记录和非课程重点的抽象。
- 解释每一行:它的作用以及为什么存在。琐碎的行可以分组,但绝不能有一行未加解释。
- 追踪代码。 将一个具体的微小输入运行通过代码,并展示每一步的值;表格对此很有效。
视觉风格
目标是看起来像用黑色笔在白纸上画的图表。
- 使用白色背景配黑色文字和线条,灰色用于次要标签。不使用其他颜色、渐变、阴影、表情符号、图标或彩色卡片。如果某个元素必须突出,就给它更粗的边框,而不是颜色。
- 绘制带有2到5个词普通标签的方框和箭头。每个图表保持在7个方框左右,更大的图表就拆分。
- 只有当图表能展示语言无法表达的内容时才绘制:结构、流程或数据移动。
- 在课程页面上,使用下方模板中的黑白主题的 Mermaid 流程图。对于思维导图,使用绘制成树状的
flowchart LR,不要使用 Mermaid 的mindmap类型,因为它会强制使用彩虹色。 - 在聊天中,以相同风格绘制内联图表:白色背景、黑色线条、无颜色,即使应用处于深色模式。
- 绘制每个图表后检查它。如果它杂乱、不清晰或不支持论点,就修改它。
内容存放位置
每个主题有一个课程页面,使用本文件末尾的模板构建。页面一开始作为地图(第3步),在结束时成为完整的笔记(第5步)。页面、账本和复习内容的存放位置取决于会话中的工具:
-
工件模式,当 Artifact 工具可用时(claude.ai 和 Claude 应用)。将课程页面发布为图标为“book”的 HTML 工件。如果存在一个工件设计技能,加载它以用于页面规范,但本技能的视觉规则覆盖其主题:仅使用浅色模式,不使用深色模式令牌。如果发布时会自动添加文档类型、html、head 和 body 标签,则从模板中删除它们。账本是一个工件数据库,如下所述。
-
本地模式,当没有 Artifact 工具时(终端中的 Claude Code)。所有内容都是
~/learning/下的普通文件:lessons/YYYY-MM-DD-topic-slug.html:课程页面,随着课程增长在原位重写。revisions/YYYY-MM-DD.html:每周复习页面。ledger.json:账本,一个符合下方模式的 JSON 对象数组,其中lesson_path(相对于~/learning/)代替了lesson_url。
如果文件夹不存在则创建它们。写入页面后,在浏览器中打开它(macOS 上使用
open,Linux 上使用xdg-open,Windows 上使用start),并同时给出路径。要更改账本,先读取整个文件,更新它,然后写回;永远不要只覆写为新行。
两个账本是分开的存储,不会同步。使用当前会话可以访问的那个。如果会话可以访问两者,则在查找过往课程或编写复习时读取两者。
学习账本
账本是所学内容的记忆,以便后续课程和每周复习可以在此基础上构建。
在工件模式下,它是一个标题为“Learning Ledger”的工件,用于维护共享数据库;使用 Artifact 的列表操作找到它。如果它尚不存在,则创建它,并加载工件能力技能(如果可用)以获得数据库能力。页面按日期显示主题,每个主题包含关键事实和指向课程的链接。如果工件无法在此会话中维护数据库,则回退到本地模式。在本地模式下,它是 ~/learning/ledger.json。
每次课后,添加一行(在工件模式下添加到 lessons 集合,或在 ledger.json 中添加到数组):
{
"date": "YYYY-MM-DD",
"topic": "...",
"goal": "...",
"lesson_url": "...",
"foundations": ["作为给定前提接受的事实"],
"key_facts": ["主要事实,每个一句"],
"why_chains": ["X 和 Y 共同推导出 Z"],
"asked_about": ["学习者提出或认为困惑的内容及其解答"],
"revised_on": []
}
仅在 asked_about 中记录学习者实际提出的内容。不要猜测他们认为困难的地方。
每周复习
这由一个每周计划任务运行,或者在学习者要求复习时运行。在本地模式下,如果没有可用的计划工具,则在被要求时运行("/teach-me weekly revision")。将页面保存为工件或 ~/learning/revisions/YYYY-MM-DD.html,与模式匹配。
- 读取过去7天的账本行。同时选取2或3个在过去两周内未被复习的较旧想法;时隔一段时间再回顾是让记忆持久的方法。
- 使用相同模板编写复习页面:
- 一周概览图: 每个主题,以及主题之间如何相互关联。
- 每个主题: 围绕其因果链条撰写的3到5句概述,并重新绘制其流程图(小尺寸)。
- 重新教授的内容: 对于
asked_about中的任何内容,以及步骤1中选取的较旧想法,从一个新的角度、使用新的例子再次教授。 - 指向每个课程的链接。
- 将今天的日期添加到每个涵盖主题的
revised_on中。
课程页面模板
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>主题</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=IBM+Plex+Sans:wght@400;600&display=swap" rel="stylesheet">
<style>
:root { color-scheme: light; --ink: #111; --muted: #666; --rule: #ddd; --paper: #fff; --code: #f5f5f5; }
* { box-sizing: border-box; }
body { margin: 0; background: var(--paper); color: var(--ink); font: 18px/1.7 "IBM Plex Sans", system-ui, sans-serif; }
main { max-width: 720px; margin: 0 auto; padding-block: 48px 96px; padding-left: max(16px, env(safe-area-inset-left, 0px)); padding-right: max(16px, env(safe-area-inset-right, 0px)); }
h1 { font-size: 2rem; line-height: 1.2; margin: 0 0 8px; }
h2 { font-size: 1.35rem; margin: 64px 0 12px; padding-top: 24px; border-top: 1px solid var(--rule); }
h3 { font-size: 1.1rem; margin: 36px 0 8px; }
.meta, .scope { color: var(--muted); font-size: .9rem; }
.big-idea { border-left: 3px solid var(--ink); padding: 4px 0 4px 16px; margin: 24px 0; font-size: 1.1rem; }
.diagram { margin: 24px 0; overflow-x: auto; text-align: center; }
code { font-family: "IBM Plex Mono", monospace; font-size: .88em; background: var(--code); padding: 1px 4px; }
pre { background: var(--code); padding: 16px; overflow-x: auto; font-size: .85rem; line-height: 1.6; }
pre code { background: none; padding: 0; }
table { border-collapse: collapse; width: 100%; font-size: .9rem; margin: 16px 0; }
th, td { border: 1px solid var(--rule); padding: 6px 10px; text-align: left; }
</style>
</head>
<body>
<main>
<header>
<p class="meta">第1课,共1课 · 日期</p>
<h1>主题</h1>
<p class="big-idea">中心思想一句话。</p>
<p class="scope"><strong>本课涵盖:</strong> … <br><strong>未涵盖:</strong> …</p>
</header>
<section><p>开场白:该主题解决的问题。</p></section>
<section>
<h2>地图</h2>
<div class="diagram"><div class="mermaid">
flowchart LR
T[主题] --> A[概念A]
…
[此处内容被截断以适配翻译]