今日头条丨一点资讯丨腾讯丨搜狐丨网易丨凤凰丨阿里UC大鱼丨新浪微博丨新浪看点丨百度百家丨博客中国丨趣头条丨腾讯云·云+社区
许多应聘者往往在简单的小事上遭遇滑铁卢,比如主观的假设,没有传达自己的想法,编写的测试用例不佳等等。本文将重点介绍作者在Facebook担任软件工程面试官期间所学到的经验教训。
作者:Ish Baid,Virtually的创始人,前Facebook工程师以下为译文:
去年,我花了无数的时间来面试应聘Facebook的工程师。
作为一名同时拥有面试者和面试官双方经验的人,我想通过本文为大家提供一些帮助。
也许你是一名大学生,正在寻找第一次软件工程的实习机会。也许你已然是一名软件工程师,但你希望跳槽到一家新公司。
或者上面两种情况都不适合你,你从业于其他行业,但希望尝试闯入软件工程的世界。
本文将重点介绍我在Facebook担任软件工程面试官期间所学到的经验教训。
我希望对面试感到迷茫的人们能有所启发。
编程面试的常见形式是长达45分钟的对话,目的是检验你对数据结构和算法的掌握。
大多数公司的实习生应聘者只需要通过编程面试。但是,高级应聘者可能需要经历2-3次编程面试,1-2次系统设计面试以及一次行为面试。
本文只介绍有关编程面试的建议。
最近有人问我:“如果遇到没见过的问题,该怎么办?”
那么我的答案是:“如果是一个精心构思的面试问题,那么你肯定没见过。”
如果你知道面试题的答案,那么面试又有何意义呢?编程面试的目的就是检验你的编程技术力。在Facebook,我们管这个叫做“信号”。
作为面试官,我们的目标是尽可能地获取更多的信号。因此,如果我们发现你听说过我们的题目,那么我们肯定会换题。
我们想了解你在逆境中的表现。
如果恰巧你在“攻克编程面试”的练习题中见过解决方案,那么我们将无法了解你解决问题的能力。
优秀的应聘者必然会从面试中脱颖而出。他们几乎不需要面试官的指导。他们才是面试的主导,而不是面试官。
通常,这些应聘者会自主完成如下这些步骤,面试官几乎不需要给予任何提示:
澄清问题;
分析各种解决方案以及权衡利弊;
使用伪代码计划解决方案;
实现解决方案;
测试。
主导编程面试并不意味着在拿到题目后着急写代码。实际上,在面试的前五分钟内开始编写代码通常是一个非常糟糕的信号。
如果想在面试中有出色的表现,则第一步应该通过提问澄清问题。
通过提问澄清问题
在开始解决问题之前,你需要清楚地理解问题。
有关澄清问题的提问可以为你的成功奠定良好的基础。
如下是一些很好的提问:
是否应该原地进行操作?(不适用额外的内存)
我们可以对输入进行任何假设吗?
我们是否需要考虑性能或节省内存?
在弄清楚这些问题后,你就可以专心解决重要的问题,同时忽略其余细枝末节了。知道应该忽略什么与知道应该关注什么同等重要。
面试者往往会对问题做出一些假设,例如所有整数都是正数,数组不为空,所有输入都是安全的等等,这些都是红色警告。
切忌为了方便解决问题而做一些假设条件。你应该主动提问。
“传递给这个问题的整数是否都是正数?”
如此一个简单的提问即可。如果是,那肯定很好,你不需要额外的检查。如果不是,那么你只需通过一个简单的if语句确保代码的安全。
通常,这样的提问可以为你前进的方向提供重要提示。
面试官喜欢看到应聘者讨论各种解决问题的方法。
这种讨论表明你明白解决问题的方法有很多种,更重要的是,即便你没有明确要求,面试官可能也会给出提示。
虽然我们不能直接给出正确答案,但是如果你提出两个选择,A和B,然后问:“你认为我应该采用哪种方法?”那么我们肯定愿意选择最接近答案的方法。
通常,你需要在白板上完成编程面试。这意味着你无法随意修改你的代码。在编写代码之前,你必须清楚地了解自己的解决方案。
你需要认真思考,并计划好代码。你可以通过伪代码,也可以绘制简单的图形,但是请确保你知道你将要使用什么数据结构,以及需要跟踪什么变量。
你肯定不希望自己最终提供的解决方案像下面这样:
这是每个人都很担心的一步,实际则不然。
实现解决方案应该是最简单的一步。因为你已经通过提问澄清了问题,考虑了各种不同的解决方案,同时还计划好了算法,现在只需写出代码即可。
但是在实现的过程中,切记:
大声交流。如果我不知道你在想什么,那么就很难指引你找到正确的方向。
如果你的方向错了,那么我可以介入。如果你的方向正确,那么我应该什么也不说,让你继续前进。
小贴士:不同的面试官有不同的风格。有些面试官会更加积极主动地介入。
由于某些原因,人们往往最有可能忽略这一步。我想说,在我面试过的人中,如果他们能编写良好的测试,那么98%的人能获得更高的分数。
在面试开始时,应聘者通常都会接到一个面试题和一个简单的测试用例。
在应聘者编写完解决方案后,他们都会运行我们给出的测试用例。但唯一的问题在于,我们只为你提供了最简单的测试用例,其不包含边缘案例,也不具备正确测试代码的能力。
如果你的算法只能针对该测试用例提供正确的输出,那么并不能保证这个算法可以在各种情况下都提供正确的输出。
在编程面试中脱颖而出的最简单方法就是——编写更多测试,编写更难的测试,编写更全面的测试。
通常,即便我不介入,你也可以通过这种方法捕捉到很多bug。这可以为你的表现加分。