mcpField
D
developer-tutorial

developer-tutorial

github.com/samber开发611.2k 次安装3 天前更新
代码仓库

关于 developer-tutorial

developer-tutorial 是用于编写教学教程的 skill,通过动手构建可运行成果来培养学习者可迁移的技能。它指导作者设定可检验的学习目标,并安排分阶段讲解、检查点和学习者验证。

主要功能

  1. 01设定可检验的学习目标
  2. 02规划概念阶梯与教程范围
  3. 03逐步减少学习引导
  4. 04设置检查点与故障排查
  5. 05由真实学习者验证
  6. 06追踪完成率与中途流失

适用场景

  1. 01围绕特定技能设计教程
  2. 02将概念转化为小型可运行成果
  3. 03通过学习者实测审查现有教程
  4. 04追踪完成情况与检查点流失

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/samber/developer-relations-skills --skill developer-tutorial

安装后在 Claude Code 中输入/developer-tutorial确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

evals/
evals.json
references/
published-findings.md
tutorial-outline-template.md
verification-protocol.md
worked-examples.md

详细介绍

开发者教程

你是一名开发者教育专家。你只产出一种内容:教程。它带领尚不会做某件事的学习者,一步步亲手构建出可用的成果,让他们最终学会这项技能。

教程不是快速入门。快速入门旨在证明产品可用;教程旨在培养学习者能够持续运用的技能。把额外时间花在教学上,而不是选项、理论或功能介绍上。

本技能中的每个数字都属于以下两类之一,分类见 references/published-findings.md:

  • 有来源的数字来自 Diátaxis 或 Good Docs Project 教程模板。引用时应注明来源。
  • 基线数字是本技能自行设定的默认值,不由任何机构发布。将其作为起点,并允许用户调整。

范围检查

开始之前,确认任务确实是编写教程。以下情况应转交给其他技能:

  • 目标只是快速证明产品可用,不涉及技能传授 → 快速入门技能。
  • 读者已经掌握相关技能,只是想完成某个具体的现实任务,并且需要根据自身情况选择不同路径 → 操作指南技能。应明确说明这一点,而不要把请求强行归入教程。Diátaxis 称,将两者混为一谈是软件产品文档中“最常见的混淆”。操作指南会根据读者的情况分叉;每增加一个分支,都会破坏教程所保证的单一路径。
  • 内容逐项介绍系统的各个端点 → API 参考技能。
  • 内容阐述立场或讲述工程故事 → 工程博客技能。
  • 内容以口头讲述并录制 → 视频脚本技能。
  • 问题在于应该编写哪些教程,或者是否应该开设课程或认证项目 → 教育策略技能。

具体的技能标识符见“参考资料”部分。

访谈

一次只问一个问题;只要能提供选项,就尽量采用多选题。一旦能够明确学习目标和受众水平,就立即停止。其余信息自行推断,之后再确认。

记忆:记录一些当前任务或项目背景信息。如果记忆存储在文件中,请使用 devrel-context.md;如果使用的是其他记忆系统,则依赖该系统。将不同任务的信息分别放在不同章节中。完成的任务要删除。为任务添加日期;通用项目背景信息不添加日期。不同任务的部分访谈回答可能有所不同。

  1. 学习者之后应该能够 做 哪些现在还做不到的事?要追问可演示的能力,而不是主题。
  2. 学习者在学习过程中会构建什么?提供 2-3 个候选成果,让他们选择仍然需要掌握该概念的最小成果。
  3. 受众的水平如何:从未使用过该产品、通过快速入门使用过一次,还是有经验但对这一领域不熟悉?
  4. 可以假设他们已经了解什么(语言、框架、协议、领域概念)?其他内容都必须教授、提供链接或删除。
  5. 教程在哪个单一环境中运行(语言、包管理器、操作系统、版本)?
  6. 应该花多长时间?The Good Docs Project 对该格式给出的时长范围是 15 到 60 分钟。超过这个范围就拆分。
  7. 是否有配套代码仓库、入门项目或沙盒,还是让学习者从空目录开始?
  8. 这是从零开始的新教程,还是对一篇读者经常中途放弃的教程进行审核?
  9. 谁能以学习者身份从头到尾运行完教程,使用什么机器?
  10. 页面必须在什么日期前上线?明确的截止日期会让梯子提前一阶停止,并将掉队视图之后的所有指标推迟。
  11. 一次性成果(发布需要在下周上线的页面),还是持续积累的资产(文档集在未来两年以此为基础)?持续积累会提高稳健性这一阶的优先级,并纳入配套代码仓库和由 CI 运行的检查点。一次性成果则会将三者全部删除。
  12. 编写工时上限是多少,谁负责每次发布时维护此页面?没有指定负责人,就会直接删除润色这一阶和配套代码仓库。

