怎么通过Facebook面试

2018年07月17日 次阅读 0 条评论 0 人点赞

在这篇文章中,我们将分享一位刚刚在硅谷各大科技公司完成了七次现场面试, 最终接受了 Facebook 的软件工程师实践经验,以及其面试前所做的一套完善的准备工作,希望可以给予大家前往 BAT

同一个面试问题并非只有一个答案,而同一个答案并不是在任何面试场合都有效。对于应聘者而言,虽然不同的公司具有不同的产品形态,但各大公司相同的职位都需要具备大同小异的基本工作技能。

在这篇文章中,我们将分享一位刚刚在硅谷各大科技公司完成了七次现场面试, 最终接受了 Facebook 的软件工程师实践经验,以及其面试前所做的一套完善的准备工作,希望可以给予大家前往 BAT 的路上一些借鉴。

 

图片来源:视觉中国

多年的硅谷之梦

当我在澳大利亚大学攻读计算机科学时,我总是将自己的未来想象成为硅谷的一名软件工程师。

我喜欢科技行业中所有创新的核心理念,即时它是错误的,我也喜欢。于是,最初的梦想让我有了不断前进的动力,且可以让我静下心来专注学习。

毕业之后,我在一家位于墨尔本的著名公司担任 iOS 工程师,然后为了更好的发展回到家乡静修,开始准备硅谷科技公司的面试。我知道这条路充满无限的挑战,也是非常困难和艰巨的。接下来,本文将基于应聘者的角度深度探讨不同类型的面试实践及经验。

面试是一项技能

在我准备的过程中,我一直明白面试会很有挑战性。但是我也很难去想象,第一次面试究竟会有多难。

在面试之前,我使用了一些免费以及付费的服务,比如,通过模拟电话面试以及上机编码操作、与有经验的求职者进行电话面试。那些练习面试对我来说非常重要,但是我后来也意识到,它们也只占了真正面试环节中的一小部分。

不同类型的面试经验

如果你在初步的电话面试过程中做好充分的准备并发挥正常,那么顺其自然地将会有下一轮的现场面试。通常而言,现场面试会持续 4-6 个小时,不过还是需要根据具体的公司来看。

我在硅谷各大科技公司,一共有七场现场面试。这也使得我对面试有了自己的一个看法及经验。

通常,现场面试会涵盖三个主要内容:算法、架构设计和个人生活。但是,如今也有很多公司在扩大面试内容的范围,涵盖了更多的实用技能。下面,将简单介绍一下我面试中所遇到的内容。

算法面试

软件工程师的面试,算法是最常见的面试内容。面试官会要求你在白纸或上机进行操作,解决所提出的问题,以评估你对数据结构、排序算法、递归、时间/空间复杂性分析以及模式和边缘案例识别的了解。在这次面试中,你可以提出一个强力的解决方案,然后尝试改进这个解决方案,并讨论你提出的不同解决方案(如果有的话)的权衡。

对于这个问题,我在面试之前做了充分的准备,我解决了算法问题,分析了其空间/时间的复杂性,以及试图了解每行代码所起的作用。

就个人而言,我真的很喜欢白板面试,因为我不必担心编写可编译的语法(大部分时间),这样我只用关心手头上已有的问题。其他人可能不大喜欢白板面试,但对他们来说,我会比较建议,一贯地去实践,肯定会有好处。

架构设计面试

这是一个有趣的面试过程,而我却低估了这个面试的难度。首先面试官会要求你设计一个系统(当然是在白板上),如停车场售票系统、聊天系统、推特反馈系统以及其他常见的系统。

首先需要评估如何采取广泛的概念,并设计一个满足所有要求及限制的系统。但是面试者应该提出正确且精准地问题,来确定面试官的要求和限制。本次面试中,我所做的是绘画一些图表和描述一些重要的结构。一切都是比较高级,但无需写任何实际性的实现代码。

当然,你也可以应该引导对话来涵盖系统的具体内容。如果你是后端工程师,除非你在该领域拥有一些以前的专业知识,否则不会真正地了解客户端应用程序的细节。我是一名 iOS 工程师,所以我谈到了架构模式、功能模块化、设计模式,而不是如何扩展 API 终端、添加工作者模块、AWS 等等。

个人日常面试

面试官会询问一些关于你个人的问题,以及如何处理某些不同的情况。这一方面的准备工作不会像其他专业性问题那么困难,但却需要你审视一下自己。

这些问题通常包括以下几个方面:

  • 你如何处理失败?

  • 你最大的弱点是什么?

  • 你如何解决冲突?

  • 你将做点什么不同的?

个人觉得,这个问题并非难以回答。但是我也曾听到很多人这样做,他们试图把自己的长处伪装成弱点,设计成面试官想要听到的内容,甚至把失败的项目归咎于别人。如:

  • 我的弱点是我太专注了;

  • 这是 Jerry 的错,他对这个项目的一直抱着消极的态度。

其实,这样回答很容易就会让自己出局。只要真正地表现出对工作的热情,展现一定的缺点也没关系,但是要表现出改进的主动性,那么结局就会完全不一样。

文化匹配

这通常与个人行为面试相配对,面试官会因此着重于检测你是否与公司的价值观相一致。 比如说,Facebook 遵循黑客般的文化、大胆运用新思路、通过实践来判断,而不是害怕这样或那样,拘束着自己。 而 Airbnb 希望创造一个让人感觉自己属于他们的世界,所以他们寻找的是热情、积极向上的人。许多大型科技公司都非常重视文化,并以人的价值观为基础聘用人才。 如果你在其中一家公司面试,也需要理清自己的价值观,并找到能够与面试官沟通和交流的过往经验。

