计算机科学视频班是一门独一无二的课程。这门课程传授的不是普通的编程技术,而是计算机科学最深刻的精髓。它培养的不是普通程序员或者软件工程师,而是具有高级思维能力的计算机科学家和系统构架师。
课程内容经过了人性化的精心设计,充满乐趣,值得反复琢磨。从最基本的概念开始逐渐发展,不含冗余繁琐的概念和阻碍理解的成分,顺利达到极深刻的概念,所以无论是零基础还是有大量经验的人员都能从中获益。课程采用独特的授课方式,不同于任何大学教育或培训班。可以说它超越了一切现有的教育方式。
在 AI 技术高速发展的今天,掌握了计算机科学精髓思想的人非但不会被 AI 代替,反而能借用 AI 放大自己的能力,在 AI 的帮助下如虎添翼,独当一面。当然,计算机科学对于理解和构建 AI 的核心技术也会有巨大的帮助。
课程采用 观看课程录像 + 一对一练习辅导 的方式进行。同学以自己方便的时间和进度观看课程录像,可以在微信上随时提问,然后做大量的练习,并从微信得到及时的提示和反馈。
课程录像来自 2024 年初进行的计算机科学基础班第五期,也就是这个系列课程最新,最完善的版本,对教学内容进行了一系列重大的改善和提高,并且扩展了内容,使它更加接近业界工程实践。
练习辅导是一对一的微信辅导方式,学生看录像和做练习时遇到问题,都可以随时提问,及时得到提示和帮助。虽然课程只有 7 节课,但由于每个练习会及时得到提示和反馈,实际的学习时间大大超过传统课堂。这种教学方式避免了普通课堂的各种不灵活性,给予了学习者最大的方便和灵活性。这使得工作学习繁忙的人士也能抽空完成学习。
视频班内容是基于第五期基础班课程的录制。为了入门方便,采用 JavaScript 进行教学,但课程的内容完全不依赖于 JavaScript,可以用到任何其它语言。课程包括了纯函数式编程,命令式编程的精华,最后可以选修一节课,用以理解业界常用的编程语言。可选的语言包括 Python, Java, Rust, C++。
所以课程的大概内容如下:
第一课:函数。与一般课程不同,课程不从所谓“Hello World”程序开始,也不会叫学生做一些好像有趣而其实无聊的小游戏。课程一开头就讲最核心的内容:函数。关于函数只有很少几个知识点,但它们却是一切的核心。只知道很少的知识点的时候,对它们进行反复的练习,让头脑能够自如地对它们进行思考和变换,是教学的要点。我为每个知识点设计了恰当的练习。第一课的练习包括了对函数概念的理解和精髓的 lambda calculus 知识。
第二课:递归。递归可以说是计算机科学(或数学)最重要的概念。我从最简单的递归函数开始,引导理解递归的本质,掌握对递归进行系统化思考的思路。递归是一个很多人自以为理解了的概念,而其实很多人都被错误的教学方式误导了。很多人提到递归,只能想起“汉诺塔”或者“八皇后”问题,却不能拿来解决实际问题。很多编程书籍片面强调递归的“缺点”,教学生如何“消除递归”,却看不到问题的真正所在——某些语言(比如 C 语言)早期的函数调用实现是错误而效率低下的,以至于学生被教导要避免递归。由于对于递归从来没有掌握清晰的思路,在将来的工作中一旦遇到复杂点的递归函数就觉得深不可测。
第三课:链表。从零开始,学生不依赖于任何语言的特性,实现最基本的数据结构。第一个数据结构就是链表,学生会在练习中实现许多操作链表的函数。这些函数经过了精心挑选安排,很多是函数式编程语言的基本函数,但通过独立把它们写出来,学生掌握的是递归的系统化思路。这使得他们能自如地对这类数据结构进行思考,解决新的递归问题。
与一般的数据结构课程不同,这个课程实现的大部分都是「函数式数据结构」,它们具有一些特别的,有用的性质。因为它们逻辑结构清晰,比起普通数据结构书籍会更容易理解。与 Haskell 社区的教学方式不同,我不会宗教式的强调纯函数的优点,而是客观地让学生领会到其中的优点,并且发现它们的弱点。学会了这些结构,在将来也容易推广到非函数式的结构,把两种看似不同的风格有机地结合在一起。
第四课:树结构和计算器。从链表逐渐推广出更复杂的数据结构——树。在后来的内容中,会常常用到这种结构。树可能是计算机科学中最常用,最重要的数据结构了,所以理解树的各种操作是很重要的。我们的树也都是纯函数式的。在熟悉了树的基本操作之后,实现一个比较高级的计算器,它可以计算任意嵌套的算术表达式。算术表达式是一种“语法树”,从这个练习学生会理解“表达式是一棵树”这样的原理。
第五课:查找结构。理解如何实现 key-value 查找结构,并且亲手实现两种重要的查找数据结构。我们的查找结构也都是函数式数据结构。这些结构会在后来的解释器里派上大的用场,对它们的理解会巩固加深。
第六课:解释器。利用之前打好的基础,亲手实现计算机科学中最重要,也是通常认为最难理解的概念——解释器。解释器是理解各种计算机科学概念的关键,比如编程语言,操作系统,数据库,网络协议,Web 框架。计算机最核心的部件 CPU 其实就是一个解释器,所以解释器的认识能帮助你理解「计算机体系构架」,也就是计算机的“硬件”。你会发现这种硬件其实和软件差别不是很大。你可以认为解释器就是「计算」本身,所以它非常值得研究。对解释器的深入理解,也能帮助理解很多其它学科,比如自然语言,逻辑学。
第七课:命令式编程。经过前面六节课,学生已经掌握了纯函数式编程的精髓思想,掌握了计算的本质。第七课的作用是把之前学到的思路扩展到业界常用的编程方式:命令式编程。通常的大学课程,从一开头讲的就是命令式编程,学完整门课程仍然难以理解,而我的课程只需要一节课就把它讲明白。第七课会补充业界常用的循环,赋值,数组等命令式元素,并且把之前的一些重要算法用命令式的方式重新写一遍。
第八课:选修一门业界语言(Python,Java,Rust 或 C++)。学完了前面七节课,学生不只是掌握了 JavaScript 语言,而是掌握了计算机科学的精髓,所以他们会很容易地把之前学到的思想用到新的语言上。所以第八课的内容,会让他们选择一种自己感兴趣的语言,然后把之前学过的内容扩展到这种新的语言上。可选的语言包括业界最常用的 Python,Java,Rust 或 C++。学生最后的练习会用这种语言写出一个第六课那样的解释器,并且增加一些命令式的构造。
学完了视频班课程,学生不但掌握了计算机科学的精髓,而且掌握了至少两种语言。希望迅速掌握其它业界语言的学生,也可以继续选修其它的语言(需要另外收费)。可以在课程结束之后提出申请。
可能有人会怀疑这样的视频教学的效果,说那我还不如上网找些教学视频自己看呢!他们没有意识到这里的不同:
我观察到一个现象,实时上课的效果并不一定比自己观看录播的效果好。由于时间压力,有些同学不能完全跟上讲课的进度,或者性格内向,所以不能有效地提问。每次上课只有少数同学及时提问,对于其他人,看视频的效果其实差不多。
使用视频代替上课,学生可以在任何时候暂停,进行自己的思考,甚至上网搜索相关资料,这样会有更充分的思考时间。思考之后,他们可以在微信上提问。这样上课不爱问问题的同学,都能够比较有效地提问了。所以使用视频来代替实时授课,并不会减少课程的交互效果,反而可能更好。
几乎每次上课都会遇到一些同学临时有事,工作太忙等。有些同学经常不能来上课,课后看录播进行,这并没有影响到他们的学习效果。视频教学给了同学更大的时间自由度,不需要安排固定的时间上课。
实际上对于视频授课,我已经悄悄做过一次成功的实验。之前有个阅读班毕业的同学问我能不能把“continuation 专项班”的录播视频给他看着学习。我是第一次收到这样的请求,想了几天之后,我同意试试。当然,是要收取一定费用的。我收了他比 continuation 专项班还要高的学费,因为现在相当于一对一教学。于是我把视频通过私密的方式给他看,他通过微信向我提问。我还给他一些练习做,并且给他反馈和指导。后来,这个同学在 continuation 方向上的能力超乎了我的预期。我拿了一个之前上课大家都没做出来,连我自己都没想清楚的问题给他,经过几次反复之后,他居然把它做对了。于是我明白了,看视频的效果并不亚于实时授课。这对于我和学生都更加省力和方便,所以何乐而不为呢?
所以我觉得视频课程应该是一个合理的方式,它的效果应该和实时授课的班级差不多,甚至在某些方面更好。