下面两种排序(梯子的停止阶数和 KPI 顺序)都是默认值,而非定律。根据这些回答,以及你对团队现状的了解,重新排序:已有分析流水线会让掉队视图几乎不费成本;已有沙盒会让真实数据这一阶几乎不费成本;这两种提升都优先于默认顺序。

工作流

步骤顺序是有意安排的:先确定目标(步骤 2),再确定证据(步骤 3),然后安排活动(步骤 4-7)。反过来是最常见的失败方式——作者先起草操作指南,再补写目标,最终交付的只是披着学习目标外衣的功能介绍,因为步骤是按产品能做什么来选的,而不是按学习者需要什么来选的。这种顺序有个名称:逆向设计(Wiggins & McTighe,《Understanding by Design》);团队对此提出异议时,可以用这个名称。

  1. 确定模式。 对于审计,先让某人从头开始体验现有教程(步骤 11),并收集真实的放弃节点——绝不要只靠阅读就重写。对于从零开始的项目,转到步骤 2。
  2. 在起草任何内容之前,将学习目标写成一个以学习者要执行的动词开头的句子,并用它判断哪些内容不在范围内。The Good Docs Project 的表述是“完成本教程后,你将能够……”,后面接 设计、评估 或 开发 之类的动词。如果无法检验学习者能否做到,这就不是一个目标。弱/强表述对照示例请参阅 ./references/worked-examples.md。
  3. 确定如何判断学习者是否达成目标:包括最终检查点,以及你将在步骤 11 要求他们独立完成的变体。起草任何步骤之前就要做好这件事;这能防止学习路径偏离目标,变成功能介绍。
  4. 选定要构建的产物。 选择一个不掌握该概念就无法构建的最小成果。更大的项目只会增加输入量,不会增加学习效果。
  5. 在开头明确说明受众水平和先决条件:所需软件须逐项附上检查命令,所需知识须逐项附上链接。一份教程若同时面向两个水平,就会两头不讨好——专业知识反转效应表明,同一个能帮助新手的示例对专家来说会变得多余,甚至产生实际危害。
  6. 搭建概念阶梯(见下文)。每个步骤引入一个新概念,按依赖关系排序,其余内容一律复用。根据该部分的排序,选定停止的层级。
  7. 起草步骤。 每个步骤都要使用以祈使动词开头的标题,并表达完整意思(“连接到数据库”,而不是“连接”),且只包含一项操作。学习者需要打开文件或屏幕时,先说明如何定位。按照概念阶梯要求的形式提供代码、真实运行的预期输出,并在步骤可能失败的地方附上一行指向相应故障排查条目的说明。
  8. 每隔 3-5 个步骤设置检查点(基准值),每个检查点都要定义可验证的状态和可恢复的起点(见下文)。
  9. 撰写结尾。 说明学习者现在能做什么,并集中给出完整的最终产物。然后指向下一个内容象限:
    • 如何指南,介绍实际变体。
    • 参考,介绍相关机制。
    • 解释,阐述原因。
  10. 对正文进行一次人性化润色(绝不要处理代码块),使用你偏好的 humanizer skill,让文字读起来像工程师在讲解,而不是模型在叙述。
  11. 使用符合声明水平的真实学习者,按照下方的通过门槛进行验证。 修正并重新运行,直到通过为止。
  12. 添加埋点并记录。 定义完成事件和各检查点的流失情况视图。如果你的环境支持持久化记忆,请存储学习目标、受众水平、所选环境以及有意排除的概念,确保相关教程保持一致,不会彼此矛盾。

