技术面试别扯智力题

捍卫技术面试

有句话是这么说的”面试造火箭,入职拧螺丝”。

对于一名开发者而言,我相信很多开发者在求职面试过程中并不会有机会现场进行代码编写,在一些公司里,技术面试已变成“测试智商”,比如谷歌微软等一起知名外企就曾出一些脑经急转弯类题目,或者考查求职者一些很难的、但是在实际工作中用不上的算法题。那么,这样的高逼格、高标准的技术面试真的能选择优秀人才吗?

回答这个问题之前,我们先来看企业为什么要出这些复杂的智力题,因为面试很困难,技术面试更加困难,仅仅只用不到一小时时间是很难考察出面试者的水平的。因为求职者的经历是可以美化和造假的。

通常来说,开发类技术面试中的问题大致可以分为 5 类,算法和数据结构只是其中一小类:

  • 编码:考察面试者的编码能力,一般要求面试者在 20 ~ 30 分钟之内编写一段需求明确的小程序。
  • 设计:考察面试者的设计/表达能力,一般要求面试者在 30 分钟左右内给出一个系统的大致设计。
  • 项目:考察面试者的设计/表达能力以及其简历的真实度。
  • 脑筋急转弯:考察面试者的”反应/智力”。
  • 查漏:考察面试者对某种技术的熟练度。

那些奇葩的智力测试题

很多年前一些书籍和电影会把谷歌微软等外企的技术面试描绘的非常有逼格,比如问一些“井盖为什么是圆的”之类的问题,类似的题目如下:

一辆校车能装下多少个高尔夫球?

如果让你清洗西雅图市所有的窗户,你会对此索价多少?

在一个重男轻女的国家里,每家每户都想生男孩。若一户人家生了一个女孩,便会再生一个,直到生下的是男孩为止。请问这个国家的男女比例是多少?

等等……

谷歌公司后来也承认这些臭名昭著的智力题对其招聘毫无用处,因为它无法判定面试者的真实能力。

复杂的算法题

虽然很少有求职者会被问一些脑筋急转弯类题目,但是在技术面试环节里,算法题目是绝对逃不掉的,例如谷歌、腾讯、百度、微软等都会问一些算法题目,例如:

给你一个长度为n的数组,其中只有一个数字出现了奇数次,其他均出现偶数次,问如何使用优秀的时空复杂度快速找到这个数字。

给你两颗二叉搜索树,如何使用线性的时间复杂度,将它们合并成一颗二叉搜索树。

等等,面试算法题目倾向于考察一些基础数据结构与算法。

算法

  • 排序算法:快速排序、归并排序、计数排序
  • 搜索算法:回溯、递归、剪枝技巧
  • 图论:最短路、最小生成树、网络流建模
  • 动态规划:背包问题、最长子序列、计数问题
  • 基础技巧:分治、倍增、二分、贪心

数据结构

  • 数组与链表:单/双向链表、跳舞链2.栈与队列
  • 树与图:最近公共祖先、并查集4.哈希表
  • 堆:大/小根堆、可并堆
  • 字符串:字典树、后缀树

面试官考察这些数据结构和算法题目的优点是显而易见的,首先,考察面试者的基本功是否扎实,因为一个科班学生上面这些知识点肯定会学过的。如果你是一个半路转行的求职者或者刚刚参加完一些编程培训班,相信这些题目肯定对你有一些难度。因此这批人很容易就被过滤掉。

不过现在很多求职者都倾向于在面试前刷 LeetCode,Leetcode 这个网站上的题都是一些经典的公司用来面试应聘者的面试题,很多人通过刷这些题来应聘一些喜欢面试算法的公司,比如:Google、微软、Facebook、Amazon之类的这些公司 。

编码能力

最令面试者头痛是编码类问题——因为几乎所有的当面技术面试均要求面试者在白板上写出代码,而不是在面试者熟悉的 IDE 或是编辑器中写出。很多面试者肯定抱怨过:“如果能在计算机上编程,我早就把它搞定了!”

很多面试者希望能够在 IDE 中(而不是白板上)编写代码,因为:

  • 一些主流 IDE 均带有智能提示,大大提升了编码速度
  • IDE 可以保证程序能够编译通过
  • 可以通过 IDE 运行/调试代码,找到程序的 Bug

白板编程的目标并不是要求面试者一下子写出完美无缺的代码,而是让面试者在解题的过程中将求职者的思维过程和编码习惯展现在面试官面前,以便面试官判定面试者是否具备清晰的逻辑思维和良好的编程素养。但是这种情况只适合在特定的地方,比如在一个小小的会议室内。如今笔记本电脑和屏幕共享无处不在。编写程序的自然方式是在编辑器中,在键盘上,使用搜索引擎和编译器来帮助您。视频通话面试允许候选人使用自己的工具在家中使用自己的计算机进行编程。不论是白板编程还是 IDE 写代码都是考察求职者的一种方式,不过很多程序员其实并不善于言谈,要求其在白板写下代码会令其很紧张,从而无法完成任务,但是这能说明其不能胜任工作吗?

