在工作面试中辨别优秀程序员的最佳方法是什么?


82

在面试中:可靠地确定某人何时是优秀的程序员的最佳方法是什么。我的意思是,他是效率低下的同龄人的10/15倍,比同龄人的效率高/快/好。

我们中的许多人都听说过FizzBu​​zz问题,以淘汰弱者。当然,花5到10分钟来解决这个问题是一个很明显的指标,表明申请人是一个薄弱的候选人。我认为一个好的指标能够尽快解决这个问题。但是,这似乎还不够。

可能是像给他一个中等复杂的越野车程序,看看他能以多快的速度完成它并找出所有问题所在?


这个问题假设它可以可靠地完成。
安东尼

您不能:http
约翰和华夫饼

不必要。一个有效的答复是“根本没有办法”
Claudiu

Answers:


65

我向那些不愿冗长回答的人表示歉意,但我确实认为,在聘用候选人之前,对候选人进行资格评定非常重要。在该行业中进行了大量面试的任何人都知道,大多数候选人不会持续到面试的前15至30分钟,因此该列表中的大部分都没有必要。请记住,在您将我的清单视为过分否决之前,开除某人(无论是在财务上还是情感上)是多么昂贵。我试图按重要性顺序列出我的采访主题。

一般情报(脑筋急转弯/逻辑难题)

计算机科学知识

编程练习

  • GCD阶乘斐波那契河内塔
  • 字符串和列表反转
  • 确定单链接列表是否具有循环(可以仅使用两个指针吗?)
  • 发现错误

面向对象的编程技术和通用设计模式的知识

算法分析(运行时O(n)复杂度和存储要求)

工具和方法的使用

常见安全漏洞和攻击的知识

基础数学

  • 数字系统(从一个基础转换为另一个基础)
  • 概率论
  • 笛卡尔平面上两点之间的距离(勾股定理)
  • 平方根(亚历山大苍鹭,逐次逼近)

密码学

  • 公钥加密
  • 对称密钥加密
  • 哈希函数
  • 加密协议(秘密共享,零知识证明)

离散数学

  • 逻辑
  • 集合论
  • 图论
  • 信息论
  • 组合学
  • 证明(如无理数,无穷素数的存在)

您可能还想看一看《暴露的编程面试》一书。这是该主题的很好参考。


10
ew,那一定是漫长的采访。
Rick Minerich,

8
今天,我试图与我的ACM编程比赛队友一起解决“过桥”问题。唯一的区别是我们必须为任何数量的人解决。我们花了大约30分钟的时间才能解决任意数量的N人..但是在面试过程中,我觉得难题是一个糟糕的指标。

52
在面试中,困惑的感觉很糟糕,因为被访者很紧张,没有正直地思考,等等。此外,许多难题都让人叹为观止!键入确实不会告诉您有关候选人的信息。

11
我发现这些数学问题难度很高。在完成了10年的计算机科学学位后,您怎么还记得如何证明无理数?

14
难题的麻烦在于大多数人还没有解决它们。他们刚刚看过答案。因此,最精明的候选人将假装没有见过他们,并停止研究他们已经知道的答案。如果您的目标是雇用聪明的人,而不是欺骗性的人,那么困惑是一个糟糕的选择。
Kyralessa

28

啊,永恒的问题。

我今年进行了很多采访(明天安排了两名候选人),根据我的经验,招聘更多是关于直觉和人际交往,而不是技术知识。

  1. 花些时间来简历吧。有些简历可能在几秒钟内被拒绝,有些则需要半个小时。有时候,我考虑基于简历的候选人要比采访他更长。尽管我通常没有准备问题,但有几次我专门为该候选人准备了面试问题。

  2. 技术知识-我需要最低要求,这通常很容易分辨。如有疑问,请在面试中谈论他在简历中提到的项目,并深入了解您需要的内容。通常,这足以告诉您他所知道的以及使他打勾的原因。教育并不重要,以前的工作很重要,可能的个人项目得分很高。

  3. 问一下他想做什么以及他想在职业生涯中去哪里-您是否需要他拥有的东西,能否提供他想要的东西?另外,在面试快要结束时,我通常会询问优先薪水。如果他不在我的范围内,或者如果我不为他所知道的付出那么高的价钱,那就是我们结束采访的地方。

  4. 最重要的是,候选人必须加入团队,我必须对我们能够一起工作充满信心。我不需要喜欢他,但我必须能够应付他,而他也需要能够应付我。如果不是这种情况,我会通过,因为我将无法使用他的技术知识。另一方面,如果是这种情况,并且如果他是一个快速学习者,那么他缺乏技术知识将不会阻止我雇用他。

