像管理代码一样管理课程:用Git和Markdown构建可版本化的课程书
如果你带过任何一门超过30人的课,大概率体会过那种“内容满天飞”的失控感:课件在网盘,作业在系统里,参考答案散落在聊天记录,课程大纲早在开学第二周就被未读消息冲走了。我最近把一门专业课的所有教学资料重构为一个叫 coursebook 的小项目,目标很朴素:一门课只维护一份像书一样完整、像代码一样可版本化的文档。每周目标、讲义、练习、评分标准、延伸阅读全部按章节组织,既能在线浏览,也能一键导出PDF。课程讲师、助教、教学设计师,还有需要系统自学的同学,都能从这份手册里各取所需。
这里面的门道,不只是“排个板式”,而是把课程从一堆零散生产资料中打捞出来,变成一个有生命周期、有版本、能迭代的“产品”。这篇内容就是一个相对完整的复盘,包含设计思路、章节模板、构建流程,以及我在实际维护中踩过的坑。
1. 内容整体设计与思路拆解
1.1 课程书的本质:把散装资料变成“单一事实源”
我先说一个最直接的观察:大多数课程内容不是太少,而是太分散。开课前的确有教学大纲,但大纲只停留在“第几周讲什么主题”的粗粒度上。真正的教学细节,比如某道作业题的具体要求、某个概念的定义口径、某次课堂讨论的引导问题,可能分散在三个不同版本的PPT、两份共享文档和六条聊天记录里。
coursebook 想做的事情,是把这些散装内容收敛到一份文档里,形成“单一事实源”。不是说PPT不能存在,而是所有内容的最终解释都指向这份课程书。学生问“这周要做什么”,不用翻群聊,去书里找答案;助教批改作业时拿不准标准,去书里翻评分维度;下轮课程换讲师,也不再需要交接一个近百G的网盘文件夹,交接一个Git仓库就行。
这个思路在软件工程里很常见:一份代码、一套配置、一个权威版本,任何展示层都是它的派生结果。课程设计其实也适合这么管。书里是所有教学决策的沉淀,而课堂、PPT、公告只是这些决策的“渲染层”。
1.2 与传统教材和PPT讲义的差异
很多人第一次听到这个想法会问:那不就是把传统教材电子化吗?还真不是。传统教材覆盖的是一个学科体系,面向的是广义读者;coursebook 面向的是“我这门课、我这学期、我这批学生”,它是情境化的,也是高更新频率的。
- 更新周期:传统教材动辄三五年一版,课程书可以每周更新。某一周发现某个例子更有说明力,直接改,不需要等再版。
- 内容粒度:教材追求体系完整,所以要面面俱到;课程书只关心本课程的学习目标,没用的内容再漂亮也不放。
- 评估衔接:教材很少直接告诉你“作业按这个量规评分”,课程书强制要求把作业、评分标准、截止日期写在同一处。
- 输出形态:纸质教材是终点,课程书更像源数据,可以生成网页、PDF、Epub,也能变成每周发给学生的讲义。
1.3 三个关键设计决策
我在设计这个项目的时候,做了三个比较关键的取舍,直接决定了后期好不好用。
| 决策 | 具体做法 | 理由 |
|---|---|---|
| 逆向设计 | 先写学习成果和评估方式,再补具体内容 | 避免“内容膨胀”,每章都知道为什么存在 |
| 纯文本优先 | 所有内容用 Markdown + YAML 头信息 | Git 能精确 diff,构建工具成熟,不绑定商业软件 |
| 模块化拆分 | 按周组织,但按“模块”分组 | 学期重排时,可以整体移动模块而不是逐行复制 |
表面上看这些都是常规选择,但实际维护后会发现,它们决定了这份课程书能不能“活着”。尤其是模块化:我这个学期是三学期制,课程分布在 14 周里;下个学期改成 16 周,我只需要调整模块在周历上的映射,不需要重写任何章节内容。