CMU 部分课程介绍

avatar 383911
萨缪
15935
19
# 在cmu上过的课

要从cmu ece专业毕业了,总结一下我在匹村上过的课,希望能给以后的同学们提供一些信息。每门课我会先大概介绍一下课程内容和project,然后描述其难度,workload以及如果让我再学一遍,我会做的事情。

## 2019fall

### 15-213/18-213/14-513/15-513/18-613 Introduction To Computer Systems

cmu最有名的课之一,也是很多中高阶课程的前置,教材是csapp。整个课程十分完善,slide/lab都是精心设计的,自底向上地把cs的各个部分介绍一遍,包括整数浮点数的表示,汇编,函数调用,内存层次,内存分配,虚拟内存,系统调用,IO,网络与并发,同步等。对于本科cs专业的同学来说,大部分知识点可能都学过,但213能让人更清楚地看到这些知识点的联系,从而对cs有个更系统的认识;对于本科非cs的同学来说,这门课用的是c语言, 可能稍有点不友好,但能让人最快时间入门cs,知道程序是怎么跑起来的,不再有雾里看花的感觉。我在面国内的几个大厂的时候,不止一位面试官特地问我学过这门课没有,考得不少八股文也是csapp里面的内容。

难度:中等。个别lab有些难,让人感觉智商不够(如datalab),大部分lab按部就班就ok,如果struggle,及时联系ta;考试和quiz都比较常规。
语言or技术栈:C
workload:中等。
如果让我再学一遍:从头到尾读一遍教材;更多地和TA交流,一个人钻牛角尖很容易心累。

### 17-637 Web Application Development

这门课主要讲如何用Django开发一个web application。slide内容包括html,css,js,ajax,git这些。这门课的优点是后半学期会让学生组个三人队按scrum的组织方式去开发部署一个全栈项目,所以能让简历缺乏项目的同学多一个全栈开发经历,并且这些开发方法学上的训练也是对以后工作的一个模拟。还有我们当时是用azure的app service部署的项目,这个姑且也算一个比较时髦的流程。缺点就是前半学期的作业(开发一个订餐网站)比较无聊,load分布也不太均衡,老师(Joshua和Michael)上课效果一般,知识也多是蜻蜓点水式的内容。作业好像在之后的学期换过。如果是自己之前用过Django并且开发过这类网站的话,基本可以当水课上。

难度:中等。作业对于之前完全没接触过的同学来说,会比较难,主要是上手需要一定时间;期中考试和quiz都比较常规,期末会难一些。
语言or技术栈:Django(Python) + html + css + ajax(js) + PostgreSQL
workload:中等。
如果让我再学一遍:尝试使用Git更多的用法

### 18-749 Building Reliable Distributed Systems

这门课是ece比较有名的水课,老师特别爱请假2333。slide内容围绕分布式系统的fault tolerance展开,介绍如何备份,如何达成consensus,AcID,CAP这些原则等等。这门课会有一个十个人规模的project,任选一个主题设计一个fault-tolerant的系统,实现passive/active replica, checkpoint, log, recover这些feature。

难度:低。考试都是简答题,难度其实挺高的,需要对slide有比较深入的了解,但老师会curve,给分很慷慨。project实现老师要求也不难,毕竟十个人。
语言or技术栈:无。project技术栈组内成员自己决定,大部分用的java。
workload:低。没有平时作业,没有quiz,将水贯彻到底
如果让我再学一遍:无。

### 39-699 Career & Professional Development For Engineering Masters Students

一门只有3学分的课,只上半个学期,会介绍如何写简历,如何建立connection,如何准备面试等等。它讲授的东西对于第一次来美帝找工作的同学来说我觉得挺有用的,至少能缓解一下焦虑。它的优点在于会督促学生尽早完成自己的简历,老师会一个个地改一遍,让你的简历在语言和格式上不会有硬伤。

## 2020spring

### 15-640 Distributed Systems

比较好的一门课,老师是神似爱因斯坦的印度老爷爷。这门课就是讲分布式,具体内容好像fall和spring会不一样。这里我只介绍spring的。slide包括rpc,分布式的各种semantics,latency,cache(一致性, evict policy...),scaling, resiliency(二阶段锁,Paxos等)。这门课有4个project,第一个project是做C写RPC,不难,不过要注意一些设计,不然很容易像我一样写出魔鬼代码;第二个是用Java写一个带Cache的Proxy,这个project我觉得是这门课最难的也是最有收获的,就是代码量多了之后,设计得不行的话,各种feature耦合在一起,debug时心智负担很重,贼难受;第三个是auto-scaling调参,难度不大,但不太好玩;第四个按部就班实现二阶段提交协议,还是有收获的,难度和代码量都适中。

难度:中高。
语言or技术栈:C, Java。
workload:中高
如果让我再学一遍:认真学习上课提过的经典设计(二阶段提交,Paxos,GFS等);合理安排时间,尽早开始考试复习和project设计,临时抱佛脚真的会崩……

### 18-709 Advanced Cloud Computing

