结对编程——我的噩梦
发表于2016-05-28
英文原文:Pair Programming - My Personal Nightmare
自从极限编程诞生起,我就一直在听说结对编程是个好东西。所有的敏捷传教士们都在告诉我们:结对编程能提高代码质量,有助知识共享,甚至激发开发效率,同时,还能深度拉近程序员之间的感情关系(参看拥抱编程)。
那些拒绝结对编程的人都被认为是独行客,懒蛋,或社交恐惧症患者。然而,我不属于任何一种(至少我自己是这么想的),可我仍然讨厌结对编程。为什么我会这样?下面是理由。
我们这个社会已经不再崇尚沉默是金,外向性格受青睐。所有的事情都要用合作的方式完成,每个人都要时刻准备好为他人服务,个人空间已不再存在,工作成绩不再归功于某个人。基本上,大家都认为三个臭皮匠胜过一个诸葛亮。
然而,很显然,我们可以看到,有些事情并不是这样的。即使在编程界,很多伟大的创新和杰出的软件都不是由一个团队或某个组合创造的,而是来自一个人的努力。Ant,给Java社区带来巨大飞跃的软件,就是由一个人在从欧洲飞往美国的飞机上开发出来的。还有,一些更近些的例子,Notch 开发 Minecraft,Marco Arment 开发 Instapaper,Gabriel Weinberg 开发 DuckDuckGo,全是单枪匹马的成就。事实上,地球上最有影响力的一个编程大师,Steve Wozniak,有一句着名的教导:
“单干,拒绝团队,拒绝委员会。”
视线放的更远些,很多科学界和艺术界伟大的思想家都是喜欢埋头工作的类型(内向性)——达尔文,爱因斯坦,牛顿,就连漫画家Seuss博士也是这样。甚至诺贝尔文学奖的得主、《愤怒的葡萄》的作者 John Steinbeck 也要在这事情上插嘴说:
两个人一起什么都干不成。合作永远是不成功的——无论是在音乐创作,艺术创作,诗歌创作,数学研究,还是哲学理论研究。只有在奇迹诞生之后,团体才去开发/扩展它们,但团体永远发明不了什么。伟大的思想往往生长于孤独的心里。
好吧,我是有点高谈阔论哲学了,回到我们的小世界,软件开发,为什么我们要相信——如很多人极力主张的——极限合作(例如结对编程)是高质量代码或高工作效率的保障?却忽视如此多的现实反例?为什么——按某些人的说法——结对编程是“必须的”——在所有工作中?
我认为这种观点只是个人的内心心理的外现。很简单:有些人喜欢这种形式的工作,所以他们会这样建议,不厌其烦的,让每个人都这样做。
然而,真实情况是,我们三分之一的人都是内向的(可能程序员中的比例会更大!)。总体上,我们人类不仅喜欢孤独的工作,而且在孤独中繁荣。并不是我们不喜欢其他人,而是我们的大脑神经会因此受到更多的干扰。对于我们程序员来说,高质量的工作来自于进入并保持一种“意识流状态(参看一种境界)”中。能做到这些,我们就能高效率,否则就不能。
Demarco 和 Lister 在他们着名的 Coding War Games 实验中验证了这些——他们发现,判断是否能够成为优秀程序员的最有效的先兆不是他们将有多少年的经验,而是他们工作的办公环境是否足够安静。
以前人们是重视这种认识的。关于工作场所的 Joel on Software Test 这篇文章的第8点就是“程序员是否有安静的工作环境?”然而,很遗憾,极限协作的文化颠覆了我们大脑的工作方式,说实话,我认为这是让人痛恶的。
结对编程,作为“everything-together”文化的延续,渗入到人们的思想中,以至于很多人认为一个人独自工作不仅低效率的,而且很无趣。而对于我来说,这正好相反。我的最佳工作状态就是与世隔绝,大脑流状态是我作为程序员最享受的事。并不是我喜欢做独行客,或我是圣人不会犯错。我十分倡导严格的代码审查,我每天都从别人的观点/指教中受益。我只是认为结对编程不能让我成为一个更好(更高兴)的程序员。我实话实说。
当人们把结对编程描述成一种他们从中受益的编程方法时,这很好,我祝贺他们。但他们进一步鼓动(要求)我进行结对编程,说他们“知道”我将也会从中受益(而且还有“数据”证明!),打住。一个人能够高效编程的方法并不一定就会适合其他人。想一想这世界上很多伟大的成就(或就在你的项目中),显而易见。宣称适合外向人的结对编程对所有人都是“最佳方法”,这是愚蠢,我不屑这些敏捷教条主义者的言论。