配对编程

在面试过程中,一个有趣的现象是,你将在另一位面试官工程师面前在电脑上设置好开发环境,就像你日常编程一番。然后你会得到一个基本的任务清单,在完成每个任务之后,面试官会继续要求你完成更多的功能,除非面试时间到点。此外,你也可以自由使用任何你想要的资源,例如 Stack Overflow 或联机文档。

我觉得很多面试者在这次面试中的成功将取决于日常积累的经验。与白板面试不同,这个时候会编写正确的语法代码是必备的技能。因此,你应该了解自己的开发语言及环境,毕竟面试过程中也不能在网上或联机文档中花费太长的时间去找答案。

在我以前的工作中,我一般习惯于编写干净的代码,然后在完成之后再进行优化。这种工作流程并不利于这次的面试。因为我优化地太过早期,无意中将自己逼到一个边缘,后期想要继续提升代码质量,也显得比较困难。事实上,我发现,首先写一些不好的代码,然后再向面试官提出我在设计过程中优化的一些想法,这比直接写干净和优秀的代码更好。

查找和修复 Bug

作为技术工程师,我们的很多工作都是以查找和修复 Bug 为中心。在这次面试中,我得到面试官提出的一段错误代码,然后他让我查找和修复 Bug、以及检查代码中是否有其他问题。

我在之前准备面试的时候,只看到过这样一个案例,因此我觉得要真正做好准备是非常困难的。每一个编码环境都有自己的特点和细微差别,我曾有的查找和修复 Bug 经验都是从 IDE(集成开发环境) 和多年积累的架构经验中得来的。

测试领域知识

在我们今天看到的大多数通用语言中,编程思想基本上是大同小异的。 如果你知道一种语言的面向对象程序设计思想,那么这些技巧大多会适用于另一种语言。不过,本次面试的重点并不是在语言或架构的切换层面,而是有关 API、内存管理、功能、约束等环境特性的问题。

对于这块内容的考察,与之前的查找和修复 Bug 相类似,都是需要平时经验积累。同时,根据你所申请的职位不同,面试官也会酌情考虑。例如,你申请的职位是一个初级工程师职位,而你不知道为什么要以特定的方式去构建 API,面试官也许宽容一下,对于这个问题的回答并不是那么看重;但是如果你申请的是高级工程师的职位,若不知晓这个问题的答案,他们也许会直接将你 pass。

了解操作系统

根据面试的职位或者团队,你可能会有一个有关于操作系统的面试。在这次面试中,可能会被问到如何理解计算机操作系统底层机制。说实话,这个问题让我当头一棒。因为操作系统是我在大学时期学的内容,如今有关这方面的知识早已模糊不清,所以面试中表现自然也不好。

如何做准备?

正如我之前写的,面试是一种技巧。即使你在日常工作中已经是一名优秀的程序员,或者在学习中已经取得了很高的成绩,但是当你身处面试室中,很多技能并不能 1:1 地被展现出来。持续性、重复性以及与面试准备和练习的一致性将是决定结果的关键因素。

浓缩知识

如果有人问我,首先应该关注哪些领域,我的建议如下:

  • 无论是在纸上还是在电脑上,首先要学会自己亲手写代码。然后将代码放到 IDE 中进行语法高亮显示,这样养成习惯。

  • 深入了解数据结构,无论是它的优点还是缺点,并学会进行相互比较。我发现从零开始编写数据结构及其实现的功能,会比单单了解抽象的概念学到的更多。

  • 完全理解时间和空间复杂性的大 O 符号(大 O 符号表示用于描述函数渐进行为的数学符号),这将完美配对你的算法和排序问题。

  • 掌握所有重要的排序算法,因为时间/空间复杂性的差异有可能导致你在试图寻找的算法的最佳解决方案脱轨。

何时开始去面试

根据自身的时间安排,也许你会想要尽快地面试。但在我面试的很多公司中,他们会对于一位已经失败的面试者有一个 12 月的冷却期,12 个月之后他们才会重新筛选失败者的简历。另一方面,如果一年之内你依然没有准备好,那么现在也可以去尝试面试,体验面试的过程,这样当你准备好之后,那就没什么可担心的了。

参考资料

模拟采访流程

  • interviewing.io 网站(测试版),免费:https://interviewing.io/

  • Pramp 网站,免费:https://www.pramp.com/#/

  • CareerCup,付费:https://careercup.com/interview

算法

  • 书籍——《Cracking the Code Interview》:https://www.amazon.com/Cracking-Coding-Interview-Programming-Questions/dp/0984782850

  • 网站结合 YouTube 视频——byte by byte:http://www.byte-by-byte.com

  • YouTube 视频——CS50: https://www.youtube.com/user/cs50tv

  • Interview Cake:https://www.interviewcake.com

  • HackerRank:https://www.hackerrank.com

  • LeetCode:https://leetcode.com

操作系统

  • 《Operating System Concepts》书籍推荐:https://www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/1118063333

架构设计

  • 架构和系统设计视频推荐:https://www.youtube.com/watch?v=ZgdS0EUmn70

面试行为举止技能

  • 面试时举止注意事项:https://www.youtube.com/watch?v=PJKYqLP6MRE

原文:https://medium.freecodecamp.org/software-engineering-interviews-744380f4f2af

作者:Andyy Hope

责编:苏宓

由Cavien发布

没有天生的高手,更没有永远的菜鸟

文章评论(0)