聊聊一个ME菜鸟在CMU(伪)转码这一年

作者@MarvelousX
发布在一亩三分地

欢迎大家点击左下角“阅读原文”到原帖与作者交流讨论哦!

刚写完了Web的作业,也在上周五混到了全职,在秋招这个时候能闲下来写点东西回馈社会我去年是想都不敢想的,以下是夹杂着一些碎碎念的分享,欢迎讨论和批评指正!

【背景】

一开始选择转码是无数的机缘巧合凑到了一起,19年初的时候陆续收到了一些offer,以为会收到CMU的拒信,结果三月份的时候收到了当时还没有卷款跑路的武汉某美前程(今年破产跑路,耽误了很多学弟学妹的申请)发来的信息,告诉我被CMU录了,喜出望外,看过CMU之前的帖子,觉得有机会转码。结果又仔细一看offer,发现是一年制项目,因为我要求的是申请两年,马上质问中介,中介开始甩锅说给我正常填的申请信息。因为不想跟中介扯皮,就又开始疯狂查找学校专业信息,知道可以专业内转项目后遂放心。认识的另一个比我强的同学申请的两年制最后进了waitlist,现在自我分析,大概率是我申请的一年制的录取要求比两年制要低一些,也多亏了中介给我申请了一年的项目…

虽然被中介摆了一道,但最后也算歪打正着,既没有赶上中介跑路,也没有因为申请的一年制项目阻碍读研的进程….来学校就是奔着转项目至少一年半,所以到了学校之后就去了一些实验室参观准备找教授转项目做research,偶然知道了MSCDM这个项目(选课不受限制,虽然是一年的项目,但可以拉长到一年半),和Kenji教授聊了之后也同意我转了,也就走上了(伪)转码的不归路….在开学之前,我的水平属于菜到C++的类都傻傻用不明白。

【19Fall】

在来学校之前看了之前学长们选的码课,同时对于自己能否转码成功还抱有怀疑,加之水平太菜,就选了24780(一门C++从入门到会用的ME转码必备课,自带一个individual project 和 group project),16720(computer vision经典课程),24787(ME下的machine learning,从入门到会用)。从我选的这些课就能看出来,我没有下定决心转码,就是都想学习一下,看看自己的兴趣到底在哪里,事后证明也多亏我上了后两门课,才能在春招的末尾上岸实习。下面就详细讲一下我个人对以上三门课的感受吧。

24780(Engineering Computation):名字叫engineering computation,课程内容跟名字没有半毛钱关系,是从C++最基础的讲起,最后到多线程。这门课的老师是日本人,叫Soji,是我非常喜欢的一个老师,此人非常佛系,有着能评教授的科研能力,却在Kenji手底下干着assistant的活儿,上课讲C++浅显易懂,凭借着超强的写码能力在课上现场写码debug,帮助像我这样的菜鸡理解C++的概念,建立debug思维。这门课的作业都非常简单,每周所花时间相对较少,但是收获确实很大,跟着Soji学C++之后,总是忍不住吐槽自己的学院,大一竟然跟着学院安排的本院半路出家、照本宣科的老师学了一个学期的C++,导致大学四年对写代码失去了兴趣,每每想到这里都想锤爆教务科老师,为什么不让CS的老师来授课。话说回来,这门课的individual project说是project,实际上要求非常简单,基本大家都会满分,但是更多的是要求有创造力,很不幸我没有,就做了个中规中矩的。等到了group project,有几个方向可以选,education/entertainment等等,其实拿满分也相当容易,毕竟老师佛系,只要不是故意搞事情,大家都会满分拿A。于是就纠集了包括我在内的六个小伙伴,做了一个rogue-like game,因为是第一次做group project,不懂用git,也不懂如何设计整个流程,做的过程挺费心费力,走了不少弯路,不过最后好歹是做出了个像模像样有点儿剧情的游戏出来交了差…