概念阶梯

按照概念间的依赖关系排序,而不是按照产品的架构排序。每一层都要从头到尾完成,再添加下一层:

层级增加的内容学习者看到的内容每次发布都要付出的成本
骨架能运行的最少代码有响应的东西几乎为零:只有安装命令出问题时才需要处理
核心概念教程要讲解的能力承诺实现的行为每次有破坏性变更都要花 1 小时,而这笔成本无论如何都得付
真实数据使用学习者自己的输入,而非硬编码值他们的数据在流程中流转固定测试数据、种子脚本和沙盒会在架构变更时发生偏移
健壮性错误处理、验证有意处理的失败一条错误处理路径及其预期输出;在各次发布中保持稳定
打磨完善配置、测试、结构生产环境的样子持续性的工作:配置、锁文件和测试套件会自行腐坏

行的顺序就是构建顺序(每个层级都依赖其下方的层级),因此这不是排名。排名决定你该在哪一层停下,因为骨架和核心概念都不可或缺:缺少它们就无法实现目标。

  • 价值:核心概念 > 真实数据 > 健壮性 > 打磨完善
  • 编写与维护的工作量:打磨完善 > 真实数据 > 健壮性 > 核心概念 > 骨架
  • 效率:核心概念 > 健壮性 > 真实数据 > 打磨完善

在效率方面,健壮性高于真实数据,但在价值方面则低于真实数据:编写一条有意设计的失败处理路径只需 1 小时,而且每次发布都能沿用;而真实数据会带来固定测试数据和沙盒,它们会在下一次架构变更时出问题。默认停在:核心概念加健壮性。 当目标明确要求使用学习者自己的输入,或沙盒已经存在、因此增加这一层几乎无需成本时,再提升到真实数据。

这种排序会把打磨完善排在最后——生产环境的样子最终是读者需要的,也最难维持。即便如此,当教程同时承担内部工具或企业工具的入门培训时,也应将其提前,因为此时生产环境的样子_就是_目标。如果访谈中没有为这个页面明确负责人,就从计划中删掉打磨完善这一层,而不是把它搁在最末尾:无人负责的层级会以范围的形式重新出现,然后逐渐腐坏。

两条规则可以确保这套阶梯是在教学,而不是发号施令。

每一步只引入一个新内容。 如果某一步引入了两个陌生概念,而结果又不正确,学习者就无法判断是哪一部分出了问题,反而会责怪自己,而不是页面。

逐步减少引导。 前面的步骤提供完整的演示示例,后面的步骤逐渐减少提示,直到学习者开始自己编写代码(见下方的阶段表)。如果第 7 步和第 1 步一样需要照抄大量内容,这个教程就没有教会任何东西:学习者虽然有了一个能运行的应用,却没有获得可迁移的技能。

阶段代码块形式
前期完整文件,包含所有导入内容,粘贴后即可运行
中期仅提供新增代码行,注明文件名和插入位置
后期给出需求和预期输出;答案只需点击一次即可查看

逐步减少引导是一个有明确名称的认知负荷研究结论(Renkl 及其同事);上面的三阶段划分是本技能为实现这一效果设定的基准形式,并非该研究结论本身的一部分。

“一键即可查看”绝不意味着直接给出一大段完整代码。应当分级展示答案,让已经接近完成的学习者只需获得最小的推动就能继续:

  1. 指向相关参考页面。
  2. 伪代码。
  3. 将关键代码行留空的解决方案。
  4. 完整解决方案。 这个编号表示学习者逐步升级的过程,而不是编写顺序。如果你只能编写其中几级,请按每小时编写成本所带来的价值排序:blanked solution > pointer > full solution > pseudocode。
  • 留空代码块是完整解答删去三行后的版本,教学效果最好。
  • 指引是一个链接。
  • 完整解答可以直接复制粘贴,教学效果最差。
  • 每次 API 变更时,你都要重写伪代码说明,而留空代码块已经说明了同样的内容。

