6天面试、斩获6家硅谷巨头Offer,我是如何做到的?
刚开始的时候我做的都是 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 就非常好,我相信面试中的表现起了很大的作用。 总结 整个过程就是这样!这是一次疯狂的旅程,我没有遗憾。我真的非常希望上述内容可以帮助你们克服所有困难,找到梦寐以求的工作。 (编辑:温州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |