CMU本科转学+转码分享

15670
26
楼主大一在美东的一所文理学院读政治哲学和数学,之后在转到了CMU的人文学院读统计。在这个学期转进了SCS并且declare了dual degree。因为地里对于美本转学和CMU本科CS的内容比较少,故开此贴分享一下这两年的心得体会。本帖大致会分成以下几个方面,大家可以直达想看的部分:

1. 转学申请的文书和背景
2. CMU内部转CS的要求
3. CMU本科其他转码友好项目
4. CMU其他值得推荐的CS课程
5. 找工
6. 文转码的利与弊

转学文书及背景

楼主是在疫情开始的那个学期申请的转学,申请的专业是Dietrich人文学院下开设的Statistics and Machine Learning(以下简称Stat/ML)。楼主认为自己成功转学的关键在于: 1. 较高的GPA(3.97/4.00) 2. 相关课程 3. 强推 4. essay

楼主高中是在国内年的理科普高,选择就读文理学院的原因一是因为楼主对于理工科的学习有些厌倦了,二来是想通过文理学院来探索自己在其他方面的兴趣。现在看来大一就读文理学院的体验无论是对于个人的成长还是对于之后在CMU学习CS都有非常大的帮助(在后文会提到为什么)。书归正传,尽管楼主有一段对于理科的厌倦期,但是在两个学期里上了三节数学课和一些人文统计交叉课程,并且维持了较高的GPA。这些和数学统计相关的课程出现在成绩单中很好的向CMU的招生官反映了我对于数学和统计的兴趣。

推荐信方面,楼主分别邀请一位我上过他两节数学课(线性代数、抽象代数)并且在两节课上都取得了最高分的教授和一位我和他一起做过数据分析研究的教授为我撰写推荐信。楼主认为在请求推荐信的过程中最重要的是和两位教授的沟通。以楼主为例,在和两位教授的多次沟通当中楼主确保两位教授完全理解并支持楼主转学的理由。

楼主在文书当中利用了所处文理学院的一个劣势来作为自己的主要转学理由,即没有独立开设的统计系。尽管楼主对于统计并没有特别强烈的兴趣,但是通过申请统计系楼主避免了转学申请中的两个大忌,即为了名声而非资源转学(例如Gatech转到CMU)和吐槽旧学校。很奇怪的一点是CMU的统计系是开设在人文学院下的,楼主在文书中也着重利用这一点结合自己的文理学院背景来说明为什么一定要选择CMU的统计系而不是其他理工强校。

由于当时楼主只申请了CMU一所学校的转学(DIY),所以所有文书都是专门为CMU而写的。CMU的转学文书由3篇250词的小文构成,并没有ps。楼主在每篇文章中都加入了CMU的特色元素,包括并不仅限于CMU的统计大牛Larry Wasserman的马屁,CMU校魂Herb Simon对于interdisciplinary study的看法,以及la prima coffee。

cmu对于转学分的政策是每个学院制定的,楼主一开始在dietrich只转了部分的学分,但是转进scs之后重新evaluate转学学分,又多换掉了很多门scs的gened。最后楼主居然只需要比additional major多上一门课就能拿到两个school的dual degree。也就是说楼主在之前大学上的课除了一门之外全部都换成了cmu的学分并且抵消掉了gened。


内部转码的要求

楼主在成功转入CMU之后便一边完成本专业必修的课程,一边全力上转入SCS所需要的六门课程(21127, 15122, 15150, 15213, 15210, 15251)。SCS的转院要求是这六门课里至少4门15开头的课要拿到A。前面提到楼主所转入的专业是Stat/ML。这个专业是由SCS的machine learning department和Dietrich的stats department联合开设的,所以curriculum当中与SCS本科所需完成的课程有很多重叠(15122, 15451, 21127, 10301, 11485)。这在一定程度上减轻了楼主转专业的压力,因为假设楼主转入的是MCS或者Tepper的其他专业,如果想要转SCS就必须破釜沉舟,放弃本专业的几乎所有课程全力上SCS的课程。如此一来就会有很大的心理压力,那就是一旦没有成功转院有可能本专业的课也上不完。

楼主这三个学期的时间线是:

20fall: 15122, 21127, 36225, 76101, 80250

21spring: 15150, 15213, 10301, 36226, 36315

21fall: 15210, 15251, 15440, 36401

接下来楼主就简单介绍一下这六门课的内容和在课程里成功的一些经验。

21127 Concepts of Maths

这门课是转院所需要的六门课当中唯一的一门数学课。在CMU本科级别的离散数学有两门,一门是为CS/Math学生开设的15151/21128,常年由John Mackey教授,第二门是为非CS/Math major开设的21127。我上的版本是Greggo(狗哥)的21127。两个版本的区别在于128有时候会多讲一些图论和随机过程,而127则更看老师。这门课因为楼主的数学底子比较好,每周差不多花费6-8个小时,并且很轻松就拿了A,所以也没什么特别值得说的。

