本文作者在 2017 年 8 月的六天里,参加了 LinkedIn、Yelp、Apple、亚马逊、Facebook 和 Google 的面试,并拿下了 6 份 Offer。在此之前,工作时间短暂、知识及经验均有限的作者,在经历一次失败的面试之后,并未丢失信心,而是从头来过。作为一名全职工作者,其在闲暇之余准备面试,能同时拿到多家科技巨头的 Offer 这样的结果确实非常地幸运,但是其背后付出的努力也不容忽视。本文接下来将与大家分享作者在面试时所做的准备工作、面试技巧以及自己的一些实践经验,希望可以为正在准备跳槽的工程师提供一些帮助。本文译自 Medium.com 中原标题为《I interviewed at six top companies in Silicon Valley in six days, and stumbled into six job offers》的文章,原文作者为 Bay Area Belletrist 。
2017 年的 8 月,我作为一名普通的软件开发工程师,已经在 Groupon 芝加哥总部工作了近三年。这是我的第一份工作,幸运的是我的团队和项目都很赞,而且我和工作中的伙伴们也一起搭建出了很懂很棒的产品。但是,这份轻松的工作和这种安逸的生活却令我发现,自己的职业成长也在不知不觉中触到了瓶颈,此时的我内心开始希望迎接新的挑战。同时作为一名在芝加哥住了八年的码工,也非常向往湾区的优秀公司。
在与家人沟通并得到他们的全力支持之后,我便决定采取行动,开始迈出职业转变的第一步。虽然我寻找的职位是移动开发类,但是这个过程中的一些面试经验应该是普遍适用的。在此希望我的这份经历能够激励在职场中与我境况相同的人们,助力大家积极地寻找未来和远方。
前期准备与统计数据
这次跳槽我主要是想在湾区找一家大公司来从事移动开发类的工作。我的前单位是一家创业公司,虽然我也很喜欢创业公司的氛围,但鉴于个人成长和平台资源,这次跳槽的目标就锁定在诸多大公司中了(主要看公司资产,团队规模倒是其次)。为了迎接新的工作个人倒不是很在意工作岗位和薪酬多少,但我也不想像大学刚毕业时那样一下子申请 100 多家公司,这么做即费心又费神。
最后我一共给 20 家公司递去了简历,其中 4 家公司(Reddit、Nest、Stripe、Uber)明确地拒绝了我;其余的 16 家中,10 家公司没给我回复(Lyft、Airbnb、Dropbox、Instagram、YouTube、Square、Robinhood、Twitter、Snap、Slack)。只有最后的 6 家公司的招聘人员联系了我。在这 6 家公司中,我参加了 6 次电话面试,6 次现场面试,并拿下了 6 个 offer。
根据我的 Google 日历,大致过程如下:
7 次招聘人员面试,共计花费 10 天;
7 次技术人员面试,共计花费 11 天;
29 次现场面试,共计花费 8 天;
3 次后续电话面试。
以上统计数据表明我在 73 天内参加了 43 次面试。这个过程真是让人筋疲力尽,有好几个星期的午休时间我都在参加面试,而且为此我还不得不很早就去上班,以便能早点下班回家打电话。在找新工作的同时,我依然需要确保完成份内的工作,不过我把面试环节放在了更重要的位置上,所以在有必要的时候调整了工作日程安排。我不会为了参加面试而打电话请假,因为这样做不道德,而且如果你找不到新工作,在目前的工作中表现又不好,岂不是很糟?
6 家公司的整体印象(按面试顺序排列)
LinkedIn(加利福尼亚州,桑尼维尔)
LinkedIn 的移动应用做的非常流畅,而且他们对开源社做了很多贡献。LinkedIn 给我的整体感觉是非常大气、很专业化的,面试过程也给我留下了深刻的印象。整个面试过程从开头到结束,LinkedIn 在我心目中的地位一直名列前茅。另一方面,自从 LinkedIn 被微软收购以后经济压力也减小了很多,使其可以放开手做一些比较酷的开发项目。作为一家专注于职业发展的公司,LinkedIn 优先考虑其员工的职业成长。目前包括 ads relevance、feed ranking 在内很多组都在招人,所以如果你想加入就赶快行动吧。
Yelp(加利福尼亚州,旧金山)
Yelp 的应用程序非常精美,里面承载了大量精妙的 iOS 版细节,很能突出这家公司的特色。我很喜欢这家公司工作的氛围,不能办公楼的装潢很别致,而且面试官也是那种见一眼就像与之成为工作伙伴的类型。虽然 Yelp 比我申请的其他公司规模都小,但是我对这儿的印象非常好,这家公司整体上给人的感觉是组织严密,流程快捷。
Apple(加利福尼亚州,库比蒂诺)
我从 12 岁起就是苹果的忠实粉丝了。最初受到 Mac 的吸引开始了我的编程之旅。在 iPhone SDK(苹果公司提供的 iPhone 开发工具包) 的帮助下我开发并发布了属于自己的第一个应用。收到他们的邀请去参加现场面试后竟然成功地拿到了 offer,我简直受宠若惊。
亚马逊(加利福尼亚州,帕洛阿尔托)
我不认为亚马逊是一个“移动优先”的公司,但是他们的职位和团队符合我制定的标准。 当我去现场的时候,感觉并不是很喜欢帕洛阿尔托的那栋大楼,但那只是一个临时的办公室,后来他们搬进了一栋更像亚马逊的大楼,所以当时的面试感觉很差。面试我的人似乎非常专注于他们的产品。虽然每家公司都喜欢告诉我,“他们的公司感觉就像创业公司一样!”,但在亚马逊这种感觉最真实。
Facebook(加利福尼亚州,门洛帕克)
我在一座最新的大楼里参加了 Facebook 的面试。我感觉那栋建筑整体非常酷,但是我对面试的细节却有些模糊,大概是因为当时的我连续参加了五天的面试,睡眠不足。但是我却记得与面试官的谈话非常愉快,那是一次有深刻见解的面试。
Google(加利福尼亚州,山景城)
据我所知,Google 并没有针对某个特定的职位进行专门的面试,而是采用了非常“通用”的形式。当时我与 Google 最大的 iOS 产品团队的许多成员进行了交谈,但是我面试的职位并不属于那个团队。在我通过了 Google 的面试后,我进入了分配团队的阶段,最终被分到了一个团队。与其他公司的面试相比,那是一个非常非常漫长的过程,因此我必须让每个人都了解 Google 的最新动态。我也必须让 Google 知道我和其他人的状况。
学习计划
刚开始的时候我做的都是 Leetcode 上那种大概 30 分钟就能搞定的简单级别的问题,如果没有时间限制的话,我可以解决 Leetcode 上 25% 的中等难度的问题。但是做 Leetcode 上高等难度的题目感觉就像解决 P=NP 的问题(注:理论信息学中计算复杂度理论领域里至今未被解决的问题),在这方面我差远了。
为了研究算法,我开始做《Cracking the Coding Interview》上的题目。每周日上午起床后,我都会去咖啡店钻研一些 Objective-C 的问题。在做了大量题目后(我做完了大约 35 道题),再去书店翻翻 Leetcode 的题目。几个星期后,当我感觉基础已经打得差不多了,就可以开始下一个阶段了。
打好基础以后,在第二个阶段中,我开始做《 Elements of Programming Interviews》。这本书比上一本更难。这本书还推荐了学习计划,我认为这个还不错所以也听从了上面的建议。当时有一个为期四周的学习计划,我几乎全部完成了。在我看来,找一个人陪你模拟做题或模拟电话面试是件很重要的事。虽然不至于非做不可,总之是利大于弊的,虽然有可能即使不做这一步你也能找到工作,但个人认为这是最佳的实践方式,有条件的话还是试试比较好。
模拟的时候,你们可能会略感尴尬,但这才是关键。因为如果你感觉自然,那就不用练习了不是吗?如果模拟电话面试或在白板上做题会让你感觉很尴尬或不好意思,那么就说明这个环节开始见效了:你正需要练习。刚开始时,我也感觉非常尴尬,但是这种练习绝对值得。
在练习了大约一个月后(每天 2-3 个小时,周末更多),我开始集中精力做 Leetcode 的“热门面试问题”。虽然没全做完,但也过了大半了。个人认为准备算法面试的关键在于持之以恒,直到你可以在面试中解决问题。不过这并不意味着一定要做完每一道题。做完所有的题是不可能的。在我参加现场面试的那一周,几乎所有的题目都是“新”的,但是却与见过的问题很类似。这也是该领域的绝大多数开发人员完成工作的秘诀。
经验教训
下面是我的一些经验教训(排序不分先后)。其中列出的每一条都是我事后才领悟出来的,无论是关于技术方面的准备、日程计划,还是其他非非技术方面的小贴士。这些经验教训不仅限于 iOS 开发,我觉得它们适用于软件开发界所有的面试。
下定决心
刚毕业找工作的时候,我仅学习了 1-2 周之后就放弃了。我觉得原因是自己根本没有下决心学习这些东西。刚开始学习的几周里,我的进步很小,那么浪费那么多时间又有什么意义呢?所以这一次我没有犹豫,直接开始步上正轨。需要学习的东西很多,但是是否愿意学习才是成败的关键。
实践才是真理
这种事确实需要一些天赋,但是练习可以弥补先天的不足。各个公司并不是根据应聘者与生俱来的知识决定雇佣谁。无论你们是从何时何地掌握的知识,只有那些能够履行职责且表现良好的人才会受到赏识。
与朋友一起练习非常关键
无论是在白板上还是在 Codeshare 上做题,定时与朋友模拟面试的现场环境可以减弱你对面试的畏惧,这可以帮助你克服因为大脑一片空白而胡言乱语的尴尬。如果能找到一个有经验并且了解那些你以前没见过的问题的人,那便再好不过了,因为他们可以给你提示,帮助你找到解决方案。说真的,这种做法非常有价值。
以量取胜
如果在努力练习的前提下仍然找不到工作,那么有可能只是因为没有合适的人看到你的简历,或者你没有及时地找出白板问题的解决方案。你所能做的就是尽可能多地尝试。也就是说多申请几个职位,只要是你喜欢又符合你的要求的地方,都不要犹豫、统统申请,而不仅仅把视野局限在你的首选上。要知道,我当时申请了 20 家公司呢!
关注解决问题,而不是解决方案
我们的记忆力很有限。我在一周内做了大约 20 道算法题,而我以前见到过的只有 1 个(我告诉了我的面试官,尽管很多人不同意这种做法)。见过的常见模式多了,那么自然就能够找到解决方案。
不要气馁
有好几次面试的时候,在现场我都不知道该怎么办,最后不得不在面试官的指导下解决问题。但是我仍然收到了所有的 offer。有一次,我感觉那次面试绝对没戏了(我以为我的 5 个面试都没戏,那一次是第 4 个),结果那家公司最后还是给我下了 offer。可见,一切皆有可能,千万不要轻易放弃。
不要轻易忽视某个问题
有好几次我与朋友一起练习的时候,他觉得这些问题太难了,没必要掌握。很有趣的是,我记得当时他说了 4 种类型的问题“永远”不可能出现,结果有其中的两种都出现了。虽然与我们练习的并非完全一样,但非常类似。如果在你的练习中经常出现某个概念,那么一定要记住它。
不要低估个人行为的重要性
我有时候会显得很自信,因为说实话我的答案正是公司想要的。我认为,很多开发人员的技术力都非常强,但仍然很难找到完美的工作,那是因为他们对待技术圈外的人非常粗鲁、不诚实或讲话方式让人很不舒服。在我看来,这些都是他们遭到拒绝的直接理由。所以如果你身上也有类似情况,那你应该像对待技术问题一样重新审视一下你的行为。
如果你知道很多,别忘了展示出来
在现场面试的时候,有好几次我在回答一个问题的同时提到了其他的一些知识,并解释说面试的时间不够所以无法完整阐述这个解决方案。比如在回答一个有关字符串问题的时候,应该在解决方案中展示 Unicode 的知识或解释如何支持 Unicode;在实现私有方法的时候,应该讨论一下 Objective-C 的惯用方法;在讨论更新表视图的时候,应该谈谈你可以支持的不同动画。如果你并不是十分明白就不要说,但如果你知道,那么就应该展示与这个问题有关的外围知识,把那些局限在问题本身的人都比下去。
不要仅仅满足于及格线,要努力争取到最好
面试中的表现不仅决定你是否可以拿到这家公司的 offer,还会决定你能拿到什么样的 offer。如果你认为你有那个水平拿下 offer,自然再好不过了。但是一定要记住,“勉勉强强”与“非常好”之间的差异很大!努力争取后者!尽管相对来说我的经验不足,但我最初拿到的(没有经过谈判)offer 就非常好,我相信面试中的表现起了很大的作用。
总结
整个过程就是这样!这是一次疯狂的旅程,我没有遗憾。我真的非常希望上述内容可以帮助你们克服所有困难,找到梦寐以求的工作。
补充:自大学毕业以来,这是我第二次参加面试,我有两年半的工作经验,而且我的简历中没有值得一提的实习生或员工经历。我上的是一所非常不知名的学校,各大软件公司的招聘会上对我们学校一无所知。我于 4 月下旬开始准备,在 6-7 月间开始申请,几个月后终于找到了梦寐以求的工作。