(管理科学与工程专业论文)小型团队结对编程研究、重构和实践.pdf_第1页
(管理科学与工程专业论文)小型团队结对编程研究、重构和实践.pdf_第2页
(管理科学与工程专业论文)小型团队结对编程研究、重构和实践.pdf_第3页
(管理科学与工程专业论文)小型团队结对编程研究、重构和实践.pdf_第4页
(管理科学与工程专业论文)小型团队结对编程研究、重构和实践.pdf_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

小型团队结对编程研究、重构和实践 摘要 结对编程是两个软件开发者在一台电脑前一起工作的一种编程实践,是极 限编程方法的基础。对于软件产品的开发,人的知识是项目成功的重要因素。 在组织的软件过程改进中,合适地引入结对编程,有利于知识的共享并营造团 队合作的氛围,进而改善产品质量和缩短完成时间。不同规模的组织和组织采 用的软件过程的不同,对结对编程的引入会有不同的影响,所以在实践中结对 编程的重构是必需的。为了更高的生产效率,基于小型组织和敏捷过程的项目 实践,给出了一个切合实际的结对编程重构方案。 在小型团队中实施结对编程会遇到各种具体的问题。通过分析结对编程的 内涵,并在一个已经完成的软件开发项目中充分使用结对编程,同时比对传统 的开发方法,可以得出结论:结对编程相比不结对可以让软件的质量更高,团 队的合作力更强,应对困难能更有效解决。在小团队结对编程中,通过一些必 要的重构和改进工作,可以避免投入过多的人力,从而降低了整体的成本,实 现了灵活有效的结对编程 本文第一章介绍了结对编程并提出了在小型团队中实施结对编程的问题所 在。第二章分析了结对编程的利益和成本。第三章针对结对编程和小团队的特 性,提出了自己的重构改进。第四章为前面的分析论断提供了项目实践的检验, 确定了详细的实施方法,并进一步证明结对编程的可用性和重构改进的必要性。 第五章为总结和未来研究方向 关键词:结对编程敏捷方法小型团队重构 i v r e s e a r c h ,r e f a c t o r i n ga n dp r a c t i c eo fp a i r p r o g r a m m i n gi ns m a l lt e a m s a b s t r a c t p a i rp r o g r a m m i n g ,w h e r et w os o f t w a r ed e v e l o p e r sw o r kt o g e t h e ra tas i n g l e c o m p u t e r , i st h eb a s i so fe x t r e m ep r o g r a m m i n g ( x p ) i nd e v e l o p m e n to fs o f t w a r e p r o d u c t s ,h u m a n sk n o w l e d g ei st h ek e yf a c t o ri na n ys u c c e s s f u lp r o j e c t i n o r g a n i z a t i o n s s o f t w a r ep r o c e s si m p r o v e m e n t ,t h e p r o p e ri n t r o d u c t i o n o f p a i r p r o g r a m m i n gb e n e f i tt ok n o w l e d g es h a r i n ga n da t m o s p h e r ec o n s t r u c t i n go ft e a m c o l l a b o r a t i o n ,a n dt h e ni m p r o v et h ep r o d u c tq u a l i t ya n ds h o r tt h ec o m p l e t i o nt i m e s i t sd i f f e r e n ti n f l u e n c eo ni n t r o d u c t i o n o fp a i rp r o g r a m m i n gi nd i f f e r e n ts i z eo f o r g a n i z a t i o nw h e r ed i f f e r e n ts o f t w a r ep r o c e s sw a su s e d ,s ot h a ts o m er e f a c t o r i n go f p a i rp r o g r a m m i n gm u s th a v ei np r a c t i c e f o rg e t t i n gh i g h e rp r o d u c t i v i t y , a n db a s e d o np r o j e c tp r a c t i c eo fas m a l lo r g a n i z a t i o na n d a g i l ep r o c e s s ,t h i sp a p e rp r o p o s e sa p r a c t i c a lp a t t e r no fp a i rp r o g r a m m i n g t h e r ea r em a n yp r o b l e m si ns m a l lt e a m su s i n gw i t hp a i rp r o g r a m m i n g b y a n a l y z i n gt h ec o r eo fp a i rp r o g r a m m i n g ,a n du s i n gp a i rp r o g r a m m i n gi n ap r o j e c t w eh a dd o n e ,i nt h es a m et i m e ,c o m p a r i n gw i t ht h et r a d i t i o n a ld e v e l o p m e n tm e t h o d , w ec a ng e tt h ec o n c l u s i o n :p a i rp r o g r a m m i n gc a ng e tm o r eh i g h e rq u a l i t yo f s o f t w a r et h a nn o tu s i n gp a i r i n g ,t h ea b i l i t yo ft e a mc o l l a b o r a t i o ni sm o r ep o w e r , a n dt h ea b i l i t yo ft a c k l i n gp r o b l e m si sm o r ee f f e c t i v e i np a i rp r o g r a m m i n go fs m a l l t e a m s ,b yr e f a c t o r i n gs o m ed e t a i l so fp a i rp r o g r a m m i n g ,w ec a na v o i ds o m e u n n e c e s s a r yh u m a nl a b o rc o s t ,s ot h ew h o l ec o s to fp r o j e c tw i l lb ec u td o w n w e a c h i e v et h ea g i l ea n de f f e c t i v ep a i rp r o g r a m m i n g i nt h i sp a p e r , c h a p t e ro n ei n t r o d u c e st h ep a i rp r o g r a m m i n ga n dt h ep r o b l e mo f i ti ns m a l lt e a m s c h a p t e rt w oa n a l y z et h ec o s ta n db e n e f i to fp a i rp r o g r a m m i n g c h a p t e rt h r e eg i v es o m er e f a c t o r i n go fp a i rp r o g r a m m i n gi ns m a l lt e a m s c h a p t e r f o u ri sa b o u tap r o j e c tp r a c t i c et ob ep r o v et h eo p i n i o n sa b o v e ,a n dg i v es o m ed e t a i l s t r a t e g i e sa n dm e t h o do fp a i rp r o g r a m m i n gu s e di ns m a l lt e a m s c h a p t e rf i v ei st h e c o n c l u s i o na n df u t u r er e s e a r c h i n ga b o u tp a i rp r o g r a m m i n g k e y w o r d s :p a i rp r o g r a m m i n g ;a g i l em e t h o d ;s m a l lt e a m ;r e f a c t o r i n g v 图表清单 图1 1x p 的1 2 个实践规则之间的联系6 图2 1个人组和结对组完成时阕的比较l o 图3 1不同程度的软件开发人员合作结构和工作区布局2 0 图3 2结对编程的典型工作区示意图2 l 图3 3 结对编程工作区改进示意图2 l 图3 - 4 基于结对编程的松结对团队示意图一2 2 图4 1h r 系统信息流2 7 图4 2 项目开发中结对的一个整体流程图3 l 表2 1测试用例通过率9 表2 2结对编程与没有结对编程的数据对比l l 表2 3测试用例不通过的缺陷率1 5 独创性声明 本人声明所星交的学位论文是本人在导师指导下进行的研究工作及取得的研究成果 据我所知,除了文中特别加以标志和致谢的地方外论文中不包含其他人已经发表或撰 写过的研究成果也不包含为获得 盒毽王些太堂或其他教育机构的学位或证书而使 用过的材料与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说 明并表示谢意 学位论文作者签字;钟专勿签字目期:2 鼋,7 年6 月岁日 学位论文版权使用授权书 本学位论文作者完全了解 金匿王些太堂有关保留、使用学位论文的规定,有权 保留并向国家有关部门或机构送交论文的复印件和磁盘,允许论文被查阅或借阅。本人 授权 金胆王些太堂可以将学位论文的全部或部分论文内容编入有关数据库进行检 索,可以采用影印、缩印或扫描等复制手段保存、汇编学位论文 ( 保密的学位论文在解密后适用本授权书) 学位论文者签名;钟寺勿 签字日期;2 1 年6 月 日 学位论文作者毕业后去向: 工作单位: 通讯地址: 导师签名;加l v 签字日期:力习年月r 日 m 电话: 郎编: 致谢 本文的完成得到许多人的帮助和支持,在此向你们表示由衷的感谢! 感谢我的导师刘业政老师在我的学业、生活和工作上给与无微不至的关心 和帮助刘老师渊博的知识、严谨的治学态度、敏锐的学术洞察力、积极开拓 和忘我的工作精神,值得我去好好学习。 感谢合肥工业大学管理学院和电子商务研究所为本人提供的研究条件,感 谢杨善转、赵慧芳、梁昌勇、刘心报、倪志伟、李兴国、何建民、左春荣、张 结魁、凌海峰、赵勇和魏婧等老师对我的关心、帮助和指导。 感谢1 4 班的同学们感谢林文龙、姜元春、杨洁琼、徐德鹏、焦宁、马 向辉、王卫、郭春根、郑蕊、唐亮、徐建华、谢珩、余智学等师兄弟。 感想室友汪晨和杨杰同学。 感谢家人的鼓励和支持。 作者:钟扬 2 0 0 7 年5 月2 6 日 1 1 结对编程介绍 1 1 1 结对编程定义 第一章绪论 结对编程( p a i r p r o g r a m m i n g ) 是一种合作式编程模式,是在必要的软件开 发环节( 如需求分析、设计、编码、测试、评审等) 中,让两名程序员合作来 完成同一开发任务。在其它领域也存在一些结对,如越野赛、飞机驾驶中的结 对驾驶。w i l l i a m s 等人1 3 l 】把结对编程定义为:“在结对编程中,两名程序员合 作开发同一产品模块( 设计、算法、代码) 。这两名程序员就像是个联合的智 慧的有机体,共同思考问慝,负责产品模块的各个方面。一名结对者作为驾驶 员,控制铅笔、鼠标或键盘并编写代码。另一名结对者作为导航员主动持续地 观察和辅助驾驶员的工作,找出代码的缺陷,思考替换方案,寻找资源和考虑 策略性的暗示。结对双方有意的周期性交换角色。在这个过程的任何时候双方 都是平等活跃的参与者,并且不管是一个上午还是整个项目的工作中,双方完 全分享所获得的工作成绩”。 1 1 2 结对编程历史 结对编程的概念起源于2 0 世纪9 0 年代中i s 】。1 9 9 5 年。l a r r yc o n s t a n t i n e 在他的专栏中第一次提到了他在一家软件公司( p j p l a u g h e r i ss o f t w a r e c o m p a n y ,w h i t e s m i t h s ,l t d ) 观察到的一个现象:“两个程序员一起工作,可以 比以往更快的交出完成并经过测试的代码,而且这些代码几乎是没有错误( b u g ) 的”1 1 1 1 。 1 9 9 6 年,k e n tb e c k 、w a r dc u n n i n g h a m 和r o nl e f f f i e s 一起提出了极限编 程( e x t r e m ep r o g r a m m i n g ,x p ) 结对编程是极限编程的1 2 个主要实践之一, 它吸收了合作式编程( c o l l a b o r a t i v e p r o g r a m m i n g ) 的关键思想,强调合作和交 流。随着敏捷开发思想和极限编程方法在2 l 世纪初前几年的快速普及,结对编 程也迅速被大家熟知和尝试 1 1 3 结对角色关系 结对编程的结对角色分为驾驶员和导航员: 1 ) 驾驶员控制鼠标和键盘的使用,负责编码工作。 2 ) 导航员在驾驶员一旁观察和思考,负责检查错误和考虑解决方案 结对角色是需要互换的若驾驶员的编码活动停滞不前或者出现方向性的 错误,结对双方可交换角色,让导航员转为驾驶员角色继续编码。这种角色互 换应该经常发生,有时可能每隔几分钟( 甚至更频繁) 就互换一次。一旦结对 者习惯了这种做法,并且适应了另一方结对人员,结对者就会进入这种流程, 很自然地来回互换角色。 i i 4 结对编程优势 为什么需要结对编程? 简单的回答是结对编程可以: 1 ) 减少风险 、 2 ) 使团队生产效率更高 3 ) 生成更好的代码 风险会使大多数团队停滞不前。在团队的软件开发项目中,管理者会想要 做但却不敢冒险去做一些事,这是大多数管理者以求稳来考虑的结果。减少风 险的最佳方法是确保团队中的每个人都完全熟悉系统的所有部件以及对系统的 所有更改。技术讲解和设计文档很有用,但对于大多数快节奏的项目,它们并 不能很好且迅速地传播知识。传播知识最有效的方法是让一个知道代码的人与 不知道代码的人一起解决蠲题。 结对编程是经理和团队减少风险并防止因更改而毁掉团队必须运用的最好 的工具之一当团队成员结对时,所有设计决策和代码更改都至少由两个人完 成通过让程序员结对,经理确保了更多人熟悉代码以及它经历的更改。此外, 两个人编写的代码总比一个人写的代码好。两个人的智慧确实胜过一个人的, 对于影响整个系统的设计决策更是如此。无论一个程序员多么聪明( 或自以为 多么聪明) ,第二种意见有助于避免由于无知、自大或只是由于疏忽而产生错误 决策。 虽然许多程序员保持专心致志可能没有问题,但是让其他人使另些普通 的程序员不出闪失当然也是有帮助的。当程序员尝试解决令人沮丧的问题时, 这特别有帮助。当程序员想要放弃时,旁边有人鼓励,从而继续前进团队也 不大可能忽略测试或其它重要的细节一一只有这样才会增加生产力 从企业管理的层次来看,结对编程有利于大家更有效的交流、相互学习和 传递经验,结对编程具备更高的效费比( c o s t e f f e c t i v e ) ,结对编程能更好的处 理人员流动。 从开发的层次来看,结对编程能提供更好的设计质量和代码质量,结对编 程有更强的问题解决能力。 从开发人员自身的角度来看,结对编程的结对者一起工作能带来更多的信 心,结对者一起工作能带来更高的满足感。 概况地说,结对编程的优势是可以最大程度地利用集体的智慧以达到项目 成功的目的 2 1 2 软件过程和方法体系 要搞清软件过程的概念,需要先了解过程的含义。一般来说,过程是指为 了达到给定目的而执行的实践的集合;它包括工具、方法、资料和人等要素。 过程具有一系列的性质:时间性、并发性、嵌套性和度量性等。过程的好坏由 结果状态与预期状态的差异决定,也就是目标成果质量的好坏 软件过程是将用户的需求转化成有效的软件解决方案的一系列活动。许多 软件组织无法正确定义和控制这一过程,但这恰恰是组织改进的关键。软件过 程必须科学、合理,才能开发出高质量的软件产品软件过程又称软件生命周 期,是软件生命周期内为达到一定目标而必须实施的一系列相关过程的集合。 软件过程管理包括各种活动管理、质量保证、环境基础设施配置、文档管理等。 软件生命周期按阶段可以划分为以下活动【1 1 ; 1 ) 可行性研究与计划 2 ) 需求分析 3 ) 总体设计 4 ) 详细设计 5 ) 实现 6 ) 集成测试 7 ) 确认测试 8 ) 使用和维护 结对编程主要应用在编码活动中,即应用在软件生命周期中的详细设计、 实现、集成测试、确认测试阶段。 截至2 0 0 7 年,软件过程的方法体系主要有以下几种: 1 ) c m m l 2 j ( c a p a b i l i t ym a t u r i t ym o d e l ,软件能力成熟度模型) 2 ) r u p i j j ( r a t i o n a lu n i f i e dp r o c e s s ) 或u p ( u n i f i e dp r o c e s s ,统一过程) 3 ) m s f p j ( m i c r o s o f ts o l u t i o n sf r a m e w o r k ,微软解决方案框架) 4 ) 以x p 4 】为代表的敏捷方法 c m m 是由美国软件工程研究所s e i 于1 9 世纪8 0 年代开发的,是一种协 助企业改进软件制作质量与管理流程并进行评估的标准。c m m 共分为5 个等 级,要求最严格的为第5 等级。在政府和军方的软件开发合同招标中,一般要 求承包软件开发合同的组织通过第3 等级c m m 。 r u p 是由r a t i o n a l 软件公司创立的迭代式软件开发过程框架,r a t i o n a l 于 2 0 0 3 年被i b m 完成收购,r u p 成为i b m 的子品牌。r u p 不是一个简单具体的 规定化的过程,它更像一个可调整可定制化的过程框架,因此开发组织和软件 团队可以根据他们的需要选择过程框架中合适的元素。r u p 也是一个软件过程 产品,r u p 产品现在被包含在i b mr m c 产品中。随着r u p 产品在商业上的成 功,一般性的非专有的过程版本u p 也产生了。并加入到软件过程方法的竞争 3 之中。 m s f 是微软公司软件过程的方法论总结m s f 是一组建立、开发和实现分 布式企业系统应用的工作模型、开发准则和应用指南。它帮助企业融合商业和 技术的目标,降低采用新技术后系统整体的费用,以及成功的应用微软技术整 合商业过程的方法。m s f 揭示出为成功设计、构建和管理技术基础结构或商业 解决方案,所需了解的重要风险,重要的设计基础假设和关键的依赖关系。它 包括明确的知识库、应用指南和实践经验。 x p 是以符合客户需要的软件为目标而产生的一种方法论,x p 使开发者能 够更有效的响应客户的需求变化,即使是在软件生命周期的后期。x p 强调软件 开发是人与人合作进行的过程,成功的软件开发过程应该充分利用人的优势, 而弱化人的缺点。突出入在软件开发过程中的作用。 c m m 、r u p 和m s f 统称为重型开发方法,而x p 是一种轻型开发方法( 也 称敏捷开发方法) ,x p 属于轻型开发方法中较有代表的一种方法。 轻型开发方法是相对于传统的重型开发方法而言。简单地理解,量的轻重 是指用于软件过程管理和控制的,除程序量以外的文档量的多少。x p 等轻型开 发方法认识到,在很多情况下,按传统观念建立的大量文档,一方面需要消耗 大量开发资源,同时却已失去帮助“预见、管理、决策和控制的依据”的作用。 因此必须重新审视开发环节,去除臃肿累赘,轻装上阵。 重型开发方法强调文档和流程的约束管理,在软件生命周期的每个阶段都 有详细的规定和制度。轻型开发方法与传统重型开发方法相比,是一种更加主 动的开发模式。在项目管理过程中,轻型开发方法调动每一位开发者主动创造 和适应交化的能力。在轻型开发方法中,开发者参与交流和协作显得尤为重要。 轻型开发方法具有很强的灵活性,强调拥抱变化。轻型开发方法的项目管 理方式和开发策略也可以适当灵活调整。比如:在项目管理方面,可以吸取 d s d m 方法中的实践,直接授权于团队成员,为了使项目快速进行。团队成员 必须能够对他们的工作任务迅速做出评估决定,以保证项目能够如期交付:在 项目开发策略方面,可以根据m o s c o w 原则,灵活调整项目计划、各项任务的 优先级。 轻型开发方法与重型开发方法楣比,更加注重交流,特别是面对面的交流, 结对编程就是一种强调交流的编程机制。轻型开发方法在没有流程和文档强约 束的情况下,将各种隐性的知识和概念在用户和开发人员之间达成一致。 1 3 敏捷方法极限编程 2 0 0 1 年2 月1 1 1 3 日,1 7 位专家学者在美国犹他州瓦塞赤岭相聚,并最终 促成了敏捷宣言( t h ea g i l em a n i f e s t o ) 的诞生。敏捷宣言是极限编程、s c r u m , d s d m 、a s d 、c r y s t a l 、f d d 和p r a g m a t i cp r o g r a m m i n g 的代表们的一致宣言, 4 他们赞同用敏捷宣言的开发理念来替代文档驱动和重型软件开发过程。 敏捷宣言的内容为【圳: “我们正在通过亲身实践以及帮助他人实践,揭示更好的软件开发方法。 通过这项工作,我们认为: 个体和交互胜过过程和工具; 可以工作的软件胜过面面俱到的文档: 客户合作 胜过 合同谈判: 响应变化胜过遵循计划。 虽然右项也具有价值,但我们认为左项具有更大的价值。” 敏捷过程和运用敏捷过程进行的敏捷开发被认为是软件工程的一个重要的 发展方向,它强调软件开发应当是能够对未来可能出现的变化和不确定性做出 全面反应的。敏捷过程现在是i e e e1 6 4 8 标准化工作组的工作内容之一 随着敏捷宣言的发布,极限编程的概念逐渐深入人心。极限编程实际上是 一种经历过很多实践考验的一种软件开发的方法,它诞生了大概有1 0 年,它 已经被成功的应用在许多大型的公司,如:b a y e r i s c h el a n d e s b a n k ,c r e d i ts w i s s l i f e ,d a i m l e r c h r y s l e r ,f i r s tu n i o nn a t i o n mb a n k ,f o r dm o t o rc o m p a n y 和u b s 。 极限编程的成功得益于它对客户满意度的特别强调,极限编程是以开发符合客 户需要的软件为目标而产生的二种方法论,极限编程使开发者能够更有效的响 应客户的需求变化,即使是在软件生命周期的后期。 极限编程由k e n tb e c k 。w a r dc u n n i n g h a m ,a n dr o nj e f f r i e s 在他们为 c h r y s l e rc o m p r e h e n s i v ec o m p e n s a t i o ns y s t e m ( c 3 1 1 4 ) p a y r o l l 工程工作时创立。 k e n t b e c k 在1 9 9 6 年三月成为c 3 项目的领导,并开始整理在工程中使用的开 发方法k e n tb e c k 写了关于该方法的一本书,叫极限编程解释:拥抱变化, 并于1 9 9 9 年十月出版。敏捷拥护者越来越多,开发方法除了极限编程、s c n l m 、 c r y s t a l 、f d d 、d s d m 、a s d 、l e a n ,还有像x b r e e d 、f r e e d o m 这样的新方法, 敏捷方法将会随着敏捷思想的深入而变得越来越多。 极限编程十分强调团队的合作,团队包括项目经理、客户和开发者。他们 团结在一起来保证软件的高质量。极限编程其实是一种保证团队开发成功的简 单而有效的方法。 极限编程强调四种价值:交流,简易,回馈,勇气。程序员之间以结对编 程方式紧密的相互交流,程序员也和客户紧密的交流程序员总是保持他们的 设计简单明了。项目一开始,极限编程就强调通过对软件的不断测试来获得反 馈,程序员尽可能早的把软件交给客户,并实现客户对软件需求提出的变化, 有了这些基础,程序员就可以自信的面对需求和软件技术的变化。 结对编程作为极限编程的一个实践,由于其独特的性质和功能,使它不但 可以在极限编程方法中使用,也可以被应用在其它的开发方法和软件过程中 5 由于极限编程通常使用较小的软件开发组织中,结对编程也通常出现在小型的 软件开发团队中 l a u r i ew i l l i a m s 和r o b e r tk e s s l e r 在2 0 0 2 年出版的结对编程详解是一 本有关结对编程方面的系统阐述的书籍该书【i o 】强调通过结对编程,可以增加 团队的纪律性,降低代码出错的概率,强化员工交流和学习的氛围。 极限编程的核心方法是实践总结的1 2 个实践规则,它们【3 2 1 是:结对编程 ( p a i rp r o g r a m m i n g ) 、计划游戏( p l a n n i n gg a m e ) 、测试( t e s t i n g ) 、代码重构 ( r e f a c t o r i n g ) 、简单设计( s i m p l ed e s i g n ) 、代码集体所有权( c o l l e c t i v eo w n e r s h i p ) 、 现场客户( o n - s i t ec u s t o m e r ) 、持续集成( c o n t i n u o u si n t e g r a t i o n ) 、小型发布( s h o r t r e l e a s e ) 、每周4 0 小时工作制( 4 0h o u rw e e k ) 、编码标准( c o d i n gs t a n d a r d s ) 、隐喻 ( m e t a p h o r ) 极限编程的1 2 个实践之间的联系如图1 1 所示。 图1 1x p 的1 2 个实践规则之间的联系 从图1 1 可以看出,结对编程是极限编程的1 2 个实践中最重要的实践之一。 结对编程是编码标准、持续集成、简单设计、隐喻、测试,代码集体所有权、 每周4 0 小时工作制和代码重构的基础。例如,结对编程是简单设计的有效途径, 因为如果结对者的设计不能让另一位理解,说明这个设计一定是复杂的。结对 编程是重要的极限编程实践,没有使用结对编程实践的极限编程团队是很难坚 持极限编程和敏捷思想的。 6 1 4 小型团队结对编程问题提出 小型团队指1 0 个开发人员左右的团队,并且开发项目是为期3 至4 个月的 开发。极限编程和结对编程方法有助于小型软件组织改进它们的过程。但同时, 由于小型团队的项目周期短、开发人员少,导致小型软件组织无法承受改进的 成本。 软件开发过程是随着开发技术的演化而随之改进的。从早期的瀑布式的开 发模型到后来出现的螺旋式的迭代开发,以至最近兴起的敏捷开发方法。它们 展示出了在不同的时代软件产业对于开发过程的不同的认识,以及对于不同类 型项目的理解方法。因此虽然结对编程是比较新的好的一种编程方法,但在不 同的组织和环境中也需要不断重构,需要改进和发展。 小型软件开发团队的主要特征有: 1 ) 软件开发质量不稳定,耗费较多的实施时间、实施成本和维护支持成本 2 ) 开发进度无法控制,导致不能按时给客户交付产品。 3 ) 客户需求不断变化,使开发人员频繁修改原有代码。 4 ) 开发文档无法进行有效管理,和实际开发情况不能一致同步。 5 ) 开发人员流动性较大,导致项目无法正常进行。 6 ) 开发人员的技术水平普遍不足。 在小型团队中实施结对编程可有效弥补这些不足。 1 ) 在2 1 1 节分析了结对编程的质量收益。结对编程可有效提升软件开发 质量。缩短实施时问,控制实施成本和维护成本 2 ) 结对编程利用结对监督和结对压力,使得结对者更加关注任务,任务的 开发进度也可得到有效的控制。 3 ) 结对编程有利于结对者写出健壮的、灵活的代码,容易应对需求的变化, 代码的修改也交得简单。 4 ) 结对编程弱化了文档的作用,结对者可以写出可读性强的代码,结合全 面的代码注释,体现了代码即文档的思想。 5 ) 结对编程的结对者互相熟悉代码和业务,当一个结对者流失后,另一位 结对者可以接手继续工作,避免工作的中断。当结对互换在组织中经常出现后。 每一位结对者对于项目的整体把握和代码的熟知都很全面,任何一个人的流失, 都不会使项目停顿。 6 ) 结对编程强化了开发人员的学习和交流,提高了开发人员的技术水平 专家和新手的结对,可以让新手的水平快速获得提升。 在小型团队中实施结对编程也会遇到许多困难和问题。由于团队规模的限 制,小型团队的人员较少,组织结构单一。结对编程中结对会对项目成本和人 员心理造成一定的冲击此外,小型组织的组织文化和中型大型组织的是不同 的,不同的组织文化也间接地影响结对编程在组织中的实施。主要的问题是实 施前期的成本较高,在2 2 节中分析了人力成本和预热成本。对结对编程在小 型团队中进行重构可有效化解这些成本,在小型团队熟悉结对编程流程后,可 最大程度发挥结对编程的优势,给小型团队带来实际的收益 结对编程的早期研究集中于1 9 9 9 年至2 0 0 5 年,主要研究内容有分布式结 对编程研究、学生结对编程研究、结对编程工具支持研究、结对编程与大型团 队c m m 瓜u p 软件过程结合研究以及结对编程价值成本经济学方面的研究等。 如下: 1 ) 分布式结对编程【l6 】研究。软件开发的全球化、外包化,使得分布在各 地的程序员必须协调一致进行工作。分布式结对编程的研究需要对此提供理论 支持。 2 ) 学生结对编程 1 2 a 3 l 研究。研究结对编程在学生的软件课程的教学过程 中的使用。这对于学生了解结对和提高他们的团队合作能力十分有利。 3 ) 结对编程环境和工具的支持【“j 研究。没有好的环境和工具,就没有高 的开发效率它是一个有重要价值的研究内容。 4 ) 大型开发团队的结对编程 2 0 】研究。小型团队中应用结对编程有其自身 的问题,那么在大型开发团队中也有它的问题,最大的问题是沟通的效果在大 型组织中会比较低下,而结对编程是强调沟通的,不光是结对者的沟通,还有 整体团队的沟通。在全球软件外包业高速发展,软件组织规模不断增大的情景 下,它也是一个值得研究的内容。 5 ) 绪对编程价值成本u 7 , 2 7 1 和经济学 t 9 , 3 4 1 研究。研究结对编程的经济性是 提高结对编程效率的重点通过分析结对编程方式和经济性的关系,适当对结 对编程进行重构和改进,从而提高结对编程的经济性,打消项目经理的顾虑。 对于小型团队中如何有效应用结对编程的问题研究主要集中于结对编程的 传统分析,并没有突破结对编程的传统模式结构来探讨如何改进结对编程模式 在小型团队中的应用。 本文针对小型团队中应用结对编程的成本问题,分析了小型团队结对编程 的收益和成本情况,针对小型团队的特征。对小型团队的结对编程闯题给出了 重构和改进方案和结对编程的组织形式。通过结对编程项目实践,进一步论证 了结对编程在适当重构改进后应用到小型团队中的良好效果,并通过结对实践 给出了结对编程的实施策略和经验建议。 s 第二章小型团队结对编程收益和成本分析研究 结对编程对于软件项目的开发从整体上来说,是好处多于坏处的。它的收 益主要有产品质量的提升,项目时间的减少,和团队成员之间互相帮助、互相 学习气氛的养成。任何事物都有它的两面性,结对编程也不例外。结对编程的 额外成本在于同一个任务是由两个人来完成的,即单位时间内的人力成本提高 了虽然结对编程会带来编程效率的提高,但双倍的人力开销是不容忽视的问 题尤其在团队规模小的项目中,这一点更要值得考虑。从团队协作的角度看, 结对编程比较适合在小型的团从中采用,但同时就要采取一些必要的改进措施 来提高编程效率和减少人力成本。本章内容主要分析结对编程可能对组织和团 队产生什么收益和成本。 2 1 小型团队结对编程收益分析 2 1 1 质量收益分析 在1 9 9 9 年,犹他州立大学( u n i v e r s i t yo f u t a h ) 做了一项试验l s 】。两组学 生,一组独自工作( 一共1 3 人) ,一组结对( 一共2 8 人,即1 4 对) 他们需要 完成相同的任务( 由助教预先设计并开发了测试案例) 表2 - l 是完成相同的三个程序,独自工作和结对工作使测试案例成功通过 的百分比可以看出,结对组比个人组的测试用例通过率明显提高l o 个百分点 以上。 表2 - 1 测试用例通过率【。1 个人组结对组 程序l7 3 48 6 4 程序27 8 18 8 6 程序37 0 48 7 1 从代码评审的角度看,结对编程提供不间断的评审,避免了效果差的团队 代码评审,也比抽查式的同级代码评审有更好的质量。结对编程中,任何一段 代码都至少被两双眼睛看过,两个脑袋思考过结合代码集体所有权和小工程 任务,代码被不断的评审,提高评审的质量。 从编程方式来看,结对编程可以避免个人鲁莽式的编程。好代码的衡量标 准是可读性和可维护性。硬件设备价格的下降和速度的提升,使得代码效率不 是考虑的重点( 对大多数的商业应用) 。对大部分的商业项目来说,更主要的顾 9 虑是成本。而成本中人工占最大的比例。好的代码可以减少修改的成本。结对 编程中结对者的互相督促可以提高代码的可读性。 2 1 2 时间收益分析 图2 1 显示的是完成相同的程序,两组所花费的时闻比【3 1 虽然结对组在 刚开始时比个人组的优势并不明显,但随后结对组的完成时间开始大幅度的下 降 在具体项目中,结对编程会带来比上面结果更商的价值。因为在实际开发 中,如果错误越多,就要花费越多的时间去修复它。在这个试验中,没有统计 修复错误所花费的时间。 程序l程序2程序3 图2 1 个人组和结对组完成时问的比较【l l c s d nb l o g 上的z d z w s z 的专栏的一篇文章统计了结对编程与没有结对编 程的数据对比,见下表2 2 l “。 对表2 2 分析可以得到以下结论; 1 ) 设计阶段,结对编程比没有使用结对编程慢。因为,两人的讨论更多, 想法更多,方案也更多,设计韵也更加全面。尽管幔,但是效果和质量明显比 没有使用结对编程的质量好。 2 ) 编码阶段,结对编程比没有使用结对编程快主要体现在两人可以保持 思维一直高度集中,和对遇到问题解决的速度上。并且是一个逐渐融合的过程, 两人融合的快,编码的速度也快。 3 ) 测试阶段,结对编程比没有使用结对编程快从b u g 数看,可以肯定, 结对编程对软件质量有所提高。在测试时间上也缩短,得益于b u g 数的减少, 修改时间域少和回归的次数减少 i o 懈 砉喜 觚 妣 撕 嗽 表2 2 结对编程与没有结对编程的数据对比【j 结对编程没有使用结对编程 a 项目 b 项目 设计两人4 2 8 天模块( 共2 组一人4 1 7 天模块( 共2 人2 5 天 1 5 天7 模块)1 2 模块) 编码1 7 o o k ,两人天( 1 0 8 8 k 2 组8 1 6 l 【,人,天( 1 3 7 2 k 4 人4 2 天) 3 2 天) 测 b u g 数 1 3 个 6 1 个 试 测试天数 6 天1 9 天 回归次数 2 次 3 次 合计5 3 天8 6 天 注;a 项目与b 项目在规模上和复杂度上相差不大 2 1 3 团队收益分析 ( 1 ) 结对编程可以提高团队工作的效率 软件的内在复杂性决定了软件开发必然是一个复杂的脑力劳动过程。当程 序员独自编程时,往往急于完成任务,有了一点零星的想法就开始动工。当代 码完成之后,由于前期设计的方案的不合理,导致后期代码维护的骶梦。雨结 对编程中任何方案都是经过两个人激烈的讨论之后产生的,这有力地保证了设 计和编码的质量。 在结对编程中,一个人关注现有逻辑并编写代码,另一个人则从设计的角 度慝考下一步的工作。有了想法之后,互相讨论,再互换角色。在开发过程中, 设计思考和编码实现不停的进行交换,保持了良好的开发节奏。 结对编程还可以使程序员之间互相督促,结对者会更加关注于任务的进展, 并减少用于打电话、收发电子邮件和上网冲浪上的时间。 ( 2 ) 结对编程可以促进团队整体的学习能力 软件公司在新员工加入时。一般都会有一段时间的培训,很多软件公司也 会建立自己的知识库。但很多新员工在面临实际的项目时仍然会不知所措,培 训的效果微乎其微。而结对编程则让新员工有机会与有经验的老员工一起共事, 新员工学到的不仅是一些技术和技巧,更多的是老员工思考问题、解决问题的 方式。和不同的同事一起结对编程。促使新员工的能力得到快速的提商。 从团队的形式来看,结对二人是一个最小单位的团队,而任何人都是工作 在这样一个团队中。开发者的言行都会影响到其他的开发者和搭档,也受到其 他开发者的影响。结对编程避免了自我的代码,使得代码的责任不属于某个人, 而是属于一个结对二入组和整个团队,从而做到代码集体所有,也避免了个人 英雄主义结对编程还迫使程序员必须频繁的交流,增进知识经验的交流,促 进团队整体的学习能力 ( 3 ) 结对编程以人为本促进团队建设, 团队是有组织有计划的,合理有效地利用各种资源,进行最佳的组合结 对编程并不是要一对固定的伙伴,它鼓励在团队中经常交换伙伴。这时,项目 不再是一个人的事情,也不是两个人的事情,而是整个团队的事情。通过结对 编程,大家可以在最短的时间内完成磨合。结对编程很好的促进了团队的沟通 交流,经常一起合作结对编程的伙伴,彼此了解、熟悉,是工作和生活上的好 友。在这样的团队里。大家很乐意互相协助,一起分享知识,分享快乐。 从以人为本的观点来出发,结对编程有以下的好处: 1 ) 同伴的潜在压力。结对编程的过程也是一个互相督促的过程。由于这种 督促的压力,使得程序员更认真的工作。 2 ) 每个人每天的有效工作时段不超过3 - 4 个小时。结对编程是每天8 小时 工作制和每周4 0 小时工作制的基础 3 ) 结对编程中驾驶员和导航员的互换可以让程序员轮流工作,从而避免出 现过度思考而导致观察力和判斯力出现偏差。 4 ) 潜意识的有利竞争。当程序员在一个团队中工作时,总是下意识的努力 展现自己的优点。 5 ) 工作及时得到同伴的肯定,程序员的自信心和成就感增强。 6 ) 程序员觉得工作是一件愉快的事情。 2 2 小型团队结对编程成本分析 能否支付结对编程的成本是一个关键问题显然,如果成本过赢,项目经 理是不会允许使用这种方式的。对此方式持怀疑态度的入认为合作方式的结对 编程将造成双倍开发成本和人力资源的需要。除此之外,还有质量保证、支持 成本、结对编程预热阶段的成本和团队人员的心理情绪带来的成本等需要考虑 所以,尽管实施结对编程带来丘勺收益从长期看要大于成本的负担,团队组织仍 然要尽可能地寻求一种折中。在保持结对编程的核心理念的同时,通过一些重 构工作,将成本降到最低。 2 2 1 人力成本分析 前面分析了结对编程给项目质量和时间、团队自身的收益,任何事物都有 1 2 它的两面性,结对编程也有自身的负面作用,即对整个项目初期带来的成本压 力。因为在项目初期,两个人去完成同编程任务时,结对双方还没有很好地 磨合,前面分析的收益还不能马上体现出来,这也是结对编程实旌的最大影响 因素。下面详细迸行分析阐述: 人力成本的提高意味着单位人员的生产率的降低。 根据图2 - 1 的数据,个人生产率可简单计算为: j 【_ :1 个人组个人生产率:1 0 0 1 结对组个人生产率: 2 6 0 0 8 3 = 可以看出,结对组的生产率还有很大的改进空间,虽然随着结对编程实践 的深入,结对者的生产率会进一步的提升,但通常情况下仍然要对结对编程的 工作形式寻求一定的改进 由于现实的因素,做到理想化的结对编程往往会有很大的阻力这个时候, 可以根据实际的情况进行调整,选用不同的方式但如何评估这些方式的成本 呢? 结对设计,结对测试,结对评审等等( 见第四章) 的变通方式都存在一个 问题:就是表面上看起来它们似乎既达到了结对的效果,又节省了成本。但是 实际上,这个成本并没有节省,而是转移了。 在项目中,为了令结对编程的思路更容易令人接受,采用了交通的做法, a 程序员和b 程序员在设计和复审的时候结对,编码则由单个开发人员负责 a 和b 针对某项需求进行了2 个小时的设计讨论,然后由b 负责编码。但是b 在编码的时候发

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论