分类

如何面试程序员?

作者: 阮一峰

日期: 2010年12月16日

腾讯课堂 NEXT 学院

你要面试一个程序员,应该问他什么问题?

有人在Hacker News的讨论区里,请求指点:怎么才能在面试中发现合格的人。众人纷纷出主意,有很多高质量的回帖,我觉得挺有启发,就整理出了下面这篇文章。

===================================

如何面试程序员?

阮一峰 整理

一、提问之前的准备

首先,最重要的是,你自己一开始就应该想清楚:

  1. 需要新员工完成什么样的任务?

  2. 怎样的人能完成这样的任务?

  3. 哪些途径和方法可以发现这样的人?

只有明确这些根本性的问题,才能正确高效地完成面试。

二、提问的原则

假定你对上一节的三个问题,已经有了清晰的想法,那么接下来就可以设计如何提问了。

有一些提问的原则,是你应该遵循的:

  * 每一个面试问题都有明确的目的。你不仅自己了解,还能向其他面试官解释清楚。

  * 多提一些开放性(Open-ended)的问题,而不是那种用Yes/No就可以回答的问题。这样做使你有机会与面试者展开讨论,并且提出后续的问题,尽可能多地了解对方。

  * 不要问宗教、家庭、健康、个人隐私等方面的问题。

  * 不要问太复杂的问题。因为面试者没有太多思考时间,所以无法周全地回答,你也就无从判断他的能力了。

三、考察专业能力

为了确认面试者是胜任的,你可以问一些与职位相关的专业方面的问题。(不过通常来说,一次面试不足以看出一个人的专业能力。)

比如,你的招聘职位是系统管理员,你可以问"如何快速地在50台机器上部署Linux?"(提示:正确答案不是刻录50张安装光盘。)

另外,你还应该向面试者了解他的过去,因为过去是未来的最好预测依据。不过,提问的重点不要仅仅是他过去的成果,更要关注在当时的环境中,他是如何决策和实施的。

四、考察综合素质

因为人是会发展的,所以某种程度上,面试者的综合素质要比他的专业能力更重要。

所以,具体的技术问题(如何调用API、什么是设计模式、编程语言的语法等等)可以少问一些,更应该关注面试者的事业心、对工作的热情、进取心、自律能力、毅力等方面。

下面是一些典型问题:

  Why did you get into development?
  你为什么开发软件?

  How many technical books did you read in the past year?
  去年你读了几本技术书籍?

  What was your favorite technical book in the past year? What did you learn from it?
  去年你最喜欢的技术书籍是哪本?你从中学到了什么?

  What websites do you read regularly, related to development?
  平时你经常访问哪些编程类网站?

  Do you maintain any open-source projects?
  你有自己的开源项目吗?

  Do you code in your spare-time?
  业余时间你编程吗?

  Do you love programming, or do you do it for the money?
  对于你来说,编程是一种爱好,还是一种谋生手段?

  Have you accomplished anything important in your career yet? Do you want to?
  你的职业生涯之中有什么重要的成就?它是你主导的吗?

  What would make you feel that you have done something important?
  什么事情会让你很有成就感?

五、考察理性思维

某些情况下,你可能需要了解面试者的分析判断能力,看他能否全面地思考问题、客观地评价自己。

那么,你可以依次提出这样三个问题:

  What's your favorite programming language? Why?
  你最喜欢的编程语言是哪种?为什么?

  If you could add one feature to your favorite language, what would it be? Why?
  如果允许你为这种语言加一种功能,你会加什么功能?为什么?

  If you could remove one feature from it, what would it be? Why?
  如果允许你取消一种功能,会是什么功能?为什么?

这里的重点是,让面试者从正反两方面评价一件自己熟悉的东西,看看他的思维是否片面。答案无所谓对错,只要面试者有一个明确的立场,能够从正反两方面说出令人信服的理由,就可以了。比如,某个软件的口碑不好,但是面试者说他很喜欢,而且说得出一大堆理由,清楚地解释了这种软件的优点和缺点在哪里,这样就很好。

你还可以把这些问题,套用在其他东西上面,比如操作系统、文字编辑器等等。

(完)

留言(30条)

悲剧,我面试的几家公司从来都是侧重技术而不是以上问题。

引用司马刘的发言:

悲剧,我面试的几家公司从来都是侧重技术而不是以上问题。

肯定是技术的啦,

HN上的文章很赞,评论也是相当的精彩。

很有针对性。

嗯嗯嗯,俺以前面试 Py 程序员的问卷:
0. 最喜欢的科学幻想作品是什么?及为什么?(列举出几个作者或是作品即可)
1. GNU 和 OSS 的不同之处
2. 参加过什么自由软件项目?是什么角色?
3. 说明如何令系统程序自动将运行结果通知相关人员?
4. 团队组织/技术框架/过程管理/个人能力,对于项目的成功与否哪个影响最大? 为什么?
5. 你认为在软件工程中什么效率是最重要的?为什么?
6. 是否有Blog?如何订阅其它Blog?每天大约会看多少篇文章?
7. Python,Zope,Plone 三者的关系是如何的?
8. SGML,HTML,XML,XHTML 的关系是如何的?
9. 你的生活规律情况?对于10年后的生活有什么计划?
10. 请使用图画描述你现在的心情(5分钟内):
+ 使用你最习惯的语言,写出找到1000之内所有素数的程序来;

根据以上建议:
- 涉及了个人隐私 ;-(
+ 其它基本包含 ;-)

这种文章写10000篇都没用!
在中国没人会根据上述这些内容招聘!

  我很快就要毕业了,现在面试的时候没人问你技术问题,基本上都是问你爸干什么,你妈干什么,家里面还有什么人,都在哪工作,谁介绍你来的,愿意不愿意加班,愿意不愿意调休,日夜电脑能不能受得了等等。

国内的公司一般都是问几个技术细节

引用史诗在线的发言:

  我很快就要毕业了,现在面试的时候没人问你技术问题,基本上都是问你爸干什么,你妈干什么,家里面还有什么人,都在哪工作,谁介绍你来的,愿意不愿意加班,愿意不愿意调休,日夜电脑能不能受得了等等。

如果是我,就会只回答 愿意不愿意加班 之后的问题。前面的用委婉的语气拒绝回答。而从另一面来说,问这种问题的科技公司能有什么前途?如有其他选择,这种公司还是别去了。

我认为面试程序员没有本文说的这么复杂;用本文的问题来面试程序员,小心招到说话头头是道但根本不会编程和追查程序问题的人。

很简单,程序员首先要会编程,所以面试时一定要写程序,写真正的程序。说得再好听,也不如写一段真正的代码。

然后,程序员逻辑思维能力要强。“你最喜欢的编程语言是哪种?为什么?”这样的问题不能考察逻辑思维,只能考察常理思维。在追查程序bug时,常理思维是完全没用的,因为bug总是出乎人的意料,只有用纯粹的逻辑思维。因此需要考察那种纯粹的逻辑思维题目,比如“海盗分金”,比如数据结构和算法。

其次,问一些项目经验、开发性问题,考察沟通能力,以及作为参考。

如果是程序员,考察编程能力的就拿那些复杂的图论算法让当场在白板上写程序(或者notepad之类的非IDE工具)。可以看到理解能力已经能否有好的编程习惯。或者拿点多线程的算法考考头脑。
考察测试调试能力......问些Jprofile,JVM底层工具之类的server级的调试方法。以及另外一些测试工具和case的写法。

真正做一个程序员,还是很不容易的啊。

1. 他是不是真的热爱编程 (看你工作之余所做的事,如果这点符合,很多问题都可以不问)
2. 是不是很容易沟通(你要让我理解你能做的,我不是发令者,你也不是民工。好的东西是需要协作的,我希望你能为你做的东西而自豪)
3. 是不是有经验(这点决定了效率和产品的技术局限性)

引用zz的发言:

我认为面试程序员没有本文说的这么复杂;用本文的问题来面试程序员,小心招到说话头头是道但根本不会编程和追查程序问题的人。

很简单,程序员首先要会编程,所以面试时一定要写程序,写真正的程序。说得再好听,也不如写一段真正的代码。

然后,程序员逻辑思维能力要强。“你最喜欢的编程语言是哪种?为什么?”这样的问题不能考察逻辑思维,只能考察常理思维。在追查程序bug时,常理思维是完全没用的,因为bug总是出乎人的意料,只有用纯粹的逻辑思维。因此需要考察那种纯粹的逻辑思维题目,比如“海盗分金”,比如数据结构和算法。

其次,问一些项目经验、开发性问题,考察沟通能力,以及作为参考。

那这就是典型的“书呆子”,死记硬背那种,只能叫程序熟手,每天机械重复同一件事用同一个东西,别说是人,马戏团的动物都能学会骑车,打球等。只是为了完成任务而编程,跟只是为了得高分而学习是一个道理,刚好,国内几乎都是这样的,企业老板也最喜欢这样的,你好,我好,大家好。所以国内几乎没有创新意识,山寨的东西铺天盖地,最可怕的是不会因为山寨而羞愧反而自得!
为什么好的产品,开源程序等全是出自老外,人家思想观念就不一样,还懂得分享,分享个挑选好程序员的经验,要懂得接受,好吧,就你的问题,如果出现一个这些都回答得头头是道,但不懂实际编程的人,我想,给他一段时间去学习实际编程,绝对
能超过那些只会编程但这些问题从来没考虑过的人!

我也是一名即将毕业的本科生.这篇文章对我很受用.

引用史诗在线的发言:

  我很快就要毕业了,现在面试的时候没人问你技术问题,基本上都是问你爸干什么,你妈干什么,家里面还有什么人,都在哪工作,谁介绍你来的,愿意不愿意加班,愿意不愿意调休,日夜电脑能不能受得了等等。

一般这样问的公司也不是没有前途,是一个老板比较注重资本运作或人事关系网铺设的。进去后可能发现很多人都是什么人什么人二代,互相社会关系都很多。

很显然,我被面试过的面试官都没看过这篇文章。

面试靠缘分,缘分靠运气

太理想化了,不符合国情:
在中国,通常情况是:面试官只关心你懂什么技术,有什么项目经验,要多少工资。

说白了,打工嘛,员工要最大限度的争取自己的利益,老板要最大限度的榨取员工的剩余价值,且通常情况下,员工都是处在劣势的位置上。

我很同意这句话 人是会发展的 所以更重要的是考察综合能力.

确实 大家过于纠结于技术,考虑的都是来公司是否能直接干活.
但是从长期培养的角度来看 . 目前的能力并不重要,如果一个人学习能力和态度足够强,是可以后来居上的.

大家都说在中国情况不是这样 我想说 从我现在开始 我招的人都重新注重综合能力 结合具体情况来要求能力值. 就不再是这种只看重单纯技术的局面了..

我前几天招人的时候看到这个就好.. 问了好多没用的问题…

m1900 说:

在中国,通常情况是:面试官只关心你懂什么技术,有什么项目经验,要多少工资。

----------------------------

说的太对了,国内就是这么面试的

作者写的都是比较专业的问法,事实上也应该问,国内做不到~

引用dmn12的发言:

那这就是典型的“书呆子”,死记硬背那种,只能叫程序熟手,每天机械重复同一件事用同一个东西,别说是人,马戏团的动物都能学会骑车,打球等。只是为了完成任务而编程,跟只是为了得高分而学习是一个道理,刚好,国内几乎都是这样的,企业老板也最喜欢这样的,你好,我好,大家好。所以国内几乎没有创新意识,山寨的东西铺天盖地,最可怕的是不会因为山寨而羞愧反而自得!
为什么好的产品,开源程序等全是出自老外,人家思想观念就不一样,还懂得分享,分享个挑选好程序员的经验,要懂得接受,好吧,就你的问题,如果出现一个这些都回答得头头是道,但不懂实际编程的人,我想,给他一段时间去学习实际编程,绝对
能超过那些只会编程但这些问题从来没考虑过的人!


说这些攻击人的话就没意思了,首要我要说明的是:不要一味地去信奉某一种观点,至少在我看来,面试程序员需考试的问题有:1.他的专业基础与项目经验如何? 2.他本人对此职业的心态问题,包括是否经常阅读相关资料+是否有除代码思维之外的其他思维,比如在开发程序的的时候有没有更多地思考业务? 这才是真正能选出一个程序员是否学以致用,所开发的程序是否服务于生产,这才是程序员的价值所在!

至于dmn12的犀利言词,比如"书呆子","如果出现一个这些都回答得头头是道,但不懂实际编程的人,我想,给他一段时间去学习实际编程,绝对能超过那些只会编程但这些问题从来没考虑过的人" 针对后面这句话,我敢说,此人绝对是说话没过大脑,闻道有先后,术业有专攻,一个人回答问题头头是道,并不代表他具有写好程序的能力,我身边能说会道的业务人员多了去了,按照你的说法,他们都有快速学会编程的能力?非也!!! 诸葛亮是个军事指挥家,难道说能够说明他自己也能成为上阵杀敌的武将?想必不是这么回事吧?还是那句话“术业有专攻”,扯远一点,这就是现代企业团队合作意识的问题了。 各司其职,各尽其能才是最好的解释!

从评论就可以反映出有多少人看待问题是否片面了

好问题,收藏收藏,以后可能做得着。

我想问问,如何去面试,我们作为面试者,如何去面试?

没办法或者这就是中国的现实,我却依稀记得马云当时在美国招人的时候,因为一次的坎坷而讲述说,一个公司一个企业,重要的你要你员工是有多么多么的牛逼,重要的是适合。

阮老师的博客一眼就能看出来,排版和风格很独特, 难道只有我一个人有这种感觉?

明天要第一次面试一个程序员(二面),感谢阮老师多年前的文章,非常受用。

这个社会需要什么样的人,我们就会变成什么样的人,因为这是中国。

我要发表看法

«-必填

«-必填,不公开

«-我信任你,不会填写广告链接