16720(computer vision):看过之前的帖子,感觉一些基本的作业区别不大,这里就只说以下我这上cv的感受。这门课分为A和B,按照以往的逻辑,A应该要比B简单,适合学生入门,涉及经典算法,课程后期会加入dl结合cv,而B班最后好像是要做一个project,内容也较深入,所以最后我选了A。谁知道720A的美国教授讲课语速奇快,加之我刚到美国,听力不怎么样,只能痛苦听课,这门课的作业量一周20+,又要写code,还要完成相应的doc,一次作业就能写10~20页,最多的一次写了40多页。除此之外,spec特别多,对于刚转码的我来说,还是很有挑战性的,尤其是上课听了一遍听不懂,回去看PPT有时还会一头雾水,还要用python来写(毕竟是小白,啥都不会)。最难受的一点,这门课老师在学期末修改了一次作业,狂加内容,比720B的作业量都多,那次做的心态崩溃,以为拿A无望(不过后来还是拿了A)。这门课上下来,一是知道了很多cv的知识,也通过这些理论实现了一些很有趣的作业内容,比如3d reconstruction, 拼接全景图像,用dl训练实现image classification,object tracking等等,二是让我觉得自己实在不是这方面的人才,果断溜了。

24787(Machine Learning and Artificial Intelligence for Engineers):首先强调,有能力上ml系的10601/10701就没必要来上本系的ml课,确实浪费钱,除非你是要满足选课限制来水学分或者就是想入个门。这门课的老师讲课师从吴恩达,基本上课件都是吴恩达提供的,选了这门课不如直接上吴恩达的免费公开课更直接。此课老师因为不是英语为母语,好像是伊朗人,说话语速着实令人着急。另外,这门课有一次midterm和一个group project,midterm好好复习基本满分,group project也是那种规规矩矩做就能过的,没有太大难度。

我真正开始转码是在秋季后半个学期,偶然一次和实验室同组的同学勾搭上了,正好那天他去上17683(Data Structure),我一想自己一共54个学分还剩6个没用上,浪费了太可惜,正好也想转码,不如去听听,遂开启了上课转码不归路。17683这门课是用Java,于是我在19年的秋天里,不仅入门了C++,python,还入门了Java,这对于我来说,也算一种收获吧…因为这门课的时间和24787稍有冲突,我还分别和两门课的老师做了申请,最后学校给通过才选上。一般来说17683都是要搭配着前半学期的17681(Java入门课)一起食用效果更佳,但是我已经错过了入门,只能硬着头皮上,在runoob上看着教程,开启了五分钟入门Java之路,好在C++和Java除了指针都挺像的,学起来也没有那么费劲儿,在mini2结束选课的末班车,拽上了Heinz的某同学一起,三个人组成了学习小组。

17683这门课简直太适合想要转码的,学了基础的data structure,顺便入门Java。此课老师Terry Lee很有个人魅力,是个韩国人,讲课有趣吸引人,也是我能学好ds的一个重要原因之一(虽然有时会犯困)。每周都有quiz,quiz内容基本上都来自课件,加上实验室同学的强力carry预测题目,quiz最后分数也不算太低,也巩固了知识点。683的几次作业,基本上只有hash那个作业有挑战性,其他的按部就班就能写出来,但是就算写出来,在autolab上得了满分,还是有很多spec需要注意,比如coding style就相当重要,这种方式也算是养成了我好好写comment和命名的习惯。最后就是final,这门课的final对于当时的我挺难的(现在可能也难),加上其他的课都接近尾声,复习比较仓促,考的内容记得不是很清楚了,但题量很大,我没有纠结于某一道题,最后是争取把所有的题目,能填的都填上了,出考场之后神清气爽,也算是熬过了第一个学期,拿了A-。学期后想去尝试当TA凑个简历,也可以帮助一下像我一样的,给教授发了邮件,最后Terry Lee回了我:TA已招满。于是我只能接受自己太菜的事实。

【20Spring】

上了ml和cv之后,感觉都不是我的菜,加之此前同项目MSCDM的学姐也对我说我上的太杂了,这样上没啥意义,于是一不做二不休,看了地里的帖子干脆选了15319(cloud computing)和17514(principles of software constructions)作为转码的准备工作。是的,我选了319而不是619,619相比319多了一个group project,我怕自己太菜,队友带不动我,同时我的项目对于选课又没有限制,就干脆转了319,advisor和我说319和514的学分只有一门课能算在内,不过鉴于我第一学期已经用满了54个学分(包括12学分research),所以就算这学期24学分(包括12学分research),我也只需要第三个学期再修18学分(包括12学分research)就能毕业了。虽然这学期只选了两门课,load感觉比上学期还大。

