上周,我花了四个工作日的时间和Tim Ottinger坐在一起来开发FitNesse的一项新功能。考虑到Tim在FitNesse上还是个新手,于是我就从先为他介绍一些底层架构开始,然后再一起开发新功能。看来Tim觉得这样还挺管用,随后他就要求把自己添加到了可修改FitNesse的人员列表中。
我们一起开发的功能是一个新的导航功能,叫做“向后查找”。它支持你按照如下方式来定义页面:<SomeAncestorPage.ChildPage
其中的SomeAncestorPage可能是一个当前页面的诸如父、祖父或是曾祖父等的页面。这就好像是在unix路径中使用..,除非你能准确地告诉它回退的路径名称,否则就回到上一层。
让这项功能运行起来并不难,我们一起结对编程了几个小时就已经能跑起来了。但随后我们就碰到一个更有趣的问题,那就是如何去影响旧有的那些功能,更准确地说是该如何去重新整合它们在一起。
FitNesse提供了让作者重构其wiki(译注)的功能。比如说,你可以改变页面的名称,也可以把页面转移到新的位置。不论是哪种操作,FitNesse可以提供选项让你搜索出整个的wiki中对当前更名或是换位置页面的所有引用,并且随之更新这些引用。当然,我们也希望去更新这些使用了“向后查找”功能的引用。
这件事情之所以复杂的原因有二。首先,这个问题本身就不简单。为一个页面指定一个路径,如果它们重命名了,那么就改变这个路径去适应新的名字。听起来可能简单,可这个问题确实有点儿绕脑子。即使那个原先编写这些代码的人(噢...那人是我)已经处理了关于路径名称语法的一些额外的复杂问题,但问题也并未因此而简化。
结果,我和Tim几乎盯着这段代码看了两个小时,而且就只是想去看明白代码。我们碰到的一个困难就是结对编程对于仔细研读的复杂代码这种事情来说没那么奏效,尽管它在开发那些你们都相对清楚的代码上是很不错的。实际上,结对的双方会很快的把注意力从理解深奥晦涩代码中转移到讨论那些没完没了的随意想出的无聊点子上了。每当我想理解其中的意图的时候,Tim会说:“噢!看看这里的代码!”,然后我的思绪就被打乱了。每当Tim想出了一个好点子,我都会拉着他谈一些其他话题。于是,没多久我们的结对就没法进行下去了。
结对编程是个了不起的工具,这四天来它在我们的大部分合作中都发挥了很好的效用,但有时结对却会妨碍事情,有时候你们最好还是先停下结对直到你们读懂了那段代码。因为这是需要时间、专注和沉默的。对于这种事情,结对编程并不适合。
还忘记了提到,实际上,通过结对编程我们完成了此项功能。我们激烈的讨论问题,随后找到了一些简单的重构方法,并且也使得代码更加易读。我们是逐步求精的,而不是一下子就写出了整个算法,通过一连串的简单改进让它变得更清晰,直到这个算法在理解和修改起来已经足够的简单。我们的主要方法是把语法和语义问题区分开来。于是我们一步步将所有语法相关的代码(例如识别是断点还是wiki单词的代码)分离成单独模块,让算法着重于去处理路径的抽象而不是那些文本的细节。
作为一份学习的经历,这对我们来说都很棒。而且我觉得我们在努力度过结对的难关以及重构出更简化的方案上所做的是对的。
尽管如此,问题依然存在。有一些模块通过结对方式来理解反而不如他们各自分开并且静下来独自专著的领会来的好。
我开始观察到,成熟的敏捷团队参与结对编程的时间往往占据了稍微超过一半的工作时间,或许是70%的样子。我认为这个比率是健康的,我并不支持100%的结对。相反,我认为你对待结对编程就应该像是对待其他工具一样--当它们奏效的时候就用它们。还要提到,我还是认为结对编程在大多数情况下比不结对更有效,而且应该积极倡导去这样做。然而,结对编程也并非一种教条,而应该像是对待其他事物一样的加以辩证去运用。
译注:
Wiki,常译作“维基”,源自夏威夷语的“wee kee wee kee”,本是“快点快点”之意。在这里wiki指的是一种可在网路上开发多人协同创作的超文本系统,是由“wiki之父”沃德.坎宁安(Ward Cunningham)与1995年所创。
(原文链接网址:http://butunclebob.com/ArticleS.UncleBob.P2M2; Robert C. Martin的英文blog网址:http://www.butunclebob.com/ArticleS.UncleBob)
作者简介:Robert C. Martin是Object Mentor公司总裁,面向对象设计、模式、UML、敏捷方法学和极限编程领域内的资深顾问。他不仅是Jolt获奖图书《敏捷软件开发:原则、模式与实践》(中文版)(《敏捷软件开发》(英文影印版))的作者,还是畅销书Designing Object-Oriented C++ Applications Using the Booch Method的作者。Martin是Pattern Languages of Program Design 3和More C++ Gems的主编,并与James Newkirk合著了XP in Practice。他是国际程序员大会上著名的发言人,并在C++ Report杂志担任过4年的编辑。
分享到:
相关推荐
### 交换编程—结对编程的延伸实践 #### 一、引言 交换编程作为一种新型的软件开发模式,是对结对编程的一种延伸和发展。本文旨在深入探讨交换编程的基本概念、实施背景及其在软件开发中的应用价值,并通过实例来...
"结对编程——敏捷开发" 结对编程(Pair Programming)是敏捷开发(Agile Development)中的一种实践方法,它是指两名开发者坐在一起,共享一台电脑,共同编写代码的过程。 结对编程的优点: 1. 提高代码质量:...
### 自组织团队与松结对编程 #### 一、自组织团队的概念与特点 自组织团队是指团队成员能够自我管理并自主决定工作流程的一种团队形式。这种团队模式强调团队内部的高度自治性和协作性,旨在通过减少层级管理和...
《结对编程启示录》是Addison Wesley出版的一本关于结对编程的实用手册,旨在帮助读者快速理解和掌握这种编程方法,以提升代码质量和开发效率。结对编程(Pair Programming)是极限编程(XP,Extreme Programming)...
敏捷软件开发方法中,结对编程是一种实践,它要求两名开发人员在同一台计算机上协同工作。这一方法源自于国际大学生程序设计竞赛(ACM/ICPC)中的团队合作模式。结对编程强调的是两个人的协作,与传统方式相比,它...
**结对编程(Pair Programming)**是极限编程(XP,Extreme Programming)中的一项核心实践,旨在提高软件开发的效率和质量。在这个过程中,两位程序员坐在同一台电脑前,共同编写代码,一人为主程序员(Driver),...
### 结对编程技术与策略 #### 一、引言与背景 在当今快速发展的软件行业中,结对编程作为一种新兴的协作开发模式,正逐渐受到广泛关注。这种开发方式不仅改变了传统意义上的个体开发流程,而且也在软件工程领域内...
【标题】:“结对编程实验报告.pdf” 【描述】:“结对编程实验报告.pdf”是XXX工业大学计算机科学与技术学院和哈工大计算机学院在《软件工程》课程中进行的一项实验活动,旨在让学生通过实际操作体验结对编程的...
是软件工程中结对编程与应用的描述与实现方法
结对编程是一种有效的软件开发方法,它鼓励两人一组共同编写代码,通过互相协作、讨论和监督来提高代码质量和团队效率。在这个场景中,学生们通过结对编程的方式解决了一项关于魔方状态表示和处理的编程任务。 首先...
结对编程,作为一种创新的软件开发实践,源自敏捷开发的理念,旨在提高代码质量和团队协作效率。"结对编程启示录"这本书深入浅出地探讨了这一主题,为小团队提供了宝贵的资源,帮助他们在有限的人力条件下产出高质量...
2020级计算机系软件工程第二次结对编程作业.zip 2020级计算机系软件工程第二次结对编程作业.zip 2020级计算机系软件工程第二次结对编程作业.zip 2020级计算机系软件工程第二次结对编程作业.zip 2020级计算机系软件...
【结对编程】是一种软件开发方法,它提倡两个开发者共享同一台计算机,共同编写和调试代码。在这种模式下,一位开发者负责输入代码,另一位则专注于审查和提供反馈,确保代码的质量和符合设计要求。这种协作方式可以...
### 结对编程在复杂项目开发中的应用 #### 一、结对编程概述 结对编程是一种极限编程(Extreme Programming, XP)技术,它要求两位开发者共同在一个工作站上合作完成编程任务。一位开发者负责编写代码(驱动者),...
结对编程
- **XP(极限编程)**:强调频繁的代码提交、结对编程、简单设计等实践。 - **Scrum**:采用冲刺周期、每日站会、冲刺回顾等方式管理项目。 #### 四、需求工程 - **需求工程活动**:包括需求的初始收集、导出、...
Java 极限编程,也称为 XP(Extreme Programming),是一种敏捷软件开发方法论,它强调团队合作、快速反馈、持续改进和可适应性。在Java语言的背景下,极限编程提供了指导原则和实践,以帮助开发人员在面对不确定性...