自从我开始工作以来,我已经面试了大约60名开发人员,我仍然在徘徊如何提高我作为技术面试官的技能。我从来没有一个表格来解释如何进行面试。这些年来,我改变了采访别人的方式。我也降低了我的期望,因为我没有从事需要世界级开发人员的项目。
法国IT市场
在谈到招聘之前,我必须介绍法国IT市场,因为它是一个非常具体和特殊的市场。在法国,技术工作被低估了。这在许多国家都是如此,但这种现象在法国非常发达。
只有极少数公司重视技术领域的经验,特别是在IT领域。这意味着,超过35岁,如果你仍然是一名开发人员,你就是一个“宽松者”,你可能会挣扎到40岁以上才能找到一份新工作。你的薪水很快就会停止增长,因为你变得太贵了,不适合“一个初级学生可以做的简单工作”。我的一个朋友没有得到开发人员的职位,因为他不够雄心勃勃(这意味着他没有说他想在5年内成为一名经理)。
因此,大多数优秀的开发人员都转向管理,职能工作,离开法国或成为独立人士(这是留在技术领域的罕见方式之一,但它需要不仅仅是一个开发人员,因为它涉及管理一个人公司)。
法国IT世界或多或少是一个双速市场:
- 向其他公司销售应用程序或顾问(即技术人员)的承包商公司(如Atos,Cap Gemini,Accenture),
- 为消费者生产产品或服务的“客户”公司(如道达尔,赛诺菲,欧莱雅,法国巴黎银行,Orange)。
很难被“客户”公司雇用,因为法国劳动法过度保护,因此这些公司很难解雇一个人,即使他非常糟糕。相反,他们更喜欢使用昂贵的顾问,他们可以随时解雇(钱流向承包商公司,而不是顾问的口袋)。此外,法国社会是精英主义的,你的硕士学位和你学习的大学对于在这些公司找到工作非常重要,即使在你获得文凭10年后也是如此。因此,许多优秀的IT人员最终不愿意在承包商公司工作,在那里他们多年来一直担任同一“客户”公司的顾问,而没有公司的良好利益。
注意:法国也有小公司和初创公司,但许多开发人员最终进入承包商公司,少数在“客户”公司。
我是从未为承包商公司工作过的幸运儿之一,但我仍然徘徊在我的未来。我面试过的大多数候选人都是来自承包商公司的顾问。由于顾问价格昂贵,客户公司希望他们“随时可用”。顾问的简历有时会由承包商修改,以便完全符合客户公司的需求。很多时候,顾问没有通过技术面试,这就是为什么承包商修改简历以轻松出售顾问的原因。我在承包商公司有朋友,他们中的一些人在面试前发现他们的简历被修改了。顾问有时会被承包商强迫接受任务(即使它很远,或者他们不喜欢任务的技术),否则他们就会被解雇。事实上,这就是承包商公司可以轻易解雇人员或让他们想离开的方式。
注意:这不是一个非黑即白的情况,我遇到过一些人很乐意为承包商公司工作。
采购
在面试之前,有采购。我们首先需要提供正在寻找的技术技能的描述以及我们正在从事的项目的描述。然后,经理将其发送给许多承包商公司。在员工和实习生招聘的极少数情况下,经理将其直接发送给人力资源服务部门。
我经常试图降低要求,因为有人不可能完全符合我们正在寻找的东西。例如,在之前的一个项目中,我们要求一个擅长13种不同技术的人,包括3种非常具体的技术......这种WTF要求是法国的特殊性,称为“五足羊”。在我目前的大数据项目中,我们只在寻找优秀且积极进取的Java开发人员。
当我们与顾问打交道时,人力资源服务没有预先选择,所有工作都由技术团队完成。顾问的价格由人力资源服务决定,并不取决于顾问的技术技能(尽管有一些非常罕见的例外)。
一开始,我仔细阅读了每份简历,但在几十份简历之后,我意识到这需要花费很多时间,特别是当你有一个项目要完成的时候。我成了一个“关键词阅读器”的人,这有点讽刺,因为我成为了我过去鄙视的那种招聘人员。我看了不到30秒的简历,如果我觉得它很有趣,那么我会更仔细地看它。我知道通过这样做:
- 我正在失去那些不知道如何写出好简历的好人选,
- 我正在失去与我们的需求仅匹配的优秀候选人,
- 我鼓励承包商和候选人伪造他们的简历。
但是我不能花太多时间在这些东西上,毕竟我是一个开发人员。
如果简历完全符合职位要求,我会在互联网上仔细寻找候选人,因为它看起来非常可疑。否则,我仍然会在网上快速寻找候选人。当我有时间,我看到一种未知的技术时,我看得太粗略地理解它,以便能够提出非常简单的问题。
现在,让我们谈谈采访!
我作为候选人的经验
在談論我如何處理面試之前,讓我們來談談我作為受訪者所獲得的一些面試。我没有做过很多面试,但他们都帮助我塑造了我成为的面试官。以下是我作为候选人的2个非常不同的经历。
我最糟糕的经历
我最糟糕的面试是初级Java开发人员职位。当时,我对java的体验是为期6个月的实习。我做了一个人力资源面试,然后做了一个关于java的一小时MCQ,几天后被叫去参加技术面试。技术面试官向我提出了超出我初学者水平的具体问题,并且居高临下。结果我失去了自信,无法回答简单的问题。在这次采访中,我真的觉得自己像一个拳击球。如果我今天必须做同样的采访,我想我会在面试期间离开。当然,我没有得到这份工作(你感到惊讶吗?)。
我最好的体验
作为候选人,我接受的最好的面试是在微软。面试官很好,问题很有趣(虽然这是主观的)。但问题来了:我有一个人力资源电话,一个小时的在线练习,一个小时的技术电话(我真的很喜欢),一个5轮面试(有些非常有趣),在5轮面试的中间发现,这个职位主要是关于做SQL查询的(而我认为它会涉及复杂的算法)......最后我没有得到这份工作,因为他们理所当然地担心我会感到无聊,我被提议安排另一轮(更少的面试)从事一份技术性更强的工作,但我拒绝了,因为这既累人又耗时(当时微软的未来是不确定的)。
虽然我真的很喜欢这些面试,但如果真正的工作需要这个水平的5%,我不认为有必要在算法和数据结构方面要求一个非常好的水平。
在我的职业生涯中:
- 我从来没有编写过自己的排序算法,
- 我从来没有编写过自己的自我平衡树,
- 我从来没有用过递归,
- 我很少创建“敏感”算法。
尽管如此,由于我的大多数项目都在处理大量数据,我对时间复杂性的理解帮助我优化了流程。
在我的空闲时间,我有时会看算法和数据结构,因为我喜欢它(我目前正在看量子算法,很棒的东西!但是我理解所有批评“类似谷歌”的采访的开发人员,尤其是Web开发人员:为什么你需要知道动态编程或分而治之算法来做MVC,MVP或MVVM?
我知道“类似谷歌”的面试是一种观察候选人如何思考的方式,但是不习惯编写算法的人将很难回答,这并不意味着他很愚蠢。因此,许多“类似谷歌”的候选人正在使用书籍或网站(如glassdoor,careercup和geeksforgeeks)来大脑转储许多execices。
我作为面试官的经历
对我来说,一个好的面试是一个很好的技术讨论,我和候选人都会学到东西。在技术面试的这一端(持续1小时到2小时之间),我必须能够判断候选人是否优秀。这就引出了另一个问题:什么是优秀的开发人员?
一个好的开发人员
优秀开发人员的定义与开发人员的定义一样多。当我开始工作时,我的定义非常专注于(学术)解决问题的能力以及快速找到问题解决方案的能力。但我意识到,除非你在某个特定领域工作,否则这些技能对日常工作并不重要。所以,这是我目前的定义。
一个好的开发人员是这样的人:
- 知道何时寻求帮助
我的意思是,他知道当他面临太困难的事情时,所以问别人比在一个问题上浪费几天要好。要做到这一点,开发人员需要知道他的水平,而不是太骄傲地寻求帮助。此外,他还需要知道自己何时面临简单的问题,这些问题可以通过思考/谷歌/堆栈溢出来快速回答,而不是寻求帮助并浪费同事的时间。
- 能够快速理解新闻语言和概念
一个项目涉及许多技术,这些技术会发生变化,因此开发人员必须能够快速理解新技术(没有掌握它,大多数时候它是无用的)。我必须承认,“速度”的概念是非常主观的。
- 是合乎逻辑的
逻辑对于开发人员来说非常重要,但我曾与不合逻辑的开发人员一起工作。我说的不是超级逻辑,而是很好。例如,在处理数据时,我们经常需要处理和筛选数据。我见过一些开发人员在过滤数据之前处理数据...
我曾与一位开发人员合作,他没有寻找一种方法来替换许多linux文件中的单词(例如使用sed甚至编写一个简单的程序),而是花了4天时间手动完成...
- 可以单独解决问题,并从以前的问题中学习
我认为能够面对一个问题并能够独自解决问题是很重要的。如果有人总是需要帮助,他会降低团队的工作效率。当然,来自google/stackoverflow的无脑复制粘贴并不能解决问题。我还与寻求帮助的开发人员合作,他们无法看到他们已经面临这个问题。
- 愿意改进自己的代码
“好代码”的概念是非常主观的。对我来说,一个好的功能必须在不滚动的情况下阅读。我遇到过一些人,他们更喜欢在同一个函数中放置一个完整的算法,因为它对他们来说更具可读性。我们俩都没有错,我们只是对什么是好代码没有相同的定义。
一个好的开发人员会思考如何对需求进行编码,以便尽可能地可读和维护。他还需要对自己的工作持批评态度,并愿意提高自己。
- 能清晰地表达自己的想法
这一点非常重要,因为开发人员经常会与技术人员和非技术人员进行交流。
- 具有我正在寻找的技术的平均水平*
我不认为了解特定语言是成为优秀开发人员的必要条件。但是,由于我主要采访那些被认为“准备工作”的顾问,他们必须至少有一个平均水平。此外,拥有共同的技术有助于我了解候选人对该技术的了解程度,有时甚至是他是如何学习的。
- 充满激情*
虽然我喜欢看到对编程的热情,但如果一个候选人在空闲时间不阅读或做代码,我不能责怪他。此外,为承包商公司工作(这是大多数法国开发商所做的)是激情杀手。对我来说,激情不是成为一名优秀开发人员所必需的,而是成为一名伟大的开发人员,这不是我们需要的,因为我们没有做火箭科学(就像98%的IT项目一样)。当然,充满激情并不意味着好。事实上,与我共事过的最好的人只在工作中做IT。但他们很聪明,知道他们的东西,并在需要时停留更长时间。虽然我无法与他们分享这种激情,但与他们一起工作真的很愉快(我甚至与他们中的一些人成为了朋友)。
话虽如此,我目前正在研究大数据,那里的技术是新的,并且发展迅速。这就是为什么我目前更喜欢一个充满激情的候选人,因为他更有可能了解最新的技术(但这不是强制性的)。
我的面试方式
面试次数取决于职位类型,但大多数情况下:
- 实习生将进行人力资源面试,然后是技术面试,然后是经理面试,
- 顾问将进行技术面试,然后与经理或多合一进行面试,
- 员工将进行人力资源面试,然后进行一次或两次技术面试,然后与经理进行一次或两次面试。我只做过一次,因为我们很少招聘员工。
我没有任何订单来做技术面试。有时我从展示我的项目开始,有时让候选人展示自己。大多数时候,我让候选人(或其他面试官)选择顺序。
当我有时间时,我会在采访前读到关于这个家伙使用的未知技术。当简历中的经历看起来很奇怪,或者如果我对一种未知的技术感兴趣时,我也会准备一些问题。
我经常从询问有关候选人使用的技术的“反废话”问题开始。
然后,我喜欢问一些关于这个人在他的项目中使用的技术/架构的广泛问题。大多数时候,我让候选人介绍他的经验,并提出我准备好的问题和/或我广泛的问题。我不知道在面试前我要问什么样的宽泛问题,这真的取决于候选人。但以下是我在讨论期间试图看到的:
- 候选人如何学习技术/科目,
- 他学到了多少技术/科目,
- 他面临的技术/管理问题以及他如何解决它,
- 他选择一个解决方案而不是另一个解决方案的原因,
- 如果我为他面临的问题添加更多约束,他提出的解决方案,
- 他如何与人合作,
- 如果这个人理解他在以前的经历中做了什么(技术和功能上),
- 如果这个人是可以理解的,
- 当他不知道答案时,他的行为方式,
- 当我错了的时候,他的行为。
我是纸和铅笔的忠实粉丝,所以我和候选人都可以表达我们的想法。当候选人无法回答问题时,我会尝试提出其他问题,这些问题将导致我最初的问题。但是,如果他仍然无法回答,我会给他一个我期待的可能答案。
当我介绍我的项目时,我经常告诉候选人,如果他愿意,他可以提出问题。我喜欢被问到问题,甚至被挑战。这是一个很好的方法,看看候选人是否能快速思考问题并暴露他的观点。但这种情况很少发生,我知道我不是一个普通的面试官,所以大多数候选人不习惯问这类问题。
我不要求真正的代码,因为我不相信我能从看到某人在短时间内编码而紧张地学习。我至少需要半天(一整天会更好)与候选人一起做结对编程,以解决一个真正的问题,这对我和候选人来说太耗时了。由于我从未尝试过,我可能是错的。谁知道呢,也许明年我会向候选人询问FizzBuzz和斐波那契。
我也不相信要求一个副业项目。我的一些副项目编码不良,未完成,其中大多数都是无用的,因为它们不适合被其他人阅读,我没有时间也没有意愿写一些干净而健壮的东西。
此外,要求副项目会过滤所有没有激情的开发人员和没有副业的有激情的开发人员,这意味着很多潜在的好人选。作为候选人,我不会为那些只要求这类候选人的公司工作,因为我认为他们会让我在空闲时间工作。
虽然我没有做过数百次面试,但我多次遇到过一些情况。
胡说八道的人
我必须区分2种骗子:
- 那些撒谎一点的人,
- 那些完全是骗子(胡说八道的人)。
与某些国家/地区不同,我们很少检查法国的参考资料。
我不介意在经历上被骗,如果候选人真的有他的虚假经历的水平。但我有时会采访过完全的骗子。我讨厌这种候选人,因为这对我和他们来说都是浪费时间。在纸面上,这些家伙都很好,但在面试过程中我很快就感到失望。
我采访过的最后一位胡说八道的人告诉我,他开发了一种map-reduce工作(大数据的东西),可以在50秒内对250千兆字节的数据进行复杂的数学处理。我再次问他,以确保他没有将千兆字节与兆字节混淆,但不是,这是千兆字节。因此,这家伙在一个强大的平台上工作,可以每秒5千兆字节的速度读取和处理数据,这还不错!更不用说Hadoop(一种大数据技术)的开销,它至少需要5-10秒才能运行一个作业,再加上HDFS(大数据文件系统)的网络和磁盘开销。所以那个家伙对我撒谎,但不够聪明,找不到一个现实的谎言。不出所料,在与Hadoop“合作”一年后,他不知道Hadoop集群的关键组件(这是我当时经历的两倍)。当然,他“做了”一些机器学习的东西,但它太复杂了,无法解释......完全是浪费时间。
使用错误的关键词
我必须再次区分2种情况:
- 我开始谈论候选人简历中的关键字,他很快告诉我,他只是在一点点或很久以前才使用过这项技术/概念。
- 候选人不理解简历中的关键字的情况。
我记得我采访过一个人,他多年来一直在开发“实时”银行应用程序。在我看来,Java中的实时应用程序是真正需要了解JVM(Java虚拟机)如何工作以及底层垃圾回收算法的罕见情况之一。我从未研究过实时应用程序,但我对JVM感兴趣,因为它使用了聪明的机制(你可以阅读我关于JVM内存区域的文章)。所以,我很高兴采访这个人来学习新东西。事实证明,他根本没有在实时应用程序上工作,他也不知道JVM是如何工作的。他的“实时”限制是在几秒钟内接听服务呼叫......我很失望,但我把它留给自己。
在这种情况下,我不能直接责怪候选人,因为我不知道是他还是他的承包商放了这个神秘的关键词。
焦虑的家伙
很容易看出某人是否焦虑:你可以通过他的语调,他看着你的方式或一些重复的动作(特别是手指和脚)来快速发现它。我经常试图通过友善或问非常简单的问题来打破僵局,但这通常不起作用。我发现面试一个紧张的候选人非常困难,因为我无法判断他是否因为压力很大或因为他不知道答案而没有回答。我更喜欢专注于候选人所做的项目,并为其添加新的限制,因为我处于他的舒适区,并且(我认为)我更有可能得到答案(尽管有压力)。但我不能每次都这样做,因为我需要高度的专注力来挑战舒适区的人。
当我不同意其他面试官
我单独面试过几次,但大多数时候是与一两个面试官(另一个技术面试官和/或经理)一起面试。以下是我不同意其他面试官的情况,例如:
- 面试官故意向应聘者强调,看看他如何处理压力。在我看来,面试已经足够紧张了。我为候选人感到难过,但在面试中我无法表达我的强烈不同意见。
- 我面临的另一种情况是,当一个候选人不理解另一个面试官的问题时,我也没有:这些问题在技术上没有意义!同样,为了面试,我表现得好像我理解了这些问题,并试图向候选人“改写”问题。
- 我记得的最后一种情况是,当另一位面试官问(我认为是)愚蠢的问题时,比如“JUnit 3和JUnit 4有什么区别”,或者要求一个特定的单词/函数/正则表达式。
尴尬的情况
由于采购一直是作为一个团队完成的,我并不总是决定我们应该面试谁。我最终遇到了几次非常尴尬的情况:
- 在面试之前,我知道这个人不会得到这份工作,因为他的经验不符合我们的需求。我是对的(3次),并为候选人浪费时间感到难过。
- 我面试了一位我一年前强烈反对的候选人。它只发生过一次,但在尴尬量表上是8/10。
最后一种尴尬的情况通常是法语,这是由于承包商公司对待顾问的方式:我面试了一些对工作不感兴趣的候选人,他们只是因为他们被承包商强迫而进行面试。
当我错了
成为一名技术面试官并非易事。你会看到许多具有不同技术背景的候选人。有时,当候选人描述他的项目时,感觉这是不可能的。我总是要求更精确,然后跳到另一点。但我准确地记录了候选人刚刚告诉我的内容,并在面试后在互联网上查看(或询问一些同事)。例如,一位候选人告诉我,他正在使用Struts(一种Web Java框架)来开发WAP接口(移动互联网的祖先)。在整个面试过程中,我认为候选人在胡说八道(因此我在面试过程中有偏见),但在互联网上查看后,事实证明这是可能的!
流程的演变
我不知道这是否只是法国市场,但我面试过的许多高级开发人员充其量只是非常普通的候选人。这就是为什么我们最近在我当前的项目中添加了一个MCQ,其中包含有关java和对象概念的基本到平均问题。如果有人没有通过某个门槛,我们就不会进行面对面的面试(我记得面试持续1小时到2小时)。我真的不喜欢它,因为我认识一些优秀的开发人员无法回答这个MCQ,但这是一种过滤废话和简历“过度优化”的候选人的方法。
不幸的是,我所从事的项目有起有落。这导致我招募的优秀开发人员在6个月后离开(老实说,我理解他们)。我现在更加重视候选人可能会离开的感觉(这是非常主观的)。
结语
在面对面面试的最后,如果我可以说“我可以和这个人一起工作”和“这个人看起来不错”,那么这是肯定的。我有时不得不为一个我相信的候选人而苦苦挣扎,而不是其他面试官。当我觉得一个候选人很好,但我的拒绝率很高时,我从来没有犯过错,这就是为什么我降低了我的三倍。我有时会接受一个我不确定的候选人,因为我们迫切需要人力,而其他面试官喜欢这个人,这导致了好的和坏的开发人员。
如果你从未做过面试,你现在知道幕后发生了什么(或者至少是一种可能的方式)。
如果你是一个技术面试官,我会很高兴读到你是怎么做到的。
无论你是面试官还是面试官,你如何看待我的做法?