面试中的双人编程

41
我们公司在考虑取消面试流程,改为让每个应聘者与一些程序员坐在一起进行4-5小时的编程对话。理论上我觉得这个想法不错,但是我不确定如何才能让每个应聘者都有公平机会。他们的表现评分应该怎么做?应该根据程序员当天的工作来判定评分吗?
如果你们对这个想法有任何想法或建议(好的或坏的),或者如何使其成功,欢迎分享。
编辑:
结果 - 按要求提供
我们将按照以前的步骤进行第一轮面试。先电话后面谈。我们不再安排第三轮面试,而是邀请3名开发人员与我们团队的其他7名成员一起共事。我们决定让团队自己决定谁最适合被雇佣。
我们之所以做出这个决定,是因为我们相信这将赋予开发人员选择自己工作伙伴的权利。另一个原因是团队协作。我们认为拥有良好的团队协作非常重要,但在雇佣一个人之前很难判断他是否适合。
因此,我们会继续进行编程对话,但方式和初衷完全不同。
欢迎分享任何想法或对此方法的批评!(此编辑内容发布为答案,如果您认为这不是最好的方法,请随时进行反对投票)

Ted - 让我们知道你们决定做什么! - Gavin Miller
2
没有“团队适应性”,你永远无法发挥某个人的最大潜力。这是一个有趣的想法。然而,有时候与团队略有不同的人可以推动他们朝着新的方向前进。我会保留否决团队做出的决定的权利。 - adolf garlic
3
没有必要使用否决权,因为只有足够优秀的开发人员才能进入团队决策阶段。泰德的做法向团队传递了一个积极的信息,即公司信任集体判断。否决权会传递非常负面的信息,即公司只在团队意见与负责流程的经理一致时才重视团队的意见。 - richj
13个回答

33

除非你在现实开发中广泛使用配对编程,否则我非常不建议使用它。我遇到过很多高素质的专业开发人员谈到他们对配对编程有强烈的厌恶感,而这种过程可能无法很好地评估他们的技能。


1
那是我们害怕的事情之一。 - Ted Smith
也许你可以在面试中提供它,或者对一些你知道存在各种问题的代码进行代码审查。 - Quibblesome
14
我将“strong aversion to pair programming”翻译为“宁愿上网冲浪”。 - adolf garlic
在谷歌搜索你忘记的语法和API并不意味着你是一个糟糕的开发者。让我们不要这么狭隘 :) - Thiago C. S Ventura

12

我希望你已经走过了很多步骤。为了使这个工作成功,你需要一份出色的简历和电话面试。你不想花费大量时间在本来就不应该与之交谈的候选人身上。

那么您建议进行初步面试并可能将第二次面试安排为代码协作会话吗?- Ted Smith(1分钟前)

是的。你甚至可以考虑使用像CoPilot这样的东西,通过网络进行简单的编码面试。


那么您建议进行初步面试,可能将第二次面试安排为配对编程会话? - Ted Smith

12

最简单的方法是给每个人同一个程序员和完全相同的代码。

问题在于,招聘并不像编程一样有一个逐步的过程来得到正确的答案。虽然你可以采用多个步骤使决策更容易,但你必须评估每个人的优点等,并基本上通过教育猜测出最好的招聘人选。有时你的猜测可能是错误的。

另一个需要注意的关于结对编程的事情是候选人完成这种测试所需的时间。如果我正在找工作,我会对那些要求我做这个测试的公司进行怀疑。为什么?因为这需要很多时间,如果我正在多个地方面试,我可能会花费几天的时间去参加我可能甚至不想要的工作面试。像谷歌或微软等公司是例外,但大多数公司都不像这两家公司。(更不用说如果他们在处理真正的代码,你实际上是在要求他们免费为某人工作)。


1
如果有公司邀请我参加周六的面试,其中一部分是进行配对编程,而这个公司在配对编程方面很擅长的话,我会毫不犹豫地接受这个机会,因为我想学习配对编程。我喜欢难度较高的面试,因为这样我更有可能与我尊重的人一起工作,如果我得到了这份工作的话。 - Ian Ringrose
我喜欢面试中配对的想法,尤其是如果公司经常使用配对,因为这可以让双方更好地了解是否适合。除非面试官擅长引导面试者完成编码练习,否则似乎比随机编码练习更有益。但是,我同意时间可能是一个问题。我曾经参加过这些面试,有些时期感觉很好,而有些时期感觉浪费了几个小时:一次是因为开发人员没有在适合配对的项目上工作(特别是考虑到我的背景),另一次是因为环境问题一段时间内阻碍了有用的工作。 - Cincinnati Joe

