iOSer:我是如何 6 天面试了 6 家硅谷顶级公司并拿下了 6 份 Offer 的?

本文作者在去年的 6 天时间里,参加了 LinkedIn、Yelp、Apple、亚马逊、Facebook 和 Google 的面试,并拿下了 6 份 Offer。

作者:Bay Area Belletrist

译者:弯月

责编:沭七

出品 | CSDN(ID:CSDNnews)

以下为译文:

写在前面

原本我只是考虑换公司的可能性。我不想为了寻找完美的工作而飞来飞去,所以我知道我必须做好日程计划,将所有面试都安排在一起。虽然我寻找的职位是移动开发,但是这个过程中的学习方法、技巧和建议应该是普遍适用的。

我希望能够激励那些处境与我相同的人(对目前的工作并非百分之百满意,梦想着在湾区生活,但缺乏严肃的“学习准备”的人),积极地去寻找,看看未来的路将通向何方。

简介与统计数据

image.png

我想在湾区找一家大公司从事移动开发的工作。以前我在创业公司工作,我挺喜欢创业公司,但由于一些原因,这次我想找一家大公司(主要看资产,团队规模倒是其次)。而且我也不是很在意工作岗位以及薪酬。另外,我也不希望像大学刚毕业那样一下子申请 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(加利福尼亚州桑尼维尔)

image.png

我在参加现场面试时的心跳率(正常的静息心跳率大约为 60)

LinkedIn 的移动应用做的非常流畅,而且他们对开源社做了很多贡献。从文化角度和工程角度来看,整个 LinkedIn 的面试过程给我留下了非常深刻的印象。整个面试过程从开头到结束,LinkedIn 在我心目中的地位一直名列前茅。

Yelp(加利福尼亚州旧金山)

我在参加现场面试时的心跳率

Yelp 有一个非常漂亮的应用,里面承载了大量精妙的 iOS 细节,彰显了该平台的魅力。我很喜欢现场的氛围。他们有一座漂亮的大楼,而且我很愿意与我的面试官一起工作。虽然 Yelp 比我申请的其他公司都小,但是它给我的印象非常好。感觉这家公司组织严密,流程快捷。

Apple(加利福尼亚州库比蒂诺)

我在参加现场面试时的心跳率

苹果是 iOS 重要的一部分:)我从 12 岁起就是苹果的忠实粉丝。最初是 Mac 吸引了我开始编程。iPhone SDK 鼓励我开发并发布了我的第一个应用。收到他们的邀请去参加现场面试,后来还给我下了 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 就非常好,我相信面试中的表现起了很大的作用。

总结

整个过程就是这样!这是一次疯狂的旅程,我没有遗憾。我真的非常希望上述内容可以帮助你们克服所有困难,找到梦寐以求的工作。如果你对 iOS 特别感兴趣,那么我可以给出一些提示,所以请在下面留言。

补充:自大学毕业以来,这是我第二次参加面试,我有两年半的工作经验,而且我的简历中没有值得一提的实习生或员工经历。我上的是一所非常小的学校,各大软件公司的招聘会上对我们学校一无所知。我于 4 月下旬开始准备,在 6-7 月间开始申请,几个月后终于找到了梦寐以求的工作。

希望大家开心地学习!

这个收了六个offer的人是个老外(不是中国人)。这个老外去面试前,刷题刷的真努力啊。:muscle:

1 Like