作者:研究生留学
链接:https://www.zhihu.com/question/36482395/answer/1609969110
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
先介绍一下自己,我是18fall入学CMU并就读于MS ECE项目的同学,今天这篇文章主要给大家分享一下CMU ECE项目的相关信息和我个人的生活学习体验,希望能够帮助到想要申请该项目的同学。
基本情况
CMU的MS ECE项目为授课型项目,在入学时间方面提供了春季学期和秋季学期两个选项供大家申请。
我们这届ECE差不多录取了200人左右,其中中国人占比超过三分之一,与往届只录几个人的情况相比,可以说扩招太多倍了。不过这个项目自开设以来就没有一个比较明确的标准,它时而缩招时而扩招,录取的bar也忽高忽低,变数比较大。

项目课程
我们项目要求学生在三学期内修满96学分,且GPA大于等于3.0即可毕业。正常来说,CMU的每门课程为12学分,所以大家只需要修满8门合规的课程就能刚好达到毕业要求。但实际情况是,为了维持F1签证的身份,每个同学每学期至少要选够36学分的课程,即至少选3门课来上。大多数同学也正是这么做的,按照3-3-3的选课模式,三学期上九门课毕业。不过,ECE规定学生在项目期间所修学分不能超过120学分,所以也会有部分同学按照3-4-3或者3-3-4的模式来选课,三学期上十门课毕业。
相较于CMU的其他项目来说,ECE算是很自由了。它没有必修课,从理论上来说,你对什么方向感兴趣就可以去选那个方向的课,且一般都能选到合适的课程。此外,ECE项目允许我们非CIT学院
的课程,但是最多选48学分,即一般情况下最多选4门,这个时候大家一般会选SCS
的课来上。我们CIT学院(主要指ECE和INI)其实能找到和CS cross-list(即同一门课,一起上课但课号不一样)相关的课程以及很多CE和ML方向的课程,如果你们选本院的替代课就不必浪费外课的学分了,那4门外课对于想走system选课路线和转码的同学来说是完全足够的。
另外,MS ECE项目虽然主要是以授课的形式开设,但是你如果想做research的话也可以,我们许多lab的research project还可以拿来抵学分,是非常值的。
下面,我就给大家推荐一下ECE项目的部分可选课程,希望大家到时候不要“踩雷”。

18600 Foundations of Computer Systems
大家应该有听说过CMU的计算机系统入门神课15213/15513吧?18600是它的ECE版本,如今课号已经从18600改为了18613,内容和讲授风格也越来越向15课程靠拢,想体验15的同学一定不要错过这门课。
这门课内容广泛且有深度,学生可以循序渐进地掌握知识。课程从0/1bit操作这类基本的知识开始,逐渐涉及到进程、cache、I/O、并发、proxy、虚拟内存等系统概念,而且会针对相应的内容辅以相关的lab,让学生进行练习巩固,以便更好地消化所学内容,可以说设置得非常周到。
我个人认为这是转码系统方向的必修课,并极力推荐大家最好第一学期就能把它上了,这样你们上完之后不仅可以对传统的计算机系统体系建立起一个基础全面的认识,而且也能给自身打下比较牢固的计算机基础,之后有利于更好地学习高阶系统课。而且有一些教授要求很严格,如果你没有先修513/600就不会给你register。
大家到时候有两位老师可以选择,一位是John Shen,他长期在Intel和Nokia任职,有大量丰富的实践经验,讲的知识也很硬核,会和我们分享自己的私货,比如hardware、superscalar等,但是讲课比较催眠;而另一位老师Saugata Ghose则是第一次上这门课,讲课就是照本宣科,内容没什么延伸性和拓展性。你们到时候按照自己的想法去选就行了,但是如果觉得老师讲得不好的话,去蹭513那边的课或者看513对应的视频也是可以的。此外我个人建议你有时间可以阅读配套课本CSAPP
的对应章节,这样能帮助你加深对内容的理解。