10

我刚刚参加了一家总部位于旧金山的公司的面试,该公司以敏捷方法等著称。我要面试的是CEO本人。我在这个行业有大约20年的经验,但从未进行过配对编程或使用TDD方法进行开发。我被告知这将是一次“编程面试”,但不知道会发生什么,在我们开始之前,那个人说他认为我可能会同意所有面试都应该这样做(回想起来,这只是一种傲慢的说法)。

无论如何,在面试中,练习是使用TDD开发一个类。我需要花费一些时间来调整整个过程的思考方式,因为我从未进行过配对编程或TDD。虽然我偶尔会犯错,但最终表现还可以。但他的回复是我没有展示出他们对于配对编程环境所需的积极的来回交流的特点。现在,这也可能是一种含沙射影的方式,表达“我认为你表现得不太好”的信息。

幸运的是,我并不需要这份工作,说实话,这次经历让我意识到,与其成为一名必须每天与人合作开发代码的软件工程师,我宁愿找到另一种职业。奇怪的是,有时我也会与其他人同时编写代码,所以任何事情都有可能发生。

最终,我想这是一个好结果,因为他们认为我不适合他们的工作方式,而我也不喜欢他们的工作方法。但如果我再多谈几分钟关于自己的情况,并且他给我更多关于他们工作方式的信息,我们也会得出同样的结论。也就是说,有其他方法来找到合适的候选人,而不是让他们与完全陌生的人进行配对编程的压力测试;在我看来,这是一种虚假的衡量能力的方式。


10
作为个人的轶事,我因为这种技术在一次面试中受到了打击。我已经通过了简历筛选和代码提交等环节,这是面试的面对面部分。
我刚毕业,之前从未进行过结对编程或TDD。他们让我做一个纸牌游戏的练习,但是我失败了。我不明白为什么面试官会编写看起来很愚蠢的测试(例如“返回null;”),而且他们也没有解释原因。当然,因为我对TDD不熟悉,我也不知道该问什么问题。最终的结果是,看起来像我连编程都不会。
如果你要做这种类型的练习,你需要考虑到面试者的情况,因为他们的能力水平会有所不同。这意味着你会得到不同的评估结果,可能并不基于实际才能,因此会有很大的偏见。
现在我理解了TDD,我知道这种测试的作用以及它应该如何工作,但那时候它看起来真的很愚蠢!

我将结果扩展为答案,因为我想进一步详细解释,而评论无法提供这样的信息... - Ted Smith

7

有一家公司采用了一种称为“极端面试”的技术。在极端面试中,他们会带来大约30名开发人员,并将他们分成15对。他们会解释说,他们正在寻找与他人合作良好的人才,并且将仅根据他们与他人合作的能力做出招聘决策。

他们会提供一个问题让这些配对的人来解决。他们强调他们不关心解决方案,只关注每个程序员与他人合作的能力。对于每一对,他们都会提供一个观察者。在大约2到4小时的练习过程中,观察者将记录下一个人与他人配对的能力,而不是解决方案。

他们惊讶地发现,有很多程序员专注于解决问题,而不是合作。在15对中,他们将确定4至6名开发人员进行第二轮面试。这些开发人员将被要求回来与团队共事一周(他们会得到报酬)。一周后,他们决定留下谁。通常只有一半左右(2至3名开发人员)。

当他们完成时,他们拥有能够协作的开发人员,并且在与各种配对工作一周后,团队有了一个强有力的指标,可以有效地开发软件。这个过程既创新又有效。他们雇用的人员成功率很高。


4
为什么他们感到惊讶?通常真正的项目是通过最终结果来评判的,即通过“解决问题”,而不仅仅是因为试图“解决问题”的过程具有良好的协作而受到评价。请问需要翻译哪种语言? - Liran Orevi
对我来说,这听起来是一个很酷的面试。 - Alex Baranosky
4
有趣,但他们能找到多少有经验的开发人员愿意花一周时间与他们合作呢?在美国,从现有工作中抽出一周时间可能会很困难。而那些未被雇用的人可能会觉得这是浪费时间。 - Cincinnati Joe
1
哎呀!使用这种方法,似乎工作职称应该从开发人员改为协作者。 - igor