我已经培训过来自人力资源部门的女孩,让他们在获得简历后立即通过我。我会尽快安排自己的面试时间(最好是在获得良好简历的简历后的第二天)。然后,他与我和至少一个同事(通常是我的老板或团队成员)进行了半小时或一个小时的面试,在那里我认识了他并回答了任何问题。即使我当场拒绝了他的申请,他也有20-30分钟的公司参观时间,我在谈论我们的工作以及我们的工作方式。然后,我将他送至HR进行心理测试,并提供一些非常基础的纸张编码/ SQL。两项测试几乎都不会对我的决定起重要作用,更多的是我在面试中正确判断的一种验证。在取得结果之后,我给他提供了15分钟的谈话,如果我们就双方都满意的条款进行谈判,他就被录用了。

在错过了几个优秀的候选人之后,我必须通过公司官僚机构为这个过程而努力。这个过程之所以有效,是因为我是决定招聘的人(尽管我确实听取了人力资源部和同事的建议,字是最终的)。更多的决策者,更长的过程。过程越长,您必须成为Google的领导才能越多。

我确定这是一场无与伦比的比赛,我结束了采访,他开始了公司之旅,并且结束了。安排面试时,这可能只需要短短两分钟的电话时间。即使您拒绝候选人,也要出售公司。如果您做得不错,那么优秀的录用可以通过被拒绝候选人的口碑传来。

另外,一个技巧。请为收到的每个应用程序发送拒绝信(或电子邮件)。在我目前的公司中,我通常将其留给人力资源部(除了在面试中告诉我的那些人),但有时候,被拒绝的候选人以“谢谢你!做出回应,而不是让我想知道他们是否会在一天之内回复!”


心理测试?

5
@喷墨:不,心理测试是正确的-要求候选人编写代码,该代码将由一个也知道其家庭住址的暴力男子维护。

老实说,这是我第一次读它。

@Grundlefleck-是的,那是正确的。:)
Domchi 2010年

2
如果收到您的拒绝信,我将感激您。在接受电话采访之后,我一直被沉默所拒绝,这令人不安。
2012年

24

这个答案有点开箱即用,但是我认为这很有价值。

最好的程序员很少面试。他们不必。如果您的公司特别是在改变世界的世界中,或者在保密方面令人兴奋地笼罩着,或者他们尊重几个程序员,那么他们可能会应聘,但是通常情况下,优秀的程序员是通过其员工网络来获得工作的,而不是通过发送简历来获得的。

因此:在工作面试中告诉优秀的程序员的最佳方法是,他不在那儿


2
如此真实...很棒。:)
Arnis Lapsa,2009年

5
那么...是“您认识的人”而不是“您做什么”?真正可怕的程序员还通过朋友和家人获得工作。哦,对不起“合作伙伴网络”。
菲利普(Philip)


11

可能没有“优秀”的程序员来找您面试。您可能必须从别人那里偷走他。


h!这个答案似乎越来越流行。就像我必须开始外出工作一样...
interstar

9

从“我只想要一份工作”中告诉热情的程序员的一种方法是问他们这周正在读什么书。然后询问他们过去几周读过的书。

我发现充满激情的程序员总是在阅读,通常列表中会包括一些编程/ Comp。科学 最近列表中的书籍。

这不只是要跟上“专业”的步伐-热情的程序员对编程有一种渴望和热爱,并且倾向于在各种主题上投入大量的材料-不仅是他们现在使用的任何一种语言,而且还包括方法论,其他语言(尤其是IT的其他方面(可能是机器人技术,AI或游戏,或...)

如果他们根本没有最新的书目,那么根据我的经验,他们可能不是程序员。

干杯,

-R


8
我最近的书单几乎都是虚构的。我最近的技术读物几乎全部在线,因为它是最新的。

1
更好的是,问他们这个月写了什么书。:)

7

有人可以“快速”到达不同的时间范围:一些聪明的人可以在几秒钟内解决难题,但是有些聪明的人可以在一个月内产生很多好的代码,即使他们在面试问题上可能不那么快。

