技术面试别扯智力题!
作者 | 阿文
责编 | 伍杏玲
出品 | 程序人生(ID:coder_life)
所谓“面试造火箭,入职拧螺丝”。
对于一名开发者而言,我相信很多开发者在求职面试过程中并不会有机会现场进行代码编写。甚至在一些公司里,技术面试已变成“测试智商”,比如谷歌微软等知名外企曾出过一些脑筋急转弯类的题目,还有是考查程序员一些很难的、但是在实际工作中用不上的算法题。
说实话,这样的“高逼格”“高标准”的技术面试真的能选择出优秀人才吗?
回答这个问题之前,我们先来看企业为什么要出这些复杂的智力题?因为仅仅用不到一小时是很难考察出面试者的水平,毕竟求职者的经历是可以美化和造假的。
通常来说,开发类技术面试中的问题大致可以分为 5 类,算法和数据结构只是其中一小类:
编码:考察面试者的编码能力,一般要求面试者在 20 ~ 30 分钟之内编写一段需求明确的小程序。
设计:考察面试者的设计和表达能力,一般要求面试者在 30 分钟左右内给出一个系统的大致设计。
项目:考察面试者的设计和表达能力以及其简历的真实度。
脑筋急转弯:考察面试者的“反应和智力”。
查漏:考察面试者对某种技术的熟练度。
那些奇葩的智力测试题
很多年前一些书籍和电影会把谷歌微软等外企的技术面试说得很“高大上”,比如问“井盖为什么是圆的”之类的问题,还有:
一辆校车能装下多少个高尔夫球?
如果让你清洗西雅图市所有的窗户,你会对此索价多少?
在一个重男轻女的国家里,每家每户都想生男孩。若一户人家生了一个女孩,便会再生一个,直到生下的是男孩为止。请问这个国家的男女比例是多少?
后来谷歌也承认这些臭名昭著的智力题对其招聘毫无用处,因为它无法判定面试者的真实能力。
复杂的算法题
虽然很少有求职者会被问脑筋急转弯类题目,但是在技术面试环节里,算法题目是绝对逃不掉的,例如谷歌、腾讯、百度、微软等都会问一些算法题目,例如:
一个长度为n的数组,其中只有一个数字出现了奇数次,其他均出现偶数次,问如何使用优秀的时空复杂度快速找到这个数字。
两棵二叉搜索树如何使用线性的时间复杂度,将它们合并成一棵二叉搜索树。
还有一些算法题目倾向于考察基础数据结构与算法:排序算法、搜索算法、图论、动态规划、基础技巧、数组与链表、树与图、堆、字符串等等。
面试官考察这些题目的优点是显而易见的:首先,考察面试者的基本功是否扎实,科班学生肯定学过这些知识点。如果你是一个半路转行的求职者或者刚刚参加完编程培训班,这些题目可能对你来说有一些难度。因此这批人很容易就被过滤掉。
不过现在很多求职者都会在面试前刷 LeetCode,这个网站上的题都是一些经典的公司用来面试应聘者的面试题,很多人通过刷这些题来应聘一些喜欢面试算法的大公司。
白板编程考察代码能力?
其实,最令面试者头痛是编码类问题,因为几乎所有的当面技术面试均要求面试者在白板上写出代码,而不是在面试者熟悉的 IDE 或是编辑器中写出。
很多面试者肯定抱怨过:“如果能在计算机上编程,我早就把它搞定了!”这是因为大家平常太依赖开发工作了,导致白板编程时脑里一片空白。
面试官考察白板编程,并不是让面试者一下子写出 0 Bug的代码,而是想看下求职者的思考过程和编码习惯是否清晰。
不仅是现场写代码,在视频面试时,有面试官也会让候选人在视频的那边进行编程。其实不管是白板编程还是 IDE 写代码知识考察求职者的一种方式。事实上,很多程序员不善于言谈,如果要求其在白板写下代码会令其很紧张。然后无法完成题目,难道这就说明其不能胜任工作吗?
项目经历
在求职过程中,面试官通常会问求职者此前的一些项目经历和在项目过程中所担任的角色,使用的一些技术,以及为什么采用这类技术,它的优势是什么?遇到了哪些问题,是如何解决的。
通过这一系列问题,可以有效的判断求职者的项目经历是否有水分,以及在项目过程中遇到问题解决问题的思路。
面试官应该避免什么
1、避免人口调查式收集求职者信息
这个主要是针对国内一些公司,在求职者还未进行面试之前就做人口调查式的收集求职者相关信息,例如家庭成员、职业、电话。这让很多求职者非常反感,事实上一些基本的信息求职者的简历都已经提供了,根本无需再次现场重复填写一遍。
2、避免“机器人面试”与自动评估
很多公司会简单电话面试,然后就扔一个在线的评估系统来要求求职者去实现类似“家庭作业”似的任务,然后系统根据标准答案自动评估。因为这样可以节省成本,但我觉得有些高级工程师会拒绝做这种面试。
3、避免白板面试
上文已详细分析。
4、避免全天采访
许多公司一面试就一整天,面试甚至多达 5 到 8 次,这让请假来面试的求职者很难参加。而通过远程面试,可以很好地解决这个问题。
5、避免大规模的“家庭作业”
有些公司要求面试者在面试时间之外去实现一些系统的设计或服务搭建,这是不尊重人们的时间。
技术面试应该如何做
首先,要尊重面试者的时间,合理与面试者沟通面试时间、地点、注意事项、避免迟到。
其次,要确认自己需要找什么样的人才,需要他完成什么样的工作。
不同岗位的要求肯定是不一样的,应该根据岗位的实际需求来考察求职者是否适合,而不是千篇一律用统一标准化来面试,这样的话就很难招聘到满意的人才。
例如你要招聘一名运维人员,不应该把考察其算法作为重点,而是应该考察其运维相关技术栈和处理故障的能力(包括操作系统原理和相关服务原理的理解是否透彻为主)以及面试者的工作经历是否与本岗位相符合,他在工作中遇到的复杂问题是如何解决的。
而不是为了体现公司的高大上,想出一系列很难让人理解和解答的智力题,毕竟大部分岗位招聘都是为了找到满意的能够解决实际业务问题的人才而不是寻找科学家。
事实上,现在很多外企都在重新设计面试流程,例如微软,微软完全改变了面试软件开发人员的方式,以确保候选人具备完成工作的实际技能。微软使用“替代面试框架”,在新流程下,微软会提前分享面试问题,以便考生做好准备。在面试过程中,候选人可能会遇到团队试图解决的真实场景或问题。
此前微软的面试可能具有很强的技术性,比如反向链接列表 ,并且包括数学游戏,比如要求候选人弄清楚有多少乒乓球会填满747,但是这两类问题很少与员工实际上每天在工作中做的事情有关 。
在新框架中更具包容性,通过更多地依靠寻找真正问题的解决方案,而不是依靠深奥或深入的技术知识,对于那些不是来自传统技术行业背景的人来说,更容易发光。微软还致力于确保采访者能够反映公司多元化的员工队伍。
求职者应该如何准备
首先,在平常大家可以通过创建 GitHub 账号,阅读一些技术书籍,建立技术影响力,例如参与一些大型知名的开源项目并贡献自己的代码,写技术博客等,这样面试时可以提供给面试官真实、明确、可度量的经历。
其次要有扎实的基本功,对于工作中会经常使用到的算法和数据接口一定要多去看多去练。对于面试岗位所需要的技能一定要多去巩固,例如面试一名 Java 工程师,你必须掌握一些 Java 基础知识,例如对基本的数据类型、泛型、多态、OOP 等基础知识点的掌握以及一些常见框架和中间件的原理和使用,并能通过所学知识解决实际的问题。
刷题没有问题,但是要避免成为应试机器,避免把题目背下来,虽然有可能通过面试,但是在实际工作中可能会变成一个水货。
不要试图在简历上造假,可以适当美化你的简历,但是一定不能造假,造假是不可饶恕的,包括学历造假和经历造假。
参考:
In defence of the technical interview
作者简介:阿文,网易云担任高级工程师,在边缘计算、云计算领域有多年的从业经历,曾担任过讲师,主讲思科路由交换技术。个人博客地址:https://awen.me
热 文 推 荐