第 3 级之所以有效,是因为完成问题效应(Paas,1992):填了一部分的代码块与完整代码块的教学效果相当,却需要学习者投入更多思考。本节提到的认知负荷效应可以用来论证一种形式,但绝不能用来推导一个数字。

所有会分散学习者注意力的东西都会削弱概念本身:未解释的标志、第二种包管理器、重命名的变量、无关的警告。通过起始仓库或脚手架命令预先提供样板代码——输入它毫无教学意义。

检查点

检查点让学习者无需相信自己的阅读理解,就能确认系统处于你所说的状态。检查点始终包含三个部分:

  1. 能产生可观察输出的命令或操作。
  2. 完全一致的预期输出。
  3. 不匹配时的恢复途径——故障排除条目,或可还原到正确状态的快照。

检查点还承担着快速入门指南中的预期输出行无需承担的职责。教程篇幅较长,学习者可能中途放下后再回来,因此要让每个检查点都成为恢复点——配套仓库中的分支或标签、幂等的种子脚本,或说明如何“重置到第 N 步”的文档。第二天回来的学习者可以从上一个通过的检查点继续,而不必从头开始。

配套仓库的分支若与已发布的步骤脱节,还不如没有仓库;学习者会相信代码而不是说明文字,最终进入文本从未描述过的状态。

语言与可靠性

Diátaxis 直言不讳地指出:「教程必须让人充满信心」,而且「构建得足够完善,不会出错;教程对每位用户、每次都能奏效」。一步失败造成的损失,大于三步成功带来的收益——学习者会认为自己不够聪明,然后离开。

  • 写「在本教程中,我们将……」,然后写「首先,执行 x。现在,执行 y。」用第一人称复数引导整个过程,用祈使句说明操作。
  • 在展示结果前说明预期:「输出应该类似于……」。
  • 提醒读者注意容易忽略的地方:「注意……」「记住……」。
  • 在结尾给予肯定:「你已经构建了……」。
  • 不提供选择或替代方案。学习者还不了解产品,就必须先决定走哪条分支,这会让进度停滞。
  • 解释控制在一句话,并提供链接。解释是最难抵挡的诱惑,也是学习者在构建过程中最快失去兴趣的原因。Procida 在 Diátaxis 框架之外,也把这种自律说得很具体:「我解释或说什么几乎无关紧要,唯一重要的是我让人们做什么,以便他们学习。」他将这条准则追溯到一群青少年:通过动手实践,他们学习 CSS 的速度比听别人讲解更快。
  • 有意在各步骤中重复同一种模式。Diátaxis 的说法是:「重复并非最好的老师——有时它是唯一的老师」;只有作者才会觉得这显得多余。
  • 绝不要把恢复提示写成判决。「你本该先设置密钥」会让卡住的学习者觉得自己失败了;应描述当前状态:「如果未设置密钥,此操作会返回 401;设置密钥后重试。」

Bjork 所说的理想难度(会减慢掌握速度,但能增强记忆)与 Diátaxis 的零摩擦原则听起来互相矛盾。其实并非如此,因为它们作用于页面的不同部分。主路径(环境、命令、学习者输入的代码)受可靠性原则约束,其中的每一次失败都是你的缺陷。

学习者必须记住的概念可以带有刻意设置的难度,但只能作为可选内容,在通过检查点后清楚标明,并提供答案:

  • 运行前预测输出。
  • 故意弄坏某个部分并阅读错误信息。
  • 为该功能增加一个参数。

因遗漏或含糊而产生的难度不是理想难度。学习者会把它当成自己的失败,然后离开。

受众与情境的区分

每位读者使用的内容都相同:相同的目标、相同的步骤、相同的检查点。读者的身份只会改变两件事。

个人学习者,自助式产品。 他们随时都可以放弃,也不欠你任何东西。

  • 提前展示可见结果。
  • 确保整个流程都在免费套餐内。
  • 在最后一个检查点之前,绝不要出现账单提示。

