几个月前我曾在博客中公布了IBM要招聘两个实习生来填补它的长期(带薪)实习职位空缺。现在好消息出来了,经过广泛的筛选和一系列繁琐的手续(跨国事务总是这样),最终有两个学生成功的加入到了我们实验室的DB2团队。
如果你想知道这两个学生是谁,他们是罗马尼亚的Marius Butuc和来自巴西的Henrique Zambon。他们都是很棒的小伙,你们可以在Twitter上关注他们(如果你是说葡萄牙语的,你也许会觉得Henrique的信息会更有趣些)。
选拔过程
我们从世界各地收到了想申请这个实习职位的100位学生的简历。我们邀请了其中50位最有潜力的申请者进行了首次电话交谈,我就是想给每个人一次公平的机会(当然了,我也不想让那些很显然不能得到面试机会的人还抱有任何幻想,对于剩下的申请人我们都通知了他们在初选时没过关)。
在初次面试进行之前,我给这50位预选通过的候选人布置了编程作业。他们可以开发一个CSV到HTML的转换器,或者一个使用Twitter API的客户端搜索工具,或一个S3上传工具。
很显然没有一道习题是关于火箭科学的,我们只是想用一种途径来证明这些学生的编程能力。大部分的候选人选择了CSV到HTML的转换器。一部分人选择了Twiter客户端,很少人选择S3上传工具(有个野心勃勃的候选人竟然把3道题全做了)。
在认真查看了他们的编码后,我对所有交了作业的候选人进行了技术面试。在这首次的面试中我问了他们每个人一系列非常技术性的问题,某些时候我们也会讨论他们的作业。大多数的面试都持续了一个小时左右。
首轮面试结束之后,我选出了10个最有潜力的候选人给了他们第二次的电话通知,我也通知了余下的人将不会再进行面试。
第二轮面试时我的经理加入了进来,一起对每个候选人进行电话交谈,谈话不大牵涉候选人的个人技能。这第二次的面试是要看看他们的软实力,了解一下他们的兴趣爱好,看看他们的综合心理状况。
这种面试很重要,它能让我们更进一步的了解候选者。我们的目的是想知道这些充满渴望的候选人对什么感兴趣,看看他们对编程的热情有多少,发现一些他们的跟编程并不十分相关的其它技能。我们也会跟他们讨论一下如果他们被选中后将会参与的项目、我们的团队合作方式(我们更像一个敏捷开发的新团队,而不是人们对IBM的老旧印象),我们还和这10位候选人都详细讨论了下一步我们将做些什么。
至此Leon(我的经理)和我最终讨论了哪两位申请人应该被选中。十位候选人都很优秀,我们要做出选择并不是很容易。我们仔细研究了整个过程中的细枝末节,从他们的简历、过往经历,到他们的作业上的表现,他们知道的(人类的和编程的)语言,他们对这几次面试的看法。
经过反复的考虑,我们最终选择了Marius和Henrique。(也许你会奇怪,那个把三道题全做了的学生也是来自罗马尼亚呀,如果能保证Marius和Henrique成功的获得实习资格的话,他将是我们的第三选择。)
从面试了这么多候选人中学到的东西
- 当你突然从世界各地收到100个非常优秀的学生的简历时,你会马上发现,要想去判断一个人的真实能力是异常的困难。光从纸上看每个人都优秀的不得了!这就是我为什么必须用一些特殊的东西显示出他们之间的区别,而不能只依据他们的课题表现和学习成绩(下面我还要更详细的说这个问题)。
- 编程作业对确定一个人的真实能力有巨大的帮助。有些做的最好的作业是来自理论表达能力很弱的人。你可以很清楚的看出谁才是程序员或有潜质将来成为计算机科学家的人。如果没有这个作业任务,选拔工作会困难的多,所以我很愿意找出一点东西让申请人去做做。
- 有一点很意外,即使是非常好的学生,看起来对一些相对直接的算法问题也会感到困难,不如其它类型的问题感到轻松。一些问题就像:红-黑树是什么?有什么用处?你能向我解释一下P vs NP的问题吗?(请注意,这些都是相对开放的问题,通常我会接着问一些特定的问题来评估候选人的理论知识背景—也就是他们对这些问题的思考方式。)
- 大多数的学生并不了解现实生活中的编程活动。特别的,他们似乎并不是十分关注时事,大多数人从来没听说过例如SVN, GIT, MVC, ORM, Agile programming,或 NoSQL等东西。
- 通常,质量偏差的候选人的简历上列出的品质我们看起来都有些夸张,而对于优秀的人的反而显得有些低估了。(这有点像某种形式的达克效应(Dunning–Kruger effect)在起作用。)
- 有些候选人,利用远程电话面试的便利,试图使用Google来搜索答案,当我问到了他们不太熟悉的知识时,我确实听到了他们敲击键盘的声音,嘴里回答,“嗯…这个…”,跟着一个20秒的停顿,然后把从维基百科上找到的东西全都粘贴出来。很容易就能看出里面的猫腻,这种不诚实的表现最终会给候选人带来不好的印象。
- 招募人是件难事。需要花费大量的时间和精力;要做出理性的决定是件很有挑战性的事,因为大多数情况下真的需要你拿苹果和橘子做比较。
什么样的简历能打动我
- 开源软件的参与者(一个GitHub的链接立即能引起我对这个候选人的兴趣)。
- 简要但明了的描述在学校课程之外为外界公司曾实现过的项目(在业余时间或实习期间)。
- 对编程社区类的社会媒体的参与。是否有StackOverflow身份?跟编程相关的Twitter账户?或者跟这个主题相关的博客?虽然这些事情单独看起来并不能说明某人是个好程序员,但这些却是一个适当的指标来说明一个人至少热衷于这个学科。是否出席行业相关会议也是一个很重要能说明对这个领域的兴趣的指示。
- 知道不常见的编程语言。基本上每个人都在简历上写了Java,然而,只是这些还不最够吸引我这个面试官的眼球。(该死,连Python也开始变得很平常了。)如果候选人声称自己会Haskell, Scala, Clojure,
OCaml, Scheme, Factor, Io, J,等等…这绝对能吸引我。同样,这也并不能保证其人就是个好的程序员,但这很可能就说明了他们对这个职业有高于常人的兴趣,或者在大学里这些语言都学过(这也许是个不好的信号)。
我不确定你能从这篇文章里得到些什么,但是把上面描述的整个招聘过程当成一个有趣的事情分享给大家是有价值的。如果你是一个正处在相同情形下的学生,如果正打算向一个类似IBM这样的公司申请实习,读了这篇文章你就会知道该怎么做了。如果你发现自己是一个处在相似情况下的面试官,你会在这篇文章里发现很多相关的观点。
最后一点提示:对于好奇的人,下面的是在我们团队第一次Party上的Henrique 和 Marius(有点喝多了):