序
去年这个时候,同lab即将去湾区工作的学长给我看了他前年秋招的日程表,当时想要读博的我无论如何也没有想到:五个月之后的自己也拥有了一张类似的日程表。
我的秋招大半年前已经尘埃落定。现在回想这段经历,从开始的处处踩坑到最后拿到满意offer,偶尔绝望,但一直在努力。于是想记录一下这个不平淡的一学期,方便以后回味;记住那些曾经帮助我鼓励我的人们;也像去年学长分享给我他的故事一样,分享给想要在美找工作或犹豫要找工作(software developer)的同学们,希望以自己的一点经验和教训启发大家更好的规划自己求职道路。当然,以下内容仅为一家之言,仅供参考,如有帮助,不胜荣幸。
决定要工作
大二的时候很幸运的遇到了Kevin,给了我在Apple实习的机会。在这半年的实习中,我每一天都很开心,没有固定的上班打卡时间,任务完成的早就早点下班,想一鼓作气多做点就晚上七八点再回家。在这种相对自由的环境里,我觉得自己生活的很舒服也学到了很多。直到有一天,一起实习的xyy问我:
你难道想一辈子做entry level的工作吗?
大三来到umich后,我陷入了前所未有的迷茫,对学习的方向和对毕业之后的规划。
- 对于写代码,不讨厌但也说不上非常喜欢,于是给自己选了几门偏硬件的课,看看会不会更喜欢。
- 对于继续读书还是工作,我去找了两三个教授做advising,教授们当然会说:”phd is the most enjoyable time in my life”、”make you become an expert in an area”;因为知道教授们的建议肯定存在对phd的bias,同时我还投了一点简历,拿到了几家大厂的面试。虽然毫无准备的我全军覆没,不过在和那些面试官交流的过程中让我认识到以自己现在的水平在industry只能搬砖的现实。
经过上面这样一番折腾,我发现相比硬件我还是更喜欢写代码;我要进lab搞科研,然后继续读书,去industry做科研类的工作。于是开始了我的第一次科研:用RFID来实现人的室内定位。
这次的科研经历让我得出了一个结论:我一定不会去读HCI的phd。想象中的科研是探索人类的未知,研究出改变世界的理论;可惜自己能力有限,现实是做无休止的数据可视化,微调算法和参数,测试,把误差从1降到0.9,再从0.9降到0.89。当然,以上结论和我选择的proj有关,我的体验也非常主观,但这确实不是我想要的生活。
在八月底,我去一亩三分地论坛(后文简称“地里”)发帖询问申请硕博还是找工作,得到了和内心一样的答案:
我要找工作!
客观上,考虑到读master的时间和金钱成本,我的gre分数和推荐信在master申请的劣势,高中竞赛经验在求职中的优势,找工作是我现在最好的选择。而主观上,对于“优化甚至解决一个学术界难题”和“做出对用户有积极影响的产品”两件事情,后者让我更有成就感,也更有热情;对比Apple实习经历和暑研经历,虽然都得到了成长,但是实习开心百倍;我觉得读cs的master对于我来说没什么实质上的提升,只是做更多的proj和更多的找工作时间。而至于之前对只能找到entry level工作的不甘心,现在只好释然,相信边工作也能边学习,或者以后找到很喜欢的方向也可以辞职再去读phd。
刚决定找工作时觉得大三这段乱七八糟学硬件、浪费大公司的面试机会、搞室内定位的科研经历,自己好像一只到处乱撞的无头苍蝇,荒废了时间。兜兜转转,最后还不是去找了码农工作。如果刚来umich就下定要找工作的决心,我会不会已经拿到return offer,不用再努力就变成一个富婆了呢?
现在回头看,觉得曾经迷茫的自己就像是一个企图迅速研究出多项式时间内解决NP问题的人。我原以为,在当前小范围内每次都找到更好的解才能爬到全局的最优解。而不知不觉中,我用了”模拟退火“,虽然依旧贪心,但尝试过跳到那些未知的区域,确认之前的解是否只是局部最优。在到处乱撞的过程中,我知道了自己不想做什么,也知道了我要focus而不能期待遍地开花。而且如果早早的决定工作,就没有下面要讲的这段四处公费旅游的经历了🤓
在美国找Software Developer全职一般是: 投简历 $\rightarrow$ OA (Online Assessment) $\rightarrow$ 电话面试1~2轮 $\rightarrow$ onsite面试4~5轮 $\rightarrow$ offer。找实习大多没有onsite,但会多加几轮电话面试。
投简历
先说我的结论:内推 $\approx$ 校招 $\gg$ 海投 (以上排序因公司而异,但大致如此);此外,在正确的时机投简历也很关键。
海投
因为决定找工作太晚,我草草改了简历,立刻找到耳熟能详的十来家公司官网海投。其中几家没几天便收到了拒信。问了同学才发现,我犯了几个致命的错误。
- 身份问题填错 大多数招外国人的公司会问下面两个问题,作为F-1签证的STEM专业学生,两问的回答都是“Yes”。因为有CPT或者OPT,所以是在美国合法工作的。而我最初投的十多家公司第一问都写了”No”,导致脆拒。
图片来源: https://boards.greenhouse.io/duolingo/jobs/4403360002 - 部分公司海投后不允许再内推 暑假去西雅图参观Amazon对亚麻好感暴增,屁颠屁颠的海投了Amazon。后来意识到内推的优越性,去找htt内推,被系统告知自己已经申请过不能内推。最后海投被拒,亚麻凉凉。
- 简历很辣鸡 第一次海投的简历里后来发现很多语法错误和typo。里面对proj的描述也杂乱无章。
果然心急吃不了热豆腐。尽管发现问题后尽量弥补,最后还是因为自己简历不过关以及海投本身效率低,投了几十家只拿到一两个OA。所以关于投简历:
- 能找到内推别海投 内推可以通过认识的同学,地里内推专版找人,也听说过有人去LinkedIn私信找校友内推。当然,内推优先找自己熟悉的人,一方面可以帮你跟踪进度提供建议,另一方面在内推的时候会有”how familiar with this person“的问题,所以如果内推人和你做过一个proj或者熟悉你的experience,内推的效果会更好。
- 简历改好再投 找同学互改,还有career center。地里很多关于改简历的建议可以参考。如果有时间的话,可以准备几份不同的简历针对不同的公司和岗位要求。举个例子,我拿到面试的LiveRamp是一家广告公司,在Career Fair推销自己的时候,他们因为我在简历上写Hadoop经验,直接给了面试;而一些FinTech公司因为我简历提到C++经验丰富,也爽快给了面试。所以根据不同类型的公司在简历上突出不一样的重点,亲测有效。此外,如果大一大二的同学觉得自己缺少proj经验,可以去coursera等网站上公开课,做一些course proj来丰富简历,详见这个帖子。
- 关注各厂开放申请的时间 去年这个repo记录了所有开放new grad申请的公司,可能每年都会有人开repo服务群众。要关注开始时间是因为去年的vmware propel项目很火爆,在我知道这个项目之前已经关闭申请,今年Google intern在8月31号会截止申请;此外,去年很多Google投晚的同学即使面试通过,却因为人招满导致被拒;但是,投简历也不一定越早越好,比如去年Facebook在九月份很多intern成功转成full time,大多数内推都直接简历拒,而后来可能又开放了?总而言之,投简历的时间有点儿玄学,只能尽人事听天命。
- 有记录的投简历 开一个备忘录记录自己哪些公司投过,哪些没有投过,心中有数。
Career Fair
到了九月中旬,除了通过Google的OA之外,我一家面试都没有。不过在学校的Career Fair之后我终于逆风翻盘,拿到了十来个面试。
参加Career Fair在我看来和逛世博会有点像:逛之前做好攻略才能参观更多的馆。
- 做攻略 Career Fair开始前一段时间,学校会放出所有参与公司的名单、日期、展台位置(umich是在一个app里面)。先把所有招国际学生的公司筛选出来,去掉已经内推过的公司,剩下的公司中对于不太了解的公司去地里搜搜看有没有面经🌚,查清楚具体是做什么的,决定要不要去排队投简历。这样,在cf开始之前,就可以知道我要去哪些公司投简历了。因为大公司就像沙特馆一样排队几个小时才能轮到,所以给自己想去投简历的公司拍一个顺序也很重要。
- CF中 在CF当天给各公司交简历的过程中,简历固然重要,但更重要的是elevator pitch能不能在对方心中留下印象,让他们之后过厚厚一叠简历的时候想起你。我在准备elevator pitich的时候一直换位思考:所有的cs学生都会介绍自己做过哪些proj,我要怎么介绍自己才能让对方在几百人中记住我呢?凭什么记住我呢?所以我会找一些与众不同的地方来重点介绍,强调proj的impact,来给对方留下印象。后来听到参加过cf的manager们确实抱怨听到的elevator pitch太相似,大家都上过一样的课,做过类似的proj,耳朵要听出茧了。
公司的Career Day
在秋招和春招期间,很多公司会来学校开宣讲会,有free food:) 宣讲会上,一般会先吹一下这个公司有多么厉害,然后就是Q&A环节。其实很多同学会把这个环节当做career fair,拿着简历和engineer们介绍自己,如果给对方留下好印象,同样也会拿到面试。我从career day上拿面试的经历很有趣:十月份某天晚上,我从图书馆出来准备去lab做毕设,经过EECS楼的时候突然发现一间教室的门口摆着TuSimple的宣传板。咦,这不是前几天刚把我海投拒掉的公司吗?我很不甘心,打算进去找他们理论一下🌚进来发现宣讲已经结束,大家开始收拾东西了。于是我随便找到一个看起来和蔼的人,说明了自己海投被拒之后用career fair上的elevator pitch介绍了自己。他不仅爽快的给了面试,甚至帮我分析为什么我的简历会被拒,告诉我怎么修改。综上所述,公司的Career Day也是一个拿面试的好机会。
准(刷)备(题)面(刷)试(题)
面试考什么?可以说90%以上的面试里都是纯leetcode类型题:不一定是原题,但都和lc上那些题差不多的套路。尤其是像大公司,比如Google,我的一轮电面和五轮onsite中,只有最后一轮考了behavior question,其他都是lc类型的题(不过我一道都没有在lc上见过。。)。我猜那轮bq可能并不会对结果有很大影响。而中小公司,像是LiveRamp,DRW,Akuna,除了算法题之外,还考了一两轮system design。但对于junior level的面试者,system design的要求肯定不会像senior的面试那么高。所以,把算法题做好,大多公司的面试就稳了。
开始刷题之前,我也怀疑过花这么多时间在lc上,除了通过面试,还有什么用处?后来我在知乎看到一个问题,为什么硅谷公司的面试都只考lc题而不考察专业知识,这样招到的“做题家”们能胜任swe的岗位吗?其中一个回答我觉得很有道理:大公司每年会有数以百万计的人提交简历,首先简历关会筛掉那些缺乏proj经验的人;在面试环节仍然会有上万的人参加,如果考察专业知识点,不同面试官可能会出不同深度、不同方向的题目,这样面试的难度难以控制和量化,招到的人也会良莠不齐,而lc题目有明确的难度分类,考察的内容也是日常工作中可能会用到的优化,同时可以反应面试者的代码水平,所以现在lc题目成为了硅谷各大公司面试考察的主要内容。回到最开始的问题,刷题除了通过面试还有什么用?从我自己的经验看,一方面可以让自己思维灵活,高中考竞赛刷了算法题之后回去学高考,觉得自己变聪明了一点hhh;另一方面提高代码水平,算法题写多了再去写proj的代码可以注意到edge case,不容易出bug,写了bug也可以很快de出。
关于LeetCode
- 刷leetcode重点不是数量,而是质量。一个朋友(开尔文)只刷了一百题,但是只要是他拿到的面试,几乎都通过了。向他讨教经验的时候告诉我他每做一道题,不管有没有自己想出来,都会去Discussion或者Solution里面看看有没有别的解法,理解一道题的所有解法才算刷了一题;同时把自己没注意到的edge case和一些好的思路可以总结起来。我照着他说的去做,受益匪浅。
- 至于刷哪些题,分面试前一段时间和面试前几天来说:当离面试还有很久,或者刚刚开始刷leetcode的时候,可以按照题目类型来刷,比如常考的String, Hash Table, DP等,每种从easy到medium,找到自己薄弱的类型题目,然后专攻那个类型;在面试的前几天,就可以去找自己要面试的公司的高频题,以及去地里找最近的面经,然后刷这些很有可能会考到的题目。面试前一天,通常会发现面经和高频题太多,根本刷不完。我会只挑几道真正的去写代码,练练手感,其他理解思路即可。
- 刷题的时候,同时想想面试中遇到这个题,怎么用英语把我的思考过程以及结论讲出来。面试不仅在看你会不会做题,而且也在考察你能不能把自己的想法清楚的表达出来,所以平时刷题就有必要练习一下。
- 用Leetcode的周赛模拟面试环境。周赛紧张的时间会营造一种类似面试的氛围,偶尔去打个周赛可以锻炼自己在高压下思考和写代码的能力,顺便看看自己的水平。当然,周赛偶然性很大,不要太看重名次,比赛完把没做出的题目搞清楚就好。
关于LeetCode之外的面试题
lc之外,主要是system design/object-oriented design和behavior question。前者顾名思义,设计一个系统或者class,而我被考到的system design,几乎都是面经里面见到过的那些典型题目:电话簿,电梯之类,google一下就有很多答案,可以面试前参考;后者大概考你三观正不正,比如会问到讲一个当你和队友意见不同你是如何解决的故事,可以提前准备一些小故事。
关于准备面试,推荐“Cracking the Coding Interview”这本书,里面对算法题,system design,behavior question都有讲解,可以挑自己不太理解的部分看一下。
Onsite
面试中最喜欢的环节就是onsite!虽然会有一天四五轮每轮一小时的面试轰炸,但是可以参观公司,去新的城市吃喝玩乐!(今年很有可能会变成virtual onsite😅)
对于准备onsite,其实和准备电面区别不大,重点还是leetcode,不过system design和bq一般在onsite出现,所以也需要看一下。
虽然onsite是能不能拿offer的决定性面试,但过度紧张没有用处。onsite不仅是公司考察你能力的一个环节,也是你考察公司的重要环节:工作环境如何,所在城市喜不喜欢等等,公司可能拒我,我还可能拒绝你呢🙄即使被拒了,公费旅游一趟也一点都不亏!
LiveRamp
第一家onsite是位于旧金山市中心的liveramp,一家在广告技术行业很有名的公司。当你白天在nordstrom看上了一件衣服但是犹豫还没有下单,晚上打开instagram时候,发现这件衣服的广告竟然出现在了你的好友动态中:咦,有人在监视我吗?没错,这很有可能是liveramp的功劳🌚当你打开购物网站,常常会弹出“accept cookies policy”的信息,我们一般不会仔细看长长的terms就accept,这其实是在告诉liveramp:你可以开始收集我的信息了。而liveramp会通过收集分析你的信息来精准投放广告到你的社交软件账号,帮助营销。
早起面试,在从酒店到公司的路上,见到了旧金山的rush hour。已经太久没有见过大城市了,我好奇的看着行色匆匆拿着咖啡杯的上班族们,还有突然会出现在眼前的耳熟能详的公司大楼:linkedin,slack等。
每一轮onsite面试都很类似,先一两分钟自我介绍,然后对方就会给出题目。接下来,我通常会问一些问题确保自己理解对了题目,再开始讲自己的思路和在白板上写代码。答完题目之后,就是提问题环节了,这是一个绝佳的了解公司的机会。我记得当时问了他们如何实现识别一个人在不同平台的账户,怎么保证用户的privacy等问题,学到了很多。
下午三四点面试就全部结束,我定了晚上十一点的红眼航班回底特律,打算在旧金山四处逛逛。看到从downtown到渔人码头走路只要半个多小时,不知哪里来的勇气,我决定走过去看看。然而旧金山是一座建在山丘上的城市,刚爬上一个陡坡,又要爬下去再爬下一个坡:
终于来到渔人码头,坐在码头的长椅上吹吹海风,看看海鸥,还有恰好碰到的fleet week的飞机表演,疲倦一扫而光:
DRW & Akuna Capital
接下来我去面了两家位于芝加哥downtown的FinTech公司,因为两家公司很像,所以放在一起写。FinTech公司是用算法来做高频交易或者说trading的公司(对金融不太懂,说错请纠正)。FinTech公司会招两类人,trader和swe。Trader是研究市场动向,提供算法,或者决定什么时候买入卖出;swe是实现infrastructure或者trading算法,比如实时从纽交所抓取一只股票的买入价之类的。因为对代码的时效性要求很高,我面的两家公司都比较喜欢熟悉C++的swe,在面试中也考到了很多C++相关的内容。
两次面试见到了两次芝加哥的rush hour,和旧金山类似,但是芝加哥金融公司众多,所以大多的人西装革履,提着公文包,有模有样的。来akuna面试那天恰好万圣节,天上下着雪,看到街上穿着小马衣服上班的人xswl:
FinTech公司一个共同的特点就是壕。两家公司都在downtown的写字楼高层,落地窗外风景很好,在akuna甚至可以看到密西根湖,面试的会议室外就是湖景,感觉思路都变清楚了😁:
在地里的面经里了解到,两家公司onsite的第一轮都是现场上机写代码,在后面某一轮会和一两个engineer一起分析你当时写的代码。现场上机写代码比白板写代码更紧张,有种回到当年noi(信息竞赛)现场的感觉,手脚冰凉,头脑发热。DRW的题目考察了很多C++细节的知识点,比如virtual function之类的(还好面试前一天复习了280课件),结束之后听到很多同学没办法解决编译错误;Akuna考得是实现某个游戏的策略,考前会先和别的同学一起玩一局熟悉规则,然后再写代码。后面的几轮面试依然是leetcode为主,但两家都考了一两道system design。
和所有公司一样,每轮面试结束前都可以问面试官问题,我当时很好奇为什么很多金融公司会在芝加哥,然后面试官给我科普了芝加哥的历史小知识~
FinTech公司虽然在芝加哥,但是因为壕,offer都给的很大方,甚至超过湾区的公司。可芝加哥实在太冷了,我还是喜欢加州的阳光😬
Google是我唯一拿到的大公司onsite,但在这场onsite之前我还没有拿到任何一个offer保底,所以压力有点大。
谷歌在大农村湾区,没有前三个公司周围fancy的摩天大楼,只有堵车的101公路和光秃秃的小山丘。可是当看到地图上那些大公司的名字,脸书、亚麻,还有之前实习常听同事说起的cupertino的Apple,心生一种来到“宇宙中心”的敬畏感,很多改变世界的创造都在这里发生着。
我面试的campus是Google Cloud所在的sunnyvale campus(现在我也在这里工作)。和其他campus差不多,很多幢七八层的建筑松散的排列,建筑之间是休闲区,还有dog park🐶。不出意外,五轮面试中四轮考了算法题,一轮是bq。Google的题感觉确实比较新颖,有些题目是面试官基于工作proj遇到的优化问题,改编成的算法题。虽然没有做过原题,但这些题也都围绕那些基本的算法,大概都是lc的medium难度。
Google onsite的午饭会安排一个engineer和你一起吃,可以在吃饭的问任何问题(和interview完全无关)。我联系了开头提到的那位lab的小伙伴一起吃。很多人都说,Google是个养老公司,几乎没有工作压力。于是我向他求证,他告诉我其实并不完全如此,虽然manager一般不会给你很紧张的ddl,但是很多人会自己push自己,所以有没有压力主要和自己的性格有关。我开始工作了一个多月,也觉得确实如此。
面试三四点就结束,跟着湾区接待员瓦尔登参观了斯坦福(七年前来过一次,现在竟然还记得去bookstore的路线),并获得了onsite和他一起吃饭就能拿到offer的buff🤓
回程飞机上幸运的看了一场日落:
Google的offer流程比较繁琐,时间也拉的很长。面试结束后,五个面试官会提交对面试者的评价,并给出等级:strong hire, hire, lean hire, no hire, strong no hire;根据这些等级,recruiter会决定是否送hiring commitee(hc);hc由一些比较senior的人组成,他们会在hc会议上讨论每一个送来的candidate的简历、面试评价,决定是否hire;hc通过后,对于fulltime会进行product area(pa) match,就是把你分到哪个大组下面,match成功后才会发official offer;具体的team match一般在开始工作前一两个月开始。关于intern:首次intern是team match完再发offer;step(ep)和return intern也是先offer再match (credit to Tony~)。
我的timeline如下:
8.30 内推 -> 9.3 oa -> 9.5 约电面 -> 9.24 电面 -> 9.26 约onsite -> 10.24 onsite@sunnyvale -> 11.8送hc -> 11.9 通知hc通过,开始pa match -> 11.11 site-reliability team 通过,但不想去,继续match -> 11.13 match到Google Platforms Product Area -> 11.14 official offer
Quora
和Google一样,俗称“美国知乎”的Quora也位于湾区。是oi、acm界大牛楼天城曾经工作的公司,能拿到onsite感觉很开心。
来面试的飞机上拍到了湾区的“湾”
Quora的办公室在Mountain View downtown的几座小楼中,对门就是把我拒掉的Pure Storage。令人惊讶的是这家公司竟然只有两百多个员工。
面试依然是四轮lc题目,一轮bq。这些题目有一两道在面经中见到过,所有题目也基本是medium难度。Quora的bq轮和Google不太一样,是一个senior的manager让我详细的介绍research project,包括算法和实现的细节,以及各种tradeoff,考察你做proj的能力。这里必须提一句,Quora的饭很好吃,带我吃饭的员工说每天大厨几乎都会做不同国家的菜,而且都做的很地道。
几个礼拜后,我也幸运的拿到了offer。Quora给我的感觉是小巧精致,因为员工少,规模大,所以个人做得东西很可能会比Google更有impact。不过,我还是更想毕业先去大公司,把基础打扎实,系统的学习一些知识,再考虑跳到小公司,做更有impact的事情。
TuSimple
听名字就知道,这是一家交大人创办的公司:主要做卡车的自动驾驶。公司位于San Diego。
sd路边到处是椰子树,有种来到海南度假的感觉:
图森的面试以考lc hard题目著称,而且大多是lc原题。因为公司的员工一多半是中国人,所以所有面试都用中文,感觉很亲切。两轮电面都是hard原题,第一轮甚至要求写出并编译跑过样例测试;第二轮的题目我没有想出答案,但对方不断给提示,最后勉强做出,拿到了onsite。
onsite是从下午开始,公司旁边有一家叫Westfield的商场,于是我决定早起逛街🌚这商场着实惊艳到我了,店很多、好吃的很多(鼎泰丰,85度C等等),而且环境超棒像是在逛公园。可惜只有一上午的时间,只好走马观花:
从商场走路十分钟,就来到了图森的写字楼。在onsite中,考得也大多是lc上比较难得题目,但和电面一样,看到你卡住面试官会给一些提示,所以其实hard也变medium了。
这是我第一次来sd,所以面试结束多待了一天,和在ucsd上学的小伙伴们一起浪。sd的海鲜真的很好吃:
很久没来海洋公园,见到可爱的小鱼们激动无比:
因为商场、海鲜、公园、气候,很喜欢sd这座不大不小的城市。图森做的事情也让我觉得很有前景。但还是忍不住big name的诱惑,放弃了offer。
Compete Offer
当拿到几个offer之后,就可以“要挟”recruiter给你涨工资了。关于如何“要挟”,强烈建议阅读地里这个帖子。
compete offer其实是你和公司制定工资部门的博弈,而recruiter是联系两者的桥梁:你想要涨工资,而公司想要节省预算。当recruiter愿意站在你这方去劝说公司的时候,你就胜利了。
刚拿到offer其实也犹豫过要不要去compete,不过后来说服了自己:it doesn’t hurt to try。我记得当时给Google recruiter发了一封长长的信,主要说自己对Google和其他的offer都有兴趣,湾区生活成本高但是工资却和其他差不多blabla。recruiter人很好,把我的concern和公司说,没过两天就compete成功了。
最后
已经搬到湾区一个多月,也开始工作一个多月了。来湾区的第一天,房东给我们讲他的故事:他十多年前来到湾区,Apple还是个名不见经传的小公司;可是十年间iPhone,iPod,iPad就在附近诞生,改变了世界,还有无数的科技公司在这里影响着全世界人的生活方式,感慨万千。尽管自己只是这巨大马达中的一小颗螺丝钉,但想到有一天自己的工作会为这马达注入一点动力,就觉得很期待。