双人编程意味着每个开发人员的成本加倍。这样的钱值得吗?

40

在敏捷开发中的“配对编程”要求我们将单个程序员的工资翻倍。当然,这种方法可以大大提高代码质量、更早地发现错误等等,但这样花费的钱是否仍然值得呢?也许我们应该将第二位开发人员的薪水支付给几名测试人员(后者通常比合格的程序员便宜得多)?有没有人有这样的比较经验呢?


3
不仅是减少错误和提高质量......它关乎共享理解。就像瓦肯人的心灵融合。请参见我的回复。 - Charlie Flowers
我想回顾一下,这个问题的大部分答案,包括我的,都是基于轶事和猜测。现在值得点赞的答案都在底部。它们实际上引用了一些关于这个主题的适当研究。我建议未来的读者去寻找科学收集的硬数据。它们是可以找到的。 - i_am_jorf
21个回答

55

你如何知道单打独斗的程序员更加有效率?我有时认为单打独斗和成对编程就像童话故事中的兔子和乌龟一样。

成对编程不会陷入数日的低效工作。我不知道有多少次看到开发人员花费数周时间来处理后来被更简单的东西所替换的任务。一个“进入状态”的单打独斗的程序员常常会做些愚蠢的事情。当你想要的是用更少的代码产生更多的效果时,只是太容易写出过多的代码。

长远来看,当尘埃落定时,你会发现有成百上千行代码本可以不写,因为有人不了解库X或技术Y。成对编程改善了这个问题,但并没有完全解决它。它鼓励个体和配对在陷入无意义的代码狂热之前进行更多的研究。

我希望我能够更多地与人配对......


6
作为一名有经验的开发者,我可以告诉你,在配对工作中,典型的任务需要花费2-3倍的时间(因为要解释我正在做什么以及为什么要这样做),但是如果我独自完成这项任务,那么能够快速掌握这段代码的人数将减少到1个。 - plinth
1
有经验的开发者犯的愚蠢错误较少,但也有机会挖掘比经验不足的开发者更深的坑。有时候这些坑可能在错误的位置 :) 配对编程不是关于你向另一个人解释。 - krosenvold

18
我们公司使用这种方法,但只用于困难的任务或当你对别人已经完成的工作不确定时,我认为这种方法非常有效。这样可以避免陷入困境,并在必要时与人交换想法,同时仍然能够独立处理大多数简单的任务。
我还相信这比代码审查更有益,代码审查是我们公司另一项工作。 在进行代码审查时,往往很难完全了解其中的情况,而不提供重要的上下文,此时您可能没有时间考虑所有细节。 而通过配对编程,您可以从一开始就获得上下文,并有更多时间思考可能会导致问题的边缘情况。

15

尽管我赞同目前为止大部分关于双人编程是好事的回答,但我会担任魔鬼的代言人并认为它并不总是有意义的。

当你配对时,并不会得到一个大脑加倍的程序员。你会得到一个由你们两个大脑的联合体组成的程序员。因此,基本上每当我犯错并且我的搭档找到更好的方法来解决问题,这是一种优点。然而,每当我自己写出正确的代码时,这是一种浪费金钱的行为,因为我的搭档不需要。

基本上,你需要评估你正在处理的代码。简单的任务通常不值得支付某人坐在你旁边以确保你正确编写for循环的报酬。然而,在某个阈值处,任务足够复杂,使得双人编程的投资回报率变得合理。


3
对此的反对意见是,在双人编程中可以传递知识。如果你自己编写正确的代码,有人看着你,他们可能会学到更好的做事方式,并且可能会更加熟悉问题、库和代码库。 - shapr
2
我同意,但我的观点是对于简单的任务来说,配对编程没有意义。如果任务很简单,那么很少有知识会被传递。如果我只是在文本框中输入和输出值,你并没有真正学到什么,因为希望你已经知道如何做了。在这种情况下,配对编程仍然是毫无意义的。 - Jacob Adams

13

通过双人编程,你将获得:

  • 更高质量的代码
  • 更好地分配内部知识
  • 更多的团队精神

你不会比这获得更多的投资回报。

然而,你也不应该将其用于所有任务。


我认为它永远不应该在所有任务中使用!有许多编程任务绝对应该自己完成。 - Iralda Mitro
4
@Gamecat - 总体而言,我同意你的观点。但是在非配对环境中也可以看到更高质量的代码。如果强制进行编程配对,那么团队精神可能不会增强。我曾经有这样的经历,感觉很糟糕。当然,这也不是真正的敏捷开发方式。但是,编程配对可以鼓励你列出的那些事情。 - Don Branson

12

如果完成一个任务只需要半个开发人员单独完成所需的时间,那么就不意味着成本会翻倍。我认为,在处理困难或低级别任务时,这是有帮助的。我发现这很值得,因为你有人可以在它真正花费你时间和金钱之前说“不要做那个!”

我曾经编写过操作系统等类似工作,有人坐在我旁边进行逻辑检查是非常宝贵的。


9
很难说 - 我在强制配对的环境和自由选择配对的环境中工作了很长时间。我见过的最高质量的代码并不是在配对环境中编写的。这可能更多地与个人开发人员的素质和纪律有关。有时,当一些程序员水平不够高时,你会从配对中受益匪浅。但如果所有程序员都是经验丰富、纪律良好的程序员,如果他们一直在配对,那么你只是在浪费钱。
我曾多次有过一种经历,对我的编码纪律和产品质量产生了巨大影响:携带呼叫器。当我必须支持一个我编写的系统时,它改变了我的编码方式。也就是说,我编写的方式是为了避免那个呼叫器响起。结果是更好的产品质量,通常也是更好的代码质量。我见过的从未携带呼叫器的程序员编写的代码更加脆弱。除非他们参与支持,否则他们甚至无法理解和改进它。

同意支持你所建立的东西。 一旦我不得不支持我所建立的网站,我就学到了更多关于建立网站的知识。 - Darren Greaves

9

在我们的工作中,我们一直使用配对编程。关键是要知道哪些任务应该成为一对完成,哪些如果由两个开发人员完成将是“浪费时间”的。 经验法则是,更注重研究的任务(即 POC 和 spike)以及新功能的开发应该成为一对完成(这样知识就存在于多个头脑中)。 更加平凡的任务,例如 CI 服务器安装或插件图标的替换,则由单个开发人员完成。 另一个因素是团队成员的当前可用性和本次迭代中要完成的当前任务。


7
发现缺陷/bug越早,修复问题就越便宜。因此,用钱来雇佣更多的QA人员而不是其他开发人员会花费更多的时间和金钱,因为需要从DEV到QA进行很多次旅行。
话虽如此,双人编程并不适合每个人,有些开发人员无法良好配对,他们会互相干扰、浪费时间打架等等。
如果您有能够进行双人编程的开发人员,那么在长期运营中,这将更加有益,因为可以添加更易维护的代码,减少缺陷,从而减少在QA上的时间,并且最重要的是,如果其中一位开发人员出现意外,您不必等待其他人了解项目后才能继续工作。
如果您的开发人员无法进行双人编程,请不要强迫他们这样做,否则只会浪费时间和金钱。

7

不需要,每个程序员仍然只会得到一个薪水。

如果你不称之为“配对编程”,你认为你的程序员就不会相互交流吗?你认为编程是完全可并行化的吗?


7
双人编程可以非常有效,但你不应该成对招聘程序员。你不能强制开发人员进行双人编程。只有当两个开发人员相互协作并决定他们可以相互学习并一起构建出优秀的东西时,它才能起作用。我的建议是尽可能地聘请最聪明的开发人员,并将他们置于一个自然倾向于鼓励兼职双人编程的环境中。开发人员需要能够独立编码,但也需要与团队中的其他人交流。

找到适合您和您公司的正确组合将更多地是一种艺术而不是科学,肯定不是您可以通过盲目遵循某些已发布方法论的要求来完成的。

即便如此,在提交之前消灭更多的错误,长期来看将会节省更多的时间。在您构建架构时,让另一个开发人员观察总是比之后由测试人员黑盒测试要更加有效。我认为这是花钱值得的。


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