自从极限编程的概念出现,我读到了一些材料,大谈结对编程的好处。布道师告诉我们,它将提高代码质量,有利于知识的传播,甚至提高生产率,同时培养开发者之间深刻到灵魂的联系。 (see: spooning).
排斥结对编程的人都被认定为牛仔,懒虫,或社会的隐士。嗯,我不属于这些(至少我不认为),但我仍然讨厌结对编程的想法。下面是我的理由……
我们不再是一种尊重沉默的文化。外向的人赢了。什么事都必须通过协作完成。每个人都必须随时准备好时间给每个人。不再有个人空间,不再有对工作的分担。基本上,我们相信两个脑袋总是比一个更好。
然而对我们来说应该是明显的,这个理论并不一定放之四海而皆准。在编程世界,一些伟大的创新和精妙的作品却并不是从一个团队或一个结对涌现出来的。我想到了Ant,当时Java社区的一个巨大飞跃,只是一个家伙在从欧洲到美国的航班上开发出来的。或者更近的例子,想想做出 MINECRAFT 的 Notch,做 Instapaper 的 Marco Arment,或是做 DuckDuckGo 的 Gabriel Weinberg:这都是单枪匹马干出来的。事实上,世界上最有影响力的程序员之一(如果他还不算是最有影响力的人的话)史蒂夫·沃兹尼亚克有一句著名的口号:
“一个人工作…不要进什么委员会。不要加入什么团队。”
更进一步,一些科学和艺术中最伟大的思想家都是低调的(例如:内向)性格 – 想想达尔文,爱因斯坦,牛顿,或者甚至苏斯博士。即使约翰·斯坦贝克都说过:
有史以来就没有什么东西是两人一起创造出来的。根本没有好的合作,无论是在音乐,艺术,诗歌,数学,还是哲学,都是一样。一旦创造的奇迹已经发生,团队可以建造和扩展它,但一组人从来没有发明过什么。珍宝只能藏在一个人孤寂的内心。
好吧,我在这里忽悠哲学,但是当我们回到我们自己的小角落–软件开发的时候,既然我们可以很容易地想到这么多的反例,我们为什么还要相信如某些人所宣称的,超级协作(例如结对编程)是确保质量或工作效率的前提呢?对于某些人来说,为什么结对编程在任何时候都是硬性规定呢?
我相信这只是某些人的个人心理的反映。简单地说:有些人喜欢这种工作作风,所以他们大声疾呼,并推广给所有人。
然而,事实是,我们中三分之一是性格内向的人(程序员中的比例可能更高!)。在一般情况下,我们不仅偏好单独工作,而且独自工作时成效更显著。我们并不是不喜欢别人,而是我们的大脑更容易被外部刺激所扰乱(不管好还是坏,结对也是刺激的一种)。对于我们来说,高质量的工作是和得到和保持自己的“区域”有关系的。如果确保了这一点,我们就能做到高效率。如果确保不了,我们就做不到。
德马科和李斯特在其著名的编码战争游戏实验中(出自《人件》一书)证明过这一点 – 他们发现,对程序员工作质量最好的预测指标既不是工作年头或薪酬,而是办公环境的安静程度。
这曾经是一个广受尊敬的见解。事实上,《Joel 谈软件测试》一文中关于好的工作场所的第八个问题是“程序员有安静的工作环境吗?”然而,可悲的是,超级协作的文化已经无情地碾压过我们更好的感性,而我要诚实地说,我觉得这种文化超烂。
结对编程,这个“一切都在一起”文化的延伸,已经渗透进我们的思维到相当的程度,以至于许多人认为,一个人单独工作不仅是无效的,而且很无聊。对于我来说却恰恰相反。我最好的工作是独自完成的,而且这种连贯的状态是我做为程序员最享受的。这不是做“牛仔”,或自以为不会犯错误。我是一个严格代码审查的热情倡导者,我每天也都从别人的见解受益。我只是说结对编程的超级协作状态不会使我成为一个更好(或更快乐)的程序员而已。请记住我说的话。
当人们描述说结对编程是使他们从中受益的一种实践,好吧,我知道了。但是如果他们要迈出下一大步,倡导(或要求)我按他们的做法来,因为他们“知道”我会从中受益(他们有一些“数据”来证明这一点!),还是打住吧。使人们产生高质量的工作的方法因人而异。想想世界上(或者就是你的项目里)一些伟大的成就,这个道理应该浅显易懂。宣称这种外向人群理想中的结对编程方法是对所有人有效的“最佳实践”是愚蠢的,我不在乎敏捷开发教条主义者会说什么。
英文原文:Ben Northrop,编译:伯乐在线 – @老码农的自留地