CS61A 是 Berkeley 提供的 Python 版 SICP (Structure and Interpretation of Computer Programs)课程,这门课让我眼前一亮,因为讲师的教学方式非常出色,而且当年我也是因为这门课知道了有 Python Tutor 这么个神器,进而了解到 Philip Guo 的一些信息——你可能听说过他的作品《Phd grind》,可惜的是他在 2020 年的时候决定下线他的 博客、Podcast 以及所有的 Youtube 视频内容(我在 Hope in Source 找到了他最后的三部曲 [1, 2, 3]... 真应该多写一些文章赞美他的)。

好吧,似乎跑题了,我们继续回来说 CS61A. 老规矩,先说我理解的怎么教,再讨论教授了些什么。

下面是一些相关信息:

  • 课程主页:https://inst.eecs.berkeley.edu/~cs61a/fa20/ ,我使用的是 2020 年版本;
  • 自动评分:使用的是 OK ,可离线测试样例(在 这个页面 可看到允许所有用户提交的课程版本)。
  • 学习方法:仔细地阅读 Syllabus 页面,建议先阅读 Textbook, 看 YouTube 上面提供的 Lecture录像,借助幻灯片复习,一些概念还是不懂的话看 QA 录像,做 Lab, HW & & Project. 通常每一堂课对应视频录像列表的第一 P 中 John 会告诉你接下来要干什么。自学的时候没有 Office Hour, 没有 Discussion, 更没有 Tutorials 环节... 毕竟没有给 UCB 缴学费,全靠自己(好在所有的作业都有充分的提示,以及会通过交互式问答确保你理解了题意)。
  • CS 61A 课程相关的所有源码可以在 GitHub 找到:https://github.com/Cal-CS-61A-Staff

注意:在 CS 61A 中,我们感兴趣的是教你编程,而不是教你如何使用一种特定的编程语言。我们考虑了一系列控制程序复杂性的技术,例如函数式编程、数据抽象和面向对象编程。对完全没有编程经验的人来说,学习 CS 61A 可能要花费更多的时间,如果想提前积累一些编程经验,可以考虑 CS 10: The Beauty and Joy of Computing / Data 8: The Foundations of Data Science / CS 88: Computational Structures in Data Science (在 Syllabus 页面中都有介绍)

CS 61A 的教育理念

用户自由是在线教育的核心优势

61A Fall 2020 Lecture 2 Video 1 中 John DeNero 提到了他对课程录制 ⏺️ 的一些思考 🤔 ,他认为像 EECS 这样的专业可以通过提供分段录制好的主题知识点讲解视频来帮助那些在课堂上错过(Missing)部分内容的同学进行回顾,而且可以自由地选择跳转到某一页,或者使用倍数播放来加快或减慢讲课节奏。

对比之下,传统的公开课视频录像(比如 MIT OpenCourseWare)存在的缺点暴露无遗,视频中太多的冗余。这些冗余对于面授课程而言是必须的,人的注意力无法长时间集中,好的教育工作者能体会到这一点——因此在实际的授课过程中,一个具有良好经验的讲师需要很有节奏感地将各个知识点分散在合适的时间进行讲解,中间可能会穿插非常多的举例,也有可能会有讲故事环节,到重点环节的时候 Attention Please 一下,说明我们的聊天结束了,接下来是需要做笔记的关键知识了。这就导致了讲座的录像不适合用于快速复习,通常的解决方案是:1. 提供课程的演示幻灯片(PPT 或者 PDF 格式文件);2. 提供时间戳,告知视频不同的部分讲解了哪些内容;3. 提供字幕脚本。更多的材料总是好的,但这些方法治标不治本,它们本质上并没有发挥出互联网视频的优势,选择权在用户手中。因此我们可以提供短的内容干练的讲解录屏,而不用担心学生会因为知识过于密集而无法掌握,因为他们总是可以选择暂停、甚至是明天再看下一个小节。

更让人舒服的一点是,John 的每个幻灯片都提供了不同的版本:

  • Full: 完整版,能看到每个内容是如何一点点在画面中出现的;
  • 1pp: 每个页面就是当前画面完整展示后的内容;
  • 8pp: 每个页面对应原幻灯片中的 8 个页面,这个适合做复习。

Powerpoint 在导出 PDF 时提供了这样的设置,但我很少看到有人使用。这其实和视频录像一样,如果你只提供一个 1pp 版本,便会让学生的选择变少,尤其是当你的演示内容可能会遮挡画面中之前存在的内容时,体验很差。

甚至在答疑环节,还根据学生水平的差异提供了“几乎毫无经验“和“有经验“两个版本,感动。

软件工程 to 教育内容工程

John 从 2013 年开始录制 CS 61A 的视频,每年都会看看某个主题的讲解是不是有更好的版本,比如用 15 年版本替换(Ver.2),到了 20 年又替换 15 年那一版(Ver.3),这样你就不用每年都去把课程全部重新录制了。这其实就类似于软件源代码的重构过程,很多时候我们承受不起完全推翻重新设计的成本,所以选择一种比较敏捷的方式进行迭代开发,保留核心设计思路,不断地打磨细节最终臻于完美。Composing Programs 是课程的讲义,我特别欣赏这种花很多年的时间去设计、创作、整理、改进一个作品的态度,而不是在有限的时间内去交付出一个项目,十分扯淡。

人们最终会意识到,像计算机这样的前沿学科,一个又一个版本地出书是不合理的,国内写高质量技术博客的人群基数本就少,能写出书来纯粹是因为没有更好的。倒不如在某个地方永远维护一个最新的社区版本,有勘误就立刻更新,有合适的内容也适当地加上。我也坚信,将来的内容出版流程一定会往着自出版的方向走。

CS61 A 的另一个特点是细粒度地获取反馈。常见的课程评价模式是在课程临近结束的时候,教师给学生一张表格,需要给出对这门课的整体评价。而在 CS61 A 中,几乎在每次 Lab 的开头,John 都要求学生填写一张调查表,收集对当前 这个Lab 设计的反馈。我想这才是真心希望改进课程质量的老师的行为,具体到每一个 Case 的询问才有意义!