至于课程作业,我们这届是7个lab,不过自18613开始多了一个帮助大家熟悉C的lab 0,也就是大家如果之后选了这门课的话一共要做8个lab。这些lab的内容很丰富,比如使用给定运算符进行bit manipulation、利用gdb阅读调试汇编、实现简易shell、实现malloc函数、进行cache simulation、实现支持HTTP GET请求的proxy等,大家可以随意选择。不过要注意的是这些lab需要全部用C在Andrew Unix machine环境下实现,用autolab测试,最后分数会包含coding style。总体来说,要完成这8个lab并不算太难,因为所有lab都会提供start code,handout也写得比较清楚,而且老师留给大家做lab的时间比较宽裕,但要做好它们还是非常费神的,尤其是在后半学期,需要付出很多精力。
这门课的考试包括一个midterm和一个final,题目量大且灵活,我觉得和作业比起来,完成的难度会大一些。如果大家还想了解更多的信息的话,可以去CSAPP的官方网站看一下,网址是http://csapp.cs.cmu.edu/3e/labs.html。
17637 Web Application Development
这门课是由ISR
开设的,课程内容主要围绕web的基础知识展开,所涉范围广泛,包括但不限于HTTP、Django
相关概念(例如MVC)、ORM、cookie/session、database、DOM、jQuery、web security、WebSocket、mobile等,总之大家选了之后什么都能学到一点。
我们春季和秋季学期都有开这门课,不过授课老师不一样,课程安排也不太一样。
秋季学期的授课老师是ISR的大佬Charlie Garrod和Joshua Sunshine,他们讲课比较清楚,而且认真负责,还开了好多10-20人的section,把课堂重心放在了学生的自主探索上。比如Charlie课前会让我们看许多视频和材料,然后section就一般只讲十几分钟,剩下的时间便是让我们动手实践完成in-class exercise,如果有不懂的地方就问教室里的TA。到了春季学期,老师被换成了Jeff Eppinger,课程变为lecture形式的授课,并取消了section和TA参与的in-class exercise部分。我觉得两学期不同的课程安排各自都有利有弊,且处在变化之中,所以建议大家到时候选课前可以发邮件问问老师的具体安排再决定。

至于作业,这门课的课程作业包含两部分,大家需要在前半学期和后半学期各完成一个任务。
前半学期是让大家基于Django实现一个小型网站,而网站的实现是被分成若干个homework来完成的,网站本身也会以incremental的形式被不断开发,即从最开始搭建纯前端界面,之后不断添加功能并完善,再增加Validation/Authentication/Authorization等要求,以及加入一些Ajax flavor等等,最后还会将网站部署到cloud上。此外,这个过程中还可能涉及到前后端测试、CI/CD pipeline搭建等等。所有作业会提交到GitHub的课程repo里,因此写作业的过程中会使用到git。
后半学期则是以2-4人组队的形式,无限制地实现一个稍微大型的网站。大家可以参考的网站类别有online game、类piazza、类Tripadvisor等。
关于课程考试,这门课一定会有final,题型包括选择、填空和简答。此外,老师还会让我们在白纸上手写一个Django app,我个人感觉有点硬核。
如果你是转码选手或者之前无项目积累、对web感兴趣并希望以后从事web前后端开发的同学的话,我建议你一定不要错过这门课。一是因为Diango操作简单易于上手,二是web的相关概念相较于其他系统课而言理解起来较为容易;三是你可以把这门课的项目经历写到自己的简历上,这对找工是有利的。

17514 Principles of Software System Construction
这是一门由ISR开设的类似于软件工程的好课。
总的来说,课程内容比较基础,但是非常经典和实用,从class level到project level再到system level都会涉及到design,能够锻炼到学生的动手能力,而且还会讲到design pattern、framework/library、testing和concurrency等若干software相关概念,上完这门课对大家之后的面试也很有帮助。此外,这门课的课堂例子是基于Java来讲的,homework也是基于Java来做,所以你们可以把它当成一门Java语言课来上。
我们一共需要做6个作业,除了第5个需要组队外,其他都由个人完成,其中比较好玩的有设计并实现Carcassonne桌游(带GUI的)和写一个data visualization framework等。至于workload,总体来说比较正常,只有Carcassonne比较耗时和难写一点。最后的考试包含两个midterm和一个final,难度都不是很大。
我个人觉得这门课可以一定程度上丰富简历并补充软件设计的基础知识,还可以顺便写点(相对高质量的)Java,因此非常适合转码选手。此外,类似于17637,大量依赖于GitHub和Travis CI的作业提交方式也会帮助掌握git版本控制技能和了解CI/CD pipeline的使用。

15640 Distributed Systems
DS是CMU非常著名的系统课之一,内容丰富翔实且深入浅出,如果大家认真学的话能够学到很多有用的东西,我个人是强推它的。不过如果你想上这门课的话,600/513至少要达到B,否则没法选上。
这门课在春季和秋季学期都有开,但是授课老师不一样。
春季主要由Mahadev Satyanarayanan讲授,这位教授非常厉害,他是AFS
和Coda
的发明者,同时也是edge computing
等云计算领域的先驱。Satya的课侧重于底层基础,大体涵盖了RPC、caching、distributed file system、scaling、failure recovery等内容,虽然他讲课节奏很缓慢,但是我觉得也留给了学生一定消化的空间。而秋季课程偏应用一些,老师为Yuvraj Agarwal和Dave Andersen,他们的授课内容弱化了caching并加强了分布式系统的一致性部分,更注重实践。
春季的project要求基于C和Java完成,包括实现基于RPC的远程文件系统、实现一个简易的AFS-like distributed file caching system、模拟scaling policy以及实现基于2PC的带有failure recovery功能的简单图片合成系统;秋季的project要求基于Go完成,具体的要求大家可以自己去了解一下。这两个学期的project均需使用autolab提交,且和其他系统课一样带有coding style分。
除了project之外,该课还有4个贯穿整学期的homework,跟考试题型相似,主要为简答和计算。至于考试,这门课包含了一个midterm和一个final,题目虽然简单,但题量大又注重考查细节,所以平均分不高,比较在意GPA的同学请慎选。
总体来说,这门课workload偏大,不过如果你坚持下来的话会觉得很充实,对于system design的概念也可能会有新的认识。

15719/18709 Advanced Cloud Computing
这门课是ECE两大高阶系统好课之一,另一门是Storage Systems,我在下文会提到。
它之所以被称为好课,授课老师功不可没。给我们上课的是Greg Ganger和George Amvrosiadis这对黄金搭档,此外还有Majd Sakr给他们打辅助。
这两位G老师都是云计算、分布式文件系统、存储系统等方向的集大成者,其中Greg还是PDL
的director,在系统方向颇有建树,跟工业界的联系也比较多,所以他们会经常请FLAG的大佬们来作guest lecture,我们便可以借此领略到工业界的前沿科技。
在讲课方面,Greg偏幽默,习惯于把很深的知识以一种巧妙的易于理解的方式传达给我们,方便我们消化。而George则更加严肃认真一点,和学生互动也更多一些,不过我觉得有点他的课堂有些催眠。他们经常交叉授课,互有特色又能相互补充,上下来真的让人受益匪浅。
课前,老师会给我们布置几篇论文或者技术文献,以便我们阅读之后加深对概念的理解。在课程中,老师会给我们讲包含了cloud computing这一领域的各个经典概念,例如elasticity、virtualization、scheduling、fault tolerance等,还有各种cloud、distributed file/storage system实例等等,可谓非常精彩。

这门课要做3个project,分别是scaling policy设计、基于spark的大数据ETL以及模拟Kubernetes scheduling,均基于AWS完成,涉及到的语言有Python和Go等。我自己做下来感觉除了spark ETL比较令人头秃外,其他的load都还行。它代码量不大,但是writeup往往不是很清楚,再加之一些配置操作细节比较繁琐,所以我还是建议新手慎选。
至于考试,包含了一个midterm和一个final。试题风格鲜明,题目灵活,题型多为简答题。老师会侧重于考察学生是否理解了各个系统的特点与design的tradeoff,需要你给出明确的选择并利用课堂所学来论证你的观点,非常考验学生的学习能力。
CMU还开了一门“低阶版”的ACC,即课程15619 Cloud Computing,我在这里也跟大家简单对比一下这两门课。
CC没有特别多lecture内容,也没有paper阅读要求等,但它的workload非常大,基本上每周都会有作业和quiz,旨在让学生通过不断练习来巩固所学的知识。我觉得这门课对于大神来说就是在重复地做一些简单的事情,所以更愿意把它推荐给简历空白的小白。而对于一些已有基础的大多数同学来说,我的建议是选ACC,因为ACC能更多地帮助你知其然也知其所以然,你上完这门课可能会有醍醐灌顶的感觉。
需要注意的是,ACC目前只在春季开设,而CC则春秋两季都可以选,如果你上过CC就不需要再选ACC了。另外,由于DS和ACC的课程内容相互呼应,所以我建议大家把它们选在同一学期来上,收获会更多。
对了,还有一门15688 Practical Data Science,据说是CMU数据科学版本的CC,大家感兴趣的话可以自行了解一下。

15746/18746 Storage Systems
这就是ECE另一门高阶系统好课,授课老师同样是Greg Ganger和George Amvrosiadis,值得一提的是Greg是746这门课的创始人。
这门课不仅课堂风格与ACC相似,而且两者在课程设置方面也差不多,老师会要求我们课前读paper,然后他俩交替为我们讲解lecture内容,后半学期会带来许多guest lecture,我印象最深的是来自Google的对GFS
继任者Colossus
的讲解,暴力美学太酷了。
在课程内容安排上,这门课从微观到宏观,涉及到了许多SS相关内容,既有SSD/HDD的底层讲解、FFS/LFS等经典文件系统的实现细节,又有RAID、分布式文件系统和存储系统实例,还有data integrity、redundancy、backup等相关概念和应用,考虑得很全面。
我们一共会做2个project,均基于C/C++完成,运行和测试环境均部署在AWS上,但分别被拆成了3个checkpoint,所以会贯穿整个学期。因为项目重心可能比较偏向于后期,所以大家在后半学期的学习压力比前半学期要大得多。
第一个做起来相对比较简单,要求我们模拟实现SSD中的flash translation layer(FTL),涉及address mapping、garbage collection、wear leveling等概念;而第二个难度和代码量都比较大,是基于FUSE实现一个hybrid file system(local SSD+AWS S3),功能较为强大(例如支持云端传输的block-level deduplication,支持snapshot和caching等等)。

至于考试,SS跟ACC一样,都有一个midterm和一个final。老师出题灵活,侧重于深度考察我们对SS领域各种概念的理解。在试卷最后,老师还会给我们放一个bonus questions,我印象最深的一个问题是请选择一种动物作为746的吉祥物,然后给的参考答案是“A beaver, because it cares about logs. There might be a fight with MIT, but totally worth it :-)”,感觉很有趣。
我个人非常喜欢Greg讲课,再加之少有大学能够以存储系统为核心开设系统硬课、上完课你们还能将hybrid file system作为一个完整的project放在简历上,所以我个人是由衷推荐这门课的。大家需要注意的是,SS只在秋季开设,如果你们春季上完ACC并喜欢这两位老师风格的话,不妨秋季试选看看。
15651 Algorithm Design and Analysis
这门课19 fall的老师是Gary Miller和Danny Sleator,两位妥妥的大牛。
Gary是Rabin素数测试算法
的提出者之一,651课程的创始人,讲这门课已经有40余年了,经验非常丰富。而Danny则是splay tree
的发明者,amortized analysis等领域的先驱,在实践方面绝对是高手。
我个人很喜欢这门课的课堂氛围,Gary总是面带微笑,讲课时会沉浸在自己的状态里,语速比较快,而Danny则总是眉头紧锁,随时准备应对各种奇怪问题,他们两人组队讲课能够碰撞出特别奇妙的化学反应。这门课的TA也很厉害,对我们帮助很大。

老师们准备的课程内容不仅非常广泛,而且也有极有深度,他们会给我们讲DP、DFS、max flow、hashing、LP等经典知识,也会把自己的研究和见解分享给我们,比如splay tree、ball growing、计算几何学、backward analysis、parallel MIS等等,我觉得这样的机会是很宝贵的。
我们一共需要做7个作业,其中3个是oral presentation,另外4个则需要提交LaTex。因为这些作业的workload都比较大,所以可以3人组队完成。具体的作业构成几乎是清一色的3道算法题+1道coding。
算法题难度较大,一般跟课上所学紧密相关,老师往往要求我们针对描述的问题,给出一个时空复杂度满足要求的算法,然后证明算法的正确性等等,比较考验个人的理解、推导和证明能力。我建议大家到时候如果思路不清晰的话,可以去piazza疯狂轰炸TA或者去office hour求助来获得灵感,还有就是要多和自己的队友交流,集思广益。而coding是基于autolab测试的,也会跟所学有所关联,但是做起来没有那么简单。case数量很多,时空复杂度要求很高,老师给我们出的题也往往是带迷惑性的,例如看上去需要max flow解决的问题,实则必须用DP才不会time out之类的,很费脑筋。老师在给分方面也比较严格,错3个case及以上就是0分,完全不留情面。
除了作业以外,我们每周都有一个quiz来帮助大家巩固所学。

