再谈“我是怎么招聘程序员的”(上)
我以前写过一篇“我是怎么招聘程序员的”的文章(在CSDN那里有很多人进行了回复)。今天,我想再谈谈关于招聘和面试这方面的东西,主要是以下这些原因:
- 近半年来我在进行了大量的招聘工作,对面试有一些新的体会。
- 酷壳最近发布了几篇趣味面试题(面试题一,面试题二,面试题三),从回复中让我有一些思考。
- 我有一个同事最近面试了一家公司,他和我分享了一个博士专家对他的面试,也让我思考了一些。
- 在豆瓣上看到“知乎上某人写面试豆瓣产品经理的经历,很欢乐”(亮点是面试官现身知乎亲自作答)
所以,我很想把自己的这些新的想法再次写下来的。还是和以前一样,这篇文章同样是献给面试官的。我认为,面试的好坏完全在面试官而不是面试的人。下面是我对“我是怎么招聘程序员的”一文中的一些加强性的观点。(关于一些点评,请参看本文下篇)
为了让我的文章有连续性,请允许我重申一下前文的几个重要观点。
- 只有应聘者真实和自然的表现,才能了解到最真实的东西
- 重要的不是知识,重要的是其查找知识的能力
- 重要的不是那个解题的答案,而是解题的思路和方法
操作,知识,经验,能力
我们有很多的面试官似乎分不清,什么是操作能力,什么是知识,什么是经验,什么是能力,这导致了我们的面试官经常错误地对面试者下结论,我认为分不清这些事的人是没有资格做面试官的。所以,我有必要在这里把这个问题先讲清楚。
- 操作。我们的面试官分不清楚什么是操作技能,什么是知识,他们甚至认为操作技能就是知识甚至经验。比如他们会 问如下的问题,请问Java中的 final是什么意思?怎么查看进程的CPU利用率?怎么编写一个管道程序?怎么查看进程的程序路径?VI中的拷贝粘贴命令是什么?包括面向对象的XX模 式是什么。等等。我以为,这些能够通过查况相关操作手册或是能够google到的东西只能说明这个人的操作技术,并不能说明他有知识或有经验。
- 知识。知识是一个人认知和学习的体现,可能会是一些基础概念和知识。比如这些问题:TCP和UDP的优缺点比 较,链表和哈希表的优缺点的比较。什么是堆什么是栈?进程间是怎么通信的?进程和线程的优缺点?同步和异步的优缺点?面向对象的XX设计模式的主要原则是 什么,等等。我以为,“知其然”只是操作技术,“知其所以然”才是真正的知识。知识不够并不代表他不能工作,会操作技能就可以应付工作,但是知识的欠缺一定会限制你的经验和能力,同样会影响你的开发质量。
- 经验。经验通常跟一个人的经历有关系。一个人的知识范围,一个人经历过的事,通常会成为一个人经验的体现。面 试中,我们会问这些问题:你解决过最难的问题是什么?你是怎么设计这个系统的?你是怎么调试和测试你的程序的?你是怎么做性能调优的?什么样的代码是好的 代码?等等。对于工作年限不长的人来说,经历和做过的事的确会成为其经验的主要因素,尤其是业务上的有行业背景的东西。但是,我更以为,经验可能更多的是你对知识的运用和驾驭,是你对做过事情的反思和总结,是你对他人的学习,观察和交流。
- 能力。一个人的能力并不会因为知道东西少而不行,也不会因为没有经验而没有能力。一个人的能力是他做事情的一种态度,性格,想法,思路,行为,方法和风格。只要有热情,有想法,有好的行为方法,以及好的行事风格,那么知识和经验对他来说只是一个时间问题。 比如:学习能力,专研精神,分析能力,沟通能力,组织能力,问题调查能力,合作能力等等。所以,对于一个新手来说,也许他的知识和经验有限,但并不代表他 能力上有问题,但是对于一个老手来说,如果其存在知识和经验欠缺的问题,那么通常都是其能力的问题。你可能暂时怀才不遇,但我不相信你会长期怀才不遇。如 果是的话,那么你必然些问题其让你的能力发挥不出来。而此时,“没有经历过”只会是你“没有能力”的一个借口。
我不否认这四样东西对于一个优秀的程序员来说都很重要。但是,通过上述的分析,我们可以知道,能力和经验和知识需要分开对待。当然,这些东西是相辅相成的,你的能力可以让你获得知识,你的知识可以让你更有经验,你的经验又会改变你的想法和思路,从而改善你的能力。在面试中,我们需要清楚的认识到,应聘者的操作技能,知识和经验只是其能力的必要条件,并不是充要条件,而我们更应该关注于应聘者的能力。
- 如果面试只是考查这个人的操作技能的话,那么这个面试完全失败。这是一个没有资格的面试官。
- 如果面试只是在考查这个人的知识和经验的话,那么成功了一半。因为你了解了基础知和做过的事,但这并不代表你完全了解他的真正能力。
- 如果你能够在了解这个人的知识和经验的过程中重点关注其能力(态度、性格、想法,思路,行为,方法和风格),并能正确地评估这个人的能力,那么你的面试算是非常成功的。
也许用这四个词来描述定套东西并不太合适,但我相信你明白我想表达的。另外,我想说的是,我们不是出个题来考倒应聘者,而是要找到应聘者的亮点和长处。
不要肤浅地认识算法题和智力题
很多公司都会在面试的时候给一些算法题或是一些智力题或是一些设计题,我相信算法题或是智力题是程序员们在面试过程中最反感的事了。很多人都很BS面试官问的算法题,因为他们认为面试官问的这些算法题或智力题在实际工作当中用不到。但我想在这里说,问难的算法智力题并没有错,错的很多面试官只是在肤浅甚至错误地理解着面试中的难题的目的。他们认为,能做出算法题和智力题的人就是聪明的人就是有能力的人,这种想法实在是相当的肤浅。
其实,能解难题并不意味着这个人就有能力就能在工作中解决问题,你可以想想,小学奥数题可能比这些题更难,但并不意味着那些奥数能手就有实际工作能力。你可 以想一想你们班考试得高分的同学并不一定就是聪明的人,也不一定就是有能力的人,相反,这样的人往往者是在应试教育下培养出来的书呆子。
所以,我认为解难题的过程更重要,你要主要是通过解题查看这个应聘者的思路,方法,运用到的知识,有没有一些经验,和你一起交互时和沟通得是否顺畅,等等,这些才是你重点要去观察的。当然,最终是要找到答案的。
我想,让面试者解决一个难题的真正思路是:
- 看看他对知识的应用和理解。比如,他是否会用一些基础的数据结构和算法来解决算法题?
- 看看他的整个解题思路和想法。答案是次要的,他的想法和行为才是重要的。
- 看看他是如何和你讨论交流的。把面试者当成你未来的同事,当成你的工作伙伴,一起解题,一起讨论,这样可以看看大家是否可以在一起工作。
这些方面才是考查应聘者的能力(思路,方法、态度,性格等),并顺带着考查面试者的经验和知识。下面是一些面试的点:
- 应聘者在解算法题时会不会分解或简化这个难题。这是分析能力。
- 应聘者在解算法题 时会不会使用一些基础知识,如数据结构和基础算法。这是知识。
- 应聘者在解题 时和你讨论的过程中你有没有感到应聘者的专研精神和良好的沟通。
- 应聘者在对待这个算法题的心态和态度。如,面试面是否有畏难情绪。
- 应聘者在解题时的思路和方法是否得当,是否是比较科学的方法?
- 等等。
在解难题 的过程中考查应聘者的能力才是最终目的,而不是为难应聘者,不然,你只是一个傲慢而无知的面试官。
模拟实际中的挑战和能力
作为面试官的你,你应该多想想你的工作,以及你的成长经历。这会对你的面试很有帮助。你在工作中解决问题的实际情况是什么?你写代码的实际情况是什么?你的成长经历是什么?你是怎么获得知识和能力的?你喜欢和什么样的人工作?相信你不难会发现你工作中的实际情况和面试的情况完全是两码事,那么,你怎么可以用这种与实际情况差别那么大的面试来评估一个人的能力呢?
所以,最为理想的面试是一起工作一段时间。当然,这个在招聘过程中,操作起来几乎不可能,因此,这就要求我们的面试官尽可能地把面试的过程模拟成平时工作的 过程。大家一些讨论来解决一个难题,和应聘者一起回顾一下他已经做过的事情,并在回础的过程中相互讨论相互学习。下面举一个例子。
我们知道,对于软件开发来说,开发软件不难,难是的下面是这些挑战:
- 软件的维护成本远远大于软件的开发成本。
- 软件的质量变得越来越重要,所以,测试工作也变得越来越重要。
- 软件的需求总是在变的,软件的需求总是一点一点往上加的。
- 程序中大量的代码都是在处理一些错误的或是不正常的流程。
所 以,当我们在考查应聘者的代码能力时候,我们为什么不能模拟这样的过程呢?比如,让应聘者实现一个atoi()的函数,实现起来应该很简单,然后 不断地往上加新的需求或新的案例,比如:处理符号,处理非数字的字母的情况,处理有空格的情况,处理十六进制,处理二进制,处理“逗号”,等等,我们要看 应聘者是怎么修改他的代码的,怎么写测试案例的,怎么重构的,随着要处理的东西越来越多,他的代码是否还是那么易读和清晰。如果只是考查编码能力,一个小时,就问这一个问题,足矣。真正的程序员每天都在和这样的事打交道的。
如果要考查应聘者的设计能力,同样可以如法泡制。不断地加新的功 能,新的需求。看看面试者的思路,想法,分 析的方法,和你的讨论是否流畅,说没说在 点上,思想清不清晰,会应用什么样的知识,他在设计这个系统时的经验是会是什么样的,面对不断的修改和越来越复杂的需求,他的设计是否还是那么好?
当然,因为时间比较短,所以,你不能出太复杂的问题,这需要你精心设计一些精制的有代表性的问题。
(末完,请参看下篇)
(请勿用于商业用途,转载时请注明作者和出处)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《再谈“我是怎么招聘程序员的”(上)》的相关评论
我去年应聘中兴的时候,问到我“如果你发现你的项目进度出现不可避免的拖延和滞后,怎么办?”。我就说合作人员提前打好招呼,预先准备后续工作;同时和投资方打好伏笔,安稳情绪。
也不知道答得如何。
不过,那个atoi的问题确实很有意思,哈哈。
这个假设性的问题只能了解你的想法,但不能得到你的真实能力,原因如下:
1)道理人人都知道,但未必人人都会做。大家都会说我当了经理会怎么怎么样,我当了总统会怎么怎么样,但真当上了,不见得你会那么去做。
2)处理问题从来都要放在一种特定的环境下的,这种假想出来的环境,只能得到似是而非的答案。
而且这种问题在各种《面试宝典》上已经问滥了,《面》这种书会分析解释各种情况应该怎么回答,很多面试者都是背答案……没有特定的环境,假想的环境不靠谱的……@陈皓
没经验那里来的能力呢?难道能力是天生的吗????
我指的经验不是简单的经历,经历了没有思考,那基本就是白瞎了。
经历过,然后思考过,这才能成为经验,这样能力才可能提高。
@virusswb 我想你误解了,我只是说我们要分开对待。我来解释一下吧。比如:一个人没有用过Java经历,并不代表他没有编程的能力,一个人没有做过金融行业软件经历,并不代表他没有开发金融行业软件的能力。
能力不是与生俱来的,我说了,能力来源于这个人做事的态度,想法,思路,风格等等,这些东西可能和这个人的性格有关系。性格可能是与生俱来的,也可能是写在DNA里的。
所以,你不能在面试过程中只看他的经历,不看他的能力(态度,想法,思路,风格……),因为经历不足而否定他的能力,这是欠妥的。
只考察操作,是因为我们目前需要的就是会操作的人。考察的内容和我们招聘的岗位目标是一致的。
我们不是每次都在储备干部,虽然会为他的发展想想,更多时候是为一个急需的操作岗位。
我个人很不认同你的这个观点,你的确是需要招一个可以马上就工作的人,但是你有没有想过,只考察操作技能还不够,这个人的想法思路行事的风格如果很有问题的话,怎么可能和你的团队一起工作?
原来你们招人就像购买设备一样,只要能运转就行了。这样的观点和招人,我只能用“目光短浅”和“急功近利”来评价。
是因为我们目前需要的就是会操作的人
我是本科生,我大二暑假的时候去面试一个杀毒软件公司的暑期的实习。面试官后来问了一个智力题,有一个内部有充实的水流的无限长度的管子,怎么在不破坏管子的条件下,判断水的流向。。然后我就先把不成熟的想法说了,面试官直接否决了。我又想了一个答案,好像勉强通过了。
结果还是被刷了。
我想知道,就是在思考的过程中,应该把思考过程中的暂时的小想法告诉面试官,还是等到有了答案再说话。因为如果不说话的话,在思考的挺长的时间里,气氛好像有点别扭。
@haoyouduo100
應該要馬上把想法說出來!不管對不對,這樣都比較有禮貌。就像現在瀏覽器載圖片都會即時顯示出來,而不是等載完後一次跳出來。
對了,那題答案會是這個嗎: 把管子掐住,哪邊漲起來哪邊就是上游,反之漸漸沒水的另一端就是下游?
前提試管子是軟的@@
lz 的想法应该有一个一般性的假设。就是所招的人,应该是考虑要长期”使用“的,并且能够相对的创造出更大的价值。按lz的思想去择取有潜力的人应该没错吧,一些大公司不也是这样选人的么?
当然买好的设备的人和买较次设备的人 没有对错的吧·
呵呵 lz的经验之谈,受教了·
还有楼上的”水的流向问题“想不出来,怎么判断呢?,听,闻,咬?哈哈~
@EriCSN
对哈,应该问下管子是不是软的。有道理~
不能同意你更多。不过,这些招聘原则对大公司来讲,行得通。对小公司,恐怕不行。大公司很少会因为编程语言拒掉一个应聘者,但小公司恐怕会将编程语言作为第一个选人的条件。@陈皓
@hustzmd 不管是大公司还是小公司,我相信每个公司都会有需要长期留下的人的愿望,特别是那些有能力的人。这点不否认吧?另外,大公司一切都很规范,大公司里的人是螺丝钉,小公司里的人是主心骨。相比小公司来说搞风险能力更强,大公司比小公司更不怕人员的流失,大公司走了一个高管一个团队也不会影响公司太多,但小公司走了一个核心的人或是一个团队会是很致命的。所以,我认为小公司比大公司更需要在选人方面下工夫。
另外,我觉得小公司也关注人的能力而不是操作技能。就像足球俱乐部一样,小的球队不能像大的球队请不起球星,所以小的球队只能是请一些有潜力的新人自己培养。不然,总是招只有操作技能没有能力的人,小公司将无法构建自己的核心团队骨干人员,那么也永远不能成为大公司。
@稀饭 你说的“买好的设备的人和买较次设备的人 没有对错的吧”,我觉得这句话可以讨论一下。大公司有钱可以买好的设备,小公司精打细算,但并不是买较次的设备,换个说法,应该是性价比高的设备。另外,小公司并不会把所有的钱都花在次的设备上,小公司更注重把钱花在刀刃上,一些地方可以次一点,但是在关键地方我相信,小公司的求贤比大公司要渴得多得多。所以,小公司比大公司更怕招错人,花冤枉钱,所以,小公司比大公司更需要注重人才的选拔。
@haoyouduo100 当然要说,让别人了解你的想法,就算是做不出来,也能让人感到你的思维方式。当然,也不要说多了,成话痨了。另外,关于水管的问题,其实答案很简单,在某点把水管加热就好了,然后看看这个热量会往哪边传。(我只花了一分钟,看来我的智商还不错,呵呵)
水管问题的我瞬间就想到加热的办法,但是又马上回想到万一别人说管子本身材料不适合加热或者管子内不是水是易燃物质呢?好吧,那我就用冷冻的方法,让管子通过液态氮的罐子看那边温度会降低些。
其实还有,水在管子中流动总会和管子产生摩擦力,将管子管子放在光滑面或在顺中能看到管子的细微移动,则可判断水流向,最明显的就是将管子竖直将不同的两端朝上。
再扯远点甚至可以从流体动力学考虑长期将管子弯折,则在弯折处水的流速是不一样的,对管子内壁的磨损是不同的,再测量其磨损情况可知水流向。
……
这种问题首先得考虑事物本身具有的特性,再考虑会影响这些特性或这些特性相关的东西就可以找到不同的答案,反正这种问题都是类似于头脑风暴 :)
嗯,我把(下)也看完了。呵呵·
还有“水管”问题,不知道热量会随水的流动传递….
软管那个也不错吧,合理的利用了水流的特性嘛。
还有,我上面的言论是针对“virusswb”所说的 他的需求就是要”操作工“。
比如说现在的一些外包公司,是吧· 他们选人的时候更注重实际应用能力也还好吧·
当然,你的文章是很棒的。
不仅阐述了关于面试的一些误区,而且还有你的见解和经验。赞一个·
“软件的需求总是在变的,软件的需求总是一点一点往上加的。”
确实啊,我去年毕业的,刚来公司的时候让做的一个东西,其实东西很简单就是调用加密机预产生一定数量的RSA密钥对,起初功能很简单,就是添加一个任务,然后后台进程扫描到任务就做就是了;但是后来又添加了要可配置限定工作时间段,要在晚上,不能在白天;后来又添加需求要执行的时候使用空闲状态的加密机;后来有添加了新需求,要同时可利用多台加密机并行执行任务;后来又添加了需求要能实现在执行任务的时候可以挂起、继续等功能…… 而且要同时兼容DB2/Oracle/MySQL,为避免分别些*.sqc/*.pc/MySQL API我使用了我们底层对数据库调用的粘合层代码,造成很多操作笨重而死板。。。 现在再看代码已经面目全非了。。。
这个东西要是再改我就准备重写一遍了。同时也认识到自己在这方面的经验确实不足。
@楼兰
挺强的·哈哈~
@楼兰 呵呵,答案不重要,重要的是你的思路,想法。你看,你的思路明显更全面,还能想到不同的Scenario,这些都是非常不错的特质啊。当我们设计软件时,不也是这样的吗?要想多种方法,要想不同的情况,然后向需求人员确认需求和假设,才能给出几个解决方案,然后比较评估,最终得出最终方案。看来,你的思考方式挺靠谱的。
@稀饭 谢谢你的认可。关于前面那位说只招熟练工人的朋友,没关系。我想他总有一天会明白的。
小公司招一个人过来,必须要能立马投入到项目中。如果不是实在缺人手,干嘛要招人?如果应聘者是个java程序员,又怎么能迅速的投入一个C++项目中呢?大公司,很多都考察算法,数据结构,操作系统的知识。即使应聘者没有java经验,如果应聘者有C++和OO的经验的话,胜任java职位也不是问题。大公司很多都有自己的开发工具和平台,任何人刚进公司,对新的开发工具和平台,以及开发的模式都不了解。因此大公司会给新人一段时间去学习和适应这些工具和平台,并让新人了解开发的模式。这段时间,对一个新人来说,太重要了。如果有mentor带一下,那就更好了。而这些,小公司能给吗? @陈皓
@hustzmd
1)看来我白说了,不过我相信你慢慢会明白的。呵呵。
2)关于要招马上就能工作的人,公司不分大小都存在这样的情况。
3)大公司之所以能成为大公司,是因为其选拔人才的能力。
举个例,当腾讯和阿里巴巴还是小公司的时候,也没有放弃过对人才的选拔,他们核心的那几个人才造就了他们今天能成为大公司。
@haoyouduo100
如果管子的材质合适的话,可以利用多普勒效应,用超声波判断液体的流速。
@陈皓
我就是这么回答的。
@EriCSN
说漏了,管子是硬的,不能弯折。。
时间太长了,细节记得不是那么清楚了。所以写漏了,不好意思。
”操作,知识,经验,能力“的说法很不错,但感觉分成以下三点会更清晰点:
信息:只要接收就可以了的东西,比如知道系统快捷键啊,某个debug命令啊啥的
知识:需要理解,消化的东西,比如虚函数调用的机制,局部性原理啥的
能力:动手,思考,解决问题的能力,比如给个算法题,先分析思路,再写出代码
至于经验,我想不能独立开来讲,因为这三个方面都是需要经验积累的
那四点本来就是相辅相成的,但认识一个人有时候需要有清醒的头脑。对于是四点还是三点,每个人有每个人的理解,都没有问题。能区分清楚就是最好的。最怕的是全部混为一谈,认为知道分子就是有知识的,有操作技能就是有能力的,这些都是不对的。重要的是能不能区分对待这些不同的点。
没想到,面试成了一门学问
知识指引操作,通过操作积累经验,而能力则是转换条件
@陈皓
阿里巴巴和腾讯的核心是什么不不干肯定(好吧,我承认我认为马云是阿里的核心)
但是绝对不是他们公司里面的软件工程师(无论多senior多牛逼)
这个你不能否认吧?
好复杂 难道进入软件行业 这般复杂?
想那么多搞屁,学得连人都变复杂了。
能力是通过现实的实践一点点储备起来的,你同意嘛?
我觉得自己还行,公司的任务或者研发性质的东西基本上很能很快时间做出来。但我总对自己没信心,感觉面试的话会答不出来不能体现出自己真正的水平
面试官确实很重要,我作为求职者时也会因为面试官的水准做判断,这个团队能不能一起奋斗?这样做似乎过于片面,人各有所长,从这个角度来说,印证了楼主的观点:区分对待每个人身上不同的能力点
用多普勒效应@稀饭
@haoyouduo100
呵呵,对这个问题,我的思路是:
在某一点上给水管内的液体留下痕迹,然后在两旁检测,有这个痕迹的就是下游
至于怎么留下痕迹,那就具体情况具体分析了….^^
哎哟~如果我能碰到如你描述的面试官,那真是万幸。
一个人的内涵包括知识和智慧。智慧与你所说的能力有点相似,智慧是知识的源泉,有能力才能创造和理解知识。我始终认为现在的人获取知识太容易了,大家欠缺的不是知识,是智慧。如果有面试官能把主要精力放在应聘者是否更有智慧上,那对双方都是好事,但无疑这样的面试难度比较大,尤其是对面试官而言。