一个关于结对编程(Pair Programming)的讲义 [转]
什么是Pair Programming
Pair Programming是一个编程模式(Programming pattern)。两个程序员并排坐在一台电脑前,面对同一个显示器,使用同一个键盘,同一个鼠标一起工作。他们一起分析,一起设计,一起写测试例子,一起编码,一起单元测试,一起整合测试(Integration Test),一起写文档等。基本上所有的开发环节都一齐肩并肩地,平等地,互补地进行开发工作。
其它领域的“Pair Working”:
• 越野赛车
• 驾驶飞机
Pair Programming的角色(Role)
•Driver The one who types
•Navigator The one who watches the back
•角色可以互换的
Pair Programming的疑问
疑问:
• 一个程序两个人写是不是一种浪费(可是两份工资,双倍资源哦)?
• 编程从来是一个人的活动。学校里这么教的,一直以来也是做么做的。
• 我不喜欢被人盯着工作,这样我不自在,无法工作。
• 这个笨家伙老是问问题,他/她不会看书么?我都无法专心工作了。
……
另一方面:
• Pair Programming被很多的大师级程序员推崇;
•不少大学都展开对Pair Programming的研究,并得到正面的结论;
• 很多尝试过的Developer都开始喜欢Pair Programming。
Pair Programming和Solo Programming的比较
一些研究数据:
1999年,University of Uath.两组学生,一组独自工作,一组Pair
Programming。(由助教预先设计和开发了Test Cases)
Pair Programming的历史
1995年,Larry Constantine在他的专栏中第一次提到了在他在P. J. Plaugherís software company, Whitesmiths, Ltd观察到一个现象:Collaborative Programming
·“两个程序员一起工作,可以比以往更快的交出完成并经过测试的代码,而且这些代码几乎是没有Bug的。”
•Collaborative Software Process(相对PSP)
•1996年,Kent Beck,Ward Cunningham 和Ron Jeffries一起提出了Extreme Programming(XP),其中吸收了Collaborative Programming,并称为Pair Programming。
•Pair Programming是XP的一个key practice,也是XP成功的关键。
•随着XP在世界范围内被采用和练习,Pair Programming开始被接受。
为什么要Pair Programming
“The Human eye has an almost infinite capability for not seeing what it does not want to see…… Programmers, if left to their own devices, will ignore the most glaring errors in their output-errors that anyone else can see in an instant.”
-- Gerald Weinberg
“Knowledge is commonly socially constructed through collaborative efforts toward shared objectives or by dialogues and challenges brought about by difference in persons’ perspective”
-- Salomon
“三个臭皮匠,胜过一个诸葛亮”
-- ?
企业管理层次:
• Pairs更有效的交流,相互学习和传递经验
• Pair Programming具备更高的效费比(cost-effective)
• Pair Programming能更好的处理人员流动
开发层次:
• Pairs能提供更好的设计质量和代码质量
• Pairs更强的问题解决能力
开发人员自身:
• Pairs一起工作能带来更多的信心
• Pairs一起工作能带来更高的满足感(程序员,用户和管理层)
不间断的Code Review
•Code Review的目的是不断的调整设计和编码质量的过程,也是为了及时发现问题和解决问题。避免把风险延后到QA阶段或Production阶段。
•开发中的Review主要包括:
1) Design Review
2) Code Review
3) Test Review
4) Document Review
传统开发过程的Review(例如印度的InfoSys公司)的问题:
1. Peer Code Review,即程序员之间的互相Review
•缺乏Design Review
•不能持久,定时Code Review
•对需求和设计的不了解导致无法实现有效的Review
2. Team Code Review
•什么时候开会做Review?不可能Team天天开会
•无法对所有的设计和Code进行Review
•面子问题
•效率低
Pair Programming提供不间断的Design review,Unit Test Review,Code Review,Document Review,避免了效果差的Team Code Review,也比抽查式的Peer Code Review有更好的质量。(CMM Level 3)
Pair Programming中,任何一段代码都至少被两双眼睛看过,两个脑袋思考过。结合Collective code ownership和小的Task (Small Engineering Task),代码被不断的Review。
•避免cow boy式的编程
•好代码的衡量标准:可读性和可维护性
•硬件设备价格的下降和速度的提升,使得代码效率不是考虑的重点(对大多数的商业应用)。对大部分的商业项目来说,更主要的顾虑是成本。而成本中人工占最大的比例。好的代码可以减少修改的成本。
•Pair Programming的互相督促可以提高代码的可读性。
Teamwork
Pair是一个最小单位的Team,而任何人都是工作在这样一个Team中。Developer的言行都会影响到其他的Developer( Partner),也受到其他Developer的影响。
Pair Programming避免了“我的Code”,使得代码的责任不属于某个人,而是属于一个Pair和整个Team,从而做到Collective Code Ownership,也避免个人英雄主义。
迫使程序员必须频繁的交流,增进知识经验的交流(Cross-Training)。
以人为本
•同伴的潜在压力( Peer Pressure )。Pair Programming的过程也是一个互相督促的过程。由于这种督促的压力,使得程序员更认真的工作。
•每个人每天的有效工作时段不超过3-4个小时。
•Pair Programming中Driver和Navigator的互换可以让程序员轮流工作,从而避免出现过度思考而导致观察力和判断力出现偏差。
•潜意识的有利竞争。当人在一个团队中工作,总是下意识的努力展现自己的优点。
•工作及时得到同伴的肯定,自信心和成就感(Self-Satisfaction)增强。
•觉得工作是一件愉快( Enjoyable )的事情。
什么样的人不适合做Pair Programming
太过自负
•不能容忍别人的意见
•我总是对的
•我吃盐多过你吃米
太过自卑
•没主见
•没责任心
什么样的人适合做Pair Programming
Extreme Programming对实施的程序员提出了更高的要求。这种要求不是技术水平,也不是学历水平也不是工作经验。这种要求是对一个人的心智,道德,修养的更高要求。
程序员的四怕:
1) 怕自己看上去傻
2) 怕被认为是没用的
3) 怕自己变的不重要(过时)
4) 怕自己不够好
Pair Programming中,编码不再是私人的工作,而是一种公开的“表演”。程序员的代码,工作方式,技术水平都变得公开和透明。
XPer的素质
一个XPer应该具备这样一些基本素质:诚实,公正,开明,勇敢和谦卑!在这些素质的基础之上,才是对技术水平,能力和天分等的要求。
•诚实
•公正
•开明
•勇气
•谦卑
具备这些素质才能克服“四怕”,才能成为一个成熟和专业的Developer。
如何Pair Programming
•Driver – 写设计文档(Class diagram等),进行编码(Unit Test and Business Object)等XP开发流程。
•Navigator – 审阅Driver的文档、Driver对编码等开发流程的执行;考虑Unit Test的覆盖程度;是否需要和如何Refactoring;帮助Driver解决具体的技术问题。
•Driver和Navigator不断轮换角色,不要连续工作超过一小时,每一小时休息15分钟。Navigator要控制开发时间。
•主动参与 – 虽然每个Engineering Task都有owner,但不能一旁观者的心态来做。任何一个Task都首先是两个人的责任,也是所有人的责任。没有“我的Code”、”你的Code”或“她的Code”,只有“我们的Code”。
•只有水平上的差距,没有级别上的差异。一个Pair,尽管可能大家的级别资历不同,但不管在分析,设计或编码,双方都拥有平等的决策权利。
•Pairs之间互换Partner。每个Task都应该和不同的Developer配对。
•每隔一天,甚至是半天,互换Partners。但Task的owner因该继续留该Task的Pair中。
•如果Pair中的一人请假,另一人应尽量不要写Production Code。
•Pair一起加班
没有Pair Programming就没有XP
•Pair Programming是XP所有的Practices中最被争议和被认为是最难接受。
•Pair Programming是获得XP最大价值的关键。
•没有Pair Programming,无法实现有效的Continuous Code Review,代码质量下降。
•没有Peer Pressure,流程的执行很容易出现偏差。
•没有Pair Programming,Communication很容易弱化,进而影响Team work。
•Pair Programming象XP流程中的粘合剂,把各个环节连接起来实现最大的价值。
XP Without Pair Programming?
这是引进XP时最难被接受的规则。但如果在采用其它XP的惯例和规则时,抛弃Pair Programming,那么会面对以下问题:
•如何进行有效的Design Review
•如何进行有效的Code Review
•如何保证代码质量
•如何保证流程的执行
•如何增进Communication
•如何进行Cross-Training
•如何增强Teamwork
Pair Programming和Open Source
Open Source现象:
Open Source Project的代码质量比很多的商业软件(项目)都好。
和Pair Programming的共性:
•有效的Code Review
•Collective code ownership
Distributed Pair Programming
分布式的Pair Programming:
•两个Programmers身处不同的物理位置,通过Sharing 软件来实现Pair Programming。需要Sharing软件能提供 桌面共享,文字交谈,语音交谈,甚至是视频交流。
•目前这种方法还没有被认可,主要出现在学校的关于XP的研究项目中 。
面临的问题:
•Internet的网路延迟
•工作时段的约定
Pair Programming和Solo Programming的比较
虽然Pair Programming的学生在刚开始的阶段比独自工作的学生花在同样Task的时间较多,但很快Pair Programming的学生的时间开始大幅度的下降。而独立工作的学生需要花费比Pairs更多的时间来达到接近的代码质量。
比较研究项目后的问卷调查发现:
•Pair Programming能用较少的时间生产更高质量的代码。
•Pair Programming的学生们认为自己比一个人的时候更勤奋和更聪明的工作,因为不想让自己的partner失望。
•Pair Programming的学生认为自己比一个人的时候更专著,紧凑和由纪律的工作,而且是持续的(因为来自Partner的Pair-Pressure)。而独立工作的学生也可以专著和紧凑的工作,但往往不持续。
•Pair Programming的学生对自己的工作更有信心和成就感。
•Pair Programming的学生觉得工作很愉快,很愿意很partner一起工作。
•在紧张时间安排和繁重的工作压力下,独自工作的学生很容易蜕变为没有纪律的Programmer。
Pair Programming是个渐进的过程
有效率的Pair Programming不是一天就能做到的。
Pair Programming是一个相互学习,相互磨合的一个渐进过程。
Developers需要时间来适应这种新的开发模式。
刚开始的Pair Programming很可能不比Solo Programming有更高的
效率。但适应后的Pairs的开发质量,开发时间都应该比Solo
Programming有大幅度的改善。
Reference
•Kent Beck,Extreme Programming Explained:Embrace Change
•The Costs and the benefits of Pair Programming -- Alistair Cockburn & Laurie Williams
•Strengthening the Case for Pair Programming – Laurie Williams, Robert R. Kessler & Ward Cunningham
•PairProgramming.com
•www.chinaxp.org
原文来自http://www.sawin.cn/doc/SoftMethod/XP/