询问候选人在任何开源项目中是否活跃,您可以在其中查看一些代码,并花一些时间阅读这些项目的邮件列表档案和提交日志。这将比候选人在面试中能证明的要多得多。(当然,这不能代替面试,因为并非所有优秀的编码人员都从事开源工作。)


7

本书“ 聪明而有效”:乔尔·斯波斯基(Joel Spolsky)的《寻找最佳技术人才的简明指南》可能有助于找到答案。

表中的内容:

  • 介绍
  • 第1章:“击中高音”
  • 第2章:“寻找优秀的开发人员”
  • 第3章:“开发人员实地指南”
  • 第四章:“排序简历”
  • 第5章:“电话屏幕”
  • 第6章:“游击面试指南”
  • 第7章:“修复次优团队”
  • 附录:“乔尔测试”

乔尔的文章《游击面试指南(第3版)》也可能会有所帮助。

而文章“完成,并能解决问题的智能”的主题由史蒂夫·耶格。


4

向他们提出一系列问题,要求他们进行编码,并且使问题变得更难。如果他们似乎喜欢挑战,那么您可能会遇到一个挑战。

如果他们无法回答第一个简单的问题,例如“编写for循环”或愚蠢的简单问题,那么您知道此人无法编写代码。


4

让他们在白板上编码。只有这样,您才能知道他们是否知道如何编写代码。


不知道为什么这被否决了。如果程序员不能在白板上编写代码,是什么让您认为他们可以在计算机上编写代码?
克里斯托弗·约翰逊

3
@Kristopher:如果程序员可以在计算机上编写出色的代码,是什么让您认为他们可以在白板上编写代码?这些是完全不同的环境。
David Thornley 2010年

“白板测试”并非旨在模拟实际编码。您可以借此机会查看候选人的想法,候选人是否可以描述自己在做什么,候选人如何迅速地在头脑中形成解决方案,等等。某个不知道该写些什么而盯着白板的人可能会有在计算机上出现同样的问题。
克里斯托弗·约翰逊

3

您应该主要判断他们已经完成的工作。某人在焦虑不安的面试中产生的任何代码或想法都不能很好地代表他们实际上可以在团队中产生的东西。

要进行编码挑战,可以将IM与codepad.com等一起使用,并让他们在家中舒适地进行。您是否在老板面前的白板上写了很多代码,最后期限为30分钟,并且在线上获得了奖金?我不。

那么,面试毫无意义吗?不,但是重点应该放在他们身上,说明他们所做的工作以及所做的贡献。

一旦遇到某人面对面,您还将遭受各种心理偏见。不要偶然雇用程序员,因为他们之间的眼神交流更好,或者比其他人更高。为了解决这些问题,在您面对面见面之前,我会通过IM /电子邮件进行尽可能多的采访。


您可以通过查看候选人录用历史中其他人的心理偏见来扭转这种影响。曾担任过高级职位并取得成就的矮个子人才可能真的很不错。具有相同历史的高个子人平均来说不会那么好,并且会绕过光环。
Tim Williscroft 2011年

2

语言无关紧要。逻辑确实如此。我的意思是,如今的IDE和编译器是如此之好,以至于任何优秀的程序员都可以在一周内学习任何语言(好的,也许不是汇编语言)。在几周内变得体面,并在几个月内变得非常好。

您需要确认的是他(她的)大脑。我的话你就做到了。我要求他们解决简单的问题。不是通过编写代码,而是通过逐步引导他们完成解决方案的逻辑。

但是我承认,如果他不能编写一个简单的1到10的循环,那么您就会遇到麻烦。


1

首先,有一种方法可以在面试甚至开始之前就获得一个想法:

如果他们有博客或对一个或多个开源项目有所贡献,只需查看他们编写的代码和文章即可。首先,如果他们完成了其中任何一项,那么他们就会主动将事情做好。此外,您可以将这些内容与他们在简历中列出的工作经历进行比较,以了解他们下班后回家学习更多信息,还是下午5点后回家忘记工作。

本质上,他们是否对编程充满热情?那才是真正的问题。


1

在我看来,面试中最好有一个好的程序员在场。

只有专家才能判断申请人是否只知道很多面试问题,或者他是否真的在考虑问题并可以进行详细说明。请记住,您不想雇用人员来解决面试难题,而是想雇用他们来完成实际工作。

