谈一谈过去两年在CMU上过的课程以及那些人和事

avatar 302457
HarveyLzz
31412
39
[Prologue]
人在家中坐,degree从天上来,万万没想到在Chinese Manong University的最后一学期就在电脑前无奈的度过了,经历了zoom直播lecture和各种奇葩的online考核方式,经历了镇校神课考试服务器的翻车......回首过去的两年,一个个课程的ddl、project和final都让我记忆犹新。不得不感慨在CMU的这段日子让我找回了本科时迷失的方向感,学到的东西和高额的学费比起来也是相当值。话不多说,开始介绍过去的四个学期上过的一些课程和感受,也算是为后人踩坑预告啦。各位看官走过路过加个米,熟人同行莫拆穿~
[Terry Lee大礼包]
谈起在CMU的学习经历,相信不少人都会对Terry Lee赞不绝口,甚至会说他开的两门转码向的基础课是在CMU感受过的最好体验之一。Terry Lee本身也是传奇人物,很难想象一个本科法学、来CMU读现在已经消失的一个就业型硕士项目的“转码选手”,竟然留在了学校当起了professor,所开课程学生都能把大教室塞得满满当当,学生评分也是年年接近满分,最近还从assistant teaching professor升到了associate。之所以会有如此成绩,与他的努力和认真密不可分。所有课程的piazza回复亲力亲为,晚上10点或早上7点都能看到他的回复。课程的备课准备也是相当认真,节奏紧凑绝不拖沓。Terry Lee讲课也是诙谐幽默、激情澎湃,让我中午12点上课都毫无困意。当然不得不提刁钻的quiz、烧脑的final和每次edge case想到自闭的作业。这两门课虽然只有正常课一半的学分,但每周平均下来所花的时间绝对会超过6小时时长,收获也远大于6个units。

17681 Java For Application Programmers
这门课对很多人来说,包括我,都是人生中第一门系统学习编程语言的课程。对科班同学来说可能是看起来小菜一碟,但据我周围软工本科的同学说,这门课让他补充到了很多盲区和以前没有注意到的地方。对于java零基础的选手和想充分利用可选系外课学分的我来说,这门课当然是不二之选。这门课从hello world、如何使用IDE开始,一直到最后的多线程和Gui application,包括Object Oriented Programming三大核心、abstract classes和interface、Java Collection应用,I/O和network programming以及Swing都会涉及,可谓是从零带你上手java。这门课节奏紧凑,每周一hw due还有quiz,每次作业其实不用花太多时间,但是coding style、defensive copy要求还有各种稀奇古怪的test case可能会让人在autolab面前静静的磨上几个钟头。然后每次当你作业完成有种自己很懂java的飘飘然时,quiz的分数又让你觉得是时候该啃java docs了。考试分为笔试和机考。笔试是概念多项选择和几个纸上coding填充,机考则是自带电脑在2.5 hrs(好像)内完成一个十几页specification的Gui application,类似于成绩登分系统之类的应用。最后给分还是很严格的,犹记拿A的似乎只有10%的人,楼主由于笔试太烂最后拿到了A-。