ACC也是很多国内同学会选的课,老师是Greg为主的几个人。这门课按老师说法是Phd-level,但基本也都是master在上,和其它课程的不同是会要求读很多论文。可能跟cloud computing包含了太多东西有关这,门课讲得很杂,包括云存储,调度,MapReduce,Spark,GFS,k8s等,每个topic都会有不少论文要读。这门课讲得还可以,Greg也是谷歌学术学术近20000引用的大佬,上课也很幽默,但3个project设计就一言难尽,load和难度很不均衡,TA也基本没有帮助。第一个project是在AWS上做Auto-Scaling策略,写terraform,代码量不大,但写得人很无奈。因为这套东西大多数人都没用过,照猫画虎还行,后期调参就很折磨。第二个project是spark从入门到精通,这个是我在CMU做过的最难顶的project,对于我这样的spark新手来说,难点有两个,一个是训练时间太长,几个测试点都要几个小时才能出结果;一个是不熟悉API,很多优化trick不了解。这两点一叠加导致我在这个project上花了很多无用功。第三个project是k8s写schedule策略,这个project比较简单,但可能太过简单了。

难度:高。这门课让我看到了自己自学能力的局限性,也见识到CMU是真的不缺dalao。
语言or技术栈:terraform, pyspark, go(k8s)。
workload:中高
如果让我再学一遍:读一读各种readings;多和同学交流,闭门造车累了就和人聊聊吧,至少能缓解下压力;放弃一些次要的东西,认真学习Spark。

### 17-514 Principles of Software Construction

由Charlie和Josh主讲的非常好的一门课。课程主要讲Java和软件设计,包括如何设计软件架构,如何设计API等,这门课也是对我实习帮助最大的一门课,很多东西我在实习的时候都用上了。课堂体验极佳,Charlie思路很清晰,Josh工业经验丰富,两个老师经常跟说相声一样唱和。作业比较复杂的是设计卡卡颂,需要想的仔细一些,但难度并没有那么高。这门课还有个优点是对代码风格要求比较高,督促人写出clean and readable code。

难度:中等。这门课project拿分不困难,不过考试感觉还是需要认真准备的。
语言or技术栈:Java,UML
workload:中等。
如果让我再学一遍:把effective java认真读一遍;java并行学得再扎实一些。

## 2020fall

### 18-746 Storage Systems

SS也是设计得比较好的课,前半学期讲单机存储,从SSD和Disk到文件系统,再到RAID;后半学期讲分布式文件系统,主要包括AFS,NFS等各种文件系统,以及backup,GFS,BigTable等。project有两个,第一个是做Flash Translation Layer,需要支持GC以及设计wear levelingscheme。第二个project是做cloud-based file system,这个project我觉得设计得非常好,也很有趣。简单来说,需要用FUSE实现一个定制的file system,使得体积小于阈值的文件存在本地,超过的存到云端(s3),之后逐步支持deduplication来减少云端存储的消耗,支持snapshot来允许回档,支持cache来减少云端和本地的数据传输。这个project的writeup写得比较好,会引导学生去模块化自己的代码,然后考虑各个模块的层次如何安排。不过这两个project的最后一个checkpoint都不简单,如果想拿满分需要花费更多的时间。

难度:高。考试其实比较灵活,但因为有大量往年卷,所以刷题到位的话,不会太差。
语言or技术栈:C++
workload:中等。
如果让我再学一遍:认真读一读各种readings,尤其是谷歌那几篇。多花些时间把第二个project做到满分。

### 18-645 How to Write Fast Code I

一门比较底层的课。讲的东西主要是设计kernel,通过使用SIMD,并行(OpenMP, MPI),使用不同data layout等来加速代码。这门课应该也是ECE的水课,知识密度比较低,不过今年讲的东西和往年好像不太一样。老师是一个和蔼的华裔or日裔,讲课很慢,喜欢和学生交流,给分也挺好的。课程有四个作业,基本都是上课讲过的内容,一次期中考试(不过时间安排在11月中下旬,其实就是期末),一个3-4人的project。project是选择一个算法比如KNN, Ray Tracing等,利用课上学的技术去加速,算法的选择和加速效果其实不是太重要,重要的是利用好课上学的东西。

难度:中低。
语言or技术栈:C/C++
workload:低。
如果让我再学一遍:无。

### 11-601 Coding Boot Camp

刷题课。老师会带着学生用Java, python, javascript三种语言学习数据结构以及练习刷题技巧。这门课最大的特点就是针对性极强,就是帮学生找码农工作,所以每周都会有2次学生之间的模拟面试,一次是自己作为面试者,一次是自己作为被面试者,而且有不少印度同学帮你适应口音:). 课堂slides也讲得都是面试爱问的知识点,各种复杂度之类的。作业就是类似Leetcode的算法题。对于要/已经找到全职的同学来说,这门课也是比较好的水课选择。

难度:低。
语言or技术栈:Java,Python, Javascript
workload:低。不过每周2次面试练习稍微麻烦了一点。
如果让我再学一遍:无。
  • 134
19条回复