本人从第一份实习的时候就开始了技术面试生涯,如今算下来,面试了近十年,面试过的人没有几千,也有几百,作为面试官,分享一下这几年的面试心得。
每个用人者都有不一样的喜好。面试是一场交流,看看两边是否适合彼此。在面试过程中,候选人需要让面试官了解自己对目标职位有吸引力的技能,而面试官的主要目标,就是找出候选人的闪光点,尤其是和职位匹配的闪光点。
对国外的巨头来说,面试流程较为严谨,也稍显死板。六七轮技术面试对不少外企来说都是家常便饭。当然面试流程长达一两个月也不是虚无的传说。
我觉得主要的原因是,大公司薪资高,平台大,候选人挤破头都想去,更多的是企业在选人。所以,他们可以采用标准化作业,面试几轮就是几轮,不多不少,不增不减。面试题哪怕被刷过了也没关系,稍微换个形式,一般刷题的人如果不懂得变通,也难以招架。而工作中,如果能够对熟悉的几种算法稍加变通,也基本能够应对大部分工作了。真要遇到性能问题,或者内存问题,团队牛人一起讨论优化便是。
何况,你碰巧刷过一个题,你难保不会遇到一个陌生的题,题海无涯,总不会被你刷完。所谓的学习能力,不是说不能刷题,而是说,刷题后,能不能掌握题目背后的原理。这和高考类似,高考状元们也不是不刷题,他们见过的题型恐怕比谁都多,他们不仅刷题,还刷出了方法论和解题技巧。
刷题本没错,这和看两遍《算法导论》没什么本质区别。当然如果临时抱佛脚,死记硬背的刷,那就是你的不对了。中考、高考的时候,这种学习方法叫做死记硬背,属于勤奋的笨学生下的苦功夫。一个好的老师,一次好的考试,就是应该将聪明的学生和这种“笨学生”区别开。学生时代出题老师怎么出题,招聘的时候,面试者就应该怎么面试。
那么作为老师(面试官),应该怎么甄别到底学生(候选人)是真聪明,还是好记性?我个人的经验里,有几个方法可以参考。
面试官需要吃透考题
很多面试官,匆匆上阵,准备了几道之前被面试过的题目,上来就问。对方刷过了题目的话,两分钟结束。对方要是没刷过,毫无头绪的话,半小时内毫无进展,场面尴尬。好的面试官,需要清楚地知道要考察的是什么技巧,和哪些算法是相关的,题目有什么变形?换个场景,换个优化目标(比如从追求内存越小越好,到追求速度越快越好),或者换个数据规模等。
考察项目经验
项目经验可以看出一个人是否足够聪明。一个人是否优秀,可以从他做过的事情中看出眉目,也可以从他所在的团队,呆过的公司看出端倪。
假如在一家毫无技术追求的公司呆了两三年,他个人又不是鸡头,而是牛后的话,那基本可以看出来他在哪里都不会出类拔萃。看他是否有学习能力,看看他在项目中是不是经常看出现有系统的问题,想办法去解决就行了。一个普通的候选人,可能可以看出一些问题,但是往往无能无力,只会抱怨。而一个出类拔萃的人,不仅能看出问题,而且能自己找到解决方案。
假如他做过的是一个面试官熟悉的项目,问问项目怎么做的,有哪些难点,基本就知道他们团队的深浅,是否有优秀的牛人在带了。一个做了几年的项目,假如做得跟学生的作业一般,那么要不就是团队太弱,要么 就是他自己不具有足够优秀的学习能力,对项目的掌握很浅。
出点项目经验相关的算法题
一个项目,实习生一般也会做三个月。正式员工,可能会做上两三年。假如候选人项目用到了去重算法,用到了查找操作,或者需要解决中文分词问题,都可以就这些方面的任务,抽象出一些算法题,问一下他的思路。比如查找操作问一下二分查找和排序的问题,去重方面问一些 hash map, bitmap 的问题,中文分词问问最大前缀匹配的算法和实现,问问 CRF 或者 神经网络等。 另外,可以问问怎么做时间复杂度和空间复杂度的分析的。
假如候选人做过爬虫项目,可以问问bloom filter,问问链接的存储,链接的调度(简化为树的各种遍历)。当然,也可以问问 Domain 怎么从 URL 中抽取出来,IP 从 「127.0.0.1」 这样的字符串形式,怎么转换为整形,考察下系统 API ,或者是考察下位操作等。当然,也可以问问怎么实现 Html parser,问问怎么实现 URL Encode / Decode 。URL encode 如果很熟悉,那么问问 Base64 编码等怎么实现的,理论上编码后数据大小需要增加多少,都是不错的考察点。
话说回来,面试官或者是用人方,在招聘的时候,他们到底要考察面试者的哪些能力?哪些能力是面试官关注的,用人方想要的?下面分几个方面聊聊。
基础是否扎实
基础是否扎实非常重要。没有很好的地基,怎么可能构建出复杂的软件?越是复杂的软件,越是需要有扎实的基础。没有扎实的基础,往往在一些简单的功能里,使用复杂度比较高的算法。而我们在做 Code Review 的时候,如果没有非常在意,往往就会成为漏网之鱼。只有大家都基础扎实,才可能和团队一起打造大的工程时,处处扎实。
举一些不扎实的例子。
能在初始化的时候排序的,非要是每次函数调用的时候初始化。
能使用引用的时候,非要使用赋值。
能使用基础库的时候,非要自己实现一份有不少缺陷的版本。
学过网络编程,不知道 UDP 和 TCP 的基本区别。
看过《Effective C++》不能够说出几个C++的编程经验。
知道各种智能指针,不知道 RTTI 是什么概念。
说自己性能优化经验丰富,不知道有哪些Heap profiler 和 CPU profiler 的工具,更无从谈起背后的一些思路和大概的原理。
随便问问 tolower 怎么实现的,更不知道有个叫查表法的优化方法。
那么作为候选人,平时多看几本书,多使用一些开源项目,多看看开源项目的文档或者代码,就很有必要了。毕竟,找工作只是开始,工作的时间还长着呢,而工作主要就是写代码解决问题,而不是刷题。
人是否聪明
人是否聪明,往往是非常主观的印象,操作起来当然比判断女性是不是美女,男性是不是帅哥要难得多。那么怎么看面试者是否聪明呢?我主要从几个方面看。
1. 在以往的项目中,是否善于发现系统的不足,发现问题并提出解决方案,甚至解决问题。一个团队如果大家能力差不多,不一样的人,一般是能够提供不一样的思路的。这也是技术讨论和 Code Review 值得长期做的原因。尺有所短,寸有所长。
2. 分析一些陌生的问题,看候选人是否能够快速想出各种不同的思路。比如做语音的,问问搜索相关的一些问题,比如平时使用搜索时使用的搜索。
Suggestion,或者是相关搜索,要怎么解决,可能有哪些难点?新词怎么处理?错误输入怎么处理?拼音输入怎么处理?多音字怎么处理?这些问题看似都是搜索相关的问题,其实语音识别也不是完全用不上。比如语音使用使用到的语言模型( LM ),就需要解决新词的问题、语料里的错别字问题。声学模型( AM )的词典,也需要解决多音字的问题。
3. 遇到不会的问题,是否有自信。聪明的人,解决的问题多了,便容易有自信。技术的发展日新月异,往往容易跟不上节奏。是否自信还是很重要的。不自信,容易心态老化,思维固化。当然,碰到不擅长的,能不能主动换一个问题,也是人聪不聪明的表现。聪明的人擅长表现自己,找自己的擅场。
是否愿意接受新的挑战
当前创业潮一波又一波,大部分情况下,创业就是去解决新问题的。问题是新的,方法可能是旧的,但是创业过程九死一生,新问题层出不穷。今天可能需要做 ToC 产品,明天说不定就需要去做一些 ToB 业务了。今年可能使用 Java 比较合适,明年说不定就需要转到 C++ 了。哪怕就是前端开发,今年使用安卓和 iOS ,明天可能就需要开发微信小程序了。
一个好的候选人,最好是有随时接受新挑战的心态。高级别的人才,可以自己去想办法建立新团队。一个新人,可能需要随时学习新技能。当然,从候选人的角度,如果有非常明确的目标,比如就想做机器学习,最好在找工作的时候,直接找相关的岗位。并且最好找团队比较大的,小团队这会承诺你做算法,过两个月可能就天不遂人愿了。
是否有解决问题的思路和方法学
工作中,经常会出现一些完全陌生的问题,团队经常需要去接完全没经验的项目。那么作为招聘者,我们当然希望能够去找擅长解决问题的候选人。
抛出一个完全陌生的问题,看看他怎么分析问题的,往往可以看到他分析问题的思路。比如很多机器学习的任务,其实是需要先获取数据,清洗数据的。那么给一个比较陌生的任务 , 看看候选人可能会怎么去解决,就是非常不错的话题。比如做语音识别的人,如果足够优秀,完全可以问问他,如果要做语音合成,你会怎么去着手。一个优秀的爬虫工程师,完全可以问问他怎么去做反爬虫的策略。
工作经验丰富,学习能力强,擅长反思总结的工程师,一般是一个遇到新问题,能够沉着应付的人。他知道使用谷歌搜索,他知道阅读最新论文,他知道怎么搜索到相关的开源项目,他了解怎么获取到业界专家的联系方式,他也知道怎么从 0 到 1。
和团队是否契合
面试官不希望找一个异类到团队,正如候选人不希望到一家让人不愉快的公司工作一样。当前,很多优秀的应届毕业生,就不太喜欢到国企去工作,原因很简单,憋得慌。工作可以很累,但是心不能累。比如据我了解,很多清华北大的优秀应届生,就不太喜欢去搞出月饼门的公司应聘,原因很简单,月饼很好吃,但是「心委屈了」。
优秀的团队,希望找到对技术有追求的人。技术圈经常被提到的,A 级人才喜欢找 A 级人才,说的就是这个。
如果是一个刺头,可能你的面试表现也不错,但是在面试的时候老是挑战面试官,拒绝写代码,专门瞎逼逼,不好意思,你再牛逼,可能也不适合我们,你可能适合自己开一家公司。
有些人技术不错,但是呆惯了大公司,总想着 6 点准时下班,觉得公司如果压力比较大,可能无法胜任,那么不好意思,你可能真的会无法胜任。
有些人擅长的是工程,算法半桶水,但是天天想的是做算法,做模型优化,觉得做工程没前途,以后搞不好中年失业。那么不好意思,可能你也不会接到 Offer,哪怕你面试表现还不错。原因很简单,你不够自信,你总觉得比做算法的低人一等。
总而言之,面试官不是高高在上的官儿,只是你将来可能要朝夕相处的同事。了解下面试官的诉求,也相当于了解了团队的诉求。了解面试官的面试风格,也可以管窥到团队的技术能力和工程氛围。面试环节,作为候选人接触未来团队技术的第一印象,重要性不言而喻。为了能够吸引到优秀的候选人,所有的面试官,都应该用心准备,勤于总结经验,以更好地甄别优选人,更好地展现团队的技术能力和工程文化。