17683 Data Structures For Application Programmers
出于上17681的超值感受,之后果断选了17683。与CS学院的算法课相比,这门课简单不少,也明显更偏向于应用和实战,作业都是造轮子或是用算法解决实际问题,没有那么多复杂度的计算和公式推导。内容涵盖java collection里面大多数data structure,着重讲述里面的原理和implementation details(例如java 排序 reference 和primitive type分别用什么sorting algorithm,java的hashCode()是怎么实现的,为什么java早期版本的HashMap length用power of 2而不是质数等等)。上课全程板书,每节课内容基本相当于手写一个数据结构,跟着学下来后对不同数据结构的性能和实现都有深刻的印象。比较可惜的是出于半学期的课程限制,详细讲到Heap后,之后的TreeMap那些就浅尝辄止了,graph是完全没有涉及。算法部分局限于各种排序算法和DFS、BFS。虽然楼主工作不用java,但这趟课学习下来还是收货颇丰,毕竟很多东西是language independent的。另外值得一提的是Terry Lee喜欢拿实物讲解数据结构,经常会带各种“法宝”到课堂。讲Collection framework时带了一个大tool box、用书架放书讲解insertion sort,用一筒品客薯片讲解stack,还从家里抱了一大堆T恤讲解max-heap里面的remove max key的操作、用扑克牌展示sorting时stability的重要性......他经常说,我希望你们上我的课就像看show一样,果然也是名不虚传。最后说下这门课的考试和作业,作业会手写各种data structure来完成一些任务比如词汇检索之类的,会有很多的edge case让人防不胜防。作业instruction经常是有些specification故意写的含糊,Terry Lee的目的是想让我们去piazza上confirm,因为工程实际中并不是所有问题都是well-defined,需求也不是百分之百明确,沟通也是一种能力的体现,这一点我深以为然。考试就像做OA一样,不同的事很多时候只需要代码填空另外也是开卷。

17637 Web Application Development
这门课其实和Terry Lee没有半毛钱关系,但是因为教课老师是Terry Lee之前的老师(现在是同事了有没有很有趣)而且都是软件学院17-的课,所以放在一起写。楼主上的是spring的版本,instructor是Jeff Eppinger。Jeff看上去是个和蔼可亲的白人老爷爷,学生时代和Java创始人James Gosling share过office,还经常讲起那个时候的故事。虽然是教web,他也经常开玩笑说他学web也没多少年,倒是在transaction上颇有名气,查阅他的经历,几十年前居然还有binary tree方面的research。这门课前半学期上课,基本的web前端UI、静态网页和动态网页、应用数据库、ajax这些都有设计。貌似主题每学期都在变,我上的那个学期是围绕建立一个mini facebook(可谓是非常mini了。。。)用Django搭一个网页,并最终部署到cloud platform。个人感觉可能和某著名网课平台上的那个万人同学的yelp网页设计差不多。下半学期做project并穿插讲一些security(包括SSL和加密算法)、transaction、web socket、CDN等一些较新的东西(web这一块确实更新的比较快,各位看官读到这里时候说不定又是一番天地)。值得一提的是project给分是相当严格的,只有不到一半的小组能拿A-和以上,最低甚至还有给C的。但就内容和时间来说,每个组都是花费了不少经历,但因为project要求使用“新的内容”,有的用react、vue这些前端框架,有的用各种third party tool,导致会有不少学习难度,而且每个组的内容非常不一样TA能给予的帮助相比作业而言也是非常有限,导致后半学期难度猛增。楼主最后是用websocket和react框架做了一个双人飞船对战小游戏,当时一度卡着非常绝望,知道报告那一天都没有实现全部功能。Jeff老爷爷竟然主动提出愿意多给我们一周的时间(当然最后得分会有discount),最后和小伙伴成功做出产品,Jeff和TA连玩三局玩的不亦乐乎,终于project这一块拿了个B+。最后当我们表示感谢破例的额外一周时,Jeff老爷爷只说了一句“It's all worthwhile",当时就差点眼泪下来了,觉得异常感动。不过言归正传,这门课不是特别推荐,web的东西完全可以网上自学,而且作业和做出来的project也都比较toy,要学web搞前端或full stack的话更建议选软件学院的一门mini课J2EE啥的,那门课几乎就等同于17637的前半学期,我觉得也基本够用了。

[Robotics/ Computer Vision相关的课程]

16720 Computer Vision
不废话,顾名思义,强推!不少同学和我一样,都是靠这门课所学知识和做的project拿到了无人驾驶方面的实习。这门课主要是五个部分image processing, detector and descriptor, multi-view geometry, deep learning-based vision和object tracking和visual slam。侧重点上偏传统cv,对于目前deep learning大火的趋势和强大的算力,这门课所学的内容可以说作为一个基础课,相当于CV里的15213。比如想搞perception的可以进阶学习Introduction to Deep Learning和Visual Learning and Recognition。想搞SLAM的可以学习前端为主Geometry Methods in Computer Vision和以后端为主的Robotics Localization and Mapping。作业貌似这几年一直在变化就不多说了,但每次作业都是量很大的造轮子的那种。在CMU经常有句话,你学啥就造个啥,类似于那些15-开头的系统课,这门课也不例外,很多东西手写起来比如back propagation,Gaussian Newton还有Geometry那些八点法、七点法的搞起来还是很累人的。

