如何面试程序员?

你要面试一个程序员,应该问他什么问题?

有人在Hacker News的讨论区里,请求指点:怎么才能在面试中发现合格的人。众人纷纷出主意,有很多高质量的回帖,我觉得挺有启发,就整理出了下面这篇文章。

15022803_TPDB.jpg

===================================

如何面试程序员?

阮一峰 整理

一、提问之前的准备

首先,最重要的是,你自己一开始就应该想清楚:

  1. 需要新员工完成什么样的任务?

  2. 怎样的人能完成这样的任务?

  3. 哪些途径和方法可以发现这样的人?

只有明确这些根本性的问题,才能正确高效地完成面试。

二、提问的原则

假定你对上一节的三个问题,已经有了清晰的想法,那么接下来就可以设计如何提问了。

有一些提问的原则,是你应该遵循的:

  * 每一个面试问题都有明确的目的。你不仅自己了解,还能向其他面试官解释清楚。

  * 多提一些开放性(Open-ended)的问题,而不是那种用Yes/No就可以回答的问题。这样做使你有机会与面试者展开讨论,并且提出后续的问题,尽可能多地了解对方。

  * 不要问宗教、家庭、健康、个人隐私等方面的问题。

  * 不要问太复杂的问题。因为面试者没有太多思考时间,所以无法周全地回答,你也就无从判断他的能力了。

三、考察专业能力

为了确认面试者是胜任的,你可以问一些与职位相关的专业方面的问题。(不过通常来说,一次面试不足以看出一个人的专业能力。)

比如,你的招聘职位是系统管理员,你可以问"如何快速地在50台机器上部署Linux?"(提示:正确答案不是刻录50张安装光盘。)

另外,你还应该向面试者了解他的过去,因为过去是未来的最好预测依据。不过,提问的重点不要仅仅是他过去的成果,更要关注在当时的环境中,他是如何决策和实施的。

四、考察综合素质

因为人是会发展的,所以某种程度上,面试者的综合素质要比他的专业能力更重要。

所以,具体的技术问题(如何调用API、什么是设计模式、编程语言的语法等等)可以少问一些,更应该关注面试者的事业心、对工作的热情、进取心、自律能力、毅力等方面。

下面是一些典型问题:

  Why did you get into development?
  你为什么开发软件?

  How many technical books did you read in the past year?
  去年你读了几本技术书籍?

  What was your favorite technical book in the past year? What did you learn from it?
  去年你最喜欢的技术书籍是哪本?你从中学到了什么?

  What websites do you read regularly, related to development?
  平时你经常访问哪些编程类网站?

  Do you maintain any open-source projects?
  你有自己的开源项目吗?

  Do you code in your spare-time?
  业余时间你编程吗?

  Do you love programming, or do you do it for the money?
  对于你来说,编程是一种爱好,还是一种谋生手段?

  Have you accomplished anything important in your career yet? Do you want to? 
  你的职业生涯之中有什么重要的成就?它是你主导的吗?

  What would make you feel that you have done something important?
  什么事情会让你很有成就感?

五、考察理性思维

某些情况下,你可能需要了解面试者的分析判断能力,看他能否全面地思考问题、客观地评价自己。

那么,你可以依次提出这样三个问题:

  What's your favorite programming language? Why? 
  你最喜欢的编程语言是哪种?为什么?

  If you could add one feature to your favorite language, what would it be? Why?
  如果允许你为这种语言加一种功能,你会加什么功能?为什么?

  If you could remove one feature from it, what would it be? Why?
  如果允许你取消一种功能,会是什么功能?为什么?

这里的重点是,让面试者从正反两方面评价一件自己熟悉的东西,看看他的思维是否片面。答案无所谓对错,只要面试者有一个明确的立场,能够从正反两方面说出令人信服的理由,就可以了。比如,某个软件的口碑不好,但是面试者说他很喜欢,而且说得出一大堆理由,清楚地解释了这种软件的优点和缺点在哪里,这样就很好。

你还可以把这些问题,套用在其他东西上面,比如操作系统、文字编辑器等等。

六、阿里大佬分享面试体会

看大家在零群里面提到了不少面试的问题,作为一个老程序员,跟大家分享一些自己的体会:

特质

先想想自己期望中的团队和同事具备哪些特质,然后让自己向着这些方面努力;

换个角度

跳开求职者的角色,想想如果你是团队的Leader,你想要招什么样的人(比如 聪明,钻研,潜力,韧性等等等等),其实面试官问你的那些具体问题,都是在试图评估前面的目标,他一定不会直接问你“你聪明么?”,这样的问题没有意义;

公司阶段