15319/619(cloud computing):这门课的评论从来都是两极分化,具体分析可以看之前的有关帖子,但是对于我来讲,利确实是远远大于弊的,虽然学的杂而且浅显,但一能接触很多cc的知识,二能对后端有一定的了解,三可以丰富自己没啥可写的简历,这对于我说就足够了。没有group project的下半学期是比较轻松的学期。拿了A。

17214/514(principles of software constructions):这门课墙裂推荐,老师是Joshua Bloch和Charlie Garrod,Josh是Java的author之一,还是Effective Java的作者,跟着来头这么大的老师学,甚至感觉自己Java都要飞升了。如果说我用683入门了Java,那这门课就是教我怎么好好用Java来实现程序满足要求。这门课的作业自由度很大,因为涉及到design pattern,要自己进行程序结构的设计,特别是第四次作业会涉及到自己从头写一个卡卡颂游戏,大概3000行代码再加上前期的design,写完了成就感爆棚,妥妥滴提高转码自信心。514的第五次作业是小组作业,比较鼓励创造性,同时也让我更深入地学习了一下git。另外,514还有两次midterm和一次final,难度系数都还好,考察的都是design,也是这门课的核心。design真滴很重要!最后也拿了A。

这学期比较头疼的事情就是找实习,二月中旬我还没有投简历,因为简历上还写不出来像样的project,当时看到一起做cc的队友已经拿到了去ANSYS的offer,也是很着急。等到二月末,勉勉强强凑上了刚学的cc的project,投了ANSYS,Mathworks,Amazon,没错,没有等公司,只投了这三个…ANSYS是学长的内推加上官网的一些招聘岗位,Mathworks直接在官网投的(垃圾公司,让我花10刀搞了个学校的证明,最后连个笔试都不给我发),Amazon投了SDE的几个岗位和一个我一开始甚至不抱希望的岗位Professional Services Consultant Intern,结果就是这个岗位让我上岸了….ANSYS收到了那边一个中国leader的电话面试,打过来先英文自我介绍,后来直接问我prefer中文还是英文,因为是第一次面试,完全蒙蔽,就说了both are ok,后半程全程中文聊,暴露了我的一堆知识盲点以及菜鸡的事实,于是没有了后文。在这之后,我就已经开始做暑假没有intern的打算了,听说暑假也可以上15513神课,学费还减半,虽然是网课,但一来这种便宜不沾以后就没机会了,二来不上这门课,像distributed system之类的就完全么得机会上(要求先修513,即使是grad也是这样),所以就打算暑假冲一波513了。没想到三月中旬的时候居然收到了亚麻的面试,直接是final interview,两轮BQ,一边做着cc烦人的concurrency project,一边开始着手准备面试的BQ。14个leadership principles,对应着地里的BQ面经,脑补了一大堆经历的细节,就等着疯狂输出给面试官。期间查了查自己申请的这个职位,地里只有一个相关的帖子,google上也基本没有,也不知道自己的职位到底要做些什么,为了以防万一,我把CC的内容准备的烂熟,结果等到了面试,两个面试官分别问了我两轮各不到45分钟的BQ就结束了,我心想这大概率是凉了,连我简历都没问,题也没让我做。没想到不到一周,居然收到了offer,职位改成 solution architect,心情就像过山车,总算是有工作了,虽然不知道工作具体干啥。后来大概了解了一下,solution architect简单来讲是给customer构建完整的pipeline来解决问题,和data scientist对接,我是隶属于AWS下面的ProServe Team。但是因为疫情,完全没有体会到自己是一个solution architect,实习的内容也不太相关。而投的SDE岗,至今仍然处于application submitted阶段,肯定是没戏了。

