课程即代码:用Git与Markdown打造可追溯的课程内容管理
刚开始做课程的时候,我最大的痛苦不是备课本身,而是课程内容的版本管理。课件改了七八版,最终文件名变成"第三章_v12_最终版_真的不改了.doc",分发到学生手里还是有人拿着旧版来问问题。后来我尝试把课程内容当成代码仓库来维护,用Git管理每一份讲义、练习、考试题,所有的修改都有记录,每一次发布都有标签,学生看到的永远是最新版本——这个思路,就是coursebook。
coursebook,直译过来是"课程手册",但在我眼里,它更像"课程即代码"的一种实践:用软件工程的版本控制、协作规范、发布流程来组织教学资料。它解决的核心问题是——课程内容散落在Word文档、PDF、网盘、聊天记录里,难以维护、难以追溯、难以协作。适合谁用?一线教师、企业培训师、慕课制作团队、甚至打算系统整理自己学习笔记的人。基础要求不高,会写Markdown、会一点Git基本命令,就能跑起来。
这套方法我实践了大半年,踩了不少坑,也总结出一套比较顺手的流程,下面把思路、目录设计、写作规范、协作流程和排查技巧一次讲透。
1. 课程内容治理,先从"版本管理"这味药开始
1.1 传统课程维护的三大痛点
先说痛点,否则你感受不到为什么要折腾coursebook。
第一个痛点是内容漂移。同一门课,讲义、PPT、实验手册、题库可能分散在不同人的电脑里,你更新了讲义上的公式,实验手册里的旧公式还在,学生对照着看,直接懵掉。第二个痛点是版本迷失。电子资源一旦经过多轮修改,文件名和内容经常对不上,时间一长,连你自己都不确定哪份是最新版。第三个痛点是协作混乱。多人合开一门课时,最怕的就是互相覆盖,A老师改了第二章,B老师不知情,又把旧版传了上去。
这三个痛点,本质都是管理问题,不是写作问题。你写课件的水平再高,没有一套可靠的流转机制,内容质量也会被流程损耗掉。
1.2 课程即代码:一次认知上的转换
我第一次听到"课程即代码"这个概念时,脑子里冒出的想法是:难道让我把Word换成Markdown,就算"代码"了?后来理解了,这个词的重点不在"代码",而在"版本管理"。
Git是我用来管理这些"不是代码的教学内容"的底层工具,它是一个分散式的版本管理系统,最早由Linus Torvalds为了维护Linux内核而开发,后来成为整个软件行业的标配。它的工作方式,简单地理解,就是给文件夹拍快照——你每做一次提交,Git就会把当时所有文件的完整状态记录下来,形成一个不可篡改的历史节点。
把课件放进Git仓库之后,我再也没有出现过"最终版"这种谜之命名。每一版教材都对应一个提交ID,可以随时回去查看、对比、回滚。这种"可回溯、可对比、可协作"的特性,正是课程内容治理缺失的那一味药。
1.3 把为什么选Git这件事说透
有人会问,我不学Git,直接用网盘不同步不行吗?我拿实际体验和个人经验来做个对比。
网盘的思路是"同步文件",它保证的是多设备之间文件一致,但对"谁在什么时候改了什么"是没有完整记录的。即使有历史版本,通常也只保留最近几次,且无法对比两个版本中间的具体差异。Git的思路则是"记录状态",它不只是一个备份工具,更是一个完整的时间线。
举个例子,有一次我把第三章的课后习题从5道增加到8道,学生反馈第7题超出大纲范围,我需要快速确认是哪个版本引入的。用网盘我根本无从查起,但在Git仓库里,一条git log -L命令就能追踪这个文件每一行的改动历史,两分钟定位到我加题的那次提交,随后直接回退,干干净净。
另外,Git是分布式的,意味着每个克隆仓库的人都有完整的历史副本,不会因为服务器挂了资料就全丢。这一点在高校和培训机构的场景里非常重要,因为课程资料是具有长期复用价值的核心资产。
1.4 可视化差异对比,写材料不再靠肉眼找茬
课程内容的修订,最常做的事情就是改措辞、调顺序、换案例。以前改Word文档,想对比两个版本的区别,只能用"修订模式"或者肉眼硬看。在coursebook工作流里,git diff命令可以直接输出两个版本之间逐行的差异。
比如我想对比本科和专科两个班级所用的实验手册差异,只要在仓库里建立两个分支或两个标签,跑一句git diff v1.0 v1.1 -- 实验手册.md,所有改动点就以增删行的形式呈现出来。你不再需要把两份文档并排摊开逐字查找,这对动辄上百页的课程讲义来说,省下的时间是以小时计的。
2. 从零搭建一套coursebook仓库
2.1 目录结构,从一开始就分好工
coursebook的目录设计是整个项目的地基。我实践了几轮之后,形成了一套用起来比较顺手的结构,分享出来供你参考。你需要先理解为什么这样分,再按自己的学科调整。
一门前端课程为例,我的coursebook仓库结构大致如下: