如何面试程序员

如何面试程序员

最近被“Homebrew作者因为不会在白板上翻转二叉树而被谷歌面试拒绝”这事各种刷屏,知乎Quora都是热门问题,连LeetCode都专门增加了这道题

说到面试这种事,一般网上讨论的热点都是如何去应对面试的方法技巧,很少有文章去讲如何面试别人,而在工作几年后,去面试别人很有可能变成日常工作的一部分,而大多数时候是没有经过什么培训就被赶鸭子上架了,只能是自己逐步摸索。所以一直想整理总结一下如何去面试程序员。

找什么样的人

招聘的本质,就是需要找到适合团队的人。所以在招聘面试前,首先要想清楚,团队需要的是什么样的人,对候选人需要有哪些基本要求。后面的面试,就是看候选人是不是满足这些要求。

一般招开发人员,我的基本要求是:

  • 当前技能是不是满足团队要求
  • 是不是有较强的学习能力,在未来可以继续成长
  • 是不是有很好的自我驱动力,不需要跟在屁股后面催着干活
  • 团队协作,是不是能融入团队

筛选简历

在明白自己要找什么样的人,对候选人有什么样的要求后,就可以根据这些要求来筛选简历。筛选简历是第一步,从简历上可以大致对候选人有个了解,并且过滤掉明显不合适的候选人。在筛选简历时,我一般会重点关注这几点:

  1. 技术方向
    虽然理论上来说,技术思想都是相通的,但是真要做开发,差别还是有一些的,比如我是招.Net开发人员,一般不会考虑Java的。但这不是绝对的,如果学习能力强,这并不是太大的问题。

  2. 项目经验
    从简历上描述的项目经历,可以大概看出求职者之前的开发方向,经验水平,比如我要招大型网站开发人员,如果简历上的项目经历都是办公OA等企业开发项目经历,那么基本上是不适合的。另外参与过的项目和担任的角色也能侧面反映开发者水平,同时项目经历也是面试时提问的一个重要依据。

  3. 工作经历
    工作经历一般指的是换过几家公司,根据每一家公司呆过的时间长短和职位,能侧面反映求职者的心态,如果工作变换频繁,每次工作时间都很短,那么说明这个人可能比较浮躁;如果面试者在公司的职位一直是在上升,那么也能侧面说明一些能力。

  4. 开源项目
    有参加过开源项目绝对是重要的加分项,如果简历上有github账号,必然要上去查看一下ta贡献过的项目代码,代码风格质量,关注的项目是什么。

  5. 薪资水平
    薪资是实力的一个侧面反映,不一定准,但是可以作为筛选的一个可选依据。一个简历写起来很牛的候选人,工资要求四五千,这就值得怀疑了。

  6. 年龄
    年龄和所谓青春饭无关,首先要招聘的目标岗位哪个年龄段更有优势,然后要看候选人的年龄和其工作经历是不是匹配。如果说做了十年程序员,所有的项目经历还只是做简单的数据库增删查,所谓十年经验也不过是一年经验重复十次。

笔试机试

对于程序员的面试,一个最基本的要求就是要有基本的编程能力,笔试机试自然是最简单直接的方式,可以简单直接的甄别候选人的编程水平。

笔试的话,一般只适合校园招聘这种一下子大量简历,又没有条件上机测试,这种情况下只能用笔试快速筛选出来一部分,然后再安排面试或者机试。

对于实际的工作中,不太可能用纸和笔写代码,所以上机测试是蛮好的方式,可以尽可能的模拟实际工作中的情况,完整的观察候选人如何去编码、调试、优化自己的代码。在机试时有些注意事项:

  1. 题目尽可能通用,不要太偏,时间和难度也要适中。例如可以考一些字符串操作的算法。
  2. 应该让候选人可以查询帮助文档,不要因为只是忘记了一个函数名字而导致无法继续进行。而且合理的运用帮助文档也是一种必备技能。但不应使用网络搜索引擎,否则都能直接找到答案了。
  3. 中间可以去给予必要的引导和提示。有时候候选人因为紧张和压力而导致卡在一些地方不能继续,这时候可以给予一些帮助,并观察候选人在这过程中的表现。