有了实习,暑假还是犯愁,不上513,下学期的课没法选,上了513,还要实习,这谁受的了(权衡之下,最后也还是硬着头皮把513给上了)。这份实习的工作,一开始给我安排的内容是写一份computer vision vertical survey,甚至都没有涉及写码,本来是奔着return去的结果心里感觉凉了一大截,单纯的文字工作大概率拿不到return,况且同组同职位的其他人都被安排了写码的工作,于是我干脆直接和mgr要求自己做一个demo,从survey里面选一个use case进行model verification,现在看来,多亏当时增加了自己的工作量,不然return也拿不到。mgr是移民美国的香港二代,人超nice,每次meeting即使我感觉自己根本没做什么,他也总是对我说“we are ahead of time“。想来一个原因是我之前学过cv和ml,并且有使用AWS的经验,进入状态比较快(妹想到这两门我想抛弃的课和spring上的CC拯救了我),另一个原因就是他应该是第一次当mgr,所以计划得不是很具体,任务分配不平均,导致前期没什么工作量但也确实ahead of time…. 就这样,我在工作、摸鱼和学习513中度过了暑假。学习上,要兼顾实习,虽然很累,但收获也很大,第一次深入地了解了一下computer system,做了7个lab,每个都很有意思,又掌握了一门语言(菜鸡只能收集语言)。这门课midterm巨简单,只要好好复习就能拿高分,但是final挺难。工作上,基本上都能按时完成mgr给安排的任务,写码的任务也帮助我在最后的presentation上有得说有得讲,mgr/mentor/bar raiser/HR 在evaluation meeting的时候也能了解我的工作量和contribution,meeting之后mgr就立即告诉我了好消息: bar raiser is inclined。所以说,能多干点就多干点,总会有回报滴。

坦率地讲,在亚麻的实习,因为是wfh,完全没有达到预期,第一职位和工作内容不符,如果没有疫情,可能会travel,和customer沟通,但现在基本全都没有;第二在家工作网络实在太差,导致每次meeting都会卡顿甚至掉线,让人抓狂。不过话说回来,这种情况下能找到实习就够了,有return就接了,像我这样的刚转码小白还要啥自行车?之后刷题再跳槽也还是挺香的。所以如果你也是小白的话,不妨考虑考虑其他的一些职位,这样的职位虽然没有SDE薪资高,但也算是在现在这种情形下一种找工作的办法。

【生活】

说说吃穿住行。最开始来到匹兹堡住在松鼠山,我以为的House是双层大别墅,前面草坪,后面小院,在遮阳伞下看书写代码,躺草坪上沐浴阳光,享受学习生活双重乐趣。现实中的house是地板咯吱咯吱响,没有空调,厨房还有老鼠。发现老鼠的过程也十分曲折,首先是在炉子上发现了超多黑又小的颗粒,以为是锅掉渣,结果一天晚上去厨房烧水,老鼠嗖地一下就窜到了橱柜底下,于是开始了漫漫除鼠路,为了能安安稳稳睡觉,晚上老鼠不会满屋乱窜,和室友把能堵的路全都用纸壳子和泡沫胶封死,在各个角落放上粘鼠板,用剩菜作诱饵捕鼠。找一个住的舒服的地方还是相当重要的,提升幸福感还能减少糟心事儿。由于自己对吃的要求非常简单加上不太喜欢做饭,基本上都是从熊猫买速冻饺子或者定中餐外卖,在吃的方面没有太多发言权。穿的衣服基本都是从家里带过来的,冬天的时候去waterfront的超市买了裤子,在穿这方面,感觉还是先去线下试试尺码再做好决定。谈到行,匹兹堡的公交挺发达的,没有车生活也没问题,但是如果下决心要买车或者考驾照,要考虑I20的日期,拿permit的话I20必须至少还有一年,本来我准备拿了return之后买车,结果发现自己因为I20就剩几个月了,连驾照都考不了,还要等申请的OPT下来才有机会。

来匹兹堡一年认识了很多朋友,各个专业的都有,了解不同人的生活,一起吃喝玩乐加(疫情前)健身,释放了不少学习压力,也能给枯燥的赶due生活加点儿料。我的原则是多扩展自己的社交网络,找到能有共同话题的人,不至于让自己一个人过自闭的留学生活。

说了挺多,都是一些自己的感受,希望给大家带来一点点点点帮助吧…

大家如果还有相关的问题和看法,欢迎点击“阅读原文”到一亩三分地讨论