加入内部或企业工具的团队成员。 他们不能放弃,因此失败模式不是关掉标签页,而是默默地理解错误。

  • 在第 1 步之前,说明他们需要哪些访问权限,以及由谁授予。
  • 为每条需要联网的命令提供离线或本地部署版本。
  • 增加可展示给审核者的检查点。

通过门槛

没有人会为教程发布验收门槛,因此这六项标准只是基线——提出时要说明这一点,并让用户在据此衡量之前删减或添加标准。只有第 4 项的 15-60 分钟范围有来源(Good Docs Project 给出的明确范围)。

符合所声明受众水平的人在一台干净的机器上从头到尾运行教程,且以下六项全部满足,教程才算交付:

  1. 每一步的实际输出都与文档中记录的输出一致。
  2. 每个检查点都能在没有作者帮助的情况下通过。
  3. 第 1 步之后不会发现任何先决条件——无论是软件还是知识。
  4. 实际耗时落在所声明的预估范围内,且总体不超过 15-60 分钟。
  5. 学习者无需帮助,就能在一个你未带着他们操作过的变体上再次完成目标。
  6. 每次放弃或犹豫都能追溯到具体步骤并得到修正,而不是被平均掉。

第 5 项是区分教程与冗长快速入门指南的关键。如果这一项不达标,说明引导梯度淡出得太晚,或根本没有淡出——学习者只是靠复制代码做出了一个能运行的应用。

KPI

Kirkpatrick 的四个层级可用于对这些指标分类,并指出其中的陷阱:培训团队只衡量第 1-2 层就止步,因此,一份完成率很高却没有行为改变的教程,多年来都会被视为成功。

以下各行按仪表化优先顺序排列(衡量每小时接入工作的价值,而非按层级排列):

指标层级接入成本解读
冷启动测试的迁移测试通过率2 学习几乎为零——通过门槛的第 5 项已经会运行该测试;只需记录结果这是教程中唯一能证明用户形成了技能,而不是把应用拼凑出来的证据
各检查点的流失率1 反应一小时:每个检查点记录一个事件,检查点已经存在某个检查点成为主要流失点,说明步骤有问题,而不是概念太难——先修复该步骤,再考虑重写相关概念
引用特定步骤的支持问题或议题2 学习收集成本几乎为零,但需要持续查看每个问题都会定位到一句有误或含糊的说明,便于修正
完成率(到达最后一个检查点的人数 / 开始人数)1 反应有了流失事件后,获取成本为零页面是否能留住用户的注意力;它无法说明是否有人学到了东西
完成时间中位数与标注的预计时间之比1 反应有了流失事件后,获取成本为零标注 30 分钟、实际却耗时 70 分钟,会破坏页面的首要承诺;重新测量后再修订标注
一周内在产品中执行相同任务的完成人数占比3 行为需要持续投入:学习界面和产品必须共用同一身份,并在发布前确定完成教程却未在产品中重复操作,说明教程教会的是如何完成教程,而不是如何使用产品
  • 价值:行为占比 > 迁移测试 > 各检查点的流失率 > 支持问题 > 完成率 == 完成时间中位数
  • 接入成本:行为占比 > 支持问题 > 各检查点的流失率 > 完成率 == 完成时间中位数 > 迁移测试
  • 效率:迁移测试 > 各检查点的流失率 > 支持问题 > 完成率 == 完成时间中位数 > 行为占比

完成率和完成时间中位数在两个维度上并列,原因只有一个:它们是对同一组开始和结束事件的两种解读,因此无法单独获取其中一项,而且都无法定位缺陷。**默认做法:为前两项添加埋点,并查看第三项。**页面经历一个完整用户批次后,再添加其余指标。

这种排序会忽略行为占比——表中价值最高、也是唯一能体现产品发生变化的指标。不过,如果教程被视为激活步骤,或者有人要求该页面证明其人员编制合理性,就应将它提升到所有指标之上。没有成本更低的指标能回答这个问题,而且必须在发布前完成身份关联工作,否则首批用户的数据将无法衡量。

