CMU好课推荐:15-122 PRINCIPLES OF IMPERATIVE PROGRAMMING

安然无恙(其实头发很有恙)的度过了在匹兹堡的第一个学期,能在五门课中活下来证明还是有进步的,即使忙碌的、焦躁的,绝望的日夜占了学期的大多数。要说这学期最喜欢最新奇收获最大的课,我觉得应该是当仁不让的15-122。

迫于淫威,选择了这门不计入毕业学分的本科生level的CS课,全名叫做Principles of Imperative Programming,以教授命令式编程(C)与基本的数据结构为主线,是要declare CS major的学生必修的基础课以及核心课程。所以有200+的学生和30+的TA,并且基本上所有的学生都是first year(first year graduate的我惭愧的低下了头)。

这门课的workload要比我这学期上的所有其他研究生课程的workload都来的大。每周一交一个written homework(共13次),每周四交一个programming homework(共11次),每周两次lecture,课上会有随机的quiz(计入总分),每周一次lab(计入总分),每周一次recitation,两次midterm和一次final。

这门课讲了什么呢?首先从最最基础的二进制讲起,然后开始将数据结构与零零散散的东西穿插起来介绍(看到syllabus可以感觉到每节lecture的内容都是精心安排的)。数据结构有介绍了array,stack,queue,linked list,unbounded array,hash tables,set,BST,AVL tree,priority queue,heap,graph,union find等。

但是这门课不光只是介绍了数据结构,还有很多零零碎碎的东西也被提上了桌面。比如说lecture里有教几种sort和search的方法,命令式编程中的pointer和function pointer,编程时需要尊重client和library的interface,如何写各种test case,使用void*和函数指针写出generic的函数,C的内存模型,undefined behavior,虚拟机等。lab里有着重锻炼书写test case,recitation里还有对lecture内容的补充(比如说用stack实现DFS,课上用的是recursion)。

我为什么喜欢并推荐这门课呢?

这门课有两位负责任的instructor。Stephanie虽然上课十句话里有一句讲错,写代码三行里必出错别字,但是上课非常有趣。在实现数据结构的interface的时候,她常常尝试用不同的方法,即使方向是完全错误的,她至少让我们看到了这么实现的弊端在哪里。作为一门CS的基础课,能够做到授之以渔便是最大的成功。Illiano作为这门课的主管,对整个课的质量把控的非常严格,所有的作业基本都是两天内出分,grading能够做到你心服口服。上课的方式也很有趣(貌似本科生的课都很有趣),比如说有一次编程作业是图片变换,有一个bonus的题,想出你最喜欢最美丽的图片变换并写代码。一周后的课堂上突如其来的评选出了top 10送小礼品+送加分。

这门课的TA非常负责(只能说有一些TA非常负责)。有一次written homework我做的比较差,因为有一道大题没太明白题目意思,于是就去OH准备和TA把分数argue回来,她非常耐心的和我解释每一条扣分点在哪里,把本来打算找他们算账的我说的心服口服。更加负责的是,后来我登录上去我的gradescope,发现她在我在OH问的那些问题的旁边把她的解释完整的加在了备注里,为的是我考试复习的时候比较方便。这是最最最让我感动的一点。还有,midterm2的时候,我因为时间来不及胡乱猜了两三个答案写在试卷上,有两个蒙对了但是TA没给我分。跑过去regrade,ta说一看你就是不会写瞎蒙的,不能给你分。

课程的设置非常的有foresight。学期初有一次编程作业里的一个task是对图片做高斯模糊,其中的一个步骤是对图片加padding,并且用方格遍历选取最大的元素。后来上到601 CNN的时候,才明白过来原来这就是CNN里的max pooling layer。其他的作业也非常实用,比如说用gap buffer实现text editor,写一个PRNG,使用heap实现huffman tree然后变成一个用来压缩文件的程序(真的可以用来压缩和解压缩文件和图片!),写一个虚拟机的decoder,类似于汇编码的decoder(真的可以用来跑c0文件的bytecode!)。

很难,很push。push是我对这门课最大的感受。比如说好死好活写了一次programming homework,只占总分里的2.5分,一次written homework只占100分的的1.2分。并且这门课是不curve的,严格按照90分以上是A的标准。真是对于任何一次作业都不敢不好好做(否则一次扣0.5分真的伤不起)。同时,总评的grading还会case by case,意思就是即使总评90+,如果三次考试的平均分不到80%,也会按照B处理。或者是如果programming homework的分数太低,就会收到D的总评,直接剥夺下学期选15-213的权利。这门课的push同时还体现在每次作业限制autolab的提交次数(5-7次),以及coding style的规范,以及有几次的作业需要考虑efficiency,以及有几次的作业是在due之后才会给你评分(意味着无法根据autolab的提示进行debug)。

整个课程的材料都让我感觉到设置的精心。比如说基本上每次的编程作业,都会提供几百个test case来测试你程序是否有bug。像最后一次作业,他写了350+个的test case来测试你的程序,我觉得这在一般的课程上是做不到的吧。另外,为了上这门课,这门课当初的设计者写了一门新的语言叫做C0。C0是C语言的一个子集,里面剥夺了一些容易让程序失控的特性,比如说casting,比如动态内存的回收,比如指针运算,比如一些ECF(break等)。同时添加了新的数据类型比如string,以及string的操作(以替代神烦的strxxx系列)。为了一门课程直接写一门新语言真的是细想极恐。

总而言之,15122真的是我到目前为止最满意的CS课(甚至超过15-513),强烈推荐闲的发慌的人去上一波。