UCB CS61A学习总结

一、课程总览

CS61A并不是我接触的第一门计算机课程。在此之前,我已经学完了 CS106L: Standard C++ Programming。这篇文章的重点当然还是想谈谈我学习 CS61A 前半部分 Python 内容时的经历与感受,但不妨先将这两门课做一个对比。

如果说 CS106L 的魅力更多体现在 Avery 和 Anna 对学生各种“奇思妙想”问题的耐心答疑,那么 CS61A 的灵魂,无疑在于 John DeNero 教授的讲解,以及那些令人眼花缭乱的 HW、Lab 与 Project。有人评价 CS106L“毕竟是大三学生教大一学生,思想深度有限”,这种说法倒也并非全无道理;而 CS61A 恰恰是这一评价的反面。John DeNero 总是以一个真正“过来人”的视角,抽丝剥茧、深入浅出地向每一位学习者讲述程序设计背后的思想、原理,以及那些常常容易被忽视的细节。

二、学习体验:为什么选择 CS61A?

和很多人一样,我最初也是通过 csdiy.wiki 接触到计算机自学路线的。在看到 FlyingPig 对 CS61A 的高度评价后,再加上我本身就对 Python 这门语言颇有兴趣,于是最终选择了这门课作为自己真正意义上的的入门课程。而直到开始学习之后,我才逐渐体会到它为何会被如此多人推崇。

1. 出色的课程设计

国外许多优秀的计算机网课都有自己完善的课程网站,CS61A 也不例外。第一次进入 CS61A官网 时,我就被其中丰富到近乎夸张的资源震撼到了:Lecture、HW、Lab、Project、Discussion、Textbook……几乎所有你能想到的学习资源,一应俱全。无论是必须完成的核心内容,还是可供自由探索的拓展材料,都被系统地组织在一起,让学习者能够在大量代码实践中,逐步完成从“理解知识”到“真正掌握知识”的转变。

尤其让我印象深刻的是四个 Project。有两个 Project 都是游戏开发,并且课程已经提前实现好了 GUI 界面;完成核心逻辑后,便可以直接运行并体验自己的成果。这种即时反馈带来的成就感是非常强烈的。作为一个未来希望进入游戏行业的学生,这也是我第一次真正意义上接触游戏开发。虽然并不是完全从零开始“造航母”,但依然让我受益匪浅。

2. 高质量的教材内容

我并没有系统读过 Structure and Interpretation of Computer Programs(SICP)原版,但在阅读它的 Python 改编版时,依然能够明显感受到 John DeNero 在其中投入的大量心血。课程并不只是停留在“教你如何使用 Python”这一层面,而是在讲解语言特性的同时,引导学习者逐步理解抽象技术、程序设计思想,以及严谨的计算模型。很多内容在初学时或许不会立刻意识到其价值,但随着学习深入,往往会突然发现:原来这些思想早已悄悄影响了自己看待程序的方式。

3. 完善的作业提交与反馈系统

至于 ok 系统的优秀程度,几乎已经无需赘述——毕竟这是一个真正发过论文的课程工具。仅仅是一句 python3 ok --local,就足以让人感受到它在学习体验上的巨大提升。对于并非UCBer的自学者而言,John DeNero依然愿意提供如此完善的学习支持,确实令人敬佩。

另一方面,Lab 和 Project 中提供的大量 Notes 与 Hints,也极大减少了“掉进一个坑里卡半天”的情况。它们既不会直接把答案摆在你面前,又能够在关键时刻提供恰到好处的引导,在保证思考深度的同时,也显著提高了学习效率。

三、我的学习历程

我学习的是2024 Fall 的版本,开发环境则是 Windows 11 + PyCharm。整个学习过程基本上也是从 Lecture 1 开始,一节一节地往下听,再穿插完成 HW、Lab 和 Project。不过到了后期,我的学习节奏就逐渐变成了与课程网站上的安排严格同步。

课程前半部分主要围绕函数展开,随后逐步深入到高阶函数、递归、树、迭代器、链表以及 OOP 等内容。一路学下来,我最大的感受就是:这门课对于“抽象”(Abstraction)的强调几乎贯穿始终。尤其是讲到 Data Abstraction 时,John DeNero 那段把违背 Data Abstraction 的代码用火烧掉的五毛钱特效,实在令人印象深刻。John DeNero 绝对是个极具幽默感的人。

另一方面,他的授课体验也非常舒服。John DeNero 的英语发音十分标准,语速相对偏慢,因此基本不用担心“听不懂”的问题。很多 Lecture 我甚至是开着 1.5 倍速听完的,理解起来依然毫无压力。

不过在我看来,CS61A 最精华的部分,始终还是那些 Project。归根结底,真正能锻炼编程能力的,还是真刀真枪地写代码。

Hog 是我接触的第一个真正意义上的大型工程项目,写起来确实非常过瘾。直到现在,我都还记得当时那个阳光明媚的午后:我端着一杯咖啡,坐在图书馆里,对着电脑一口气 Coding 了一整个下午。当然,仅凭一个下午肯定不可能完成整个项目。晚饭之后,我又重新回到图书馆继续奋战,最终赶在闭馆之前完成了整个 Hog Project。那种长时间沉浸在代码里的满足感,确实很难用语言形容。

有了 Hog 的经验之后,后面的 Cats 和 Ants 写起来就轻松了不少。可能是觉醒了某种奇怪的属性吧——Debug 对我来说居然也没有那么折磨了,甚至还隐约带着一点乐趣(?)。

这里再讲下一部分有负反馈的地方:说实话,第一遍听Mutations那部分时我有些没听懂,Iterator那节讲next()的时候我也没太搞明白这个函数的逻辑,不过这些地方再听一遍很快就明白了。另外,这门课的学习成本属实有点儿高,必须严厉批判FlyingPig在CSDIY上写这门课学习时长约为50~60小时的行为啊(笑),拿北大本硕博的水平来衡量这门课的难度显然还是有失偏颇的,我自己花在这门课上的时间打底100小时起步吧,毕竟除了Lecture之外,所有的HW、Lab、Project都是必须完成的,不然跟没学过这门课没区别。学这门课的时候,我们学校在讲C++,而这期间我几乎没怎么写C++,直接导致期末的时候我大脑有些混乱,写出“if x > 3:{……}”这种四不像的代码,Debug的时候给我自己看笑了。

总的来说,学习 CS61A 的过程其实是相当快乐的。这门课当然也存在一些问题:比如学习曲线偏陡、英文授课对部分学习者不够友好(至少直到现在,我都没找到哪怕一个合格的中文翻译)。但和它那些耀眼到几乎无法忽视的优点相比,这些缺点又显得不那么重要了。

四、总结

多的话其实也没什么好说的了,感谢互联网,感谢UCB,感谢CSDIY,感谢John DeNero吧。能听到如此高质量的公开课,是我的荣幸,也是每一位计算机科学学习者的幸运。希望我们的高等教育内部也能涌现出更多高质量的课程。世界一流名校,靠的不只是科研和论文,教学的质量同样重要。教育的本质是一棵树摇动一棵树,一朵云推动一朵云,一个灵魂唤醒一个灵魂,可以说CS61A真正让我感受到他们是在用心搞教育,用心教学生。说实话很羡慕UCB的学生们,能上到如此高质量的课程。千里之行,始于足下,诸君共勉。

技术 

也可以看看