10

如何面试程序员

 3 years ago
source link: https://zhuanlan.zhihu.com/p/20072954
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

如何面试程序员

最近被“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应该关系不大,还是作者自身有问题可能性比较大。在一个成熟的面试流程中不太会因为一个问题就否定掉候选人,多半还是有些其他原因在里面。

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK