`
抛出异常的爱
  • 浏览: 629440 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转贴:如何在面试中发现优秀程序员

阅读更多
http://www.aqee.net/2010/09/29/finding-awesome-developers-in-programming-interviews/

我曾在一次面试中要求一个很有经验的嵌入式软件开发人员写出一个反转一段字符串并输出到屏幕上的程序。他在这个题目上挣扎了很久。这个家伙是个很神奇的人。你给他一些没用的零件,他能建造一个机器人,并能用程序控制它在屋里走来走去。他曾经参与过研制卫星,并且这个卫星现在正在轨运行。他只用左脑都比我能干。但是对于这个题目他却从来、从来没机会干过:在屏幕上显示什么东西。


有些人就有这种技能,能在面试中问出正确的问题,发现优秀的程序员。而有些人却害怕提问,畏首畏尾,问一些从网上拷贝下来的问题,自己没主见,只会跟随其他面试官的意见。但面试对于大多数开发人员来说是一项很基本的技能。一次失败的招聘会给一个组织造成很严重的长期的后果,因为很水的雇员会把其他很水的人也带进公司。另一方面,把优秀的应聘者拒之门外对公司也是一种伤害。

一场技术性的面试至少包括三个部分。在第一部分里,我们要做的是看应聘者的简历上写的是否符合实际情况。在第二部分里,我们要评估一下候选者究竟有多少实际经验。最后,我们要用一些问答选项或编程问题来测试这些经验。

第一部分:测试简历的真实性

有一次我跟一位同事面试一个候选人。当面试完之后,我觉得这个候选人还可以,但不是十分出色。可我的同事看起来很不满意。“他撒谎,他说他会XXX技术,可很显然他根本没有做过这种技术。绝对不能要这种人。”虽然这XXX技术对我们公司并不是很重要,“因为他撒了这个慌,”我的同事继续说,“我就不会相信他在简历上写的任何东西了。”

应聘人员应该在简历中用一种很积极的色彩来描绘自己。然而,这种积极的描绘应该有个度,过了这个度,就表达的不正确了。在上面的例子中,我并不和我的同事一样觉得这个事很严重,因为我事先就假设了,简历上的任何东西都是假的,除非被证明。如果简历上说,“擅长于XXX技术”,那么我就认为这个应聘者可能仅是知道XXX技术这个名字。如果简历上说,“在一个开发多线程股票交易系统的团队里工作,”那我就会认为应聘者可能只是为这个系统挑选了一下背景的颜色。我的要求一向不严格,除非碰到了一位有十年工作经验、已经不再写代码的家伙。如果有人说他开发了OpenOffice软件的文本格式化工具,或拥有哲学博士学位,那我们就很容易假设他们有什么技能了。假设一无所有。一切都要证实。

对于简历上每条相关的描述,我会首先估摸一下应聘者的实际情况。然后,我通过下面的交谈来证实。

开发过一个实时操作系统作为练习项目。
你工作的团队有多大?15个成员?哦,那么,你实际上负责哪部分的?消息队列?很好!请描述一下一个高优先级的任务向一个低优先级的任务发送消息时会发生什么情况?
完全自主开发了一套为无线安全系统使用的音频传输协议。
你的团队有多少人?只有你?哦,你是如何测试的?你为什么不使用RTP呢?
给XXX引擎修复Bug。
请你描述一下你曾发现过的一个特别有挑战性的bug,以及你是如何修复它的。
第二部分:发现实际的经验

拥有更多的经验是一个优秀人才的很好的指标。有经验的开发人员都是从犯错误中成熟的。他们知道何时该,何时不该使用设计模式。他们有第六感,能感觉到需求的哪一部分需要修改,哪一部分要保持原样。他们知道何时该偷懒,何时该考究。是真实的经验让优秀的开发者和平庸的开发者之间的差距大的无法跨越。



并非所有的经验都是等效的。很有可能,对于某个人,他通过多年的工作,在很多的任务中写或重新无数的代码,犯了许多的错误,就能获得扎实的技能。而另一种情况,一个人会在十年的时间里只在一个项目里修改了一行代码,没有学到任何新的东西。



发现隐藏的时间

很多伟大的程序员都是在他们大学的第二年就开始编程了。当他们离开学校时,他们就已经有了几年的工作经验了。还有,有些很神奇的程序员在他们很小的时候就开始学习编程的艺术了。我也认识好几个人在他们十几岁或更小时就写出来一些不算小的程序了。这些信息你是在简历上找不到的,需要你在面试中把它们引诱出来。

你是怎么进入到软件开发这一行的?
你曾经学过的第一种编程语言是什么?
经验的密度

很多神奇的程序员只是在他们工作的时间里编码。这很好,工作生活很平衡,你没有理由不雇佣这样的人。然而,在工作和学习之余做一些个人的编程项目是一个优秀的人才的很好的指标。有业余编程经验的应聘者很明显有更丰富的经验,更适合公司。没有个人项目?这里有其他几点也能做这方面的指标:

在很小的团队或小组里工作。
参与过很多各种各样的项目。
对一个大型项目的各个抽象层面上都有很详细的了解。
在一个项目组里作为主要开发者。
第三部分:验证经验

在对应聘者有了一个基本的真正经验水平的感觉后,就开始对他们进行重要的实际编程经验的验证了。几分钟的时间对于一个真正的测试肯定是很不充分的,但也只有这样了。我们可以通过对编程开发的各个领域进行提问来认识应聘者对这些知识掌握的深度和广度。当然了,你对应聘者技能水平的看法会由于你自身的经验水平而有所偏向。对于你不太熟悉的领域你不可能对答案做出正确的判断。所以我们一般同时会有好几个面试官。

工作职务的不同会有不同的面试主题。然而,下面几个领域是很常见的:

数据结构和算法
多线程
字节操作
内存分配
对象,继承,设计模式
递归
汇编知识和程序运行原理
我选择的每个领域都有一个精心挑选的很基础的问题(“什么是一个信号?”)。问题很基础,只要应聘者在这个领域做过一些工作就能回答上这些问题。每个领域都有一些其它的较深入的问题。候选人对这些问题的回答能证明他们到底是不是专业。例如,如果你问一个有经验的嵌入式软件开发人员如何把0×4c转化成二进制,他写出一个4×16+12,这就不是很对了。

编码问题

在完成了上面的步骤后,我通常就已经能认定了这个候选人是否能过关,如果还有困难,那编码问题会帮我扫除最后的障碍。这个很重要,即使在电话面试里也不能漏过。为了行之有效,在面试之前,你要好好的思考和计划要提出的编码问题。问错误了,回答也就没意义了。

首先,问题的选择必须基于应聘者的工作经验之上。如果你想起来3D飞机,想把所有问题都围绕着它进行,这样会有很妙的问题。但你还是省省吧,吃午饭时跟同事说说还行。如果招聘的工作跟3D图形没一点关系,那这个候选人就肯定被不公平的排除掉了。

问题必须精确的表达出来。“写出一个用来移动一摞卡片的函数”,这个表述就十分的含混不清。要给出功能性标题,避免误解,这种事情经常发生。如果你不小心,面试者有可能回答的是一个比你提出的问题更难或者更简单的问题,而不是你想要问的。如果回答的是更难的问题,那还好,除非难题让他目瞪口呆。如果回答的是更简单的问题,那没有什么用处。为了防止浪费大量的时间,在他们答题的几分钟后问一下他们的答题纲要,看看他们的理解是否在正确的方向上。

更进一步

上面的指导并不能解决所有问题。这些主要是针对工作经验。你也许会错过一些没有多少经验但有非常大的潜力的优秀程序员。特别是当面试官想通过一些不用编码的难题来考察应聘者解决问题的能力的时候。

这里所说的这些面试技巧都是要基于一种假设、可能性、内部直觉。假设候选人是一个很出色的开发人员。那一个出色的开发人员应该具有哪些品质呢?你没法直接的测量这些品质,所以你需要想:一个具有这些品质的优秀开发人员对这样一个特定问题进行快速回答的可能性是多少?你不可能通过面试对一个候选人进行100%正确的评价,但通过尽量周全的提问,你会做到很接近这个结果。

[英文出处]:Finding awesome developers in programming interviews

标签:面试
分享到:
评论
3 楼 抛出异常的爱 2011-08-01  
1如果两个人就能完成项目 那么不需你说的人员。
2如果两十个人只能完成上面两个人的工作。的确需要和谐的人员。
3多优秀?
如果我开一家公司接到的业务 100万 2个人能作完, 两个人每人年薪20万
如果我开一家公司接到的业务 100万 20个人能作完  每人年薪3万

你会说招人困难
的确十人取一与百里挑一区别很大。

2 楼 whking2003 2011-07-30  
抛哥,你不觉得对于面试官来说,还有2个问题是更重要的么?
1) 你真的是需要招聘“优秀的程序员”吗?你确定你不是需要招一些任劳任怨,能够按照领导意见加班,又能保持团队和谐的coder?
2) 你提供的职位,真的能够养得起,留得住“优秀的程序员”吗?你确定你真正需要要的不是一些费用低廉,能随时替换的coder?
1 楼 geminiyellow 2010-09-30  

相关推荐

    转贴:利用钩子技术控制进程创建.txt

    虽然钩子技术为开发者提供了强大的功能,但在实际应用中也存在一定的风险和限制: - **性能影响**:频繁的钩子调用可能会对系统性能造成影响。 - **稳定性问题**:不当的Hook实现可能导致系统崩溃或其他不稳定现象...

    转贴:随心所欲的Web页面打印技术

    【正文】 随心所欲的Web页面打印技术是针对基于B/S架构的应用程序中客户端页面打印问题的一种解决方案。传统的Web页面打印方式,如使用IE的...在实际应用中,开发者应根据项目需求和用户环境来决定是否采用这种技术。

    android和java面试大全集

    java程序员面试宝典.txt Java面试宝典2011版-1C,Java基础部分.doc 三大框架面试题.zip 技术面试题.zip Android笔试题库 C语言终极面试宝典.doc Java笔试题目汇总.pdf Java面试宝典_2010.doc 面试全攻略100题.doc ...

    易语言动网转贴

    在动网转贴过程中,校验可能用于确保帖子数据在转移过程中没有被篡改。 3. **搜寻**:在编程中,搜索功能用于在数据或文本中查找特定的信息。在易语言中,可以使用字符串处理函数进行搜索操作。 4. **文件处理**:...

    企业公司软件测试面试笔试题集合 软件测试面试题

    企业公司软件测试面试笔试题集合 软件测试面试题 (测试基础).doc 01_企业面试试卷(综合).doc 01_企业面试试卷(综合)_参考答案.doc 04_企业面试试卷(测试基础).doc ...中软的面试题(转贴).doc

    ZZ: 时间管理方法(转贴)

    在这个快速发展的IT行业中,良好的时间管理能力可以帮助程序员提高代码编写效率,项目经理更好地控制项目进度,以及团队成员之间的协作效能。 一、时间管理的重要性 1. 提高生产力:通过有效的时间管理,我们可以...

    易语言源码动网转贴.rar

    "动网转贴"这个主题可能指的是在论坛或者社交网络中实现帖子转发或分享的功能。 动网转贴的源码可能涉及到以下几个方面的知识点: 1. **网络通信**:在实现动网转贴功能时,首先需要与服务器进行交互,发送用户的...

    asp.net中的并发控制

    转贴:asp.net中的并发控制 并发控制的类型 通常,管理数据库中的并发有三种常见的方法: 保守式并发控制 开放式并发控制 最后的更新生效

    朋友们一起收藏的 知名企业的面试题

    每个企业的面试题都可能侧重于其业务所涉及的核心技术,而这些文档将提供实际的问题和案例,帮助求职者准备并提升在这些领域的专业素养。对于准备面试的朋友来说,理解和掌握这些知识点将大大提高他们的竞争力。

    [转贴]计算几何(附:计算几何函数库)

    本资源提供的“计算几何函数库”可能包含一系列预定义的函数和数据结构,便于程序员在项目中快速集成计算几何功能。博客链接(https://sysu-zeh.iteye.com/blog/119221)可能提供了关于如何使用这个库的详细信息和...

    史上最全的转贴代码

    【标题】:“史上最全的转贴代码”通常指的是一个包含大量可复用代码片段或解决...实际的"史上最全的转贴代码"压缩包可能会涵盖更多其他编程语言和技术领域的代码,但在这个例子中,我们专注于JavaScript方面的知识。

    java面试大全(中软国际的大公司)

    在准备Java面试的过程中,了解和掌握相关知识点是至关重要的。以下是一些基于标题、描述以及提供的文件内容可能涉及的关键知识点: 1. **基础概念**:Java的基础知识包括但不限于语法、面向对象编程(OOP)、异常...

    转贴:四十岁的男人要像孩子一样养.doc

    作为伴侣,了解和适应他们的饮食变化,制作符合他们口味的家常菜肴,能够让他们在家庭中感受到更多的归属感和舒适感。 此外,四十岁的男性在某些时刻会展现出孩子般的依赖,这其实是一种情感上的依赖。他们可能会在...

    电子政务-导电泡棉转贴装置.zip

    在“导电泡棉转贴装置”这个特定的场景下,我们可能是在讨论一种用于电子政务设备或系统中的特殊组件。 导电泡棉是一种具有导电性能的泡沫材料,通常用于电子设备的屏蔽、接地或防静电保护。在电子政务设备中,这种...

    易语言动网转贴.rar

    4. **数据交互**:易语言可以处理各种数据类型,并且具备数据库操作能力,方便与数据库进行交互,这在论坛转贴功能中非常重要,因为帖子数据通常存储在数据库中。 关于"动网转贴"的具体实现,可能涉及到以下知识点...

    BFC UBB转贴器

    <br> 这个工具的使用方法与通常的转贴工具完全相同,在浏览器中选中需要转换的内容并复制,然后在本程序窗口中点击 HTML->UBB 按钮即可完成转换,右键菜单中可使用 追加模式 覆盖模式 插入模式进行转换。...

    行业分类-设备装置-FPC吸附胶纸转贴组件.zip

    本压缩包文件"行业分类-设备装置-FPC吸附胶纸转贴组件.zip"主要关注的是FPC在实际应用中的一个重要环节——FPC吸附胶纸转贴组件。这个组件在FPC的制造和组装过程中起到关键作用,确保FPC能够稳定地固定在设备上,并...

Global site tag (gtag.js) - Google Analytics