计算机科学视频班是一门零基础课程,用以帮助人们在最短时间内掌握计算机科学的精髓。它是近 30 年计算机学术研究和工程实践,再加上超过4年面向社会零基础教学实践的结晶。
课程吸取了世界上主要的计算机入门教学方式的优点,去掉了它们阻碍初学者理解甚至让他们望而却步的各种问题,以至于完全零基础的外行人士也可以在短短两个月之内掌握大学博士阶段才可能学到的内容。
我从来没见过任何大学有这样的教学质量,所以可以说它超越了世界上所有大学的教学方式。这些内容足以建立起坚实的知识基础,使学生对于理解 IT 和 AI 业界的各种技术从容自如。
几年来,这门课程已经成功教会了超过一百人。他们来自世界各地,有着各种背景。比如13岁的初中生,带两个孩子的全职主妇,快递员,医生,律师,投资者,公司CEO,各种专业的硕士,博士,教授,研究员……
课程采用 观看课程录像 + 一对一练习辅导 的方式进行。同学以自己方便的时间和进度观看课程录像,可以在微信上随时提问,然后做大量的练习,并从微信得到及时的提示和反馈。
课程录像来自 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 方向上的能力超乎了我的预期。我拿了一个之前上课大家都没做出来,连我自己都没想清楚的问题给他,经过几次反复之后,他居然把它做对了。于是我明白了,看视频的效果并不亚于实时授课。这对于我和学生都更加省力和方便,所以何乐而不为呢?
所以我觉得视频课程应该是一个合理的方式,它的效果应该和实时授课的班级差不多,甚至在某些方面更好。
顺利完成视频班,或者之前参加并顺利完成基础班,阅读班的同学,应该有机会得到进一步的教学,也是使用录像进行。已有录像的范围包括之前进阶班,continuation 专项班的内容。
进一步的教学也可能包括我从来没讲过的内容,比如 Web 编程,大数据构架,数据库,AI 等方向。如果有足够人数的学生对这些内容感兴趣,我可以随时组织小班进行教学。所以如果你对某些技术感兴趣,希望我对此授课,可以提前告诉我。
因为进阶内容的级别很高,所以我会对学生有比较高的要求,具体传授的内容也会有一些限制,所以也不一定会提供教学。请大家理解。
具体的内容,方式和价格,可以发信息向我询问。但视频班还没有完成的同学,请不要提前申请。