16822 Geometry-based Methods in Computer Vision
这门课一直是由现任SCS院长(也是之前robotics institute)的院长martial hebet。Martial人是非常Nice,之前因为要注册学分得找他签字,一时头脑发热居然去碰运气直接敲院长的办公室大门,结果他直接就开门并签了字。Martial虽然年纪比较大了,但上课一直是经历满满富有激情,板书推到一丝不苟,下课也经常留下来答疑,非常负责。这门课比较理论,几乎可以看做一门数学课,内容的话对标CV届的Bible 《Multiple View Geometry in Computer Vision》,内容涵盖几何用到的线性代数和优化方法、calibration、stereo、multiview Geometry,Dense Reconstruction,Prospective-N Point, SFM, Non-rigid SFM都有。然后好像是这一届开始加入了deep learning解决depth estimation相关的内容,不过也是简要介绍。作业和期中考试多理论计算和公式推到,还是很有难度的,project则是各位RI大神的展示空间,很多人展示的project作品都是最后发表到了ECCV或是CVPR的。给分温和,基本都是A。这门课比较不满的就是作业编程部分设计的太烂了,甚至还出现了原本是deep learning部分的作业TA种种没有设计出来,最后改成paper review写个报告了事的现象。除了用vanishing point和几组平行、正交线来标定相机、用plane homography单目三维重建外,也没有啥适合写在简历上的project了。本来很感兴趣的sfm加dense reconstruction也直接照搬普林斯顿肖健雄的原作业repo。不少大神选这门课要么是research需要(像RI就有团队搞non-rigid sfm而且是行业顶尖) ,要么是搞无人驾驶visual localization和传感器标定会用到,除此之外不太推荐,不过简历上有个geometry的字眼还是吸引人的,比较无人驾驶里面很多实际问题是deep learning没法end-to-end解决的,比如pose estimation、calibration、depth estimation和动态目标速度估计,geometry vision就可以派上用场。

[镇校神课]
还有谁?学校邮编都是这个。

18213/15213/15513/18613 Introduction to Computer Systems
认识的中国人转码的基本都上了。对的,你没看错,piazza上就是这么长的课号,只不过每个课号预留给不同专业或项目的同学,上的内容基本都是一样的(除了18-系列针对ece同学,覆盖东西会稍微多一些)。这门课每年都有差不多400-500人上,很多人是online的session也“不要脸”的去教室听(手动狗头开个玩笑哈哈,说的其实就是我)。对于楼主这种c都没怎么学过的选手来说上的也是非常艰难,每次作业都快花一整周的时间了,513课程内容覆盖非常广,从最基础的data、到汇编、cache、再到virtual memory、process and thread等等都会涉及。楼主个人觉得没有哪次作业是可以水过去的,哪怕是作为预备知识自我检测的lab0都花了我三个小时。Data lab让我印象深刻,用位操作搞count 和palindrome这种事情简直是变态 (只能限定的几种位操作,好几题连condition都不能用!)汇编相关的几个lab包括attack lab算是里面比较简单的了(毕竟汇编可以连蒙带猜试出来), 当然还是得弄懂,毕竟考试会碰到非常复杂的读汇编的题目,并且推算结果(楼主期中就遇到了斐波拉切的汇编代码,还是递归版本的,看了好久才反推出来)。cache lab也是难度不小,一个是因为得从零开始写code(之前有给大的框架来填充function),而且第二个矩阵优化的问题楼主太菜至今都没想通。最难的公认malloc,就是手写一个类似于malloc function实现动态内存分配,顺带实现free、realloc这些,这个作业就要求对malloc原理要非常清楚。其实vanilla版本的malloc function写出来不太难,但作业给的throughput和util metric就要求你对code层层优化,比如如何找到free block,如何减少非payload占用的空间,并且设计和改进customized data structure等等,比较有成就感的是写的malloc function通过library interpositioning可以用在real programs里面,这种感觉和之前写的cache simulator是完全不一样的。个人觉得最变态的是shell lab,就是手写一个简化版的linux shell,里面一涉及到process和signal就很容易出现各种bug,而且piazza上似乎大家都遇到不同的bug......很多甚至还不好debug毕竟run 3次两次work一次失败的那种,课上给的example code也有不少misleading的信息,得学会读man page。相比shell lab,占分更多的proxy就比较模式化了。总而言之这门课让我从无到有学到了不少system的知识,这门课也是很多课程的先修课,而且很多课程包括distributed system和parallel Programming据说会踢出没上过513的人,所以建议有机会来之前的暑假就上掉,或是在第一个学期上掉。有趣的是,笔者是最后一学期上的513,考试由于疫情原因没法去机房考,而remote server罕见的翻车了,不少同学反应无法登录进去(有的考试开始20min了才log in),更惨的是有的同学没过5min系统就会弹出莫名其妙的警告......感觉是教学事故了,最后给出的解决方案大致是要么考试成绩加5分,要么选择重考。这段经历也是没有谁了哈哈。

