2017年7月24号到28号,我连续五天面试了五家公司:LinkedIn、Salesforce、Google、Airbnb、Facebook,最终拿到了五个Offer。能有这样的结果确实非常地幸运,付出的诸多努力也算有了回报,同时这段时间也是一段相当宝贵、刺激程度胜过高考的经历,所以写了这篇帖子作为总结和纪念。
五家公司各有特色,都是我非常喜欢的。我会回顾一下准备面试的过程以及一些个人经验,谈谈对五家公司的印象,最后说一些整个换工作流程中我觉得值得注意的地方。因为我并非计算机专业出身,工作时间也很短,知识和经验都非常有限,所以这里写的内容仅供大家参考。
起因
时间是2017年,我已经在Groupon芝加哥总部工作了将近三年,项目很有意思,团队也非常给力。按道理说我本应该衣食无忧地继续下去,工作轻松,生活自在。但是我却觉得不满足,毕竟年纪轻轻就耽于安乐不是一件好事。我感觉日常工作越来越熟练的同时,每天学习的速度却在减慢,内心也开始希望迎接新的挑战。同时作为一名在芝加哥住了八年的码工,也总想着去硅谷折腾折腾。
于是我和老婆说了我的想法,在得到她的大力支持后,我开始准备换工作。首先是经历了一场失败的面试,遗憾地错过了一个明星Startup,激发了我的动力,也让我认识到自己的不足。然后我重整旗鼓,挑选了几家喜欢的公司,回复了LinkedIn上面HR发来的几封邮件,又拜托以前会议上认识的朋友帮我内推,同时开始认真准备面试。
准备
我申请的都是机器学习相关的职位,但五家公司的具体头衔和面试流程略有不同。有三家公司(G,L,F)的职位是Software Engineer in Machine Learning,Salesforce的职位是Data Engineer,Airbnb是general的Software Engineer,因此Algorithms & Coding,Machine Learning,System Design这三块我都需要准备。
因为白天还有全职工作,所以只能晚上和周末抽出一些时间准备面试,加上需要准备的东西又多,前后总共大概花了两三个月时间。以下简单说说我的方法。
Algorithms & Coding
这一块其实是最好也最难准备的。一方面有许多的网站提供了大量的题目可以练习,另一方面也需要投入大量时间精力。我先是花几周复习了常见的算法和数据结构,然后有针对性地练习了一些不太熟练的方面,最后又练习了一些高频题目。这里有几点想法,其实也是老生常谈了,就算多给大家提供一个数据点吧。
1、不能盲目追求数量,而是要理解做过的每一道题目。有的帖子会告诉你“一定要把LC刷三遍以上”之类的,我的感觉是这不太现实。目前LC上面有600多道题,在全职工作的情况下要全部做完我可能要做个一年。我最后做了将近80道,个人感觉是完全够用了。我的想法是如果做完80道还没有效果的话,那么做800道可能依然没有效果:) 当然前提是这80道还是要面面俱到的,常见类型都要覆盖到。
2、按照题目类型,逐个类别准备,每个类别要到最高难度。像LeetCode这样的网站上都有Tag,可以分类进行练习,比如dynamic programming,recursion,graph等等。一般来说每种类型的题写两三道之后就差不多完全熟练了,如果没有的话,那么可以思考一下自己是不是真正理解了之前做过的题目。同时要做每个类型中最难的题目,不要被Hard的标签吓到。这个是理所应当,做过最难的题,简单一些的当然能迎刃而解。
3、什么时候看答案:一道题卡了两个小时以上,以及做出来一道题之后。如果一道题卡了两个小时以上,我的做法是直接看答案。很多时候做不出来就是做不出来,花再多时间也没用,或者不划算。用心理解别人的做法而不是和一道题死磕能够省去很多时间。即使做出来的题,建议也看看高票答案。有的时候很多答案会让你叹为观止。我就很佩服那些一行Python代码解决问题的人,虽然有时依赖语言的某个特性,但实在是很精妙。
4、用自己最熟练、最通用的语言。毕竟Coding面属于应试,用最得心应手、最流行的语言可以提高效率,面试的时候也有助于和面试官进行沟通。如果用略小众的语言(Clojure,Rust,etc.),虽然可以体现你技能的多样性,但有时候面试环境不一定支持,和面试官解释思路的时候在算法的上面可能还要额外解释一层语法,不如保险一点用Java或者Python。另外不得不说Python和Ruby这样的动态类型语言在面试的时候打起来实在是很快很方便,换做是Java容器类型的type parameter还要额外写一遍,有时候效率会打点折扣。
System Design
这一块只要是有工作经验的就会被着重问到。 如果你有不少系统设计的经验,那么花的时间可以相对少一些。虽然是很看经验,但也还是可以准备的,网上也有很多的经验贴和练习题。
个人感觉这一块问的问题很杂,范围很广,主要考察综合素质。常见的范围包括architecture,object oriented design,database schema design,distributed system,scalability等等。因为我主要面试的职位是机器学习相关的,所以这次面试遇到的session少一些(主要是Airbnb)。
这里是一些我准备过程中看过的不错的资源:
1. http://blog.gainlo.co
2. http://horicky.blogspot.com
3. https://www.hiredintech.com/classrooms/system-design/lesson/52
4. http://www.lecloud.net/tagged/scalability
5. http://tutorials.jenkov.com/software-architecture/index.html
6. http://highscalability.com/
面试中一些大的原则是:
1. 先明白需求,然后考虑大框架,最后是具体设计。
2. 没有完美的设计,要懂得如何做出取舍(trade-off)。
这里想说的是平时里的积累在系统设计里其实很能体现出来。举个例子,要是工作中用到HBase,有的人可能就只是简单的用一下Client跑一些DDL,做一些Get,但是有的人可能就会深入一些了解整个系统的设计,包括Zookeeper起到什么作用,整个读/写流程是怎样的,如何保证strong consistency,minor / major compaction都会做什么工作,LRU Cache和Bloom Filter的作用,等等。如果经验更多一些,还可以把HBase和Cassandra进行比较,看看二者的设计有什么异同,Consistency和Availability各自如何取舍,Master-Slave和Master-Master相比有何优劣。所以工作中遇到的问题、使用的工具最好多花一些时间思考和了解,平时多积累,保持虚心和对知识的渴望。
另外就是许多不错的微信公众号会推荐一些很好的干货文章,虽然总体来说碎片化、不系统,但有的文章质量相当高。我订阅的有数盟、大数据文摘、架构文摘、InfoQ、阿里技术等等,等车时或者睡前读读都挺好。
Machine Learning
机器学习这块大致能分为两种,一个是Theory,一个是Product/System Design。
理论部分就要靠基础和平时积累了。除非从事过机器学习方面的研究,多看几本教材肯定是有必要的。经典教材比如The Elementsof Statistical Learning和Pattern Recognition and Machine Learning都会很有帮助。有兴趣的话Deep Learning,Probabilistic Graphical Models都是不错的书籍。
基础概念例如bias-variance trade-off、overfitting、gradient descent,L1/L2 regularization,Bayes Theorem,bagging/boosting,collaborative filtering,dimension reduction等等都要有所了解。简单的公式要写得出来,比如常见的模型例如Logistic regression,SVM最好要会loss function的推导。简单的算法例如decision tree和K-means最好自己实现一下。
另外就是自己用过的模型一定要深入了解,不仅仅限于调用API,最好能够从理论角度评价优缺点。
机器学习产品和系统设计方面的话,总的来说比较依赖经验和直觉。我自己本来不做建模和产品设计,但是有段时间维护几个比较重要的模型,也算是有些肤浅的了解。
一些基本的设计流程需要了解。比如让你设计一个机器学习系统,首先要明确目标是什么(预测/推荐/搜索),其次是具体算法的选择(有监督/无监督,分类/回归,线性模型/决策树/神经网络), 然后是针对现有的数据如何进行特征工程选取特征,最后是如何评价模型的质量。之后还会有一些针对工程方面的优化,比如实时的机器学习系统如果要满足SLA,模型应该做些什么样的调整。
这里再强调一次持续学习的重要性,好奇心和虚心还是很重要的。比如有的人用Spark MLlib或者XGBoost就只是简单地调用API训练出一个模型,但有的人就会研究为什么Stochastic gradient descent适合分布式训练,又或者了解XGBoost和通常的GBDT有什么区别,包括对Loss Function的定义有何特别之处,为什么用到二阶导,等等。
流程
电面
在集中精力准备了大约两三周之后,我开始了整个面试流程的第一步,电面。
电面没什么好说的,都是标准化的过程,区别是有的公司(比如LinkedIn)有一个小时,有的(Facebook,Airbnb)只有45分钟。
因为时间紧迫,而且通常只有一次机会,所以熟练度最重要。题目类型一定要马上识别出来并且给出思路,写代码的过程可以慢一点,但要和面试官说明你的意图。如果是背答案只有死路一条,稍微问个Follow up就挂了。
另外针对机器学习的职位,有的公司会问一些基本概念,所以也不能只准备coding。
我为了提高效率,把三个电面安排在了同一天下午,每个之间隔一个小时休息。这样的做法不一定适合所有人,好处是可以趁热打铁,坏处是很累而且风险很大,万一头没开好后面可能会受影响。
这里想说的是集中面试虽然很累,但也会给你很多优势,比如有的时候能够省去某些环节。有些硅谷的公司有一个规定,对于湾区以外的面试人要进行两轮电面。LinkedIn和Facebook我都是一轮电面后拿到了onsite,于是我就跟Airbnb和Salesforce的HR申请能不能免掉第二轮的电面,结果两家公司都非常爽快地同意了。
而Google作为一家大公司就更加让我惊喜了。当时我本来已经安排了除开周三的四天面试,本来准备留出周三休息一天。没想到就在前一周我接到一个陌生来电,没想到是Google的HR,问我对Google有没有兴趣。我自然是受宠若惊,表示非常有兴趣但下周没有时间,问他们能否推迟到别的公司onsite之后,HR说没问题。过了几个小时,我又接到他们的电话,说决定让我跳过电面,直接进行onsite,并且可以给我安排到周三。虽然预计到这样会很累(事后证明确实如此),可这是天上掉下来的大馅饼,我没有理由放弃,所以很高兴地答应了。
Onsite & 公司印象
五家公司虽然都是互联网/IT公司,但处于不同的领域,文化上也各有千秋。我简单说一说自己对它们的感觉。另外虽然不算是吃货,但作为民以食为天的中国人,自然也要对午饭进行一下评价。
我三年前去过Mountain Views的总部,这次面试我去的是Sunnyvale的办公室,比MV要新一些。作为专注于职场社交的公司,L家的特点是端庄、大气、职业化,内部文化也相应地非常Professional。员工的穿着都是Business casual,整体给人一种职场精英的感觉,与他们的Mission非常契合。
LinkedIn被微软收购以后少了经济压力,并且保持基本完全独立的运营,可以把重心放到更长远的目标上,同时能够与M家大量的资源进行整合,个人认为对L是件好事。作为一家专注于职业发展的公司,LinkedIn自然也把自身员工的成长放在首要位置。目前包括ads relevance、feed ranking、people you may know在内的许多组都在招人,感兴趣的同学可以尽快行动。
面试方面,每个Session是一个小时。Coding题目正常,不过ML方面难度不低,大家要做好足够的准备。但其实onsite之前HR会发一封邮件,非常详细地告诉你需要准备哪些内容:)
面试官们都很亲切,有时候会给一些适当的指引,总的来说面试过程还是相当开心的。面完了我还惊喜地发现面试官中有一位本科的师兄。
L家的食堂还是一如既往地给力,中餐、西餐、印度餐菜系齐全,菜样丰富,还搭配有很多水果、沙拉。吃完了午餐坐在Sunnyvale明媚的午后阳光中思考思考晚餐该吃什么,想来应该是一件幸福的事。
Salesforce Einstein
Einstein是Salesforce近几年主推的明星产品,拥有一个明星团队,拥有像Richard Socher这样的优秀研究员。从我了解到的情况看,由于Benioff对于团队充分放权,Einstein团队就像是公司内部的一个startup,文化也与公司别的部门不同。Einstein未来几年肯定是整个公司主推的产品,Salesforce拥有的海量数据加上公司推进AI平台的决心,可以说是前途光明。
团队主要使用Scala,Tech stack都是Akka/Play/Spark那一套,这也是最吸引我的一点。我最初接触到Einstein就是在17年4月的ScalaDays上听了Matthew以Type safety in machine learning为题的演讲,之后又在Spark Summit West上听了Leah的演讲。喜欢Scala的人一定不要错过。
面试地点是在Salesforce位于Palo Alto的办公室,是一栋三层建筑的顶楼。面试整体流程比较短,总共只有四个Session,总体侧重于Data engineering和System design。另外需要注意的是coding也是要上机跑的。面试我的人中有Prediction IO的创始人,也让我很激动。
团队氛围很轻松,吃饭的时候就像是一大家子人,互相开玩笑,VP也会坐在一起和大家胡侃。我去的那天吃得非常不错,具体什么菜记不清了,就记得摆了一大桌子,其中鱼肉很好吃。
当今业界的领头巨人,没啥好说的。最重要的印象就是大,去见我同学的时候骑车还骑了二十分钟。就我所了解到的,和Facebook相比,Google整体节奏要慢一些,会做一些比较长期的项目。如果你认为自己适合慢一点的工作节奏,那么Google会是个很棒的选择。
面试是在许多楼里的其中一栋。感觉面试官貌似都比我年轻,总体来说题目没有很难。Coding有一道题我没有给出正确解,但面试小哥说接近了。机器学习的部分感觉和L家问的内容差不太多。值得注意的是Google特别强调算法的复杂度,一定要能够清楚地分析出时间和空间复杂度,能够针对瓶颈进行优化,这一点与别的公司不同。
中午吃饭的时候人超多,排队也排了好久,最后还跟带我吃饭的伊朗大哥打了一会儿乒乓。
Airbnb
这个时间点上(2017年)当之无愧的明星公司。在Snapchat已经上市但股价低迷,Uber高层动荡的今天,Airbnb算是Unicorn里的一枝独秀,拥有非常独特的公司文化以及可能是硅谷最漂亮的办公室。由于实际上处于旅游产业,所以Airbnb能够比较顺利地进入中国市场。在核心的短租业务于欧美市场初步实现盈利但趋于饱和的情况下,也在积极地向旅游房屋租赁的上下游进行拓展,推出了新产品“体验”以及餐馆预定服务,并在高端市场进行尝试,这些都为Airbnb的前景增添了积极的因素。
与别的公司不同,Airbnb的coding面试要求上机,并且每个Session只有45分钟时间,某些题目的难度也相当大,所以压力还是不小的。System design环节还算正常,不过房间里的board很小,有点写不开。而Airbnb独树一帜的cross functional面试我觉得是最享受的,基本上就在和面试官谈人生谈理想,全程都很放松。但Airbnb的面试流程最长,环节最多,总体感觉也是最累的。
印象中午餐选项没有特别多,但是味道还不错。带我吃饭的法国小哥一听我第二天要去Facebook面试,立刻非常兴奋地告诉我他从Facebook来Airbnb的理由,并且很开心地带我到楼里几个著名景点转了转。
仍然在高速成长的巨人,在可能是硅谷最爱中国的CEO带领下铺展了全面的产品线,在社交网络领域基本上处于垄断地位,同时也在AI和VR等引领未来的领域积极投入,发展空间仍然非常广阔。从我了解的信息看,Facebook注重开放的文化,同时工作节奏快。
我的面试是在楼顶有花园的海景房Building 20,也是扎克伯格办公的地方,由于夏季水少其实看到的是一片盐碱地。旁边还有几栋正在盖的新楼,加上传闻今年两千多的名额,说明Facebook仍然处于扩张期。
Facebook的整个面试过程我自己感觉是最不好的,一方面是因为已经是第五场面试,整个人已经很疲劳了,另外可能是Facebook的规定,面试官都没有对我的答案给出特别明显的好与不好的信号,虽然我觉得自己的答案没有错,但也稍微有些拿不准自己的表现。
两场Coding还算是正常,两道题都在面试官的提醒下总共给出了两种解法,有一场还问了两道题。ML产品设计面到一半的时候已经感觉自己生病了,头疼得厉害,最后硬撑着完成了面试。出来以后感觉不太好,以为没戏了,没想到最后竟然也拿到了Offer。
谈工资
回来以后就陆陆续续地收到了几家公司的Offer,虽然心里基本上有数,但说实话听到HR祝贺的时候还是非常开心的,毕竟付出那么多努力都有了回报。
然后就是流程最后的阶段,工资谈判。这个阶段其实重要性不亚于面试,因为它直接决定了你未来几年对工作和生活的满意程度。
很多人觉得自己不擅长谈判,或者很多时候不好意思开口。我个人觉得求职实际上是在出售自己的时间,而时间对于一个人来说是唯一不可再生的资源,如果你自己都觉得你的时间不值钱,那么别人也不会觉得它值钱。
工资谈判是个很大的话题,这里我不打算深入讨论,不过这篇帖子很有帮助:https://medium.freecodecamp.org/how-not-to-bomb-your-offer-negotiation-c46bb9bc7dea
有几点我觉得值得注意:
1.保持职业风度。
2.了解你的筹码。
3.显示出你对团队和项目的兴趣。
4.保持耐心和信心。
5.态度坚定的同时要温和。
6.绝对不要撒谎。
Databricks
也许五次面试拿到五个Offer是一个比较理想的结果,但这样的结果其实始于一场失败的面试。
早在五月份的时候,我就面试过Databricks,也是我换工作面试的第一家公司。当时是Spark MLlib组的经理Xiangrui在LinkedIn上联系我,问我有没有兴趣面试他们组。我当时受宠若惊,觉得这是个绝佳的机会。第一,我自己用Spark工作,无论是Scala还是分布式机器学习算法都对我有很大吸引力。第二,Databricks的工程师实力都是业界顶级,如果有机会跟他们一起工作一定能学到很多东西。第三,Spark正在给整个业界带来变革,处于浪潮的最前沿也是一件让人非常兴奋的事。考虑了几天之后,我觉得这是个不可多得的机会,于是简单地准备了两天就开始了面试流程。
Databricks的水平要求相当高,整个过程包括两道初筛题、一次电面、一道大作业以及最后的Onsite。我的感觉是仅仅是两道初筛题难度就已经不低,应该说比其他大公司的面试更加严格。我前面的环节还比较顺利,拿到了Onsite的机会。
Databricks目前位于三藩城内,依然是早期创业公司的规模,办公室有两层楼,其中一面可以看到海湾,风景非常不错。
早晨和HR打过招呼后她就领我到了面试的房间。前面几轮我感觉还算正常,题目难度算是中间偏上,面试官也都是非常的谦和。但是下午有一轮是针对机器学习算法理论,一方面自己实力不足,另一方面准备不够充分,整个环节完全僵在那里,不知从何下手,当时就觉得自己应该拿不到Offer了。最后是和他们VP of Engineering简单聊了聊。
回芝加哥之后几天就收到了拒信,虽然也是预料之中的结果,不过还是郁闷了好几天。虽然没有机会到Databricks工作,但我相信以现在Spark在整个业界的影响力以及Databricks整个团队的实力,他们一定能创造出更大的成功。
总结
1. 人生很短,职业生涯更短。该跳的时候就要果断跳。
2. 集中面试很累,但也会给你很大优势。
3. 面试不仅仅是个找工作的过程,更是个交朋友的机会。硅谷圈子就那么大。
4. 平时有机会也要多交朋友,比如开会就是个很棒的机会。Databricks、Salesforce、Airbnb的面试机会都源于我去过的Spark Summit和Scala Days。
5. 拿到Offer仅仅代表你达到了公司的最低标准。最高标准肯定是没有的,所以时刻保持虚心和进取心。
从五月初份面试第一家公司到九月末接受Offer,终于完成了职业生涯中第一次跳槽。回过头看看,准备面试的过程还是很辛苦的,有一段时间每天晚上都是准备到一点才睡,第二天早晨又要100%投入地上班,确实对身心都是一种考验。
最终能拿到这样多的工作机会实在是很幸运,毕竟任何一家公司都是无数人的dream company。
感谢在这个过程中所有帮助过我给过我建议的朋友。感谢所有给我面试机会和Offer的公司,跟我一直联系的HR,以及每个抽出宝贵时间和我聊天的人。
最后也是最重要的,感谢一直默默支持我的家人们——看着我一步步成长的父母,全职工作、努力带娃、愿意放我一个人出去浪的妻子,还有,每天都给我暖心微笑的女儿。你们是我努力的动力。
LinkedIn:https://www.linkedin.com/in/xiaohanzeng/
Twitter:https://twitter.com/XiaohanZeng
最后给自己的小说《当我谈论算命时,我想谈的是大数据》打个广告,关注本公众号或者上果壳看连载:http://www.guokr.com/post/592618/
曽笑寒
网友评论