Contents

Days I Studied CS61A

前言

今天是我完成 CS61A 的日子。从我开始学习到结束,历时一个半月。当然我是有一点基础的,所以其中某些部分会进行跳过,但是总的来说,基本所有的 lecture 我都会过一遍,如果遇到难啃的部分甚至会再看下 discussion 部分。这篇主要是记录我这段时间的感受和收获。

缘起

学习这门课程并不是误打误撞,随性而起的。

起因是我在豆瓣的 程序员书单看 到 计算机程序的构造和解释 这本书。其实很早之前就听说过这本书,但是那会翻了以下,发现 Lisp 语言对我来说还是有些恼人。各种括号,是我还没理解那属于老法师的浪漫。所以就放下了。

后来读了黑客与画家,里面作者对 Lisp 大为推崇,而且他对于语言的观点让我耳目一新。由此及彼,我想起这之前没看下去的上述那本书。

既然我还没有时间抽出来学习 Lisp,它又是一门函数式编程语言,现在使用的人相比其他流行的语言来说是不多的,遇到我这种情况的人,应该不少,或许已经有人把它用 JS Python 之类的解释型脚本语言翻了一遍?

果然 SICP JSSICP using Python3 – CS61A textbook 是有的,在我输出 sicp 关键字的时候已经跳出来 jspython 这两个提示词。我想也许是它俩的函数式编程特性支持的太明显了吧。

一看有一版是竟然是 UCB 的教材,那自然质量是有保证的。

一看课程表,还有 lecture 视频可以看,各种 lab, hw, project 都是公开的。我何不趁此机会体验一下国外知名大学的教育呢?随然没有身在其中,失去氛围的熏陶,但是我还是觉得花时间去跟学,会有不少收获。

秉持这这种新鲜感和对 sicp 这本原书和 UCB 的慕名,我开始了 CS61A Fa20 的学习。并在推特上用一条 thread 进行记录。

过程

体验

可以看出,授课老师是认真备课,而且在不断改进课程的,因为每个视频都是不同时期录制的,只有老师觉得需要改进的部分才会进行重新录制。

有一个细节,每一个 labhw 基本都是相同部分的内容,但是他们被安排在相近的日期之内,hw 有 hint video, lab 可以找 TA 进行协助。所有的一切一切都只在帮助你更好地掌握知识。

收获

总的来说,我并不是零基础,因此这门课给我也不是进行入门的。

这一个半月下来,给我印象最深的部分就是:

  • 递归

最开心的时候,还记得是在做最后一个 project, 发现竟然可以通过两个函数相互调用,递归地去解决一个问题。这个时候实在是太有成就感了。我相信这种左右搭右手式的解决方法将会在我的脑海里存在,一直存在,因为那个时刻给我的印象太深刻了。

  • 抽象

这门课其实前半部分其实一直花很大篇幅在传递一个信号:将问题分析出来,抽象,再写代码解决问题。

前三个 projects 本质上就是要培养起这个能力。

然后最后一个 project 带你进行难度上一个台阶的问题。

OOP 编程中去完成一个函数式编程的解释器和执行器。通过这个设计,既然掌握了 OOP ,又深入理解了函数式编程的奥秘。可以感受到课程老师们的用心良苦,想起国内大量的 PPT 阅读者,不难理解为什么每年毕业季都是最难就业季。

  • scheme

终于到后半部分,终于来到重头戏, scheme 。因为我之前接触过 OOP 等概念,所以前半部相当于复习。

这部分是收获最大的部分:

学习完这两部分,我甚至可以自己去写一门微语言了。其实实现简单的运算不难,主要就是解释器和执行计算的执行器组成。远看以为发明一门语言是一个很庞杂的工作,其实还是由一些最基础的组件组成。根本没必要畏难。所有复杂问题都可以拆解成小问题,一步一步去解决。如果不行,那是问题还没被正在理解和拆解罢了。

Last but not least

这种形式的自学,比起在课堂上听老师读 PPT ,算得上是一种真正的受教育。

课上有举例,有一言不合 show me your code, 有答疑会在专门的讨论课得到解答。

课后有测试机,帮助你实时验证你的输入,就像在做 LeetCode 一样。

当然,还有体验不到的 TA 协助,以及 office time.

这才知道为什么那些在校生都在看这些,才知道英语世界的资料是如此的丰富,才知道自己以前错过了这么多宝贵的资源。

迈开腿,翻越那堵墙,去发现更大的世界,很多世界顶级的内容在等着你。

What is next?

接下来,我准备在休息时间,做一下这些:

这几项估计我要学上个大半年。期待学完之后的自己,对接下来的挑战充满期待哈哈哈!