每周平均用时: 6-8hrs

难度:2/5

难点:无

自学建议:没必要自学,就是普通的离散数学

15122 Principles of Imperative Computation

Functions are pointers

这门课是这六门课里第一门劝退课程(aka weeding class),对标的是伯克利的61b。值得一提的是在122之前还必须上一门15112(即cmu版61a),但是楼主拿ap cs换掉了。

122在前大半个学期所用的语言是C0,这个语言是C的一个safe subset with garbage collection,但是保留了pointer和一些C的特性。C0是Frank Pfenning在很多年前写的教学语言,而CMU的编译器课15411则是用一整个学期的时间不断完善C0的compiler,可谓是一箭双雕。

122由lecture,recitation,written homework,11个programming assignment以及3个考试组成。lecture本身取决于老师质量可能参差不齐,但是由Frank自己撰写的lecture note的质量是CMU所有课程里数一数二的,即使一节课也没有听只是把lecture note通读三遍这门课也能把122学的差不多。

122被称为劝退课程的原因主要在于他的programming assignment和三个考试。在11个programming assignment中,前7个是C0而后四个是C。每一个assignment在让学生熟悉C0/C的同时会运用到一个新的数据结构或者算法。最后一个assignment C0VM则是用C为C0写一个virtual machine。基本上课程里最花时间的就是完成这11个assignment,每个用时会超过5个小时,而对于没有写码经验的同学而言更是上不封顶。

这三场考试也是题量大,时间短,并且122不像后面的150,210,251一样会有比较大的curve,一般情况下考多少就是多少。这也就导致了很多人虽然作业写的不错但是考试翻车。122也因此成为了这几门课里重修率最高的课。

每周平均用时:10-15hrs

难度:3.5/5

难点:lab,考试

自学建议:如果想学C但是有点畏难可以去读Frank的lecture note

15150 Introduction to Functional Programming

Functions are values

这门课是楼主的最爱之一。在我上150的那个学期很幸运的赶上了Michael Erdmann和Karl Crary两位非常好的老师。和四大里的其他学校相比,CMU有着非常深厚的programming language底蕴。从SCS的首任院长Alan Perlis到Turing Award winner Edmund Clarke再到Frank Pfenning和Robert Harper,pl study从建系伊始就是scs的中流砥柱,这一点也可以从CMU本科的课程设计看出来。在六门必修课当中有两门是用Robert Harper开发的New Jersey Standard Meta Language(SMLNJ)来教学。可以说每一位scs的本科生对于sml都是又爱又恨。爱的是SML的pure functional style,用来写recursion非常的爽,恨的也是SML的pure functional style,在用SML写bellman ford的时候恨不得给Bob Harper 寄刀片。

15150就是第一门向本科生介绍functional language, programming language theory和sml的课程。这门课程在我上的那个学期作业量巨大,最忙的三周要花20个小时左右。课程的workload呈现一个正态分布的曲线,一开始比较简单,到期中左右难度会达到一个巅峰,到了期末又会简单起来。和122一样,这门课的难度也来自于programming assignment和考试。楼主认为最难的三个lab分别是cps, hofs和sequences。楼主21spring最死亡的那个礼拜是213的malloc和150的cps同时due,记得那周梦里都在continuation passing style... 作业如果遇到障碍去oh基本都能得到解答。

考试的话基本上三次考试每次平均分都在60-70,不过到了期末会有一个比较generous的curve,个人感觉150拿a的难度要比122小一些。

值得一提的是150有着非常好的TA文化,每位TA都非常的helpful,recitation的质量也很高。sml在后面的几门课程中也非常重要(15210, 1531x, 15411),所以在150里打好一个底子是非常重要滴。

每周平均用时:10-20hrs

难度:3.5/5

难点:sml,lab,考试

自学建议:基本没法自学

15213 Introduction to Computer Systems

大名鼎鼎的15213 ICS。这门课网上的资源太多了,楼主在这里就不多说了。推荐小土刀师兄的博客:[wdxtub.com](wdxtub.com)

每周平均用时:15hrs

难度:4/5

难点:lab

自学建议:u2b 15年视频,小土刀博客以及csdn上找lab

15210 Parallel and Sequential Algorithms

My heart is in the span

这门课是楼主在CMU最喜欢的CS课,没有之一。我上的那个学期是由Guy Blelloch和Charlie Garrod(楼主的advisor)一起教学,可谓是体验极佳。这门课虽然有一个让人摸不着头脑的名字, parallel and sequential data structures and algorithms,但是它在diderot(cmu的内部教学平台)上面的名字简单易懂,就一个字:algorithm。尽管122和150也讲了很多算法,但是他们的主要侧重并不是算法本身,而210就是一门完完全全的算法课了。这门课覆盖了technical interview 会遇到的几乎一切算法,包括divide and conquer, sweep line, Boruvka, Kosaraju, Bellman-ford, quickSelect, star contraction, treaps, leftist heap等等。