项目经历

在求职过程中,面试官通常会问求职者此前的一些项目经历和在项目过程中所担任的角色,使用的一些技术,以及为什么采用这类技术,它的优势是什么?遇到了哪些问题,是如何解决的。通过这一系列问题,可以有效的判断求职者的项目经历是否有水分,以及在项目过程中遇到问题解决问题的思路。

面试官应该避免什么

避免人口调查式收集求职者信息 这个主要是针对国内一些公司,在求职者还未进行面试之前就做人口调查式的收集求职者相关信息,例如家庭成员、职业、电话。这让很多求职者非常反感,事实上一些基本的信息求职者的简历都已经提供了,根本无需再次现场重复填写一遍。

避免“机器人面试”与自动评估。很多公司会简单电话面试,然后就扔一个在线的评估系统来要求求职者去实现类似”家庭作业”似的任务,然后系统根据标准答案自动评估,因为这样可以节省成本,但是我相信高级工程师会拒绝做这种面试。

避免白板面试。虽然多年前可以理解,毕竟以前网络和技术不够先进,但现在笔记本电脑和屏幕共享无处不在。编写程序的自然方式是在编辑器中,在键盘上,使用搜索引擎和编译器来帮助您。视频通话采访允许候选人使用自己的工具在家中使用自己的计算机进行编程。不过当在一个小小的会议室里时,要求某人用胖记号笔写代码是非常可取的。

避免全天采访。许多公司希望对开发人员的采访需要一整天,通常需要5到8次单独面试。这使得已经有工作的开发人员很难参加。而通过远程面试,可以很好的解决这个问题。

避免大规模的“家庭作业”。有些公司要求面试者在面试时间之外去实现一些系统的设计或服务搭建,这是不尊重人们的时间,许多人会拒绝这样做。

技术面试应该如何做

首先,如上文说说,要尊重面试者的时间,合理与面试者沟通面试时间、地点、注意事项、避免迟到。

其次,要确认自己需要找什么样的人才,需要他完成什么样的工作,不同岗位的要求肯定是不一样的,面试一个岗位应该根据实际的岗位需求来进行考察求职者的相关软硬件指标是否满足该岗位的需求,而不是千篇一律的统一标准化面试。这样很难招聘到满意的人才,例如你要招聘一名运维人员,不应该把考察其算法掌握的如何作为重点,而是应该考察其运维相关技术栈和处理故障的能力(包括操作系统原理和相关服务原理的理解是否透彻为主)以及面试者此前的工作经历是否与本岗位相符合,它此前工作中遇到的哪些复杂问题是如何解决的。而不是为了体现公司的逼格,想出一系列很难让人理解和解答的抖机灵的智力题,毕竟大部分岗位招聘都是为了找到满意的能够解决实际业务问题的人才而不是寻找科学家。

事实上,现在很多外企都在重新设计面试流程,例如微软,微软完全改变了面试软件开发人员的方式,以确保候选人具备完成工作的实际技能。微软使用‘替代面试框架’,在新流程下,微软会提前分享面试问题,以便考生做好准备。 在面试过程中,候选人可能会遇到团队试图解决的真实场景或问题。

此前,微软和其他地方的面试可能具有很强的技术性 - 比如“反向链接列表” ,并且包括数学游戏,比如要求候选人弄清楚有多少乒乓球会填满747,但是这两类问题确实很少与员工实际上每天在工作中做的事情有关 。

在新框架中更具包容性,通过更多地依靠寻找真正问题的解决方案,而不是依靠深奥或深入的技术知识,对于那些不是来自传统技术行业背景的人来说,更容易发光。 微软还致力于确保采访者能够反映公司多元化的员工队伍。

求职者应该如何准备

面试者可以通过创建 GitHub 账号,阅读一些技术书籍,建立技术影响力,例如参与一些大型知名的开源项目并贡献自己的代码,写技术博客等等从而提供给面试官真实,明确,可度量的经历。

其次要有扎实的基本功,对于工作中会经常使用到的算法和数据接口一定要多去看多去练。对于面试岗位所需要的技能一定要多去巩固,例如面试一名 Java 工程师,你必须掌握一些 Java 基础知识,例如对基本的数据类型、泛型、多态、OOP 等基础知识点的掌握以及一些常见框架和中间件的原理和使用并能通过所学知识解决实际的问题。

刷题没有问题,但是要避免成为应试机器,避免把题目背下来,虽然有可能通过面试,但是在实际工作中可能会变成一个水货。

不要试图在简历上造假,可以适当美化你的简历,但是一定不能造假,造假是不可饶恕的,包括学历造假和经历造假。