至于考核方面,这门课的考试包含两个midterm和一个final,难度较大,课程给分也很是严格,curve以后只有20%的A,其余大概会有40%左右的B和40%左右的C,以及若干fail,在意GPA的同学请慎选。
就我个人来讲,这门算法课是我在CMU最喜欢的课,所以我强烈安利给大家!如果你们想要学好CS的话一定不能错过这堂算法课。但是,客观地说,这门课老师讲课速度快,作业和考试难度也较大,费时较多,其实不太适合零基础的小白。对于想要把精力留在刷题上的找工党来说,这门课对你刷题也没有特别多和特别快速直接的帮助,因为能力的提升毕竟需要一个潜移默化的缓慢过程。不过,在选择之后坚持下来的同学,你们到时候会发现自己对于许多算法和数据结构的理解会有质的提升,我认为这是非常值得的。
15750 Graduate Algorithms
这是Gary于春季开设的一门高阶算法课,涉及到了Van Emde Boas tree、斐波那契堆等内容。内容与651有部分重叠,对算法感兴趣又觉得651简单的同学可以直接考虑这门课。

17681 Java for Application Programmers/17683 Data Structures for Application Programmers
这是ISR开设的两门mini课(每门mini课的学分为6分),均由Terry Lee主讲,我认为非常适合那些没有代码积累、不了解OOD、对数据结构无概念的小白入门,大神们也可以把它当作水课来搭配使用。总之,我身边上过这门课的同学都说它非常好,值得一选。
15618 Parallel Computer Architecture and Programming
PP是CMU的经典CS系统好课之一,我个人也给大家强推这门课。这门课的其中一位授课老师Randal Bryant同时也是CSAPP的作者之一。由于这门课实在是太过于热门,所以每年waitlist都会被排爆,我在这里告诉大家一个tip,那就是你即使在waitlist上也要按时上课和交作业,这样就能优先排进去。它的project由individual和team构成,据说load较大但做完收获很多。我身边有人凭着课上所学最后去了Apple做GPU加速,所以我认为这门课对于找工的同学来说,一定是个加分项。
15662 Computer Graphics
这是一门很有趣的计算机图形学入门课,内容涉及图形学领域的方方面面。作业是基于OpenGL实现若干与rasterization、animation等相关的project,load较大,debug时间较多。我身边有人推荐PP+CG一起上,你们可以试试看。相关课程还有15663(Computational Photography)、15664(Technical Animation)、15666(Computer Game Programming)等。

18645 How to Write Fast Code
这门课是ECE开设的破产版PP,虽然workload相较于PP会小很多,但是课程质量远不及PP。如果你对并行计算感兴趣、但是又不想自己太累,或者不想占用48学分名额的话,我建议你可以试选,选上之后可以去蹭PP的lecture视频,这样既能学到想学的知识,又不至于负荷过大的workload。
15645 Database Systems
DB是CMU的经典CS系统好课之一,授课老师Andy Pavlo是DB领域的狂人,他还是上文所说的PDL的成员之一,跟Greg、Dave等人交流密切,我个人建议如果你对数据库非常感兴趣的话一定要pick它。
不过这门课只在秋季开设,并且超级热门,所以你可能选不上。而且课程的project均要求基于C++来做,不仅workload很大且对没写过C类语言的人非常不友好,所以你也可能对它感兴趣但又不是很愿意上。这都没关系,因为我们贴心的Andy老师会录制lecture视频并发布在Youtube上,piazza的权限也对未选课生开放,如果你想的话,完全可以参与到课程中去。
此外,Andy在春季还开设了另一门DB有关的课程 15721(Advanced Database Systems),貌似load比645要小,大家如果感兴趣的话可以自己去了解一下。

