首页博客必修课如何面试软件工程师?

如何面试软件工程师?

必修课2018-08-10

​如何面试软件工程师?这确实是个值得回答的问题。

1. 确定你要找的员工需要具备哪些技能

并没有一套技能标准来定义一个好的程序员。没有哪个工程师能够擅长这所有领域的技能。那么,进行一个好的面试的第一步就是要确定应聘者需要具备哪些技能。建议HR问下面几个问题。

 

你需要一个能够快速迭代的程序员,还是细心严谨的程序员?

你想要有人来解决技术问题,还是构建产品?

你是否需要一个拥有某个特定技术技能的程序员,还是一个聪明的、能够在工作中学习的程序员?

理论计算机科学、数学、算法能力是重要的还是无关紧要的?

理解并发、C内存模型、HTTP是否重要?

 

这些问题没有正确的答案,但是那些成功的公司对这些问题都会有正反两个不同的答案。

2. 让问的问题尽可能地接近真实的工作

面试中问的问题应尽可能地接近应聘者应聘的那个职位(或者你想要衡量的技能)。

 

例如,如果你关心的是后端编程,可以让应聘者构建一个简单的API并添加功能,而不是要求他们解决BFS字链问题。如果你关心算法方面的能力,可以让应聘者通过使用算法来解决问题(比如,用BST和hashmap来构建一个简单的搜索索引,以提高删除操作的性能),而不是要求他们确定一个点是否包含在一个凹多边形中。你可以让应聘者在白板上解决一个小问题,也可以让他们用真实代码来调试程序。

面试过程中问的问题应该要能反映实际的工作。这些问题不应该受外部的依赖,这很重要。例如,要求应聘者用Ruby编写一个简单的网络爬虫看起来就是一个不错的实际问题。然而,如果应聘者需要安装Nokogiri(一个Ruby解析库,安装起来可能会很痛苦),并且最终用了30分钟的时间来配置本地扩展,那么这将成为一个可怕的面试。不仅浪费了时间,而且对应聘者的压力也已经过去了。

3. 问那种不能放弃的并且包含多个部分的问题

对于面试中要问的问题,有另外一个很好的经验法则,那就是要避免可以“放弃”的问题,例如,避免出现应聘者可以提前在Glassdoo上搜索到相关信息的问题,以防止他们不用动脑子就可以回答出来。

 

举个例子,让应聘者在终端上实现Connect Four游戏(有一系列的步骤)可能比要求应聘者旋转一个矩阵(单单一个步骤)来得更好。而实现k均值聚类(互相依赖的多个操作)可能比确定直方图中最大的矩形来得更好。

 

4. 避免太难的问题

如果一个应聘者顺利解答了一个非常困难的问题,那么这相当于告诉了你很多有关他的技能方面的事情。但是,由于问题很难,大多数应聘者都不能很好的解答。那么期望从这个问题获得的信息的多少,就会受到这个问题的难度大小的影响。我们发现,最优的难度要比大多数面试官估计的难度要小得多。

 

举个例子,要求应聘者创建一个简单的命令行界面,其命令用于存储和检索键值对(如果他们完成的很好的话,可以添加一些功能)可能比要求应聘者实现算术表达式的解析器更好。而涉及到最常见的数据结构(列表、散列、树)的问题可能比有关跳转表、树堆或其他更模糊的数据结构的问题更好。

 

5. 对每个应聘者问同样的问题

面试就是对应聘者进行比较。目标是将应聘者分为能或者不能为公司做出贡献的两类人员(如果只是为单个职位雇用人员,则选择最适合的人)。正因为这样,向不同的应聘者提不同的问题是没有道理的。如果你以不同的方式评估应聘同一工作的不同应聘者,就会引入杂音。

我认为,人们之所以继续以一种随意的方式选择问题,是因为面试官喜欢这样。技术公司的工程师通常不喜欢面试。他们只是偶尔做这种事情,同时,这也让他们脱离了自己的主业。为了规范对每个应聘者所问的问题,面试官需要花更多的时间来学习这些问题,并讨论得分和答案。每当问题改变时,他们都需要重新再来一遍。另外,总是问同样的问题的确有那么一点点乏味。

6. 考虑使用多套面试题

在设计面试题时,第一步要考虑的是有关技能方面的事情。然而,某些答案可能会互相之间冲突!

 

例如,你可能需要招聘几个遵守规则的工程师,但同时又要招几个非常有创造性的工程师(甚至可能是相同的角色),这都是非常正常的。在这种情况下,应当考虑准备多套面试题。并且,关键问题是,你应该准备足够多的题目来标准化每套试题。这就是我们在Triplebyte公司所做的事情。你可以简单地询问每个应聘者他们喜欢哪种类型的面试。

 

7. 不要让自己因为证书而产生偏见

证书并不是毫无意义。从麻省理工学院或斯坦福大学毕业、或者在Google和苹果工作过的工程师,从整体上来说比其他那些没有这些经历的工程师表现的要更好一些。但问题是,绝大多数的工程师都没有这些经历。所以如果一家公司太依赖于这些,那么他们会错失绝大多数的技术人员。在筛选步骤中给予证书一定的重视程度并不是完全不合理。

然而,让证书来左右最终面试的决定没有任何意义,而且我们有数据可以证明这种情况。拥有顶尖大学学位的应聘者的面试通过率比没有名牌大学学位的候选者高出30%。如果面试官知道应聘者拥有麻省理工学院学位的话,他们更愿意在面试中宽恕应聘者的错误。

这是一种杂音,你应该要避免。最简单的方法就是在把简历提交给面试官之前将学校和公司名称去掉。有些应聘者可能会提到他们的学校或公司,但我们在面试时并不知道应聘者的背景,而应聘者在技术评估时很少会提及这些。

8. 避免欺负应聘者

面试不仅仅是评估一个应聘者的技能,也是一个团队在接纳一个成员。作为一名面试官,当看到应聘者因为一道简单的题目而卡住的时候,心里是沮丧的。你会变得脾气暴躁。当然,这只会增加应聘者的压力。

这就是应该极力避免的东西。解决的办法就是对这个问题进行讨论并对面试官进行培训。一个窍门是,当应聘者表现得实在很差时,面试官可以把评估模式转变为教学模式,评估模式的目标是评估应聘者的技能,而教学模式的目标是让应聘者理解问题的答案。在心理上做出改变会有很大帮助作用。当你处在教学模式时,就没有任何理由去隐瞒信息或是做除了友好以外的其他事情。

9. 根据应聘者具备的最强技能做决策,而不是平均或最小技能

做出是否录用决定的方式是这样的,每个面试应聘者的人坐在一起开会,如果至少有一个人强烈要求录用,而且没有其他人强烈反对,那么最终就会录用。而要让一位面试官强烈的支持他,就是应聘者在面试过程中需要做的事情了。我们的数据显示,最强技能是与面试最相关的属性。然而,要被录用,不能有任何一个面试官发出强烈的反对意见。当应聘者在一个问题上看起来真的很愚蠢的时候,强者的反对意见就会出现。

最好的解决办法是让公司专注于最强技能,并且对那些在面试中表现得不太好的人提供更多的帮助。这就是要寻找强有力的理由来肯定应聘者,而不是担心应聘者薄弱的方面。。当然,技术领域对于公司而言是至关重要的。但更多地关注最强技能可以降低面试的杂音。

 

这九大注意点就是面试官在面试软件工程师的时候应该注意的问题,掌握要点就可以顺利开始面试啦!