全部博文(254)
分类: LINUX
2013-08-02 19:50:05
在招聘程序员方面,没有所谓的神奇“银弹”!但我可以分享一些建议和诀窍,它们经过我的实践证明是有效的。这些方法我多年来一直在用。我把它们总结如下:
我知道这听起来很疯狂,但有些自称是程序员的人根本没写过代码。时至今日,还有人常常过来告诉我:他们在面试过程中碰到一些应聘者连最基本的编程测试题目都不会做,真是难以置信!
那也是为什么要把简单的编程测试作为任何面试流程的第一步的原因(如果你足够理智的话)。这些测试应该是在线的,目的不是为了证明应聘者是不是编程天才,而要确认他们最起码知道编程是怎么回事。是的,这听起来有点悲哀,令人沮丧,真的有必要这么做吗?然而,如果你不做这种检查的话,相信我,你一定会后悔的!
有一些网站提供这样的在线编程测试,比如Interview Zen、codility等。(我相信还有其他更多的网站提供类似的服务,但我目前只了解这两个。)
任何称职的程序员都应该有一个“文件夹”,里面收藏了他曾经做过的东西。这些东西无须奇特。我只是在寻找你在互联网上留下的蛛丝马迹,以印证你有多了不起。如果你是Stack Overflow的用户,你可以给我看看你的介绍页面,让我知道你是怎样跟人沟通的,以及你是怎样去帮助别人解决问题的。如果你参与了某个开源项目,那么给我一个连接到开源代码库的地址。或者你有一个专业的博客?一个微博?在用Twitter?或者其他我从没听说过的东西?有这些就太棒了。我们可以一起来看一看。分享一下你设计过的应用程序或者你做过的网站,并指出哪些部分是你做的。
看看应聘者以前做过什么样的工作,他在网上展示了什么样的作品,这对了解这个人是极其有帮助的——通过这些,可以去理解他做过的东西,并且判断出他擅长什么(或者不擅长什么)。
像GitHub一样,我发现应聘者对公司文化的认同往往比他们高超的编程技能更重要,前者更能决定我们是否能够成功。
我们在招聘过程中会谈到哲学,我们对此是很认真的。我们想让任何可能进入GitHub公司的人都知道,他们将在一个怎样的环境里工作。我们要确保他们跟我们能够合得来。为了达到这个目的,我们可能跟他们一起吃午餐,并且谈论比如文化、哲学、我们犯过的错误、计划等方面的话题。
在早期,我们曾经单纯因为一些人的高超技术而雇用了他们,但忽略了他们怎样融入到我们公司文化中去的问题,或者他们是否理解我们对人处事的哲学。很自然的结果是,那些人的工作表现不如预期。因此,在我们关注应聘者技能的同时,他们是否能“变成”我们也是一个主要的考量因素。
我意识到,不是每个行业都为他们正在做的事情建有一个社区,但如果你有幸拥有一个社区的话,你应该尽可能从社区里找出人才来,并且雇用他们。这些人自然已经被扯进了你正在做的事情,他们被你公司的磁场所吸引,而且他们的行为完全是自觉自愿的。这些人能够适应公司文化的概率超乎寻常地高。他们就是你要找的人!
你发现有些用户给你的游戏建立了一个令人惊异的模组吗?有人发现了一个暗藏的安全漏洞,并尽快通知了你吗?立即把这些人雇用进来!
上面3件事情一旦做完之后,该给应聘者打个电话了。我得提醒你,电话面试不是为了聊天,重点是要筛选(或者说淘汰)。电话里谈论的应该都是技术方面的问题,而且要以结构化的形式进行。这样的话,如果你发现应聘者不合适目前的岗位要求,可以马上结束通话。我们在后面有一节“如何做好电话面试筛选”专门来探讨这个问题。这里只是简单总结如下:
1. 做一点即兴编码,比如“在一个整型数组里找出一个最大的整数值。”
2. 做一些基本的设计,比如“设计一个表示法,用于HTML的建模。”
3. 脚本编程以及正则表达式,比如“把某个目录下包含特定格式电话号码的文本文件都列出来。”
4. 数据结构,比如“在什么情况下你会使用哈希表,而不用数组?”
5. 位与字节,比如“为什么程序员开玩笑说10月31号跟12月25号是同一天?”
译者注:10月31号用英语表示为Oct. 31,是万圣节(也叫“鬼节”);12月25号用英语表示为Dec. 25,是圣诞节。Oct.本来是October(10月)的意思,而程序员可以把它解释成Octal(八进制);Dec.本来是December(12月)的意思,而程序员可以把它解释成为Decimal(十进制)。于是,八进制的31等于3 x 8 + 1,结果等于十进制的25,也就是Oct. 31 = Dec. 25。
不要期望从电话的另一头得到完美的答案,也没这个必要,你需要了解的只是这个人解决问题的方式,还有他们是否真的掌握了相关的技术(上下浮动10%)。你的目标是,不要让一些不合格的人蒙混过关,否则到了下一阶段会浪费大家更多的时间。因此,你不要心慈手软,要对电话另一头保持火力,而当发现有太多疑点之后,提前结束通话。
(提示:我们将在下一节对电话面试进行更为深入、详尽的分析。)
译者注:“试镜”是影视制作领域中的一个术语。用拍摄一段影片的方式,来决定某人是否适合当演员,或者某演员是否适合演出一部影片里的某个角色。在这里,作者把这种做法借用到了软件开发领域。
到这时候,应聘者已经通过了“Hello World”编程测试,他的“文件夹”里的东西也很光彩夺目,他融入公司文化没有丝毫的问题,他也成功通过了电话面试。是时候把他叫过来进行面对面的面试了,对吗?别这么急,兄弟!
我见过一些应聘者通过了前面4关,然后加入了公司,结果在实际项目中还是表现不佳。我没有提醒你吗?招聘程序员是很难的!
这位候选人会不会是一个成功的聘用呢?如果你还心存疑虑,想要抹去这层阴影的最好办法,就是给他一个“试镜”项目。我指的不是那种空泛的、抽象的编程问题,而是现实世界里、实际项目中你需要马上做的一块实实在在的工作。这块工作你原本是打算让正式员工做的,只是他们现在都在忙着其他的事情,因此这块工作暂时还没分配出去。
这个项目应该以常规的咨询服务的形式进行,按小时计费,并且清晰地定义好项目任务书。选择的项目一定要小,理想情况下几天就能做完,至多1~2周。候选人可以进办公室来做这个项目,或者也可以远程登录过来。我知道,不是所有的公司都能提供这种“一口大小”的工作分给公司以外的人来做。(他们拼死了也想把所有的事情都在公司内部做完。)但是,我就想了,如果你费劲脑汁还是想不出一个迷你的“试镜”项目给一位很不错的候选人做(你很有可能把这个人招进来哦),也许你在现有员工之间的工作分配方面也存在一些问题,至少不够结构化。
如果“试镜”项目做成了,那就太美妙了——你现在得到了一位高度合格的候选人,他的做事能力得到了验证,而且你还有效地给实际项目完成一些工作。迄今为止,我还没见过有谁通过了“试镜”项目的考验但后来还在实际项目中表现不佳的。我非常依赖“试镜”项目来考察一个人的能力;做这种项目实际上跟做正常的工作很接近了,就差没把人家聘用进来了。不过,如果“试镜”项目失败了,也不要紧,想想也就浪费一点点咨询服务费,跟把候选人直接叫进公司、浪费公司的其他4~5位同事的时间去面试他相比,其实还是挺划算的。况且,你还可以把这个“试镜”项目传给下一位有潜力的候选人去做。
(利用雇佣合同上的试用期也是可以的,它们在概念上非常相似。双方可以预先做好约定,先雇用6~8周作为考察期,然后再决定是否正式录用。)
最后,你应该当面见一见候选人。这是必不可少的,而前面所有的步骤都是为了确保,在应聘者走进面试房间那一刻,你已经有95%的把握:他将是一位很棒的员工。
在面谈方面,我绝对不是什么专家,因为我不够温柔。但至少有一点,我不喜欢在面试的时候要人家回答什么谜题。
关于怎样面试程序员,其实我自有妙招:我会让候选人对他们的专业领域做15分钟的演讲和展示。跟传统的面试相比,我认为我的方法要有效得多,因为你很快就能看出来:
· 这个人对他正在做的事是否有热情?
· 他能在小组里有效地沟通吗?
· 他对他的专业领域是否有很好的认识?
· 你的团队是否会喜欢跟这个人一起工作?
拿 Steve Yegge的话来说,每个程序员都应该学会做一件事,那就是推销自己、推销自己的代码和项目。我对这个观点举双手赞成!开始吧,冲我来!
前面所说的这些你也别太迷信了!虽说这些技巧常常是奏效的,但我也见过偶尔不奏效的。你必须根据你的实际情况,保留那些你认为合理的做法,然后把其他的都抛弃(尽管我强烈不建议你跳过第一步)。即使在最理想的条件下,招人仍然是不容易的!工作做不好的原因有很多,有时候完全不受任何人的控制。就跟人们常说的那样,人这个东西很复杂!
如果你也觉得“工作是在你有生之年每周都要花40小时(甚至更多)的一种重要关系”,那你就应该认真对待这次“约会”。公司和应聘者双方都应该很真诚,尽各自最大的努力去判断彼此是否合适。你的目标不应该只是为了得到一份工作,或者随便找个人来做事,而应该乐在其中,为了一种相同的爱好而彼此靠近、并且走到一起。因此,不要匆匆忙忙做决定,除非你们早已相互倾心。
(顺便补充一下,如果你想找到一些方法来吸引程序员,那你千万不要错过SamuelMullen的建议。请上网搜索“Advice on Attracting Good Developers”这篇文章。)