再谈“我是怎么招聘程序员的”(上)
我以前写过一篇“我是怎么招聘程序员的”的文章(在CSDN那里有很多人进行了回复)。今天,我想再谈谈关于招聘和面试这方面的东西,主要是以下这些原因:
- 近半年来我在进行了大量的招聘工作,对面试有一些新的体会。
- 酷壳最近发布了几篇趣味面试题(面试题一,面试题二,面试题三),从回复中让我有一些思考。
- 我有一个同事最近面试了一家公司,他和我分享了一个博士专家对他的面试,也让我思考了一些。
- 在豆瓣上看到“知乎上某人写面试豆瓣产品经理的经历,很欢乐”(亮点是面试官现身知乎亲自作答)
所以,我很想把自己的这些新的想法再次写下来的。还是和以前一样,这篇文章同样是献给面试官的。我认为,面试的好坏完全在面试官而不是面试的人。下面是我对“我是怎么招聘程序员的”一文中的一些加强性的观点。(关于一些点评,请参看本文下篇)
为了让我的文章有连续性,请允许我重申一下前文的几个重要观点。
- 只有应聘者真实和自然的表现,才能了解到最真实的东西
- 重要的不是知识,重要的是其查找知识的能力
- 重要的不是那个解题的答案,而是解题的思路和方法
操作,知识,经验,能力
我们有很多的面试官似乎分不清,什么是操作能力,什么是知识,什么是经验,什么是能力,这导致了我们的面试官经常错误地对面试者下结论,我认为分不清这些事的人是没有资格做面试官的。所以,我有必要在这里把这个问题先讲清楚。
- 操作。我们的面试官分不清楚什么是操作技能,什么是知识,他们甚至认为操作技能就是知识甚至经验。比如他们会 问如下的问题,请问Java中的 final是什么意思?怎么查看进程的CPU利用率?怎么编写一个管道程序?怎么查看进程的程序路径?VI中的拷贝粘贴命令是什么?包括面向对象的XX模 式是什么。等等。我以为,这些能够通过查况相关操作手册或是能够google到的东西只能说明这个人的操作技术,并不能说明他有知识或有经验。
- 知识。知识是一个人认知和学习的体现,可能会是一些基础概念和知识。比如这些问题:TCP和UDP的优缺点比 较,链表和哈希表的优缺点的比较。什么是堆什么是栈?进程间是怎么通信的?进程和线程的优缺点?同步和异步的优缺点?面向对象的XX设计模式的主要原则是 什么,等等。我以为,“知其然”只是操作技术,“知其所以然”才是真正的知识。知识不够并不代表他不能工作,会操作技能就可以应付工作,但是知识的欠缺一定会限制你的经验和能力,同样会影响你的开发质量。
- 经验。经验通常跟一个人的经历有关系。一个人的知识范围,一个人经历过的事,通常会成为一个人经验的体现。面 试中,我们会问这些问题:你解决过最难的问题是什么?你是怎么设计这个系统的?你是怎么调试和测试你的程序的?你是怎么做性能调优的?什么样的代码是好的 代码?等等。对于工作年限不长的人来说,经历和做过的事的确会成为其经验的主要因素,尤其是业务上的有行业背景的东西。但是,我更以为,经验可能更多的是你对知识的运用和驾驭,是你对做过事情的反思和总结,是你对他人的学习,观察和交流。
- 能力。一个人的能力并不会因为知道东西少而不行,也不会因为没有经验而没有能力。一个人的能力是他做事情的一种态度,性格,想法,思路,行为,方法和风格。只要有热情,有想法,有好的行为方法,以及好的行事风格,那么知识和经验对他来说只是一个时间问题。 比如:学习能力,专研精神,分析能力,沟通能力,组织能力,问题调查能力,合作能力等等。所以,对于一个新手来说,也许他的知识和经验有限,但并不代表他 能力上有问题,但是对于一个老手来说,如果其存在知识和经验欠缺的问题,那么通常都是其能力的问题。你可能暂时怀才不遇,但我不相信你会长期怀才不遇。如 果是的话,那么你必然些问题其让你的能力发挥不出来。而此时,“没有经历过”只会是你“没有能力”的一个借口。
我不否认这四样东西对于一个优秀的程序员来说都很重要。但是,通过上述的分析,我们可以知道,能力和经验和知识需要分开对待。当然,这些东西是相辅相成的,你的能力可以让你获得知识,你的知识可以让你更有经验,你的经验又会改变你的想法和思路,从而改善你的能力。在面试中,我们需要清楚的认识到,应聘者的操作技能,知识和经验只是其能力的必要条件,并不是充要条件,而我们更应该关注于应聘者的能力。
- 如果面试只是考查这个人的操作技能的话,那么这个面试完全失败。这是一个没有资格的面试官。
- 如果面试只是在考查这个人的知识和经验的话,那么成功了一半。因为你了解了基础知和做过的事,但这并不代表你完全了解他的真正能力。
- 如果你能够在了解这个人的知识和经验的过程中重点关注其能力(态度、性格、想法,思路,行为,方法和风格),并能正确地评估这个人的能力,那么你的面试算是非常成功的。
也许用这四个词来描述定套东西并不太合适,但我相信你明白我想表达的。另外,我想说的是,我们不是出个题来考倒应聘者,而是要找到应聘者的亮点和长处。
不要肤浅地认识算法题和智力题
很多公司都会在面试的时候给一些算法题或是一些智力题或是一些设计题,我相信算法题或是智力题是程序员们在面试过程中最反感的事了。很多人都很BS面试官问的算法题,因为他们认为面试官问的这些算法题或智力题在实际工作当中用不到。但我想在这里说,问难的算法智力题并没有错,错的很多面试官只是在肤浅甚至错误地理解着面试中的难题的目的。他们认为,能做出算法题和智力题的人就是聪明的人就是有能力的人,这种想法实在是相当的肤浅。
其实,能解难题并不意味着这个人就有能力就能在工作中解决问题,你可以想想,小学奥数题可能比这些题更难,但并不意味着那些奥数能手就有实际工作能力。你可 以想一想你们班考试得高分的同学并不一定就是聪明的人,也不一定就是有能力的人,相反,这样的人往往者是在应试教育下培养出来的书呆子。
所以,我认为解难题的过程更重要,你要主要是通过解题查看这个应聘者的思路,方法,运用到的知识,有没有一些经验,和你一起交互时和沟通得是否顺畅,等等,这些才是你重点要去观察的。当然,最终是要找到答案的。
我想,让面试者解决一个难题的真正思路是:
- 看看他对知识的应用和理解。比如,他是否会用一些基础的数据结构和算法来解决算法题?
- 看看他的整个解题思路和想法。答案是次要的,他的想法和行为才是重要的。
- 看看他是如何和你讨论交流的。把面试者当成你未来的同事,当成你的工作伙伴,一起解题,一起讨论,这样可以看看大家是否可以在一起工作。
这些方面才是考查应聘者的能力(思路,方法、态度,性格等),并顺带着考查面试者的经验和知识。下面是一些面试的点:
- 应聘者在解算法题时会不会分解或简化这个难题。这是分析能力。
- 应聘者在解算法题 时会不会使用一些基础知识,如数据结构和基础算法。这是知识。
- 应聘者在解题 时和你讨论的过程中你有没有感到应聘者的专研精神和良好的沟通。
- 应聘者在对待这个算法题的心态和态度。如,面试面是否有畏难情绪。
- 应聘者在解题时的思路和方法是否得当,是否是比较科学的方法?
- 等等。
在解难题 的过程中考查应聘者的能力才是最终目的,而不是为难应聘者,不然,你只是一个傲慢而无知的面试官。
模拟实际中的挑战和能力
作为面试官的你,你应该多想想你的工作,以及你的成长经历。这会对你的面试很有帮助。你在工作中解决问题的实际情况是什么?你写代码的实际情况是什么?你的成长经历是什么?你是怎么获得知识和能力的?你喜欢和什么样的人工作?相信你不难会发现你工作中的实际情况和面试的情况完全是两码事,那么,你怎么可以用这种与实际情况差别那么大的面试来评估一个人的能力呢?
所以,最为理想的面试是一起工作一段时间。当然,这个在招聘过程中,操作起来几乎不可能,因此,这就要求我们的面试官尽可能地把面试的过程模拟成平时工作的 过程。大家一些讨论来解决一个难题,和应聘者一起回顾一下他已经做过的事情,并在回础的过程中相互讨论相互学习。下面举一个例子。
我们知道,对于软件开发来说,开发软件不难,难是的下面是这些挑战:
- 软件的维护成本远远大于软件的开发成本。
- 软件的质量变得越来越重要,所以,测试工作也变得越来越重要。
- 软件的需求总是在变的,软件的需求总是一点一点往上加的。
- 程序中大量的代码都是在处理一些错误的或是不正常的流程。
所 以,当我们在考查应聘者的代码能力时候,我们为什么不能模拟这样的过程呢?比如,让应聘者实现一个atoi()的函数,实现起来应该很简单,然后 不断地往上加新的需求或新的案例,比如:处理符号,处理非数字的字母的情况,处理有空格的情况,处理十六进制,处理二进制,处理“逗号”,等等,我们要看 应聘者是怎么修改他的代码的,怎么写测试案例的,怎么重构的,随着要处理的东西越来越多,他的代码是否还是那么易读和清晰。如果只是考查编码能力,一个小时,就问这一个问题,足矣。真正的程序员每天都在和这样的事打交道的。
如果要考查应聘者的设计能力,同样可以如法泡制。不断地加新的功 能,新的需求。看看面试者的思路,想法,分 析的方法,和你的讨论是否流畅,说没说在 点上,思想清不清晰,会应用什么样的知识,他在设计这个系统时的经验是会是什么样的,面对不断的修改和越来越复杂的需求,他的设计是否还是那么好?
当然,因为时间比较短,所以,你不能出太复杂的问题,这需要你精心设计一些精制的有代表性的问题。
(末完,请参看下篇)
(请勿用于商业用途,转载时请注明作者和出处)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《再谈“我是怎么招聘程序员的”(上)》的相关评论
我觉得面试有一个方法不错:
当场给出我认为的面试题的答案,然后和对方来个辩论,这样可以纠正自己判断的误区,也可以了解对方的思路,最后还可以检验对方在“逆境”下的情绪控制能力。
文章最后的“未完”写成“末完”了。
@ctzsm
由此是不是可判断 楼主是用的五笔输入法
@EriCSN 就算不是软管,直接用多普勒效应也行啊喵……
这是篇好文章,即能指导面试官也能让面试者收益!
个人觉得分成“操作,知识,经验,能力”四种不太好理解并记忆!这四种的关系应该是循序渐进,逐步深入的成长过程!
操作主要是肤浅的了解和简单的运用,依然是未消化吸收的原材料,一般人都能快速的获取和得到,和个人的能力谈不上太多关系
而知识是对所了解的东西深入理解并转化为自己能完全接受的东西
经验是上述过程的不断反复积累沉淀
而个人能力可以加速上述循环的过程并从中得到提高
所以我比较喜欢分成:了解–》理解–》经验–》能力
如果水管是软的
用力捏住,然后拎起来,一个方向水管瘪下去,另一个方向的水管还是硬的,水管硬的那个方向就是水来的方向。
@陈皓
加热不见得就能判断出来,一是有可能两边都热(热量向两边传递),二是可能两边都不会热(太快来不及热)。。
The subsequent moment I learn your weblog, I hope it doesnt fail me when a great deal as this. I imply, I can say for sure it absolutely was my option for you to learn, but I actually really assumed youd possess one element interesting to talk about. All My spouse and i hear is numerous whining concerning one issue this you might repair in the big event you werent far too busy on the actual lookout for focus.
I think other site proprietors should take this web site as an model, very clean and great user frie
若管子是硬的,且透明的或半透明。用强光照射,若是流动快,会有偏射、折射。
若管子硬的,且完全不透明,用X光。看偏射、折射。
Great work! That is the type of information that are meant to be shared across the net. Disgrace on
She allow out a long breathing by way of hit mouth, bolted her eyeballs, and made an anguished head.
Hello Nice wewebsite. Do you want to visitor post on my very own sometime? If that’s the case you should let me know via e mail or simply reply to this particular opinion simply due to the fact We enrolled in notifications and can understand should you choose.
刚刚经历了一次非常棒的面试,我认为面试过程比较完美体现了陈皓文章里对面试的要求和精神。 是我所经历的最好的面试,无论是从面试官或面试者的角度, 对我来说都是收获甚多。
我面试的是”高级软件测试工程师“这样一个职位。整个面试持续三个半小时, 三个面试官,都是纯技术方面的面试。 按照陈皓的“操作, 知识,经验,能力”的分类, 操作几乎没有(电面有一点,可以理解). 知识占1/3基本上, 但都是基本又重要的概念,比如synchronized, wait, notify,重点是理解了这些技术的原理(知其所以然),相互关系, 分别适合用在什么具体的场景中。所以虽然是基础的概念, 但只有你用过, 思考过才能回到好这样的问题。
大部分时间是在“经验”的考察上, 但这里的经验不是你自己当前项目的具体的某个技术, 平台的经验,而是给出一个具体的问题,然后让面试者给出解决思路, 解决方案。比如实现一个队列,很基础,很简单,但可以看出编程习惯,异常处理这些细节。 又比如,给出一个软件的架构(比如12306,当然实际面试不是这个), 然后让你给出产品优化方案, 测试方案。
三个小时感觉时间很短,因为脑筋一直处于兴奋的状态, 同时 又很放松, 好像自己就在解决工作中遇到的问题一样, 而不是在面试。
至于能力的考察, 3个小时真的太短。 陈皓提到的“学习能力,专研精神,分析能力,沟通能力,组织能力,问题调查能力,合作能力”, 其中“分析,理解, 沟通”能比较好的体现, 其他 就不是太直接能考察到。
通过这次面试, 让我对这家公司又增加了一些敬仰。 因为我已经知道它有优秀的产品, 现在知道它有优秀的员工, 优秀的管理思想(至少在招聘环节)。 无论最后能否成功, 我没有遗憾,因为,通过这个过程, 我基本上完整的体现了自己的知识,经验和能力, 如果fail, 那也是真的技不如人。
哪家公司啊?
有种想被耗子面试一把的冲动
写的很好,收益良多。作为一个刚踏入工作的新人,有时会彷徨。但是看了你的文章我更确信我的能力。个人觉得程序员要有良好的自我修养和职业素养,好的程序员得有艺术家一样的热情,以及对于细节的关注,而不只是码农而已,码农这个词用于自嘲就够了。
”操作,知识,经验,能力”
换成
“操作,原理,经验,能力”
会不会好些?
总觉得“操作,原理,经验”都是知识……
”操作,知识,经验,能力”其中前三个可以等同,都是通过学习了解Google可以获得的,我把他们都理解为经验的不同层级,我面试别人的时候会问很多经验点,不是为了难为求职者,只是全面了解一个人做过什么用过什么,因为有些事情就是用过就知道的,小公司招人比较现实,就是要有相关实际经验的人,这样比较快接手。
能力当然也是考察的另外一半权重,会考察编程算法,不在于能否做出答案,更在于他如何处理困难。如果真的直接做出来了反而要怀疑点什么
这样面试对应聘的是很好,但是对面试官很不友好~~搞不好自己就露馅了,能力可能还不如应聘的呢。。。。