在项目中,我们实行了结对编程,获得了一定的成功:
1、 职业态度有很好的改进。由于缺少了单人独处的环境,两个人的合作更专注于工作,职业态度是编程人员的首要精神,对代码的质量起关键作用。员工聊QQ的、看新闻的、不务专业的、工作义务式的现象没有了。取而代之的是工作变的积极,学习也热情了,并且充满成就感。如果有很好的企业文化来配合,例如进行一些合作性的运动,足球,篮球等,更能促进职业态度改进,达到以团体带动个体的效果。
2、 1+1>2。结对编程,在每一时刻都是一个程序员在编程,说效率如何高,也只是1+1>1,但是否大于2呢?答案是肯定的。首先,一个人的编程,平均很难实现1>80%×1的工作效力。但是在和同伴一起工作时,必须保持思维一直高度集中,所以平均都可以达到1>80%×1的个人效力,同时有了一遍代码评审,使得出错几率就降低,减少了bug的产生。也由于两个人的思想汇集,能创造了很多新编程算法或结构重用等。所以着眼于整个项目来看,这个实践确实大大提高了效率。
3、 软件质量有明显的改进。
1) 代码的坏味道减少。首先是对编码的规范的遵守。结对编程改掉了一些人的编码的坏习惯(例如:不注释),也同时融合了每个人的编程优点。其次,代码的层次,和语法变得优美了。一些不耐烦的代码没有了,一些重复出现的代码没有了,改重用的代码重用了,改重构的代码重构了。
2) 程序执行效力提高了。结对编程是两个人的脑力劳动,可以相互学习,相互研究,所以我们在一起,常常会去试验新的编码方式,以寻找最好的方法。而且有什么想法通过交流后两个人都觉得可行,就可以写出测试用例,再来写出实现;所以不论在解决问题的时间和方法上,都比以前做得更快更好。
3) 减少了bug的产生。Bug的产生首先在于理解上,两人编程,需要两人去理解,同时两个人要经过讨论,形成一致思想,才可以编程,使得在理解错误的风险上减少。其次两人编程就等于已经有了一遍代码评审,出错几率降低了很多。所以结对编程能有效的减少了bug的产生。
当然,在结对编程的过程中,也遇到了一些困难
1、 如何将结对编程有效的融合到开发流程中
我们团队加上项目经理和美工,一共6人,可以有2组配对(不包括经理,美工)。开发流程如下:
开发阶段 | 描述 |
需求 | 搜集需求,用户用例建模。 |
分析 | 功能分析,将系统分解成模块,并定义模块的功能;进行系统用例建模。 |
设计 | 结构设计,界面设计,数据库设计 |
编码 | 编写程序。包括了白盒测试代码的编写 |
测试 | 集成,功能,黑盒测试。 |
那么如何进行结对开发呢,在那些流程中结队开发呢?
1) 我们进行以模块为单位,即是一组人负责一个模块的设计,和编码
2) 尽量将性格融合的,技术互补的配对。并且在不同阶段,有针对性的组合,可以起到很好的作用。比如,一个严谨,谨慎的人,配上一个喜欢创新的人。
3) 两人中,地位是平等的,只有经验多寡之分,没有地位高低之分
4) 工作时,两人必须使用一台电脑,一天中必须要有大于4小时的合作时间,即是要最少共同工作半天。
5) 将项目中的难点,分配给搭配默契并且经验丰富的组去负责。
6) 分析设计时,由两人讨论通过并签名。(在项目讨论会上必须由两人讲解)
7) 编码前,两人必须有达成共同的思想
8) 编码时先写测试,再写实现
9) 任务出错或不能完成,应由双方共同负责,不能相互指责
10) 两人意见不同时,可由上司帮助解决,最好不要各执己见
11) 每次测试时,从新组合配对人员,但不能由设计编码的人负责测试自己编写的模块但可以写测试文档。
12) 上司多点鼓励,结对人员相互鼓励,可以产生共同的荣誉感,责任感。
这是我们项目配对的情况
| 模块1 | 模块2 | 模块3 | …… |
设计 | 张三,李四 | 王五,吴六 | 张三,李四 | …… |
编码 | 张三,李四 | 王五,吴六 | 张三,李四 | …… |
第一次测试 | 张三,王五 | 李四,吴六 | 李四,吴六 | …… |
第二次测试(回归测试) | 王五,吴六 | 张三,李四 | 王五,吴六 | …… |
项目完成后,统计了结对编程与没有结对编程的数据对比。
| 结对编程 | 没有使用结对编程 | |
A项目 | B项目 | ||
设计 | 两人4.28天/模块 (共2组15天7模块) | 一人4.17天/模块 (共2人25天12模块) | |
编码 | 17.00k/两人/天(1088K/2组/32天) | 8.16k/人/天(1372k/4人/42天) | |
测 试 | Bug数 | 13个 | 61个 |
测试天数 | 6天 | 19天 | |
回归次数 | 2次 | 3次 | |
合计 | 53天 | 86天 |
注:A项目与B项目在规模上和复杂度上相差不大。
对上表进行分析得到以下结论
1) 设计阶段,结对编程比没有使用结对编程慢。因为,两人的讨论更多,想法更多,方案也更多,设计的也更加全面。尽管慢,但是效果和质量明显比没有使用结对编程的质量好。
2) 编码阶段,结对编程比没有使用结对编程快。我想主要体现在两人可以保持思维一直高度集中,和对遇到问题解决的速度上。并且是一个逐渐融合的过程,两人融合的快,编码的速度也快。
3) 测试阶段,结对编程比没有使用结对编程快。从Bug数可以肯定,结对编程对软件质量有所提高。在测试时间上也缩短,得益于bug数的减少,修改时间减少和回归的次数减少。
2、 结对编程中两人不合作问题。
在开始运作结对编程上,这个问题特别烦人。在新人中倒是很好解决,在公司呆的久的员工反成了问题。习惯了单打独斗的,旁边有一个人总是显的不习惯。还有,在性格上不是问题,大家都是一定文化层次的人,很容易融合。但是在生活上,反成了问题,比如一些坏习惯,个性等。我进行如下的解决方法
1) 营造团结,和谐,活跃的环境,让大家多点自我表现的机会,使大家充满自信,勇于发言,勇于表达自己的意见。
2) 多进行团体活动,下班打篮球,周末有空去一起喝茶聊天(从来没有加班)。做集体运动,使其有共同目标,还相互理解,拉进距离。聊天可以轻松玩笑的指出一些人的坏习惯。
3) 多多对小组鼓励奖励,使他们有共同荣誉感,责任心。
4) 实在不行,就赶人吧!(我没有用过)。
3、 结对编程中两人编程水平问题。
这是很多人提问最多的问题,我很牛,也要结对吗?又或者我是新手,可以结对吗?其实结对编程的内涵为一种共享;一种技术,经验,知识的共享。通过共同商讨、解决问题,来提高沟通,交流,来降低误解和疏远。所以这不是问题,问题的本身在于共享精神,要求大家没有私心,要求大家互相帮助。不管菜鸟与菜鸟,或者老鸟与菜鸟,老鸟与老鸟的结对,都不会有问题。尽管两人编程水平问题有所差异,那也是工作的方式不同罢了,专家级的两个人,更多的是创新,一老一小,更多的是教育,两个菜鸟那就是更多是在唱歌,就像过河的小马。
最后,谈谈公司文化对结对编程的影响。首先要明白,不是什么公司都可以进行结对编程。结对编程是XP的核心实践之一,但很多人执怀疑态度和观望态度。我觉得软件公司的企业文化对是否能成功执行结对编程是一个关键因素。如果下面三个问题都回答是,你可以试试实施结对编程。
1、 是否有一个可以能畅所欲言的,和谐平等的,相对民主的环境?
2、 是否有一种相互交流,相互研究,共享代码,共享知识的氛围?
3、 是否致力于一种共同成长,开放共享的学习型组织?