我想在湾区找到一份工作,然后在一家大公司里让自己在移动开发方面有所成长。我以前也在创业公司工作过,我很喜欢这些公司,但出于一些其他的原因,我一直想看一看大公司的机会。我不确定自己想去哪里工作,也不知道多少薪水才能与当前的水平相匹配,但我知道我不想像大学毕业时那样海投简历。
我总共投了 20 家公司,其中有 4 家公司(Reddit、Nest、Stripe、Uber)明确拒绝。在剩下的 16 家公司中,有 10 家没有给我我回复(Lyft、Airbnb、Dropbox、Instagram、YouTube、Square、Robinhood、Twitter、Snap、Slack)。在剩下的 6 家公司中,我进行了 6 次电话面试、6 次现场面试,并拿到 6 个 offer。
回看我的谷歌日历,我大概做了以下这些事情:
10 天内进行了 7 次招聘人员面试;
11 天内进行了 7 次技术面试;
8 天内进行了 29 次现场面试;
3 次后续电话面试。
总的来说,我在 73 天内接受了 46 次面试。整个过程让人筋疲力尽,也就是说,有那么几个星期,我的午休时间都用来面试。我必须很早就去上班,这样就可以提早下班回家接受电话面试。与此同时,又要确保仍然可以完成工作上的事情,这是一项艰巨的挑战。我给工作上的事定了更高的优先级,在必要的时候我会重新安排面试时间。我不会为了面试停下手中的工作,因为那样会让你看起来很糟糕,这是不道德的。而且如果你没有拿到 offer,你的绩效就会有问题。
拿到 offer 的公司
LinkedIn(桑尼维尔)
LinkedIn 的移动应用实际上非常流畅,他们对开源社区做出了一些可靠的贡献。在整个面试过程中,LinkedIn 的工程文化给我留下了非常深刻的印象,它们在我的“iOS 声望”清单中名列前茅。
Yelp(旧金山)
Yelp 有一个非常漂亮的应用程序,带有大量的 iOS 细节,这些细节彰显了他们对这个平台的理解。我非常喜欢现场面试的氛围。他们的大楼很漂亮,我很乐意和我的面试官一起工作。Yelp 比我申请其他公司要小得多,但通过各种方式展示了他们好的方面。面试过程进展得很快。
Apple(库比蒂诺)
我是一个极端的果粉(从 12 岁开始)。Mac 让我开始接触编程,然后使用 iPhone SDK 开发和发布了我的第一个应用程序。他们邀请我到现场面试,然后再给我一个 offer,这就像在做梦一样。我不知道该说什么好了。
亚马逊(帕洛阿尔托)
我不认为亚马逊是一家“移动优先”的公司(根本不是)。不过,这个职位和团队符合我一开始设定的目标。我并不是特别喜欢帕洛阿尔托的建筑,但在搬进更有亚马逊风格的建筑之前,这只是一个临时的办公场所。面试我的人似乎非常专注于他们的产品。虽然每家公司都喜欢跟我说“这真的感觉像是一家初创公司”,但这句话在亚马逊听起来最真实。
Facebook(门洛帕克)
我去了 Facebook 的新大楼。总体来说,我觉得它很酷。虽然我对面试细节已经有些模糊,因为我已经连续五天睡眠不足了。我只记得与面试的人聊得很开心,午餐时间的面试也很有见地。
谷歌(山景城)
根据我的理解,谷歌会对候选人进行“一般性”的面试。我与谷歌最大的一个 iOS 产品团队的成员进行了交谈,但并没有面试该团队的职位。在我通过谷歌招聘委员会的面试之后,进入了团队匹配阶段,并最终与一个团队进行了匹配。与我面试过的其他公司相比,这是一个非常漫长的过程。
学习计划
需要说明的是,我先从简单的 Leetcode 题目开始,确保可以在大约 30 分钟内完成大部分这类问题,然后可以用无限时间解决 25%中等难度的 Leetcode 问题。解决 Leetcode 难题类似于解决 P = NP 问题。简单地说,我有一个很大的差距需要弥补。
为了研究算法,我先是看了“Cracking the Coding Interview”(https://www.amazon.com/Cracking-Coding-Interview-Programming-Questions/dp/098478280X)这本书。星期天早上,我醒来后就去咖啡馆,使用 Objective-C 解决书中的一些算法问题。在解决书中足够多的问题后(我想我解决了大约 35 个问题),我会继续回顾书中提到一些 Leetcode 问题。几个礼拜之后,我觉得我已经掌握了“基本知识”,可以进入下一阶段。
在了解了这些基础知识之后,我开始看“Elements of Programming Interviews”(https://www.amazon.com/gp/product/1479274836/)这本书。这本书比上一本要难得多。这本书推荐了一些学习计划。其中有一个为期四周的学习计划,我几乎完成了所有的学习任务。在我看来,无论是在白板上与别人讨论问题,还是模拟电话面试,对于我来说都至关重要。可能不能说它“非常重要”,但在学习时应该将其视为一项绝对性的要求。我相信没有它也找到工作,但这毕竟是一个最佳实践。
如果有人想模拟 iOS 方面的电话面试,我很乐意帮忙——你可以在 CS Career Hackers(https://www.cscareerhackers.org/)上找到我,也许我们可以在时间允许的情况下做点什么。除了我以外,还有很多其他人愿意提供帮助。不过这样做会有点奇怪,这才是重点。如果在面试时你表现得很自然,那就不需要练习了,不是吗?但如果你开始模拟手机面试或者在白板上练习与别人讨论问题,并且它会令你感到尴尬,那么说明你需要这么做:就是练习。在一开始我会感到很尴尬,直到变得很自然,这种做法也让我获得了回报。
经过大约一个月的持续练习(可能每天 2 到 3 小时,周末会更长),我开始做 Leetcode 的“热门面试问题”。我没有全部做完,但做得“足够”多。为算法面试做准备的关键在于让自己达到一个点,可以在面试中找出问题,而不一定知道如何解决每一个问题,因为这是不可能的。我在网站上看到的几乎所有问题对我来说都是“新”的,但与以前见过的问题相似。你有很多类似的问题,但在特定情况下有特定的约束。
我从中学到了什么?
我将分享我学到的一大堆东西,并以列表的形式列出来,顺序不分先后。下面列出的所有内容都是我希望之前就该知道的,无论是在技术方面的准备,还是日程安排和其他非技术技巧。这些东西不只是针对 iOS 开发的,我认为它们适用于我们行业的所有面试。
坚持
在我刚走出校门找工作时,一般学习一两周就放弃了。我的理由是,我根本不是学习这些东西的料。在刚开始的几个星期,几乎没有什么进展,所以浪费时间又有什么意义呢?但这一次,我想我没得选择。最终我开始慢慢步入正轨。这是一项艰巨的工作,但学习的意愿是将成功的候选人与其他人分开的重要因素。
实践就是一切
你当然需要一些先天能力,但练习(即学习)可以填补很大的能力差距。公司不会根据候选人与生俱来的知识来雇用员工。他们会雇佣那些能够履行职责的人,并且无论候选人在哪里或什么时候培养了这些知识,都能很好地履行职责。
与朋友一起练习
无论是在白板上还是使用 Codeshare(https://codeshare.io/),通过一段时间的模拟面试,可以消除很多实际面试的恐惧感。通过这种事前练习的方式,你可以克服对别人说一些完全愚蠢的废话的尴尬。如果能找到一个有经验并且了解那些你以前没见过的问题的人,那便再好不过了,因为他们可以给你提示,帮助你找到解决方案。说真的,这种练习是无价的。
以量取胜
你可以尽情练习,但不一定就会找到合适的工作,因为有可能合适的招聘人员没有看到你的简历,或者你未能及时解决白板上的问题。但你可以最大化你的机会。申请你想要去的公司,以及你符合他们要求的公司,而不是只申请首选的公司。我申请了我想去的前 20 家公司!
专注于如何解决问题,而不是解决方案本身
只是死记硬背是不够的。在一周内看到的 20 多个算法题中,之前可能只见过其中的一个。但我知道很多常见的模式,所以能够灵活地提出解决方案。
不要气馁
有好几次面试我压根想不出解决方案,面试官不得不给我提示。但最后我仍然拿到了 offer。此外,我觉得有一次面试完全被我搞砸了(那天五轮面试中有四轮在我看来是肯定“没戏”了),公司后来还是给了我 offer。显然,一切皆有可能!
不要轻易忽视问题
有好几次我和一个朋友在一起练习,他认为有些问题太难了,没必要掌握。奇怪的是,在实际面试时,他过“永远不会”出现的四类问题中出现了两类。虽然与我们练习的形式不完全一样,但非常相似。如果你在练习过程中经常会遇到某个概念,那么请学好它。
不要低估个人行为的重要性
我认为我很享受成功,因为我(诚实)的答案正是公司想要的。我认为很多开发人员的技术能力都很强,但仍然很难找到理想的工作,因为他们对技术环境以外的人说话很粗鲁,或者不够诚实,或者让人感到不舒服。在我看来,这些都是公司拒绝候选人的合理理由。所以,我们要像练习技术问题一样练习它们。
如果你知道更多,就展示出来
在现场面试中经常遇到这种情况,我会回答问题,并提及其他的一些知识,但解释说我没有足够的时间在面试中完全实现这些解决方案。在回答有关字符串的问题时,可以展示一下你的 Unicode 知识或解释一下如何支持 Unicode。在回答如何实现私有方法时,可以讨论 Objective-C 在方法方面的约定。在回答如何更新表视图时,可以谈谈你知道的不同的动画效果。如果你不能畅所欲言,就不要提出来,但如果可以的话,可以让你在问题提供的狭小窗口之外展示知识,让你在严格遵循常规的人面前占得先机。
不要满足于及格线,努力设定更高的标准
面试中的表现不仅决定你是否可以拿到这家公司的 offer,还会决定你能拿到什么样的 offer。如果你认为自己知道要达到怎样的程度才能拿到 offer,那很好。但请记住,“勉强够好”和“非常好好”之间有很大的区别。你要争取做到后者!尽管我相对缺乏经验,但我最初(即没有经过谈判)的 offer 还是相当不错的,我相信面试表现起了很大的作用。
总 结
就是这样!这是一个疯狂的旅程,我没有留下任何遗憾。我真的希望上述内容可以帮助你们在寻找梦寐以求的工作时克服困难。
我可以透露一些额外的信息:这是我大学毕业后的第二份工作,当时我有两年半的工作经验,简历上没有任何值得注意的实习经历或雇主。我上的是一所非常普通的学校,在他们的“招聘会”上,没有一家知名的软件公司会光顾。我从在 4 月下旬开始准备,并在 6 月 /7 月开始申请职位。几个月后,我拿到了梦寐以求的工作机会。