15641 Computer Networks
这是一门网络CS课程,但是它的课程内容设置比国内的一般计网课程强了好几档,具体从作业要求基于C实现TCP、实现类Netflix streaming功能等就可见一斑,因此workload也较大。授课老师Justine Sherry之前是伯克利的,他给我们讲课的时候特别有活力,还会经常给我们发糖吃,课堂氛围很好。总之,这门课相对小众但质量很高,我推荐大家去上一上。
18741 Computer Networks
这是ECE版本的CN,但内容跟15版本相差较大,比较偏向于链路层和信号处理,load也相对较小。不想占用40学分名额但又对CN感兴趣的同学可以试选。
15410 Operating System Design and Implementation/15411 Compiler Design
这是CMU流传已久的两门镇校神课,虽然课号都是4开头但load巨大。这两门课的学分均为15,所以如果你们都想选的话就会占到30分的外课学分,剩下的16分貌似最多就只能选一门外课了。不过如果你在暑期先修513课程(这样513只用占到6学分,弊端是要多交6学分的学费)的话,这样就能够上够四门CS外课,即15410+15411+15513+15XXX。
其实这门课对找工的帮助还蛮大的,我身边有大佬坚持了一学期扛下来了OS并最终去了Apple写kernel,TOC的时候有个小公司直接说如果你上过OS并且成绩还OK,就可以直接去他们公司工作。

17645 Software Engineering for AI-Enabled Systems
这是ISR于19 fall新开设的软件课,我有朋友上过觉得还不错,感兴趣的朋友不妨试一试。
14741/18631 Introduction to Information Security
这是ECE开的security课程,lecture比较无聊,但作业以CTF形式呈现,挺有趣的,workload对大多数人来说应该都比较适中。另外一门security相关的课程是18730(Introduction to Computer Security),据说课程内容艰深晦涩且给分不高,在意GPA的同学请慎选。
11755/18797 Machine Learning for Signal Processing
这门课比较适合本科具有信号和图像处理背景的同学以及刷题找工党来上,可以作为一个缓冲,跟硬课搭配使用。
18661 Machine Learning
这是ECE开的ML入门课,课程干货十足。对比10601,18661能够帮助你夯实理论基础,而且还不会占外课学分。

11661 Search Engines
这门课的内容和作业都很好,但考试就是死记硬背,我个人不是非常推荐。
10707 Deep Learning/11785 Deep Learning
这两门DL课,我个人比较推荐785,因为707的课程设计问题比较大。
11747 NN4NLP
这门课没什么好说的,我心中永远滴神。
此外,我们还有24780 Engineering Computation、18794 Pattern Recognition Theory、18749 Building Reliable Distributed Systems这几门课,大家完全可以把它们当做水课来上。
总体来说,我觉得CMU的大部分课程质量都很好,对于我们更好地掌握现学的知识是有益的。大家还可以把那些做得不错的course project放在简历上,以便日后找工。至于workload,我个人觉得还是蛮大的,因为我之前在国内的时候几乎不怎么学习,但是到了CMU之后经常学习到一两点才坐escort回家,学习状态对比强烈。但是只要你认真努力了,一般都能拿到A/B。

就业
在就业方面,CMU会为学生提供career service,具体工作是帮忙修改简历上的格式和语法错误以及教你一些面试技巧,我个人觉得作用不是很大。
学校也会有cf,因为开的比较早所以建议大家提前准备好简历和自我介绍,不然的话很可能会白跑一趟。
我自己当时找工的时候主要是在LinkedIn上获取求职信息,感觉还比较有用。
大家其实不用太担心上岸的问题,虽说CMU的peer pressure较大,但是往届找全职的情况很好,而且我认识的大部分ECE同学大部分也都拿到实习offer了。
生活
我们这届录取了挺多中国人的,而且整个CMU也有很多国人,所以我平时基本都待在以说中文为主的社交圈里,每周就跟朋友一起约约饭打打球,没有跟外国同学party过。但是我感觉大家还是得重视一下口语问题。在来美国之前,我T 105、口语23,刚到这边的时候遇到口音比较重的外国人根本听不懂他在说什么,不过现在上课的话基本没啥问题了。大家要是想提高口语的话可以在做project的时候和外国人组队。