困惑是要排除那些没有正确基础知识的人。如果您想测试技能,请准备一些事情(您或您的“优秀程序员”)可以详细介绍,并专注于申请人必须考虑一会儿的事情。他如何处理自己不立即知道解决方案的问题?


1

我认为您不应该在面试中谈论激情。坦白说,听起来像一家公司在寻找“激情”,实际上意味着“为这个想法不花钱”。

激情甚至不能保证卓越。我的意思是,我几乎一生都花时间编程,阅读编程,学习诸如Erlang或Clojure之类的疯狂语言,而我却没有得到任何报酬。但是我很喜欢编程。

我认为优秀的程序员应该跟踪他们一直积极参与的成功项目。因此,在访谈中,不需要程序员编写超出基本FizzBu​​zz的任何内容。谈论他们过去的项目以及他们做了什么。您是在雇用程序员来解决Rubik的多维数据集并计算弹珠数量,还是从事大型和大型且精疲力尽的 50多个coe的软件项目?


1

http://www.inter-sections.net/2007/11/13/how-to-recognise-a-good-programmer/

从文章:


项目符号中的标准

因此,总而言之,这里有一些指标和反指标可以帮助您认识一个好的程序员。

积极指标

  • 对技术充满热情
  • 业余爱好节目
  • 如果鼓励的话,会在技术主题上大声疾呼
  • 多年来重要的(常常是众多的)个人附带项目
  • 自己学习新技术
  • 对哪种技术更适合各种用途提出了自己的看法
  • 对于使用他不认为“正确”的技术工作的想法感到非常不舒服
  • 显然很聪明,可以在各种主题上进行精彩的对话
  • 在大学/工作之前很久就开始编程
  • 在CV雷达下有一些隐藏的“冰山”,大型个人项目
  • 各种无关技术的知识(可能不在简历中)

负面指标

  • 编程是一项日常工作

  • 即使鼓励,也不要真的想“谈论商店”

  • 在公司赞助的课程中学习新技术

  • 很高兴与您选择的任何技术一起工作,“所有技术都是好的”

  • 看起来不太聪明

  • 在大学开始编程

  • 所有编程经验都在简历上

  • 主要专注于一两个技术堆栈(例如,与开发Java应用程序有关的一切),没有其他经验


您介意进一步解释它的功能吗,为什么在回答所提问题时推荐它?在Stack Exchange上不太欢迎“仅链接的答案”
gna13 2013年

0

一个优秀的程序员也将能够与那些低频谱的同行一起工作。只要他们能够进行测试并且不沉迷于自我,那么您就有一个不错的候选人,不是吗?

那个fizzbuzz测试虽然很有趣。我能想到的解决方案使用模运算符。我只能通过计算字符表映射坐标来知道(在学校或大学中从未提及)。普通程序员甚至会知道吗?或者我接受过废话教育?


令您惊讶的是您没有遇到模运算符。我用一年来学习的各种语言介绍了它。

2
如果您在大学攻读CS专业,则Modulo操作员正在编程101

令人惊讶的是,诸如移位和模之类的东西在大学中被跳过了
Claudiu

我认为这取决于他们想在大学教给你什么样的东西。我认为我从未在实际问题中使用过模数,也没有明确地教过它。但这在此类练习(以及考试题)中非常普遍。
星际

2
实际上,他们俩都是在小学任教的。在那个阶段,它们被称为“余数”和“乘以10”。
直觉

0

我使用的一个标准是看到他在学术或专业项目中使用的“种类”的语言和工具,以及他究竟取得了什么成就。他是否一直在使用标准库(总是C#或VB6的家伙)在应用程序级别上工作?还是他在Linux中使用C进行了一个项目,处理诸如指针,内存管理,递归,进程同步,互斥,事件等硬核问题。如果他一直在某些抽象层下使用这些核心和基本概念,我将感到怀疑。

这显然是在让他编写代码之外。没有什么可以替代。但是,我确实要满足以下事实:有些人可以比其他人更快地编写代码,并且在面试时,人们的响应时间有所不同。


递归,过程同步,互斥。无论您使用C#,VB.NET,C还是汇编语言,这些技术都同样重要。

-1-这是完全错误的。语言和工具的“种类”是100%“无关的”。
Morgan Herlocker 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.