原来我在飞信Team的时候,我们刚开始面试必做的一道机试题就是做一道CSV文件解析的题目,那题灭人无数,肯定也有不少误伤的,但是能顺利做出来那道题的那拨人,编程功底都非常好,后来都是团队的中流砥柱。

还有像Thoughworks的面试,面试前先给你发机试题,完成后邮件发过去,根据代码质量决定要不要面试。面试的时候,很重要的一环就是面试官和候选人一起,基于完成的代码,完成升级版的需求。通过对需求的变更,观察候选人的设计和应变能力,同时也通过公共编码,观察候选人的团队协作能力如何。

对笔试和机试的使用,需要合理的运用,因为这种方式很容易导致一部分候选人的反感和排斥。搞不好人家就会去发微博了:“我写的Homebrew辣么多人在用,结果被你一道上机题给挡住了!”。

面试

面试环节对面试官的要求很高,需要在较短的时间内对于候选人有个相对客观的了解,并有个明确的是否录用的结果。关键就是要尽可能多了解候选人,并且判断对方是不是团队所需要的人。这些年来,我自己总结的一些面试方法:
1. 尊重候选人,平等对待,尽可能让候选人能真实展现其优点和缺点
2. 尽量基于候选人做过的事情和熟悉的领域去提问,避免预设一些固定的问题去提问
3. 对于候选人做过的事情去深入了解细节,从而推断他做事的风格和态度
4. 通过一些非技术问题去观察候选人性格特点,看是否能融入团队

一般来说,我主要是通过这些问题和步骤。

  1. 营造轻松的氛围
    被面试的人一般多少是会有些紧张的,一个人在非常紧张的状态下,是比较难正常发挥其真实水平,所以如果想要有好的面试效果,就要尽量在面试过程中营造一个相对轻松的环境,让候选人可以真实的展现自己,从而更好的了解其真实的水平。

    在开场的时候,面试官可以先做自我介绍,介绍下公司和团队,甚至可以聊聊天气路况等话题,让候选人尽快消除紧张感,进入角色。

    另外还有些小细节也是可以注意的,比如给候选人倒杯水,适当调整空调温度,这些会人感觉更好一点。
  2. 了解候选人的项目经历
    虽然在简历上已经有写项目经历,但我一般还是会让候选人自己再说一遍他做过的项目。一方面可以甄别简历的真假,一方面也可以通过他的介绍,了解他的陈述能力。通过他对项目描述的详细程度甚至语速,可以大致了解他对于哪些项目是比较熟悉的。
  3. 深入了解项目细节
    同样是做一个项目,不同的人做的结果肯定是不一样的。所以对于候选人做过的重点项目,需要对一些细节进行深入挖掘。比如项目的时间周期、参与人、其扮演的角色、项目的运行情况等。比如说候选人说是项目的架构师,那么可以让ta在白板上简单花一下项目的架构图,并说明一下关键模块的作用。通过对几个项目细节的了解,可以知道其在项目中真实的角色是怎样的,其大致的水平如何。
  4. 对项目需求或环境做出变更
    需求变更或环境变更在项目中是常见的现象,一个优秀的程序员在设计程序的时候,往往会考虑到一些可能的变化,在需求发生或变化时能快速应对。举例来说,如果某个候选人说自己设计开发过用户管理系统,当前用户量大约十万的规模,那么我会让他考虑下如果用户量达到百万甚至千万的时候,他的设计要做哪些修改;如果对用户资料进行扩展,需要做哪些修改。等等这些。在候选人回答这些问题的过程中,能很好的考察出其工作的态度,其技术能力和解决问题的能力。
  5. 业余时间都喜欢做什么事情
    一个人在业余时间做的事情很能反映其学习能力和自驱力。学习能力,天赋是一方面,个人的努力也是必不可少,如果一个程序员业余时间不会再考虑其技术和工作相关的事情,那么他可能只会把编程当成一个普通的工作来做,很难做到优秀。在项目相关问题问完后,我一般会问问候选人都看过哪些书,平时上哪些网站,做些什么事情。如果有很好的阅读习惯,参加过一些开源项目,都会是很好的加分项。
  6. 为什么离开上一家公司
    一个员工离开公司,可能是公司的原因,也可能是候选人自己的问题。通过问一些“为什么离开上家公司”、“评价下以前的领导同事”、“觉得自己运气怎么样”等相关问题,可以看看候选人是否太过浮躁,是不是喜欢以自我为中心,是不是负能量过重。没有人愿意和一个整天抱怨,斤斤计较的人一起共事。
  7. 向候选人学习
    在面试时,总有机会遇到一些在某个领域比自己更优秀的人,面试就是个非常好的向别人学习的机会,这时候可以巧妙的把一些日常工作学习中遇到的问题,伪装成面试题目去提问,也许可以得到一些意想不到的答案。
  8. 有没有什么问题需要问我的
    在面试结束的时候,一般都会以“有没有问题问我的”这个经典问题结尾。面试本身是对等的,一方面是招聘方了解候选人,同时也应该给候选人机会去了解公司和团队。另外也可以通过这个问题考察候选人对岗位是不是重视。但对于候选人提出的一些敏感话题还是要合理回避,可以让他和HR沟通。
  9. 其他
    其实面试并没有什么固定的模式,每个人都可以根据自己的特点总结出自己面试的套路和习惯,甚至可以根据候选人的情况灵活做出调整。

    如果候选人明显不合适,也建议不要太早结束,耐心的保证一个基本的面试时间,这是对候选人的基本尊重,也体现面试官的修养和公司形象。

    不建议当场给出面试结果,这可能会导致不必要的纠缠和冲突,可以后续由HR进行邮件或电话的通知。

决策

在面试结束后,需要有个明确的结果来表明是不是愿意录用候选人。对于是否决定录用,我一般会这么做:
1. 列出候选人的优点缺点
每个人都有优缺点,关键是看其优点是不是正好是我们所需要的,其缺点是不是我们所能接受的

  1. 候选人在现有团队中处于什么样的位置,是不是满足团队需要,对公司有价值
    我们招人的目的是为了找到适合团队的人,如果他不能给公司创造价值,不能胜任团队要求,那么就没必要招ta。

  2. 是不是愿意和候选人一起共事,能不能融入团队
    如果候选人通过面试顺利入职,今后将会一起公司,所以一定要问自己的一个问题就是:“我是不是愿意和这个人一起共事”。如果答案是否定的,那么就不要再犹豫。

    顺便提一下,在面试时,候选人的卫生习惯也最好要考虑一下。

  3. 纠结就是不通过
    有时候,面试完了之后你就能很明确的知道这个人行还是不行,但是大多数时候,你会很纠结,觉得似乎有可取之处,团队又很缺人,但又不是那么好。一般这种情况下,我的建议是:“纠结就是不通过"。只有保持一个相对较高的招聘标准才能保证团队的整体水平。

最后

回头说到Homebrew作者被Google拒绝这事,就我观点来看,这事跟Google应该关系不大,还是作者自身有问题可能性比较大。在一个成熟的面试流程中不太会因为一个问题就否定掉候选人,多半还是有些其他原因在里面。

要成为一个好的面试官,关键还是多面试多总结,尊重每一个候选人,用心最好每一次面试。

抛砖引玉,欢迎大家一起分享。

最后祝大家都招到合适的人!

编辑于 2015-06-16

文章被以下专栏收录