在幼儿园学会的结对编程
英文原文dhttp://collaboration.csc.ncsu.edu/laurie/Papers/Kindergarten.PDF
读来觉得有点意思,翻译了一下,与大家共享。
在1986年,Robert Fulghum出版了一本《那些人生中最重要的道理我在幼儿园里都学过(All I Really Need to Know I Learned in Kindergarten)》的书籍。它包含了一些非常棒的思想。Laurie A. Williams和Robert R. Kessler在1999年發表的文章《All I Really Need to Know about Pair Programming I Learned In Kindergarten》模仿該書風格對結對編程做出了生動的詮釋。
摘要
共享(Share everything)
公平的游戏(Play fair)
不要打击别人(Don’t hit people)
把东西放回你发现他们的地方(Put things back where you found them)
清除你自己的垃圾(Clean up your own mess)
不要拿不属于你的东西(Don’t take things that aren’t yours)
当你伤害了别人的时候要说对不起(Say you’re sorry when you hurt somebody)
飯前洗手(Wash your hands before you eat.)
冲洗(Flush)
热曲奇和冷的牛奶对你有好处(Warm cookies and cold milk are good for you)
过平衡的生活-每天學一些,思考一些,畫唱玩跳,工作(Live a balanced life– learn some and think some and draw and paint and sing and
dance and play and work every day some.)
每天下午午睡片刻(Take a nap every afternoon)
過馬路看紅燈,手掺手(When you go out into the world, watch out for traffic, hold hands and stick together)
意识到奇迹(Be aware of wonder)
簡介
结对编程是一个编程模式。两个程序员并排坐在一台电脑前,面对同一个显示器,使用同一个键盘,同一个鼠标一起工作。他们一起分析,一起设计,一起写测试例子,一起编码,一起单元测试,一起整合测试(Integration Test),一起写文档等。基本上所有的开发环节都一齐肩并肩地,平等地,互补地进行开发工作。這種方式已被證實可以提高軟件產品的生産效率和質量。Williams(本文作者之一)在1999年所做的調查表明,100%的PPer在使用這種工作方式時比單獨開發對他們的工作品質更有信心。同時96%的認爲更喜歡這樣來工作。然而大多數程序员長期習慣于單獨工作,並抵制先結對編程轉變。本文的目的就是幫助程序員成爲高效的PPer。這種轉變需要每天實踐一些準則,正如上面Robert Fulghum的詩。詩中每行詮釋了成功實施結對開發的必修課。
結對編程成功的證據
衆多轶事趣闻和统计表明PP的益处。XP方法论的成功极大归功于PP。XP最初由Smalltalk开发社区和Kent Beck及其同事(Ward Cunningham和 Ron Jeffries)提出。XP的成功引起了许多德高望重的软件工程研究者和咨询师们的兴趣。XP获得如此名声的典例是于1997年启动的克莱斯勒汽车综合薪资系统(Chrysler Comprehensive Compensation system)。在发现最初开发的重大问题后,Beck和Jeffries应用XP概念重新启动项目。该系统每月支付超过10,000员工的薪水,有2000个类和30,000个方法,1998年按时投入使用直到今天。此外,Ford Motor公司的开发者使用传统瀑布方式,花费四年构建车辆成本和赢利系统(Vehicle Cost and Profit System),以失败收场。而XP开发者使用不到一年时间成功实现了该系统。
XP的成功极大归功于PP。所有代码产品有两个人编写。XP如此热衷于支持PP,以致于原型开发都两个人来做。结对工作一个关键的因素就是持续的Code Review,旁边那个人可发现很多明显的但未被注意到的缺陷,数量之多令人惊讶。Beck(1999)的实践结果证明,两个程序员一起工作比单独工作快两倍多,对解决方案的思考多于两次,因此可以预防和发现更多缺陷,产品有更好的品质。
共享(Share everything)
在PP中,两个程序员被安排做一件工作(设计,算法,Coding等)。两个人好像公用同一个大脑,负责这件工作的各个方面:一个人编写代码,而另一个人持续的Review;在这个过程中双方都是平等的。“你的设计有个问题”,“这个问题是你那部分的”,这种言辞或想法是不能接受的。 “我们得改善我们的这个设计”, 会更好。每个人都对整个工作负责。
公平的游戏(Play fair)
在PP中,有一个人是主控的,他正控制键盘或记录设计思路,同时另一个人持续的Review工作成果。即使当一个人明显比另一个更有经验,轮流“主控”也是很重要的。让一个人只是做观众,会让其感觉此事与己无关,或者自己无关紧要。而且此人也并非只是做一个被动的观众,他是以一直积极的参与其中.“看别人写程序就像看沙漠中的草干死一样有趣”(Beck)。众多PP调查表明,大约90%的PPer中最主要的人并非敲键盘的那个人,而是旁边那个做持续的分析,设计和代码Review。“当一个人忙于敲代码时,另外一个则思考更策略层的东西——接下来的开发如何进行?是否会走入死胡同?有没有更好的策略?”(Beck)
不要打击你的伙伴(Don’t hit your partner)
确保你的伙伴集中精力在工作上。毫无疑问,结对工作会使每个人“浪费”更少的时间在读邮件,浏览网页上,因为你的伙伴正等你输入呢。而且每个人都希望对方遵守预定的开发规则。
调查结果表明:“每个人会更努力,因为必须和另一个人保持同样的节奏;没有人会觉得可以偷懒”。因此,提高工作效率和质量是必然的。
把东西放回你发现他们的地方(Put things back where you found them)
思想是很奇妙的东西。如果你一直思考某件事情,你的大脑就会认为它是真的。假如你一直考虑一些负面的东西,比如“我是个很糟糕的程序员”,不久你的大脑就会相信你了。然而,每当这些东西想溜进你的脑子时,任何人都可以控制自己,把这些东西放回你发现他们该呆的地方——垃圾桶。对众多PPer的调查证实:很难同对自己的技术能力不自信的人一同工作。“如果我和你一起工作,你会发现我从来不处理异常”。这种没有安全感的程序员应该把PP看作一种提高自身技术能力的方式,因为有人会帮助检查代码并反馈给你。一项调查回复:“PP对我来说最棒的就是持续的讨论教会我设计和编程时明确思路,这使我成为更好的程序员”。有两个研究者调查了750名合作工作的程序员发现:使用频率最高和价值最高的沟通是“同行间的讨论”。“面对自己无法单独解决的问题的标准答案是求助于同事”。而在PP中,“被求助的同事”随手可得。两个人一起可以解决无法单独解决的问题,并提升每个人的技术能力。
另一极端思想——“我是个很牛的程序员,与我结对的人都太嫩了”——也应该放回到垃圾桶,否则极可能破坏合作关系. 约翰·冯·诺伊曼(John von Neumann) ,一个伟大的数学家,冯·诺伊曼计算机架构的创始人,常常会认识到自己的不足,让别人Review他的工作。“And indeed, there can be no doubt of von Neumann's genius. His very ability to realize his human limitation put him head and shoulders above the average programmer today . . . Average people can be trained to accept their humanity -- their inability to function like a machine -- and to value it and work with others so as to keep it under the kind of control needed if programming is to be successful。
清除你自己的垃圾(Clean up your own mess)
PPer们常说,这太有趣了,我的同伴发现了这么多明显而愚蠢的问题。相比正式评审会议发现的缺陷,PPer会毫无怨言移除同伴发现的缺陷。现有的软件工程技术很重视缺陷的预防和有效移除,或许PP经典地概括了如何预防和移除缺陷。“给我足够的眼球,曝光所有Bug”。
不要太严肃(Don’t take things too seriously)
“谦虚编程”(Ego-less programming)——Gerald Weinberg20多年前在《计算机编程心理学》(The Psychology of Computer Programming)中提出思想——在有效实施PP中是必要的。调查表明:过度自我会破坏合作关系。首先,“舍我其谁”的态度会阻碍程序员考虑他人的思路;其次,过度自我的程序员在被质疑时会认为不被信任。
《计算机编程心理学》中讨论一个重要场景是关于Review一个程序员的代码。在糟糕的一天,他被搞得哭笑不得,因为在13行代码中发现了17个Bug。最终,修改了这些Bug后,程序顺利通过测试并上线使用。如果这个程序员太自信而不接受这个结果,后果可想而知。让另一个人持续而客观的审核你的设计和代码,是PP的益处之一。“人的眼睛有无穷的力量,可以无视它不想看到的东西;如果让程序员单独工作,会漏掉别人一眼就看明的错误”。
相反,程序员对他的同伴唯唯是诺,唯恐造成紧张气氛,对合作关系同样没有什么好处。在交换思想时,存在争论是正常的。在过度自我和畏畏缩缩中有一个平衡,而PPer会经历一段最初的磨合期才能形成这种平衡。Ward Cunningham(XP创始人之一)认为磨合期可能会花几个小时到几天,因人而异,因工作性质而异。
当你伤害了别人的时候要说对不起(Say you’re sorry when you hurt somebody)
在调查中,96%的PPer认为合适的工作间对他们的工作很关键。程序员必须能并排坐在一台电脑前,同时看屏幕,使用同一个键盘,同一个鼠标。下图中,右边的设置要好于左边。