原文链接:http://coolshell.cn/articles/4506.html
我以前写过一篇“我是怎么招聘程序员的”的文章(在CSDN那里有很多人进行了回复)。今天,我想再谈谈关于招聘和面试这方面的东西,主要是以下这些原因:
所以,我很想把自己的这些新的想法再次写下来的。还是和以前一样,这篇文章同样是献给面试官的。我认为,面试的好坏完全在面试官而不是面试的人。下面是我对“我是怎么招聘程序员的”一文中的一些加强性的观点。(关于一些点评,请参看本文下篇)
为了让我的文章有连续性,请允许我重申一下前文的几个重要观点。
我们有很多的面试官似乎分不清,什么是操作能力,什么是知识,什么是经验,什么是能力,这导致了我们的面试官经常错误地对面试者下结论,我认为分不清这些事的人是没有资格做面试官的。所以,我有必要在这里把这个问题先讲清楚。
我不否认这四样东西对于一个优秀的程序员来说都很重要。但是,通过上述的分析,我们可以知道,能力和经验和知识需要分开对待。当然,这些东西是相辅相成的,你的能力可以让你获得知识,你的知识可以让你更有经验,你的经验又会改变你的想法和思路,从而改善你的能力。在面试中,我们需要清楚的认识到,应聘者的操作技能,知识和经验只是其能力的必要条件,并不是充要条件,而我们更应该关注于应聘者的能力。
也许用这四个词来描述定套东西并不太合适,但我相信你明白我想表达的。
很多公司都会在面试的时候给一些算法题或是一些智力题或是一些设计题,我相信算法题或是智力题是程序员们在面试过程中最反感的事了。很多人都很BS面试官问的算法题,因为他们认为面试官问的这些算法题或智力题在实际工作当中用不到。但我想在这里说,问难的算法智力题并没有错,错的很多面试官只是在肤浅甚至错误地理解着面试中的难题的目的。他们认为,能做出算法题和智力题的人就是聪明的人就是有能力的人,这种想法实在是相当的肤浅。
其实,能解难题并不意味着这个人就有能力就能在工作中解决问题,你可以想想,小学奥数题可能比这些题更难,但并不意味着那些奥数能手就有实际工作能力。你可 以想一想你们班考试得高分的同学并不一定就是聪明的人,也不一定就是有能力的人,相反,这样的人往往者是在应试教育下培养出来的书呆子。
所以,我认为解难题的过程更重要,你要主要是通过解题查看这个应聘者的思路,方法,运用到的知识,有没有一些经验,和你一起交互时和沟通得是否顺畅,等等,这些才是你重点要去观察的。当然,最终是要找到答案的。
我想,让面试者解决一个难题的真正思路是:
这些方面才是考查应聘者的能力(思路,方法、态度,性格等),并顺带着考查面试者的经验和知识。下面是一些面试的点:
在解难题 的过程中考查应聘者的能力才是最终目的,而不是为难应聘者,不然,你只是一个傲慢而无知的面试官。
作为面试官的你,你应该多想想你的工作,以及你的成长经历。这会对你的面试很有帮助。你在工作中解决问题的实际情况是什么?你写代码的实际情况是什么?你的成长经历是什么?你是怎么获得知识和能力的?你喜欢和什么样的人工作?相信你不难会发现你工作中的实际情况和面试的情况完全是两码事,那么,你怎么可以用这种与实际情况差别那么大的面试来评估一个人的能力呢?
所以,最为理想的面试是一起工作一段时间。当然,这个在招聘过程中,操作起来几乎不可能,因此,这就要求我们的面试官尽可能地把面试的过程模拟成平时工作的 过程。大家一些讨论来解决一个难题,和应聘者一起回顾一下他已经做过的事情,并在回础的过程中相互讨论相互学习。下面举一个例子。
我们知道,对于软件开发来说,开发软件不难,难是的下面是这些挑战:
所 以,当我们在考查应聘者的代码能力时候,我们为什么不能模拟这样的过程呢?比如,让应聘者实现一个atoi()的函数,实现起来应该很简单,然后 不断地往上加新的需求或新的案例,比如:处理符号,处理非数字的字母的情况,处理有空格的情况,处理十六进制,处理二进制,处理“逗号”,等等,我们要看 应聘者是怎么修改他的代码的,怎么写测试案例的,怎么重构的,随着要处理的东西越来越多,他的代码是否还是那么易读和清晰。如果只是考查编码能力,一个小时,就问这一个问题,足矣。真正的程序员每天都在和这样的事打交道的。
如果要考查应聘者的设计能力,同样可以如法泡制。不断地加新的功 能,新的需求。看看面试者的思路,想法,分 析的方法,和你的讨论是否流畅,说没说在 点上,思想清不清晰,会应用什么样的知识,他在设计这个系统时的经验是会是什么样的,面对不断的修改和越来越复杂的需求,他的设计是否还是那么好?
当然,因为时间比较短,所以,你不能出太复杂的问题,这需要你精心设计一些精制的有代表性的问题