[系内课大合集]
CMU的MechE绝对不是传统的MechE,讲道理我上来两年的MechE master连传统的机械设计CAD、振动、流体、控制相关的都没有上过lol.

24783 Advanced Engineering Computation
这门课和24780 Engineering Computation一样,算是山川老师大礼包,是CMU不多的用C++写作业的课程之一(CMU不少系统课用c,很多用java、go,科学计算prefer python和matlab)。讲课的老师是个口音及其严重的日本人,经常把大家绕的云里雾里以致于学期过半教室里只剩5-6个人来听课了,但有一说一,山川老师的技术水平和课程设计还是非常棒的!不用ide用codepad上课live coding c++,拿着windows的powershell编译加运行,让依赖clion或vscode的我觉得无比硬核。山川老师coding对c++的熟练程度应该和他在工业届的经历有关,每次看他coding就觉得,如果能把c++写的这么熟练,怕是横行天下面试无忧(开玩笑哈哈)。有人可能会问,“这门课和机械学院有什么关系”,这就要谈到课程设计了。这门课本质上用各种算法解决MechE的问题,内容核心是算法和opengl,举个例子,用Dijkstra算法找飞机上两个mesh 网格之间的最短路径等等并用opengl可视化。山川老师本人据说是个狂热的游戏爱好者,特别喜欢日式游戏,作业很多也是与游戏相关,比如binary tree那些要做个可视化的binary tree,按“V”键自动balance。还有一个作业是写一个lidar simulator也是非常有趣。hashmap的作业是数出一个游戏界面(好像是勇者斗恶龙)用了多少unique的bitmap。最后值得一提的是作业用的库除了opencv那些都是老师自己写的,据山川老师说他大学时开始一直到现在都在写这个库,并且用这个库做了不少应用比如飞行模拟器,png decoder之类的。有次没事翻他的code,不少都是十几年来accumulated的progress。最后project大家也是各显神通,楼主和小伙伴们写了一个简易的键盘控制的temple run,居然还挺好玩的hh
本帖隐藏内容需要登录后才能查看。说的不对的欢迎指正,欢迎补充,另外欢迎加米lol

补充内容 (2020-10-18 12:29):
大家都很关心的MechE就业情况:尽管有covid-19影响,大家找工作情况都还是很不错的。很多人去了无人车(waymo,tesla autopilot组,nuro,图森,高通adas组等),干sde的fb,亚麻,核弹厂,推特,字节等都有

补充内容 (2020-10-18 12:32):
另外楼主已经毕业,项目申请方面的问题由于信息跟不上就不便回答了,有关MechE选课,找工,实习或是无人车相关的问题会尽力解答...
    • 194
    39条回复