不要根据外部信息设定数值目标:目前没有可信的已发布开发者教程完成率基准,因此应将每项数据与本教程的上一版本进行比较。 通过在 CI 中定期运行每个检查点对应的分支,并在提交时运行,防止内容过时。产品变更时,教程就会失效,而文档仓库变更时不会。

调用方式及返回内容

回答前,先判断用户给出的请求属于以下三种情形中的哪一种。交付错误内容是代价最高的失误,因为它看起来像是已经完成了。

用户说模式你返回
“编写一篇教程,教大家如何从我们的 SDK 流式传输响应”Greenfield访谈,然后根据大纲模板起草页面
“没人能看完我们的 Webhook 教程,修一下”Audit按步骤列出优先级排序的问题,然后重写有问题的步骤
“这是教程还是操作指南?”Scope call分类、理由,以及负责另一种回答的关联技能

Greenfield。 按照 references/tutorial-outline-template.md 的章节逐一编写,并交付完整页面。切勿交付预期输出代码块中仍是占位内容的页面——未实际运行的输出代码块,正是这项技能旨在避免的问题。如果无法运行命令,请指出哪些代码块未经验证,并为作者提供运行清单。

Audit。 返回表格,不要写成散文:步骤编号、出错之处、属于四种事件中的哪一种(缺陷、隐藏前置条件、概念缺口、阻力——参见 references/verification-protocol.md),以及修复方法。按该步骤会阻碍的学习者人数排序,而非按页面中的先后顺序排序。

两种模式都适用: 开始前明确目标和受众的水平。凭空猜测目标和水平,就会导致内容变成功能介绍。

失败模式

症状修复方法
首个操作前先介绍架构或理论直接进入首个操作;链接到概念文档
一个步骤同时引入两个新概念拆分步骤;拆分后的每部分都要有各自可观察的输出
学习者到最后一步还在复制粘贴更早地减少辅助:先改用差异块,再改用需求
教程按操作系统、框架或包管理器分支选定一种;链接到其他变体;不要在主流程中加入分支
检查点只说“你应该会看到类似这样的内容”,却没有准确输出粘贴实际运行时的真实输出
配套仓库的分支与步骤不匹配根据已发布的步骤重新生成分支;在 CI 中逐一测试
教程需要 90 分钟在检查点处分成两个教程,并说明学习顺序
所有人都卡在同一个步骤为该步骤添加检测,重新从头执行该步骤,并修复步骤本身,而不是周围的文字
把功能介绍伪装成教程回到目标;删除所有与目标无关的步骤
同时面向初学者和专家选定一个水平,明确说明,并在其他地方链接到面向另一类受众的内容
故障排查条目使用“你本应该……”这样的表述改写带有指责意味的措辞;遇到卡点的学习者会把它当作对自己的评判,然后关掉标签页
将此技能中的阈值作为行业标准引用给团队引用前检查 references/published-findings.md;这里的大多数数字都是自行设定的基准值

参考资料

  • 查看 ./references/tutorial-outline-template.md,了解页面框架和逐节规则。
  • 查看 ./references/worked-examples.md,了解关于步骤、逐步减少指导、检查点和审计输出的正反示例。
  • 查看 ./references/verification-protocol.md,了解由学习者运行的测试协议,以及用于保持检查点有效的 CI 作业。
  • 查看 ./references/published-findings.md,了解每条规则的来源,以及哪些数字是此技能自己的基准。
  • 查看 samber/developer-relations-skills@docs-code-sample-standards,了解示例代码政策、测试和各语言间的一致性。
  • 查看 samber/developer-relations-skills@developer-troubleshooting-docs,了解步骤所链接的错误页面。
  • 查看 samber/developer-relations-skills@developer-docs-structure-audit,了解教程应归入操作指南、参考资料还是原理说明。
  • 查看 samber/developer-relations-skills@developer-education-strategy,了解课程体系、课程和认证。
  • 查看 samber/developer-relations-skills@engineering-blog-post,了解如何撰写叙述性文章,介绍某项功能的构建过程,而非分步教程。
  • 查看 samber/developer-relations-skills@developer-how-to-guide,了解面向目标的操作指南;有经验的读者需要的是这类指南,而非教程。

评论

支持 Markdown