我刚刚在硅谷的科技公司完成了7次现场面试,我收到了来自Facebook的软件工程师的职位Offer。下面分享一下我是怎么为面试做准备的,以及我在这个过程中学到的东西。
(一)为了能到硅谷工作,我已准备多年
当我还在澳大利亚的大学学习计算机科学的时候,我总是想象着未来能成为硅谷的一名软件工程师。我希望自己未来能够到科技行业的创新中心硅谷去工作。这个目标让我充满了动力,它也让我能够更加专注地准备面试。
为了更好地学习,我辞去了在墨尔本一家非常棒的公司的首席iOS工程师的工作,然后回到了我的家乡城市珀斯。在珀斯,我开始为硅谷公司的面试做准备。我知道面试准备将是非常困难和艰巨的一项任务。
如果你告诉一群软件工程师技术面试的流程,其中的很多工程师都会对常见的面试方法持反对意见。很多争论来自于这样一个观点:即在白板上解决算法问题实际上并无法实际代表软件工程师是否能在实际工作中完成日常任务。
我在这篇文章中不会去讨论这个话题。相反,我将从应聘者的角度来探讨不同类型的面试实践。同时,我还会分享我自己在面试过程中学到的东西。
(二)面试是一种技能
在我准备的面试的过程中,我始终知道面试是非常具有挑战性的。但是直到我被第一次面试折磨之后,我才知道面试是那么困难。
在面试前,我曾使用过一些付费和免费服务,这些服务可以让那些拥有行业经验的人通过电话对应聘者进行代码和白板模拟面试。这种面试模拟练习对我应对真实面试中所面对的压力是非常有帮助的。但是后来我逐渐发现,模拟面试练习只相当于真实面试内容的很小一部分。
我的建议是,在你没有积累一些模拟或实战面试经验之前,不要面试你梦寐以求的工作岗位。面试中紧张的情绪会让你难以承受,只有通过不断练习才能克服这种紧张的情绪。
和生活中的其他很多事情一样,不断练习可以增强你的自信。
(三)我经历的几种不同类型的面试
如果你在最开始的电话面试中表现得足够好,你就有机会参加现场面试,面试可能会持续整整几天的时间。每次面试通常会持续4到6个小时,具体时间取决于你所面试的公司。
在我自己在硅谷面试的过程中,我总共进行了7次现场面试,这让我对目前的面试现状有了一个独特的看待视角。
通常情况下,现场面试会覆盖三个主要面试主题:算法、架构设计和行为,这些正是我专门研究和精心准备过的面试内容。然而,也有一些公司似乎不按常理出牌,他们会扩大的面试内容范围,以考察应聘者的更多实用技能。
下面分享一下我经历过的几种面试类型:
(1)算法面试
这是最常见的面试类型。面试官会要求你在白板上解决一个问题,并据此来评估你对数据结构、排序算法、递归、时间/空间复杂度分析、模式和极端案例识别等方面知识的掌握情况。在这样的面试中,你通常会提出一个蛮力的解决方案,然后试着改进这个解决方案,并且讨论权衡不同的解决方案。
这类面试是我准备最充分的面试类型,因为连续6周时间,我每一天都会练习在一个廉价的悬挂白板上解决算法问题,分析它们的时间/空间的复杂性,真正理解所写的每一行代码带来的结果。
就我个人而言,我非常喜欢白板算法,因为我不需要担心编写可编译的语法,这让我能够专注于解决手头要解决的问题。其他人可能不喜欢在白板上进行算法面试,对于这些人,我要说的是,如果能坚持练习,这可能会改变他们的想法。
(2)架构设计面试
这是一种非常有趣的面试类型,也是被我严重低估的一种面试。面试官会要求你在白板上设计一个系统,比如停车场的售票系统、聊天通讯系统、推特信息流系统以及其他常见的系统。
通过这类面试,面试官考察的是,在你拿到一个宽泛的概念之后,你如何设计一个能够满足所有需求和限制性条件的系统。在这个过程中,需要应聘者提出正确的问题,因为这些问题将会定义需求和限制性条件。这类面试过程更多的是一种对话,你需要在这个过程中画一些图表,甚至是阶级结构。所有这些都是一种高层次的交流,所以你不需要编写任何实际的代码。
当然,你应该对交流内容进行引导,从而能让面试官了解你在系统工作方式方面的知识。如果你是一名后端工程师,你无需探讨客户端应用程序机制的细节,除非你之前在那个领域积累过一定的专业技能和知识。我是一名iOS工程师,所以我在这类面试中会主要谈到架构模式、功能的模块化、设计模式,而不是谈论如何扩展API端点之类的内容。
(3)行为面试
面试官会问你一些关于你自己的问题以及你如何处理一些特定的情况。准备这类面试并没有准备其它几类面试那么难,但是它需要你自己做很多自我反省。
通常会问到的问题包括:
-
你是如何对待失败的?
-
你认为你自己最大的弱点是什么?
-
你如何解决冲突?
-
如果有机会可以重来,你现在的做法会与以前的有何不同呢?
我觉得很难把这类面试搞砸,但我发现很多人确实在这类面试中出了问题。他们试图把自己的强项伪装成弱点,他们回答问题时只说那些他们认为面试官会想要听到的答案,甚至把失败项目的责任转嫁到别人身上。类似下面这样:
-
“我的弱点就是我太专注了。”
-
“这个项目失败主要怪Jerry,他把这个项目中的大部分工作都搞砸了。”
要知道,这些面试官都是经过严格训练过的专业人士,他们能轻易辨别那些不称职的人,并且对应聘者所说的废话谎言非常敏感。他们能快速将那些不合格的候选人Pass掉。在面试过程中,要真诚,不要耍小聪明,要表现出对你的工作的热情,承认你的缺点,并表现出有改进缺点的主动性和强烈意愿,只有这样,你才能得到面试官的青睐。
(4)文化匹配性
这通常是与行为面试结合在一起考察的,这主要考察你是否符合公司的价值观。例如,Facebook鼓励黑客似的文化,鼓励员工大胆尝试新想法,并通过试验对想法进行测试,而不是害怕打破陈规,也就是所谓的“Move fast and break things”。Airbnb希望创造一个让人们在任何地方都能找到归属感的世界,所以他们通常会寻找那些具有良好好客技能的人才。
很多大型科技公司都非常重视企业文化,并根据应聘者是否符合公司价值观来决定是否录用他们。如果你在这样的一家公司里面试,你需要想办法了解这家公司的价值观,并找到你自己那些与公司文化相契合的过往经历,并向面试官展示出这一点,这一点非常重要。
(5)结对编程
一种非常有趣的面试类型是,让你和另外一位工程师在一个设置好的编程环境中结对编程,这和实际工作场景非常类似。你会被分配一个基本的任务,任务中列出了你必须完成的一系列需求列表。在你完成每一个任务后,面试官会要求你实施更多的功能,直到到了规定的时间为止。在这个过程中,你可以自由使用你想使用的任何资源,如Stack Overflow或在线文档。
我发现,在这样的面试中,很多候选人能否通过考察主要依赖于他们真实世界的开发经验。与白板面试不同,在这类面试中需要你写出语法正确的代码,因此你应该彻底了解你的编程语言和环境,因为你肯定不希望在编程面试过程中花太多时间去在网上或文档里搜索答案。
在我之前的工作中,在我在做一项任务时,我会写干净的代码,然后等我觉得任务完成之后再进行优化。这种工作方式对这种类型的面试是不利的。
(6)发现并修复Bug
作为工程师,我们所做的很多工作都是围绕着找到和修复那些我们从不同渠道搜集到的bug。在这类面试中,你会得到一个需要你去找到和修复的bug列表,在这个过程中,你还需要识别其他可能存在问题的代码。
我自己只经历过一次这样的面试,我觉得这类面试真的很难让人做好准备,特别对那些经验所有欠缺的初级工程师更是如此。每个编码环境都有各自的小怪癖和细微差别,我所做的很多bug修复工作都来自于以前的IDE(集成开发环境)的经验以及我在过去多年时间里积累的相关框架。
(7)考察专业领域知识
在我们今天看到的大多数通用语言中,编程基本上是相同的。如果你知道一种编程语言的面向对象编程,那么这些技能多半能够转移到另一种编程语言里。但是,这类面试的考察技是不能在语言或框架之间相互转换的。面试官将会在特定的环境下考察你在有关API、内存管理、功能和局限等专业领域知识的掌握情况。
对于这类主题的面试,练习是很具挑战性的。和上文中说过的发现并修复bug面试类似,我觉得这类面试问题的答案大都来自于过往的经验。根据你所申请的职位的级别的不同,面试官评估你的答案的标准会有所不同。例如,如果你申请的是一个初级职位,不知道为什么一个API的结构是特定的,那么面试官会在这方面做出让步,不会对你要求太高。然而,如果你申请的是一个高级职位,面试官对你的要求会更高,这时如果你不知道这个问题的答案的话,这就会给面试官留下非常不好的印象。
(8)对操作系统的了解
根据你所应聘的职位或团队的不同,你可能会有一个专门的操作系统方面的面试。在这个面试中,你会被问到一些问题,面试官通过这些问题对你对计算机操作系统机制的理解进行评估。说实话,这个面试有点让我措手不及。操作系统是我早年在大学里学过的东西,但是后来慢慢都淡忘了。
(四)你该如何准备?
正如我在上文中说的那样,面试本身其实就是一种技能。即使你在日常工作中已经是一名优秀的程序员,或者在你在学校的成绩非常优异,但是在面试会议室里,你的这些技能并不能按1:1的比例方式转化为面试技能。坚持、重复地做面试准备和练习将在很大程度上决定你的面试结果。
(1)至少需要掌握这些知识
如果有人问我,我觉得应该关注哪些方面,我建议以下几点:
-
首先学习在纸上和白板上手写代码,然后把它放到一个IDE(集成开发环境)中,以便语法高亮显示,这应该成为你的第二天性。
-
对数据结构要有深入的了解,包括他们的长处和弱点。
-
完全理解大O符号的时间和空间复杂性,这将与你的算法和排序问题完美地配对。
-
掌握所有主要的排序算法,因为时间和空间的复杂性有可能破坏你想要解决的算法的最佳解决方案。
(2)何时开始
根据你自己的时间表,越早开始越好。我面试过的很多公司都有一个12个月的冷却期,面试未通过的应聘者需要等到12个月后才能重新申请公司的职位。反过来说,如果你知道你无法在一年时间内准备好这个面试,,你不妨现在开始这个面试流程,大概感受一下面试流程具体是怎样的,到时真正面试的时候就不会那么害怕了。