不同阶段公司的侧重点是不同的,对于初创型公司,最重视的是能立刻上手干活,应对快速变化的市场和方向;对于高速发展中的较成熟企业(类似滴滴、小米),商业模式基本清晰,技术进入深水区,效率和管理也成为急需解决的问题,开始关注人的发展和潜力,说白了就是要找牛人和潜力新星,但牛人(在当前阶段急需补足的特定领域有资深经验的人,比如算法,虚拟化技术,研发效能等)要较潜力新星更侧重一些;最后就是成熟大厂(BAT这种),除了对技术前沿的布局(例如AI、区块链、量子计算等)所需的专业人才之外,牛人和潜力新星的侧重基本持平。拿阿里举例,前几年是“平凡人做非凡事”,近两年更多的是“非凡人做非凡事”,团队TL招人的时候,也会很重视潜力(牛人也会看潜力,你能成为更牛的人的潜力),而且基本会考虑招的新人要在团队中同层级中位以上;

重视基础

重视基础,重视基础,重视基础!重要的事情说三遍,大家一定要重视基础,不要被琳琅满目的新技术花了眼,数据结构、算法、编译原理、操作系统、概率论/线性代数等等,这些面试的时候未必会考,但对他们的深入理解会帮你未来走的更高;

潜力

首先要定义什么是潜力,这个其实挺虚的,我一般会比较看重:对技术的热情和热爱(真心感兴趣才能更可能走得更远),乐观&韧性(不管做什么都必然会有挫折,有成功和失败,坚持才是答案,哈哈),认知和思考的能力(是否形成了自己的认知体系,能层层剥茧找到事物的本质),勤奋(加班不是勤奋,思考上的懒惰才是真正的懒惰)。举个特别简单的例子,面试时候常常会问道 StringBuilder和“+” 连接字符串的差别,估计一般人都能答出来,甚至还有同学研究过StringBuilder的源码,但下一个问题如果是“为什么Java中String要设计成 immutable的?和C++中的可变字符串相比,二者的优劣是什么?”,就不是所有人都能说出个所以然了。如果没答上,面试官可能会有不同的推论:(1) 技术好奇心可能不够,科班出身的大多都学过C++,对String这么关键的一个类,Java设计中如此重要的变化都没有引发好奇去探究;(2) 认知能力可能不够,对比是认知的重要手段;
上面只是举例说明,即使没答上也不会盖棺定论,好的面试官会关注发掘面试者的优势(因为好的团队是“用人之长”而非“揭人之短”),对关心的特质也会多角度去佐证。

回答问题技巧

被问到不了解的问题不要慌:

  • 不知道就说不知道,不要绕和试图遮掩,大家都是做技术的,技术上的事,做没做过,会不会,一目了然。如果不懂装懂,绕来绕去,会让人觉得未来跟你合作会很累;

  • 对知识型问题,就是那种知道就是知道不知道就是不知道的问题(比如中国有多少个省级行政区),直接说不知道就好了。但对于认知型、问题解决型之类的问题,一定要根据自己已有的知识和经验给出自己的思考和解决方案,比如你可能从来没解决过线上的OOM问题,但你学习过JVM虚拟机的知识,被问到时你可以跟面试官说:“我没实际处理过,但如果遇到你说的问题,这样解决应该可行…..”。

关于这个多说几句,线上的OOM问题如何处理,这个问题本身可能面试官并不care(根据他的业务特点可能很少遇到类似问题,或者团队已有这方面的高手),重要的是这些:

  • 如果你处理过,那你对细节是否了解,是否形成自己的一套方法论,是否总结了问题分类和常见解法跳出解决问题迈向避免问题等等,这能从侧面反映你的认知能力和钻研能力;

  • 如果你没处理过,你能否根据已有的经验和知识给出不错的解决思路(侧面反映你的思考能力和举一反三的能力,以及解决新问题的能力)

  • 另外,有一些不明确的点一定要和面试官确认,比如,现象的一些细节,线上环境的配置等等,不要做主观假设,这其实也是很重要的方面,如果你解决问题都是靠猜和主观假设,很难让人放心.

先写到这吧,希望对大家能起到一点帮助 :),欢迎大家积极讨论。

(完)

Refer:

[1] 小马哥:O2O公司咋招聘技术人

http://dwz.cn/2lWkCu

[2] 如何面试程序员?

http://www.ruanyifeng.com/blog/2010/12/how_to_interview_a_programmer.html

[3] 谈谈面试官的责任

https://mp.weixin.qq.com/s/lF6_0iIIVpfKgQdiAFdrGw

[4] 说说招聘工程师

https://bit.ly/2GBwTMA

[5] #面试#阿里大佬分享面试体会

https://mp.weixin.qq.com/s/5IEMYe0m1YLUFPjrEXEMwA

转载于:https://my.oschina.net/leejun2005/blog/73388

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值