楼主认为210和其他学校的算法课不同的一点就是它对于parallelism的关注。上述的所有算法在教授的过程中不单单只是分析其sequential implementation/complexity,而是会花费大量篇幅分析他们的parallelism和span。在并行运算成为主流的今天,能够熟练分析一个算法的span是一项非常重要(装逼)的技能。210也是用sml教授的。一开始楼主和一些朋友都觉得用sml这种语言去写dijkstra啥的就是自虐行为,但是当楼主上完一个学期之后发现这门课用sml教的效果是最好的。这是因为在functional language里面可以非常方便的分析一个算法的parallelism,而不用担心imperative programming中会出现的concurrency issue。选择sml可以让学生花费全部的经历在学习这些算法,而不是花时间debug 死锁上。后者所需的工程能力完全可以通过上15418,15440和15410这些system课来获得,而210所关注的是让学生在毕业20年后(可能那时候都不用写mutex了)还能用到课上学到的东西。这种长期主义是我喜欢210的一个原因之一。

在上完210之后楼主基本上大部分的lc问题都不怕了,而且在面试里每次分析完work之后都会习惯性的分析算法的span,经常能够impress到interviewer。对于找工作而言上完122+210已经可以足够秒杀ng级别的任何面试。

210有着非常人性化的bucket system,也就是每次小测验和作业只要拿到80分就算满分。而210最难的就是他的考试了,我上的那个学期三次考试的平均分分别为66, 59和57分,所以想要拿到a还是有一定的难度。

每周平均用时:15hrs

难度:4/5

难点:考试

自学建议:[cs.cmu.edu](cs.cmu.edu) 如果没有sml背景自学会有一定难度

15251 Great Ideas in Theoretical Computer Science

Math is hard

在介绍这门课本身之前,我们先来看看曾经教过251的教授都有谁:Luis Von Ahn(Captcha发明者,duolingo创始人), Daniel Sleator(Splay tree发明者), Ryan O'Donnell(TCS大神)。在最近几年这门课都是由Anil Ada教授的,据上过ada课的同学反映,ada教的251就是cmu天花板级别的存在,从lecture, hw, infra, TA 到recitation都无可挑剔。

很可惜,楼主上的那学期没赶上ada,而是遇到了Klaus Sutner。Sutner是一个英语很好的德国老头,他在我上的那个学期之前上一次教251是好像是十几年以前。其实Klaus教课除了非常快之外还不错,但是最大的问题在于他教的东西是ada版本251的strict superset。这就导致往往上课讲的70%的东西考试和作业都不会遇到,而且Klaus用的notation和ada用的notation也非常不一样。楼主后半学期基本上就没怎么听过Klaus的lecture。所以后面的同学能上ada就一定要上ada,切记切记。

251主要覆盖的内容包括languages, finite automata, Turing machine, P/NP, approximation algorithm, randomized algorithm, cryptography。基本涵盖了TCS入门的所有内容。251这门课的精髓在于每周的problem set,一般由2-4道solo,1-3道group和1道open组成。solo指的是只能个人完成的题目,group是一个4人小组内可以讨论的题目,而open则是可以和所有人讨论的题目。251在ada教的学期是每周五放problem set,第二周的周三会有一个2hr的writing session把所有人叫到一起从problem set中选3小问现场写。而楼主由于遇到了sutner就没有赶上这种交作业的形式,而是更传统的周三写完全部交上去ta选三道题判。

对于楼主而言楼主更喜欢ada的形式,因为往往把答案写出来比想出来要花更多的时间。楼主十分作死的选择了用latex写每周的作业,导致每周251的用时都在15-20小时左右。如果是周三现场写的话这个时间应该可以缩到10小时以内。

251最最重要的就是选一个好小组。如果组员有大腿的话基本上group问题不用花什么时间。楼主有幸赶上了非常好的组员,算是弥补了一部分没上ada版本的遗憾。

每周平均用时:15-20hrs (如果不用latex可以少很多)

难度:3-4/5 (取决于小组)

难点:problem set

自学建议:Michael Sipser的introduction to the theory of computation

以上便是需要转进scs所需要的所有课程了。楼主因为大二才进入cmu,在每学期上两门的情况下大三上半学期转入scs,算是比较晚的。一般而言大二上或者大二下就可以转。比较推荐的组合是大一上127+122, 大一下150 + 251,暑假213,大二上210。基本上每一届能有20-30个从别的专业转进scs的本科生,这对于每年在大陆只收个位数的cmu本科cs而言是一个难度要低很多的曲线救国的途径。尽管如此,每门课程的难度会刷掉很大一部分想要转进scs的学生,而没能成功转进scs的人大多都选择了cs addtional major。