7
我几天前参加了一次双人编程面试,但实话说,我并不喜欢这种方式。在面试前一天通知我要进行双人编程面试,然后面试官告诉我,在公司里我最终都需要进行双人编程。我来到办公室后与一位非常资深的软件工程师配对,这家公司位于旧金山,是一家以双人编程而闻名的公司,所有人都在办公室里进行双人编程。起初似乎没什么问题,他向我介绍了他们使用的所有工具、他们自己构建的单元测试框架以及项目的一些细节。然后他基本上写了一堆单元测试,并希望我完成实现使其通过。顺便说一下,已经存在的代码库非常庞大,我会说有10k行代码,虽然不像一个超级复杂的项目,但对于一个没有先前理解类层次结构等的人来说确实很复杂。我真的很难相信他期望有人直接进入一个已经存在的10k行源代码中。这根本不符合双人编程面试的要求,如果是较小的代码库将会更好。由于我被已经存在的大量类/代码所压倒,我从导航类和来回移动中挣扎了一会儿。老实说,这让我的面试过程非常糟糕。最终我并不是很满意。在大学课程作业中,我并没有做过双人编程。
对我而言,双人编程的优势在于当你已经熟练/熟悉你的配对对象时可以被发挥,但真的不适合面试。有时我想问我的配对对象问题,但我认为如果问太多问题,那么他们会认为我很笨,无法胜任工作。如果这已经是真实的工作,我不会犹豫去问,但在面试中很难做到...你想问因为你的配对应该帮助你解决困境,但同时这是一次面试,所以你不能问太多。
这只是我在双人编程面试中的经历,如果你真的想这样做,我的建议是:
1.确保不要让候选人使用一个大型代码库,使用一个较小的代码库,使他/她能够最大限度地展示自己的技能
2.在进行双人编程面试之前告诉候选人,当你陷入困境时,你是否可以询问问题,你是否能够做这个或那个,你不能做什么
3.尽可能详细地说明
最后,我不建议这样做。很难衡量候选人在双人编程中的表现,并且可能存在偏见。

3
我喜欢这个想法。但是我认为它可能很难做到,因为这需要候选人对你将与他一起配对的项目有一些了解。此外,4到5个小时似乎有点长。如果您立即发现不会成功,您会和候选人一起坐整个会话吗?
好问题。值得思考。

2
从我的有限经验来看,我有些复杂的感受。我喜欢将配对作为面试的一部分,尤其是如果公司经常使用配对,因为这可以更好地了解双方是否匹配。作为候选人,我经常参加面试,在那里我坐在房间里回答问题几个小时,但之后并没有很好地了解他们的工作环境。除非面试官擅长让人通过随机编码练习,否则配对可能比随机编码练习更有益。我喜欢能够从两个方面讨论技术问题。作为一个候选人,我宁愿与某人互动,而不仅仅是自己回答问题或解决代码问题。
但是......正如其他人所指出的,需要的时间可能是一个问题。我经历过几天的配对面试,发现有些时段很好,而其他时段则感觉浪费了几个小时:一个原因是开发人员没有做与配对相关的工作(特别是考虑到我的背景),另一个原因是环境问题一段时间内阻碍了有效的工作。如果工作不起作用,为此请假一两天会很令人沮丧。
一个尝试这种方法的地方不确定是否应该让公司外的人员在客户项目上工作。他们还担心解释领域和正在进行的工作会花费太长时间,尽管没有这样做,候选人可能无法做出贡献。因此,他们选择了一个员工正在开发的开源项目。
这似乎是一个关键点:需要选择一个候选人可以快速理解并能够为其做出贡献的任务。后者将在一定程度上取决于候选人的技能。员工评估这种方法的能力也很关键。并不是每个人都擅长普通面试,而这在配对面试中可能更加真实。
此外,如果一家公司不经常进行配对,则这种类型的面试可能没有那么有用。看到别人编码似乎有好处(正如Joel Spolsky所指出的),这可能是一个很好的方法。但是,如果配对不是工作的典型部分,那么可能不适合完全的配对会话。也许是修改过的版本。
我很想知道采用这种方法的公司对结果的看法。阅读这个问题的其他答案表明,从候选人的角度来看,它并不总是理想的。

2

为什么不呢?而且,面试并不总是(或从未)公平的。您应该将新方法的最终结果与传统的基于面试的方法进行评估。

此外,在配对编程会话之前进行一次小型面试可能是有好处的,可以避免花费程序员时间在那些不适合的人身上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接