学习CS-61A个人体会
现在我刚好学到11节,期中考试之前的最后一节,算是学过一半了。
当初想要学CS-61A是我一个朋友和我介绍的,放假后没什么事干,本这实在不行学个英语也行的态度开始了61A的学习。
和国内课程的区别
我就读于西安电子科技大学,目前大一上了2个有关编程的课,大一上的计算机导论与程序设计(C语言),下的Python程序设计,还有一个程序设计(C语言做几个题写报告)。
整个大一上下来给我的感觉就是老师讲的东西没有什么用,基本就是照着教材说一遍。教材的编排更偏向于让你学会如何运用一个语音去编写程序,对于算法的教学大多是上机时做题自己参悟出来的。我不知道是不是国内的大学都是这样,反正就我的学习体验来说,这些课程对与提高我对于编程理解的作用是很有限的。
CS-61A不同的是,它一开始就会教你程序是如何运行的,让你学会如何解释程序的运行,也会教你一些非常神奇的操作,比如各种high-order function。61A的作业量其实是比较大的,但是很多作业都很有趣,比如project系列会让你去完成一个可执行的游戏或者程序,他给你了一个大的框架,你只需要填一些东西,就可以感受到自己写的东西运行起来的快乐。有些题也很烧脑,比如hw03的Extra Questions让你写Church numerals,是一个利用函数定义自然数的程序,最后的程序不过几行,但是可能要花数小时思考。
资料丰富
61A的课程资料是完全对外公开的,所以即便不是伯克利的学生也可以运用课程资料自学,作业也可以用自带的python ok来检测,只需加上--local
就可以不用填写邮箱,GitHub上也有人上传了作业代码,包括我也上传了我的版本,所以上课和写作业的过程是非常顺畅的。
完成CS-61A后的感受
这门课作为入门课真的非常有意思,老师也挺不错的。在最后一节final lecture上老师鼓励说61A是一门非常难的课,CS也是一门非常难的学科,无论是现在还是未来你都有可能觉得自己不适合CS,但是就算落下一点也没有关系,你还是可以成功毕业,你还是可以找到适合自己的方向。还有就是不要忽视其他学科的学习,因为CS是一个相对闭塞的学科,很可能你会陷入一个信息茧房之中,所以上一些文学、艺术或者历史课都是很有帮助的。什么叫人文关怀,这就叫人文关怀,希望那些恃才傲物的老师多学着点。
清晰的原理说明
现在再来回顾一开始上的几节课其实就教了一点Python基础,但是方向是截然不同的,61A更偏向于如何解释程序的运行。比如一开始就教你怎么画Environment Diagrams,介绍了frame的概念。我还记得我们大学的Python期末考就考了局部变量和全局变量,我就做错了,因为我们老师根本没有讲过frame,我还是用c的思维方式来思考的,现在叫我做我不可能做错。上完61A,我可能没学到几个函数怎么用,但是我对Python和类似的语言的理解高了几个层次。
大量的作业实践
我没有做Disc和Guerrilla,因为笔试我觉得真的没有必要(21的Disc更新换代了,不用自己写纸上了,可以互动了,太NB了)。可想而知真的在UCB学习这门课的压力有多大,几乎做作业的时间是比看课长很多的,如果真的认真做完每一道题和optional questions一定会花费大量时间和精力,但是换来的是一个非常牢固的基础,对于理解任何编程语言都是有帮助的。比如有几节课会学习Scheme的知识,作业是要求用Python写一个Scheme解释器,这就可以帮助你深入理解Python和Scheme是如何运行一段程序的。不过有一点不太好的就是,61A的ok程序有些edge case检测不到,所以有的时候写了个错的程序也能过,所以一定要看好要求。lab14要写RLE算法,我看有些传到GitHub的代码就是错的,只是统计了每个元素出现的次数,而不是真正的RLE。还有就是真的不要去抄别人的解法,自己想才是对自己的锻炼,毕竟没人逼着你上61A。
还有一点就是abstract的思想非常重要,61A的project通常让你写的不是整个程序,而是程序的一小部分,在做project的时候我根本不了解整个程序是怎么运行的,我只要写好我要写的部分,跟其他模块对接好就行
命令行和演示
其实这也是我觉的国内做的很不好的一点,老师上课不做演示,不用命令行。很多人上完课不会用ide或者编辑器,不会使命令行打命令。还是Python期末考有个送分题怎么在命令行运行一个.py
文件,很多人不会,很多人都是背的。61A ppt上的代码基本都会运行一遍而且基本都是用shell和vim,课后的Python ok也是要用命令行,也就是说61A的学生如果不会命令行作业都交不了。其实我觉得这些操作都是CS中需要积累的部分,我打算学The Missing Semester of Your CS Education也是想加强这一部分,不了解这些内容不会影响你的分数,但是了解这些起码你能用一些没有GUI的软件,在解决一些问题的时候也能知道自己输入的代码是干嘛的。
演示这一点我觉得也是很有必要的,一个是老师无形之中就可以教一些高效率的计算机操作和shell命令,还有就是帮助学生理解,有任何问题可以直接敲代码演示。但这对于老师的要求也提高了,毕竟念ppt和做演示不是一个难度啊(笑)。