CMU本科其他转码友好的项目

其实来到了cmu就算不进入scs也有很多不错的本科项目能为cs打下良好基础。其中Stat/ML和IS(information system)是两个比较流行的选择。

Stat/Ml如前文所说是统计department和ML department合办的项目,其中general education是dietrich的gened,core则是统计/CS/ML分别占50/25/25。楼主知道这个项目的很多人毕业之后都去了非常好的公司。但是因为这个项目在每个方向上都有一点浅尝则止的感觉,加上录取的bar相对较低,很容易造成看似什么都会一点,但是什么都没学太明白的窘境(统计没MathStat学得明白,cs没scs的学得明白,ml没ai major的学得明白)。由此可见Stat/ML是一个自由灵活,上下限很高的专业。

IS是Dietrich 和Heinz合开的一个项目,楼主由于不是特别了解就不在这里展开讲了。这个项目的bar比Stat/ML高但是没有scs高,楼主知道很多很厉害的人都在IS。

另外,除了转院进入SCS之外还可以declare additional major in CS。additional major的好处是不用修SCS的gened,坏处是不是所谓的“嫡系”,很多隐形的scs资源(例如advising,选课优先权,talks and events)享受不到。additional major所上的专业课和CS degree是一样的。

CMU其他CS课程推荐

15440 Distributed System

这是一门基本所有中国研究生都会上的课,分春秋两个版本。春季版本是afs的作者,dfs大神satya亲授,语言是java。秋季版本最开始是Dave Anderson设计的,现在是yuvraj教,语言是Go。楼主上的是秋季的版本,一共两个考试三个project,分别是写一个protocol再在自己写的protocol上写一个分布式应用,用go写raft,和一个distributed backend server。秋季版本比较受欢迎的原因是因为他的内容跟实际应用结合的比较紧密。楼主上过春季版本的朋友也对satya赞赏有加,所以无论春秋440都是不错的一门system课,并且他的workload也是所有system课里最小的。

每周平均用时:10-15hrs

难度:3/5

难点:project 1

自学建议:所有project都在GitHub上,可以跟着写

15312 Introduction to Programming Language

前面说到pl 在scs里有着举足轻重的地位,而现在scs pl group里的大牛之一就是312的教授、sml的作者Bob Harper。虽然楼主没有上过312,但是上了的同学都很喜欢这门课。值得注意的是312秋季是bob教,春季是jan hoffmann教,两位教授都很好,只不过选择秋季跟bob学的人会比较多。

15719 Advanced Cloud Computing

这门课是cmu两门主讲cloud computing的课之一(另外一门是臭名昭著的15319)基本上如果不想牺牲掉一整个学期又想学一些cc的内容的话719是唯一的选择。

最开始719室RAID的作者garth gibson和greg ganger还有319的老师majd设计的,后面garth去创业了就剩下了greg和马老师。这门课主要是读26篇论文和三个project,工作量会比319小很多很多,并且前沿的东西会讲的多一些。

这门课只有每年的春季开设,楼主很幸运选进了明年春天的719。说句题外话,这门课的wl达到了恐怖的240个人,排在倒数第二的楼主可能是作为wl里的唯一一个junior被管理wl的老师开了后门。

15259 Probability and Computing

这门课也是公认的scs本科最好的课之一。由Mor教授和Weina Wang教授一起讲。楼主因为走的统计系的统计课路线没有机会上PnC了,但是强烈推荐没有上过别的统计课的同学上15259。这门课的教材是Mor自己编写的,并且只有纸质版,据说在疫情那个学期都把纸质版寄到了每个学生的家里。

除了以上这些课之外,scs值得一上的课还有15410 OS和15411 compiler(两个都是30hr+的time sink),O‘Donnell开的theorist’s toolkit和quantum computing,Pavlo的两门database,Crary的HOT compilation以及discrete computational geometry。

找工

楼主认识的大部分scs同学都是faang打底,也有很多去2sig,城堡,hrt赚快钱的。基本上大家只要按照timeline投简历最后结果都不会差。

其他还有很多同学选择了做科研读博,走科研路的同学基本上大二暑假开始就跟着老师做科研发paper了。

文转码的利与弊

本来楼主想在这个部分直抒胸臆,激扬文字一番,但是考虑到篇幅以及每人背景、价值观的不同还是觉得有些观点有失偏颇。就楼主个人而言大一文理学院的一年教给我为人处事上的东西要比在cmu学到的多得多,相对应的cmu毕业后的工资可能也是文理学院可望而不可即的。重要的是无论选择哪条路都想好自己想要什么,不要轻易地在与他人的比较中迷失了自己。
26条回复