CMU MSECE 选课心得&心路历程
1543812
## 15-513 / 18-613 Foundations of Computer Systems @20SpringProf. Ian Lane
Feedback:
等价于15-213,网上针对于CMU镇校神课的介绍和分析都很详尽了。workload一般比较合理(Low),偶尔Lab会偏难(Medium),总体就是Low到Medium之间。如果教授不太合自己口味的话有录播课,可以选择自己喜欢的prof看recordings。而且这门课是来CMU第一门CS课首选,因为很多课的prerequisite都有15-213。
btw真心建议有时间的话读一遍CSAPP,真的十分详尽的介绍了计算机系统的全部构成,从底层到顶层,从hardware architecture到system kernel再到software,对于未来做system design大有裨益。
## 10-601 Introduction to Machine Learning @20Spring
Prof. Matt Gormley
Feedback:
教授是男神matt,人长的帅,课讲的很有激情,经常会用道具或者邀请学生参与”课堂实验“(感觉像是中学老师会做的课堂游戏hhh),而且萌娃经常抢镜。
课程设计的内容特别丰富,涵盖了ML的全部领域,比如classifier(KNN、naive bayes、logistic regression、perceptron、SVM)、regression(linear regression)、unsupervised learning(clustering)、neural networks(Back-propagation 图灵奖获得者Geoffrey Hinton在我校工作过一段时间,还见过他和某一位教授在聊天、CNNs)、graphical models (Bayesian networks、HMMs)、learning theory、reinforcement learning。总体感觉略微有点走马观花,每个topics可能只有一周时间,做一个作业或者一个programming assignment就过去了。如果想要更细致的了解具体topics,可能还是得上10/11/15/17的其他课。
个人感觉,如果以后不想往MLE或者ML research scientist方向发展的话,未必要上这门课。如果抱着了解一下ML的态度的话,这门课比较合适。只不过每周都有assignment or programming assignment,可能会占用一些时间和精力,还有两个midterm(感觉midterm1有点难),workload很均匀,但不算很大(Medium)。
## 17-514 Principles of Software Construction @20Spring
Prof. Josh Bloch & Charlie Garrod
Feedback:
Hightlight!!! 如果只能上一门软件课或者本科课的话,一定要上的一门课。
这门课本科课号是17-214,其实是最入门的软件课,内容也非常基础,就是讲构建软件的基本原理,比如design principles和design patterns,最核心的内容就是OOA/OOD/OOP,非常适合那些想要转码的同学初步入门软件构建。但是,这门课的homework/project设置的非常合理,循序渐进的实践了functional correctness、efficiency、reusability、extensibility、concurrency,难度总体来说在逐步提升。而且每个作业都要follow coding checkstyle,还要自己写test,还要跑CI jobs,甚至到后期要自己写build files,这个是其他课程会忽视的一个细节。
Homework 1: solo。算Git repo里文件的document similarity,考察functional correctness。
Homework 2: solo。设计一个可以运行汇编指令的interpreter,考察extensibility和reusability,初步尝试OOD,需要设计各个component的解耦和合理暴露接口。
Homework 3: solo。写一个cryptarithms运算器,考察extensibility和efficiency,需要考虑的component关系变得复杂起来,需要设计出可扩展的component。
Homework 4: solo。大名鼎鼎的卡卡颂游戏,也是最累的project,分为abc三个checkpoint,a画UML图,b实现game core engine,c实现GUI (Java awt & Swing)。其中b的游戏逻辑实现和测试代码直接干到3000-4000行,c的GUI实现很简单,设计UI和调API就好了,只要b的逻辑没写错(至于有bug的话,lol,good luck)。
Homework 5: Group of 3,分为abc三个checkpoint。设计一个Data Visualization Framework,需要暴露接口给其他人做plugins(data extraction plugin / display plugin)。a做接口设计,b实现framework core。注意,如果b做到了best framework,c基本就没事了,只用回答其他人在实现你framework插件时的问题就好了。but emmm 我们b得了满分,却没评上best frameworks(有的best framework也没满分),就离谱,c就给别人打工写插件了。
Homework 6: solo。用java concurrency paradigms like producer-consumer patterns提升git repo history comparator(with JGit)的效率。基本上Optional、Executor、BlockingQueue那些都要用到。
注意,我的prof是Josh & Charlie搭档,一切前提也是建立在有Josh(Java Collections和Effective Java的作者)的基础上。这门课原来是Charlie讲的,但是Josh来了之后,加入了很多他个人经验的总结,比如Effective Java的很多items和设计Java Collections API的心路历程和轶事,这部分才是最有价值的地方,毕竟Josh这种大佬的毕生所学在其他地方可听不到,我就是听了josh的课之后选了他的另一门高阶课的(17-780)专攻API Design。
btw每节课他俩都要表演一个冷笑话,我猜他俩每次课前都要预演一遍,但是每次演出来笑的人不多就罢了lol。
btw这门课十分Java向,对于我这种gopher略微不友好,很多practive都是Java-specific,但是如果没有Java经验,这门课入门也不错。
总之,这是我CMU印象最深的两门课之一,当然主要因为共同上这门课的队友,和他们一起上课的日子过得十分充实和开心。
## 15-640 Distributed Systems @20Fall
Prof. Heather Miller & Rashmi Vinayak
Feedback:
ds课程内容可以说是非常全面,每一章的知识我认为都是程序员必知必会的,所以十分推荐上这门课。而且每个知识点应该都要记住,毕竟是systems design中最基础的内容。
一共4个project,全是Golang,其中p1和p3是双人组队project,feature完全可以划分的很合理,但是无奈我当时又搞成了solo,有点累,不推荐这样。
p0(solo):Key-value messaging system。重点是channel(unbuffered/buffered)和goroutine的运用。
p1(duo):Distributed Bitcoin Miner。在UDP上实现Live Sequence Protocol支持各种可靠传输features,建议花时间思考reusable的设计,做好encapsulation,后期可以节省很多重构的时间。矿机方面就是client、miner、server三元关系,注意同步异步问题,问题不大。
P2(solo):Raft Consensus Protocol。请完全按照Raft paper写的内容实现,谢谢。(建议先好好读paper,理解透彻再开始实现)
p3(duo):Tribbler。一个类似twitter的message disseminator,基于RPC实现各种操作(get、put、delete),依然经典的client、server、backend storage三元关系,需要考虑效率,所以尽量用空间换时间,还要优化算法。
btw我个人不太喜欢prof的讲课方式,尤其某位prof一节课能说200次you know,所以后来就没听lectures了,但是期末prof贴心的送了一堆gopher贴纸很可爱。这门课上对我个人而言有点鸡肋,本来当成硬课选的,但是每个project都是直接crack掉(不排除我是gopher写Golang可以直接上手的原因),两个midterm考试也比较轻松,上成了一门不硬的课(考虑到当时选了4门课还有硬课ss)lol。但是对于大多数同学好像是门十足的硬课(High)。尽管如此,我也推荐这门课是来CMU必上的课之一。
## 17-780 API Design and Implementation @20Fall
Prof. Josh Bloch
Feedback:
先说上完这门课的感受
感受一:API真的太妙了,design & evolution的过程真的是很有趣的一件事。一切的工作都只是为了满足自己的审美需求,即”being tasteful“,所以设计API可能更多是一门艺术rather than工程实践。
感受二:似乎很多同学都get不到Josh的思维精髓,毕竟他融合了他几十年的业界经验,全盘托出,没有亲自实践,很难全部领悟。
感受三:之前写的代码好ugly,包括很多看到别人写的代码也好ugly,接口写一点都不tasteful。甚至拿来17-514写的代码,会感觉需要全部重构。
感受四:CMU的高阶课(>=700)真的注重设计rather than实现,甚至可以忽略implementation detail,毕竟只要核心接口和框架做的合理,剩下的东西就会自然水到渠成了。
一共5个作业(还有一个打卡作业HW0)。
HW1:solo。找出某个Java.io库的significant flaws。
HW2:solo。修复HW1找出的flaws。
HW3:group of 3。翻译给定的API,从C到Java/python。靠谱的队友很重要。
HW4:group of 3。找出目前仍被使用的broken API。
HW5:group of 3-5。重构一个体量适中的public API。这个project很考验合作,也考验大家的API taste是否一致,需要共同找问题并且反复evolve api design,需要想各种use case和写很多client code,在此感谢我的队友都做出了很多贡献。
两个midterm。第一个以发行broken API和fix为主。第二个需要fix broken API和自己设计API,注意用户需求很重要(我考试那天前一夜没睡觉,考试时候完全神游,题干好多都读错了,太惨了……)。
这门课workload比较适中(Medium),只有final project有点累,因为需要每天开会。不过由于这门课的size特别小,运气的不好的话很难选的上lol。
总之,这是我CMU印象最深的两门课之一,因为Josh Bloch的个人魅力。
## 15-746 / 18-746 Storage Systems @20Fall
Prof. Greg & George
Feedback:
ss是我来CMU上的最累的一门课,简直要被workload压得喘不过气来。每周有quiz和required readings,quiz的题基本出自readings。两个midterm,全是简答题,(提供十年内的考试原题和答案),很考验对于各种storage system概念的理解,不理解是真的很难写出reasonable的答案的。两个大solo project体量也惊人,都是几千行code,更何况要用C/C++。
Project 1:MyFTL。from scratch实现一个Flash Translation Layer,翻译SSD的物理地址和逻辑地址,要实现多种地址映射机制和各种GC策略,最后的进阶checkpoint还要设计自己的wear-leveling策略,防止SSD硬盘寿命过低。最后的checkpoint是真的tricky,建议向TAs多套话,我就是在一条错误的道路上连续奋战了一周发现走不通,最后换了个方法,一晚就写出来了。
project 2:CloudFS。from scratch实现一个运用SSD和AWS S3的基于FUSE接口的hybrid file system。要实现的feature也多的可怕,upload and download、segmentation、deduplication、caching、compression、snapshots and backup recovery,关于文件属性和源数据的设计真的令人挠头,还有需要自己improvise出一种能够节省transferred data的方法(千万要相信自己的直觉,这个project真的允许你做各种骚操作来节省cloud usage)。最tricky的是每次提交次数是有限制的,而且全是hidden case,即使想打印出来信息,输出buffer也容不下所有信息,所以这个project最大的收获往往是学会不用print来debug和学会一次性写对复杂的逻辑(如果一遍错的debug的时间可能比重写一次的还要长)。
不过ss的课程内容很有意思,包括disk drives(HDD、SSD)、file systems、caching、disk array、distributed file systems(NFS、AFS、GFS)、data protection(reliability、RAID)。其他学校是很少开这种专门讲授storage方面技术的课的,更何况ss特别紧跟技术发展,基本最新的技术都能被涉及到,而且能邀请到许多业界的cmu alum作为guest lecturers。
我个人认为这门课是真正的硬课(Very High),非常适合那种能力比较强而且想要更深入体验system design的同学。
## 18-749 Build Reliable Distributed Systems @20Fall
Prof. Priya Narasimhan
Feedback:
Prof. Priya的课大家都懂,workload就较小(Low),project一般很容易,并且TA检查的会很松,给分也很慷慨。讲的内容相当于ds里面CAP原理的扩充,总之就是针对各种fault detection & recovery,包括sync/async、consensus、consistency、fault tolerance、replication、SLA、 CAP、ACID、BASE、performance fault。其中replication这块最为重点,包括active、passive、primary-backup之类的,而且要掌握ordering、membership、checkpoint、deduplication、deterministic behavior等概念。
一个3人Project(但是怎么都感觉这个project就没法三个人写,因为功能很耦合,很难定义公有接口,一般都是一个人写完的),有5个checkpoint,循序渐进构建一个fault toleratant TMR system,支持fault detection、active/passive replication、deduplication、checkpoint、quiescence,还有每次checkpoint要画系统架构示意图(记得当时每次都是我due前一晚开始写然后第二天让TA检查,但是建议不要这样,后三次都是肝到天明才写完的)。project要求用Java/python,但是其实如果能换Golang或Rust的话,由于语言特性的原因,工作量能省好多好多,就不用写很多冗余的代码了。
两个midterm考试,主要是选择和判断对错,以概念理解为主。千万注意题干的措辞,有的时候副词和形容词也很关键,有的时候好几道题都共用同一假设(但没声明),有些离谱。复习的小trick是可以读一遍prof本人的某一篇paper,涉及了这门课的核心内容,我甚至怀疑课程内容大部分是直接自引的那篇paper。
## 15-719 / 18-709 Advanced Cloud Computing @21Spring
Prof. Greg & George & Majd
Feedback:
虽然依然是Greg和George授课,但是workload比ss轻了不少。如果之前上过ss,这门课会驾轻就熟一些。George日常卖萌但讲课十分清晰,Greg经常捣鼓zoom virtual background和负责邀请业界大佬,加入了cc的Majd但他讲的很偏应用。每周五都有quiz,千万不要错过,而且之前最好先复习一下。每周都有required readings,强烈建议认真读,感觉对于design thinking真的很有帮助,至于optional readings看个人时间兴趣了。两个midterms(全是简答题,如果不能理解course material的话感觉会很艰难。而且有提供十年以来的卷子,但是至于刷题有没有复习价值,我看未必),后半学期guest lectures居多(真的都是大佬,错过哪节课都很亏,常驻嘉宾有AWS、Intel、VMware、IBM等公司的techlead,这学期还把Microsoft Azure CTO请过来了,表演了一把用supercomputer cluster玩俄罗斯方块的霸道总裁行为,太浪漫了,但是这电费就得不少钱啊喂),而且这些guest lecturer往往都会提供一些internship & full-time机会,千万不要错过。这门课内容evolve的很快,紧跟edge cutting technology,比如这个学期重点专题就是edge computing。
Project 1: Elasticity & Auto-Scaling on AWS
写terraform(一种类似于YAML的配置文件语法)和Python。针对于给定workload设计auto-scaling policy,和进一步的auto-scaling controller(AWS Step Functions做有穷状态机,用CloudWatch观察性能,改Django代码调整scaling policy),然后去做更细小粒度的scaling(用AWS Lambda,相当于是function-as-a-service)。注意不要用超budget,因为花销的更新有很大延迟,所以千万要注意!!!我p11在试各种policy的区别的时候就用超了,被扣分了,只能后期靠scoreboard打榜来挣bonus补回扣掉的分……
Project 2: ETL Processing on AWS using Apache Spark
Python写PySpark,fluent programming的感觉很舒服。最建议的是就是先熟读PySpark API Doc再提出各种问题,感觉身边同学的问题普遍是不认真熟悉API specification导致的。其次就是了解cache和persistent的用法和区别,以此来tradeoff memory & storage space。还有就是注意数据维度的一致性。再有就是先思考周全,再开始敲代码,如果想出了最优的pipeline,直接实现就能一次性写出合格答案。
Project 3: Resource Scheduling in Kubernetes
我最爱的Golang。接触Kubernetes是非常不错的体验。分别写scheduler extender和kube-batch。注意千万不要想复杂了,策略真的很简单,可能每个checkpoint就那二十几行或者四五十行代码需要写。但是前提是观察好workload distribution & pattern,再设计job scheduling policy。btw 作为一个gopher,真心推荐这门编程语言,真的可以把代码写的既简洁又有自解释能力。
个人建议,这种课就不必苦背知识点了,真正的精髓是学会做engineering tradeoffs,理解各个决策分支的pros & cons,并且加入cost efficiency的思考,摒弃思考问题只考虑理想环境的习惯,多考虑engineering problems & caveats。据我观察,很多同学依然走的是”离散“路线,认为在现有情况下做一种决策就一定是好的。但是事实上这种system design往任何一条路径发展都有利有弊,需要全方位的考量设计需求和限制,尽量满足优先级高的要求才能做出最合理的设计决策。
btw请记住每次lecture结束后谁说Happy Monday/Wednesday,还有哪个prof喜欢打篮球,还有哪个prof喜欢旅行。
总的来看workload不算特别高(介于Medium和High之间吧),但是花在理解design tradeoffs & engineering practice上的时间可能会因人而异。至于adv.cc和cc要上哪个,我的建议是这两门课相互并没有任何影响,advcc更注重设计思维,cc更注重practice,而且cc会比advcc工作量大好多(我曾经选过cc但是中途drop了,感觉implementation details有点多,并不一定能提升能力,但是没做过final project所以也很难做出公允评价)。
## 18-741 Computer Networks @21Spring
Prof. Swarun Kumar
Feedback:
总体来说,就是按照计算机网络的分层协议栈由下至上的讲了一遍,没有什么特别的。如果本科有学过,完全可以“温故”一下,能不能“知新”就不好说了。感觉workload比较适中(Low和Medium之间)。
4个quiz
3个solo project
project 1: matlab写五层协议栈实现WIFI transmitter & receiver (比较简单,就是matlab programming比较尴尬,我个人不太喜欢。)
project 2: C/Java写Content Distribution Networks (实际上难点只有link-state advertisement协议和Dijkstra Algorithm,基本上一天写完checkpoint一天写完final checkpoint)
project 3: C/Java写Streaming Server (本质上就是实现一个http server,处理多媒体类型的时候有点小坑,需要注意partial content的传输方式。btw由于要支持5000并发连接,但又不提供benchmark,所以需要自己去想怎么复用socket connections来处理高并发连接,还要尽可能节省内存,还要自己用apache benchmark去试。)
midterm: from Physical layer to IP layer 选择题/填空题,较简单,因为全是固定的知识点。
final: from Transport layer to Application layer (and advanced topics like CDN/SDN/Security/5G) 选择题/填空题,比midterm稍难一些,因为涉及的内容比较杂。
## 19-637 Special Topics: Patents, Licensing, and Innovation @21Spring
Prof. Dean Alderucci
Feedback:
4 assignments(选择题/简答题各占一半)
1 project(2人一组自由选择专利细分领域,完成一个patent application draft,分为5个checkpoint,依次做Field Analysis Study、写Claim & Background,做Competitive Analysis,每次有3-4周可以做,每次都是一晚做完的量)
1个最后一节课的随堂midterm(全是选择题)
真心没有体验到任何workload,但是也是来这里上的最离谱的一门课,因为每次作业都不知道写的答案对不对,即使是最后的midterm考试也一样,感觉所有答案都可以argue成对的或者错的,甚至有的描述还与官方法案冲突(比较迷)。而且似乎这门课没人拿到A的样子,最好就是A-。真的是最水的课没有之一了。
## Summary
写了这么多的选课心得,才发现在CMU有过如此丰富的体验。这个项目读下来,感觉收获和付出是等价的,因为选择了很多自己感兴趣的专题去研究,体会到了什么叫巨大的workload,遇到了一群有意思的一直陪伴着我的朋友,找到了今后感兴趣的发展方向。不得不说,在CMU上学(不考虑划水的话)生存压力真的很大,因为需要面对各方面的压力(比如找工求职、上课写project、甚至生活中的各种琐事),但其实唯一能帮助你的人就是你自己,既然选择了这条路,就要接受焦虑和压力,相信在终点等待着你的一定是光明的未来。
Feedback:
等价于15-213,网上针对于CMU镇校神课的介绍和分析都很详尽了。workload一般比较合理(Low),偶尔Lab会偏难(Medium),总体就是Low到Medium之间。如果教授不太合自己口味的话有录播课,可以选择自己喜欢的prof看recordings。而且这门课是来CMU第一门CS课首选,因为很多课的prerequisite都有15-213。
btw真心建议有时间的话读一遍CSAPP,真的十分详尽的介绍了计算机系统的全部构成,从底层到顶层,从hardware architecture到system kernel再到software,对于未来做system design大有裨益。
## 10-601 Introduction to Machine Learning @20Spring
Prof. Matt Gormley
Feedback:
教授是男神matt,人长的帅,课讲的很有激情,经常会用道具或者邀请学生参与”课堂实验“(感觉像是中学老师会做的课堂游戏hhh),而且萌娃经常抢镜。
课程设计的内容特别丰富,涵盖了ML的全部领域,比如classifier(KNN、naive bayes、logistic regression、perceptron、SVM)、regression(linear regression)、unsupervised learning(clustering)、neural networks(Back-propagation 图灵奖获得者Geoffrey Hinton在我校工作过一段时间,还见过他和某一位教授在聊天、CNNs)、graphical models (Bayesian networks、HMMs)、learning theory、reinforcement learning。总体感觉略微有点走马观花,每个topics可能只有一周时间,做一个作业或者一个programming assignment就过去了。如果想要更细致的了解具体topics,可能还是得上10/11/15/17的其他课。
个人感觉,如果以后不想往MLE或者ML research scientist方向发展的话,未必要上这门课。如果抱着了解一下ML的态度的话,这门课比较合适。只不过每周都有assignment or programming assignment,可能会占用一些时间和精力,还有两个midterm(感觉midterm1有点难),workload很均匀,但不算很大(Medium)。
## 17-514 Principles of Software Construction @20Spring
Prof. Josh Bloch & Charlie Garrod
Feedback:
Hightlight!!! 如果只能上一门软件课或者本科课的话,一定要上的一门课。
这门课本科课号是17-214,其实是最入门的软件课,内容也非常基础,就是讲构建软件的基本原理,比如design principles和design patterns,最核心的内容就是OOA/OOD/OOP,非常适合那些想要转码的同学初步入门软件构建。但是,这门课的homework/project设置的非常合理,循序渐进的实践了functional correctness、efficiency、reusability、extensibility、concurrency,难度总体来说在逐步提升。而且每个作业都要follow coding checkstyle,还要自己写test,还要跑CI jobs,甚至到后期要自己写build files,这个是其他课程会忽视的一个细节。
Homework 1: solo。算Git repo里文件的document similarity,考察functional correctness。
Homework 2: solo。设计一个可以运行汇编指令的interpreter,考察extensibility和reusability,初步尝试OOD,需要设计各个component的解耦和合理暴露接口。
Homework 3: solo。写一个cryptarithms运算器,考察extensibility和efficiency,需要考虑的component关系变得复杂起来,需要设计出可扩展的component。
Homework 4: solo。大名鼎鼎的卡卡颂游戏,也是最累的project,分为abc三个checkpoint,a画UML图,b实现game core engine,c实现GUI (Java awt & Swing)。其中b的游戏逻辑实现和测试代码直接干到3000-4000行,c的GUI实现很简单,设计UI和调API就好了,只要b的逻辑没写错(至于有bug的话,lol,good luck)。
Homework 5: Group of 3,分为abc三个checkpoint。设计一个Data Visualization Framework,需要暴露接口给其他人做plugins(data extraction plugin / display plugin)。a做接口设计,b实现framework core。注意,如果b做到了best framework,c基本就没事了,只用回答其他人在实现你framework插件时的问题就好了。but emmm 我们b得了满分,却没评上best frameworks(有的best framework也没满分),就离谱,c就给别人打工写插件了。
Homework 6: solo。用java concurrency paradigms like producer-consumer patterns提升git repo history comparator(with JGit)的效率。基本上Optional、Executor、BlockingQueue那些都要用到。
注意,我的prof是Josh & Charlie搭档,一切前提也是建立在有Josh(Java Collections和Effective Java的作者)的基础上。这门课原来是Charlie讲的,但是Josh来了之后,加入了很多他个人经验的总结,比如Effective Java的很多items和设计Java Collections API的心路历程和轶事,这部分才是最有价值的地方,毕竟Josh这种大佬的毕生所学在其他地方可听不到,我就是听了josh的课之后选了他的另一门高阶课的(17-780)专攻API Design。
btw每节课他俩都要表演一个冷笑话,我猜他俩每次课前都要预演一遍,但是每次演出来笑的人不多就罢了lol。
btw这门课十分Java向,对于我这种gopher略微不友好,很多practive都是Java-specific,但是如果没有Java经验,这门课入门也不错。
总之,这是我CMU印象最深的两门课之一,当然主要因为共同上这门课的队友,和他们一起上课的日子过得十分充实和开心。
## 15-640 Distributed Systems @20Fall
Prof. Heather Miller & Rashmi Vinayak
Feedback:
ds课程内容可以说是非常全面,每一章的知识我认为都是程序员必知必会的,所以十分推荐上这门课。而且每个知识点应该都要记住,毕竟是systems design中最基础的内容。
一共4个project,全是Golang,其中p1和p3是双人组队project,feature完全可以划分的很合理,但是无奈我当时又搞成了solo,有点累,不推荐这样。
p0(solo):Key-value messaging system。重点是channel(unbuffered/buffered)和goroutine的运用。
p1(duo):Distributed Bitcoin Miner。在UDP上实现Live Sequence Protocol支持各种可靠传输features,建议花时间思考reusable的设计,做好encapsulation,后期可以节省很多重构的时间。矿机方面就是client、miner、server三元关系,注意同步异步问题,问题不大。
P2(solo):Raft Consensus Protocol。请完全按照Raft paper写的内容实现,谢谢。(建议先好好读paper,理解透彻再开始实现)
p3(duo):Tribbler。一个类似twitter的message disseminator,基于RPC实现各种操作(get、put、delete),依然经典的client、server、backend storage三元关系,需要考虑效率,所以尽量用空间换时间,还要优化算法。
btw我个人不太喜欢prof的讲课方式,尤其某位prof一节课能说200次you know,所以后来就没听lectures了,但是期末prof贴心的送了一堆gopher贴纸很可爱。这门课上对我个人而言有点鸡肋,本来当成硬课选的,但是每个project都是直接crack掉(不排除我是gopher写Golang可以直接上手的原因),两个midterm考试也比较轻松,上成了一门不硬的课(考虑到当时选了4门课还有硬课ss)lol。但是对于大多数同学好像是门十足的硬课(High)。尽管如此,我也推荐这门课是来CMU必上的课之一。
## 17-780 API Design and Implementation @20Fall
Prof. Josh Bloch
Feedback:
先说上完这门课的感受
感受一:API真的太妙了,design & evolution的过程真的是很有趣的一件事。一切的工作都只是为了满足自己的审美需求,即”being tasteful“,所以设计API可能更多是一门艺术rather than工程实践。
感受二:似乎很多同学都get不到Josh的思维精髓,毕竟他融合了他几十年的业界经验,全盘托出,没有亲自实践,很难全部领悟。
感受三:之前写的代码好ugly,包括很多看到别人写的代码也好ugly,接口写一点都不tasteful。甚至拿来17-514写的代码,会感觉需要全部重构。
感受四:CMU的高阶课(>=700)真的注重设计rather than实现,甚至可以忽略implementation detail,毕竟只要核心接口和框架做的合理,剩下的东西就会自然水到渠成了。
一共5个作业(还有一个打卡作业HW0)。
HW1:solo。找出某个Java.io库的significant flaws。
HW2:solo。修复HW1找出的flaws。
HW3:group of 3。翻译给定的API,从C到Java/python。靠谱的队友很重要。
HW4:group of 3。找出目前仍被使用的broken API。
HW5:group of 3-5。重构一个体量适中的public API。这个project很考验合作,也考验大家的API taste是否一致,需要共同找问题并且反复evolve api design,需要想各种use case和写很多client code,在此感谢我的队友都做出了很多贡献。
两个midterm。第一个以发行broken API和fix为主。第二个需要fix broken API和自己设计API,注意用户需求很重要(我考试那天前一夜没睡觉,考试时候完全神游,题干好多都读错了,太惨了……)。
这门课workload比较适中(Medium),只有final project有点累,因为需要每天开会。不过由于这门课的size特别小,运气的不好的话很难选的上lol。
总之,这是我CMU印象最深的两门课之一,因为Josh Bloch的个人魅力。
## 15-746 / 18-746 Storage Systems @20Fall
Prof. Greg & George
Feedback:
ss是我来CMU上的最累的一门课,简直要被workload压得喘不过气来。每周有quiz和required readings,quiz的题基本出自readings。两个midterm,全是简答题,(提供十年内的考试原题和答案),很考验对于各种storage system概念的理解,不理解是真的很难写出reasonable的答案的。两个大solo project体量也惊人,都是几千行code,更何况要用C/C++。
Project 1:MyFTL。from scratch实现一个Flash Translation Layer,翻译SSD的物理地址和逻辑地址,要实现多种地址映射机制和各种GC策略,最后的进阶checkpoint还要设计自己的wear-leveling策略,防止SSD硬盘寿命过低。最后的checkpoint是真的tricky,建议向TAs多套话,我就是在一条错误的道路上连续奋战了一周发现走不通,最后换了个方法,一晚就写出来了。
project 2:CloudFS。from scratch实现一个运用SSD和AWS S3的基于FUSE接口的hybrid file system。要实现的feature也多的可怕,upload and download、segmentation、deduplication、caching、compression、snapshots and backup recovery,关于文件属性和源数据的设计真的令人挠头,还有需要自己improvise出一种能够节省transferred data的方法(千万要相信自己的直觉,这个project真的允许你做各种骚操作来节省cloud usage)。最tricky的是每次提交次数是有限制的,而且全是hidden case,即使想打印出来信息,输出buffer也容不下所有信息,所以这个project最大的收获往往是学会不用print来debug和学会一次性写对复杂的逻辑(如果一遍错的debug的时间可能比重写一次的还要长)。
不过ss的课程内容很有意思,包括disk drives(HDD、SSD)、file systems、caching、disk array、distributed file systems(NFS、AFS、GFS)、data protection(reliability、RAID)。其他学校是很少开这种专门讲授storage方面技术的课的,更何况ss特别紧跟技术发展,基本最新的技术都能被涉及到,而且能邀请到许多业界的cmu alum作为guest lecturers。
我个人认为这门课是真正的硬课(Very High),非常适合那种能力比较强而且想要更深入体验system design的同学。
## 18-749 Build Reliable Distributed Systems @20Fall
Prof. Priya Narasimhan
Feedback:
Prof. Priya的课大家都懂,workload就较小(Low),project一般很容易,并且TA检查的会很松,给分也很慷慨。讲的内容相当于ds里面CAP原理的扩充,总之就是针对各种fault detection & recovery,包括sync/async、consensus、consistency、fault tolerance、replication、SLA、 CAP、ACID、BASE、performance fault。其中replication这块最为重点,包括active、passive、primary-backup之类的,而且要掌握ordering、membership、checkpoint、deduplication、deterministic behavior等概念。
一个3人Project(但是怎么都感觉这个project就没法三个人写,因为功能很耦合,很难定义公有接口,一般都是一个人写完的),有5个checkpoint,循序渐进构建一个fault toleratant TMR system,支持fault detection、active/passive replication、deduplication、checkpoint、quiescence,还有每次checkpoint要画系统架构示意图(记得当时每次都是我due前一晚开始写然后第二天让TA检查,但是建议不要这样,后三次都是肝到天明才写完的)。project要求用Java/python,但是其实如果能换Golang或Rust的话,由于语言特性的原因,工作量能省好多好多,就不用写很多冗余的代码了。
两个midterm考试,主要是选择和判断对错,以概念理解为主。千万注意题干的措辞,有的时候副词和形容词也很关键,有的时候好几道题都共用同一假设(但没声明),有些离谱。复习的小trick是可以读一遍prof本人的某一篇paper,涉及了这门课的核心内容,我甚至怀疑课程内容大部分是直接自引的那篇paper。
## 15-719 / 18-709 Advanced Cloud Computing @21Spring
Prof. Greg & George & Majd
Feedback:
虽然依然是Greg和George授课,但是workload比ss轻了不少。如果之前上过ss,这门课会驾轻就熟一些。George日常卖萌但讲课十分清晰,Greg经常捣鼓zoom virtual background和负责邀请业界大佬,加入了cc的Majd但他讲的很偏应用。每周五都有quiz,千万不要错过,而且之前最好先复习一下。每周都有required readings,强烈建议认真读,感觉对于design thinking真的很有帮助,至于optional readings看个人时间兴趣了。两个midterms(全是简答题,如果不能理解course material的话感觉会很艰难。而且有提供十年以来的卷子,但是至于刷题有没有复习价值,我看未必),后半学期guest lectures居多(真的都是大佬,错过哪节课都很亏,常驻嘉宾有AWS、Intel、VMware、IBM等公司的techlead,这学期还把Microsoft Azure CTO请过来了,表演了一把用supercomputer cluster玩俄罗斯方块的霸道总裁行为,太浪漫了,但是这电费就得不少钱啊喂),而且这些guest lecturer往往都会提供一些internship & full-time机会,千万不要错过。这门课内容evolve的很快,紧跟edge cutting technology,比如这个学期重点专题就是edge computing。
Project 1: Elasticity & Auto-Scaling on AWS
写terraform(一种类似于YAML的配置文件语法)和Python。针对于给定workload设计auto-scaling policy,和进一步的auto-scaling controller(AWS Step Functions做有穷状态机,用CloudWatch观察性能,改Django代码调整scaling policy),然后去做更细小粒度的scaling(用AWS Lambda,相当于是function-as-a-service)。注意不要用超budget,因为花销的更新有很大延迟,所以千万要注意!!!我p11在试各种policy的区别的时候就用超了,被扣分了,只能后期靠scoreboard打榜来挣bonus补回扣掉的分……
Project 2: ETL Processing on AWS using Apache Spark
Python写PySpark,fluent programming的感觉很舒服。最建议的是就是先熟读PySpark API Doc再提出各种问题,感觉身边同学的问题普遍是不认真熟悉API specification导致的。其次就是了解cache和persistent的用法和区别,以此来tradeoff memory & storage space。还有就是注意数据维度的一致性。再有就是先思考周全,再开始敲代码,如果想出了最优的pipeline,直接实现就能一次性写出合格答案。
Project 3: Resource Scheduling in Kubernetes
我最爱的Golang。接触Kubernetes是非常不错的体验。分别写scheduler extender和kube-batch。注意千万不要想复杂了,策略真的很简单,可能每个checkpoint就那二十几行或者四五十行代码需要写。但是前提是观察好workload distribution & pattern,再设计job scheduling policy。btw 作为一个gopher,真心推荐这门编程语言,真的可以把代码写的既简洁又有自解释能力。
个人建议,这种课就不必苦背知识点了,真正的精髓是学会做engineering tradeoffs,理解各个决策分支的pros & cons,并且加入cost efficiency的思考,摒弃思考问题只考虑理想环境的习惯,多考虑engineering problems & caveats。据我观察,很多同学依然走的是”离散“路线,认为在现有情况下做一种决策就一定是好的。但是事实上这种system design往任何一条路径发展都有利有弊,需要全方位的考量设计需求和限制,尽量满足优先级高的要求才能做出最合理的设计决策。
btw请记住每次lecture结束后谁说Happy Monday/Wednesday,还有哪个prof喜欢打篮球,还有哪个prof喜欢旅行。
总的来看workload不算特别高(介于Medium和High之间吧),但是花在理解design tradeoffs & engineering practice上的时间可能会因人而异。至于adv.cc和cc要上哪个,我的建议是这两门课相互并没有任何影响,advcc更注重设计思维,cc更注重practice,而且cc会比advcc工作量大好多(我曾经选过cc但是中途drop了,感觉implementation details有点多,并不一定能提升能力,但是没做过final project所以也很难做出公允评价)。
## 18-741 Computer Networks @21Spring
Prof. Swarun Kumar
Feedback:
总体来说,就是按照计算机网络的分层协议栈由下至上的讲了一遍,没有什么特别的。如果本科有学过,完全可以“温故”一下,能不能“知新”就不好说了。感觉workload比较适中(Low和Medium之间)。
4个quiz
3个solo project
project 1: matlab写五层协议栈实现WIFI transmitter & receiver (比较简单,就是matlab programming比较尴尬,我个人不太喜欢。)
project 2: C/Java写Content Distribution Networks (实际上难点只有link-state advertisement协议和Dijkstra Algorithm,基本上一天写完checkpoint一天写完final checkpoint)
project 3: C/Java写Streaming Server (本质上就是实现一个http server,处理多媒体类型的时候有点小坑,需要注意partial content的传输方式。btw由于要支持5000并发连接,但又不提供benchmark,所以需要自己去想怎么复用socket connections来处理高并发连接,还要尽可能节省内存,还要自己用apache benchmark去试。)
midterm: from Physical layer to IP layer 选择题/填空题,较简单,因为全是固定的知识点。
final: from Transport layer to Application layer (and advanced topics like CDN/SDN/Security/5G) 选择题/填空题,比midterm稍难一些,因为涉及的内容比较杂。
## 19-637 Special Topics: Patents, Licensing, and Innovation @21Spring
Prof. Dean Alderucci
Feedback:
4 assignments(选择题/简答题各占一半)
1 project(2人一组自由选择专利细分领域,完成一个patent application draft,分为5个checkpoint,依次做Field Analysis Study、写Claim & Background,做Competitive Analysis,每次有3-4周可以做,每次都是一晚做完的量)
1个最后一节课的随堂midterm(全是选择题)
真心没有体验到任何workload,但是也是来这里上的最离谱的一门课,因为每次作业都不知道写的答案对不对,即使是最后的midterm考试也一样,感觉所有答案都可以argue成对的或者错的,甚至有的描述还与官方法案冲突(比较迷)。而且似乎这门课没人拿到A的样子,最好就是A-。真的是最水的课没有之一了。
## Summary
写了这么多的选课心得,才发现在CMU有过如此丰富的体验。这个项目读下来,感觉收获和付出是等价的,因为选择了很多自己感兴趣的专题去研究,体会到了什么叫巨大的workload,遇到了一群有意思的一直陪伴着我的朋友,找到了今后感兴趣的发展方向。不得不说,在CMU上学(不考虑划水的话)生存压力真的很大,因为需要面对各方面的压力(比如找工求职、上课写project、甚至生活中的各种琐事),但其实唯一能帮助你的人就是你自己,既然选择了这条路,就要接受焦虑和压力,相信在终点等待着你的一定是光明的未来。
12条回复