UML软件工程组织

 

 

兴工具之利 善敏捷之事
 
作者: 蔡培堃 出处:软件世界
 

虽然在敏捷开发过程中,工具的使用已经不会再被反复地强调,但是实践证明,我们仍然无法忽视工具对敏捷开发项目的重要意义。合理的选择和使用工具,将使敏捷开发真正受益于工具,而不是受工具所累。

随着软件规模和复杂度的不断加大,想在计划的时间和预算内完成一个项目似乎越来越难。主要原因就是不可控制的因素对整个开发过程的影响日益凸现,如人员流失、需求变更、分布式团队难于协调等。针对于此,一些被广泛认可的方法,譬如敏捷和CMMI,越来越受欢迎。根据VersionOne在2006年的调查报告,大约有80%的公司在采用敏捷方法后生产力提高或明显地提高。

敏捷开发强调以人为本,认为面对面沟通是软件项目成功的一个重要因素。

当我询问一个研发经理关于敏捷开发所需的工具时,他开玩笑地说,一张白板和两杯咖啡。这也反映出开发人员对于敏捷方法的普遍认知。

事实上,许多开发项目主管虽然认同敏捷开发所强调的快速反应和沟通的理念,却担心它的“杂乱无章”带来的“不安定因素”。因为它极度地强调人的因素,使得人员的素质对敏捷团队的影响,远比对其他团队更大。

举例来说,配对检入是个保证代码质量很好的方法。但编程人员不了解其重要性,可能为了进度,常常一个人草草就检入了。因此,在采用敏捷方法时,若能适当地使用工具来保存累积的知识并固化关键过程,必能使敏捷项目更加成功。我们试以敏捷开发的几个主要特点为例,探讨工具在敏捷开发中扮演的角色。

特点一:测试驱动开发

传统的瀑布方法先编码再测试,等到发现需求和设计上的问题,为了节省费用,常常不了了之。测试驱动开发是在需求产生后,设计模块和其之间的接口,并将单元测试代码完成。在此过程中,需求和设计上的偏差将会被发现。由于编码尚未进行,只需更改需求和设计即可,避免造成太大浪费。

特点二:简单设计

敏捷开发崇尚简单的渐进设计,而不是剧烈的颠覆式设计。其目标是首先只设计我们所了解的那些部分,然后使该设计随着时间的推移而逐渐改进,这有助于提高灵活性并将变化导致的成本最小化。

特点三:配对编程

尽管两人一组的配对编程从理论上看使眼前目标和长远目标都得以保证,这却是敏捷方法中备受争议的做法,反对者普遍认为它会导致耗时加倍。广义的配对编程也包括前面提到的配对检入(Pair Check-in),也就是由两人一起检验代码的正确性,然后才检入。

特点四:小型发布

发布周期短可使对项目的评估提前,进而降低了风险性。但这所带来是大量的可执行文档,造成管理上的困难。

工具所扮演之角色

现在让我们以一个典型的敏捷团队DevAgile为例,看看该如何用工具实现其敏捷过程和设想(图1)。Smart先生是DevAgile团队的项目经理,他被要求在开发过程中体现我们以上所列的几方面特点,在配对编程方面还要求配对检入。

图1:工具对敏捷开发的支持示例

角色1:需求管理的利器

对项目需求和设计文档的管理是DevAgile必须首先面对的问题。他们要完成的,恰恰是一个需求变更很快的项目,这也是他们选择敏捷开发的重要原因。在敏捷开发中,需求的变化常常是为下一次迭代提供信息和进度计划的依据。

因此,DevAgile的大多数成员认为,记录下每一次关键的需求变更很重要,尽管最初有些人坚持敏捷开发并不需要文档。

同时,他们也注意到,要遵循简单设计的原则,并非意味着设计文档不需管理。相反,文档的数量和版本都会比采用其他开发方式更多。这些设计文档及其历史应该被妥善地管理,也要和相对应的配置项链接。

另外,小型发布意味着整个生命周期中有更多的发布,如何对这些发布进行系统化管理也是DevAgile团队必须解决的问题。

综合以上这几点考虑,Smart先生认为,应该找到一种需求管理的武器。DevAgile团队在进行了一番市场调研后,决定尝试TechExcel DevSpec这种需求管理工具。它不仅提出“以知识为核心”的概念,满足需求和设计文档管理的要求,还实现了真正的“功能驱动开发”。

尽管DevAgile目前没有清楚的看到后者如何实现,但DevSpec对产品需求、产品功能及知识文档的系统管理还是吸引了他们。

它成全了设计团队的敏捷性,支持简单设计,并对他们经常修改设计的做法提供了管理上的帮助。一些成员还指出,在敏捷开发的道路上,太多的不确定因素和灵活性难免会影响大家对最终产品的认识,有一个这样的工具能够时时刻刻描绘出要发布产品的清晰轮廓,记录下产品需求和功能变更的每一步,实在是很令人欣慰。

另外,为了配合数量多的小型发布,DevSpec还有整理发布功能点的能力。也就是说,将和某一发布有关的新功能、功能变更,以及缺陷修复,全都进行统一组织和管理。

例如,要完成6.1的发布,他们只需把6.1功能文件夹里所有的新功能、功能变更,以及缺陷修复全都做完,6.1版本也就可以发布了。为了更大程度上提高开发效率,Smart先生还别出心裁的对这些功能及缺陷设定了优先级,优先级低的任务可能被延缓执行。实践证明,这种具灵活性且针对发布来管理的系统使小型发布越发容易。

角色2:项目规划的利器

Smart先生发现敏捷的项目管理要能做到随机应变,应付各种可能出现的情况,也是建立在对任务的细分,并对任务的状态采取高频度的探测并及时调整的基础上。DevAgile选择了TechExcel DevPlan作为项目规划工具,因为它能够围绕DevSpec中管理的功能点进行迭代计划,对人力资源进行管理,既把握了正确的宏观方向,又能对任务细分。任务若被耽延,还可以反馈回来。

Smart先生认为,作为敏捷团队的项目经理,他应该从传统项目经理的“工头”身份中解脱出来,发挥他的领导力,去监控和协调开发过程。虽然项目经理还是必须定义和初始化项目,作项目计划,执行计划,监督并控制结果。

但是完成这些步骤的方式却是不同的。具体来说,敏捷项目的计划不再是详细的完整的项目实施步骤和资源分配,而更多的表现为一种迭代计划。在开发人员与客户或其他团队沟通的每一次迭代中,计划和资源分配随时可能被调整,以不断适应项目进展的需要。在DevPlan的帮助下,这种调整变得方向明确、清晰和有据可查。它将每一次迭代的框架确定下来,剩下的工作就是根据这个框架实施了。

角色3:测试管理的利器

有了DevPlan,测试计划和开发计划开始制定,项目在一种既有序又敏捷的机制下运有序地转着。为了实现“测试驱动开发”,DevAgile不可避免的遇到了测试管理的问题。他们注意到,需求管理工具DevSpec内的需求,可被直接导入测试管理工具TechExcel DevTest,并自动生成测试任务。所有测试任务可以遵照既定的工作流执行,保证测试工作的有序开展和管理,并在编码之前发现设计偏差。

另外,他们以往是用光盘来存储可执行版本,文件柜的每一个抽屉里都装满了光盘。在进行敏捷开发以后,光盘的数量更是与日俱增,要找某版本的光盘时,多半是很困难的。

DevTest能够保存和管理发布的软件版本,而且和DevSpec内的功能及缺陷文件夹相对应。也就是说,若在需求管理工具DevSpec内有个6.1功能文件夹,那么在测试管理工具DevTest中也有个相对应的6.1发布文件夹。这显然比用其他方式来存储软件版本更加科学和方便。

角色4:任务执行的利器

有了以上这些项目管理的利器之后,DevAgile团队的工作并非一帆风顺,因为新的问题又出现了:一些成员片面的认为敏捷开发是一种松散型开发模式,也就是不需要遵守固定的流程。这直接导致了很多开发任务的执行效果糟糕,有些任务被提出以后就失去了踪迹,就连Smart先生也难以追踪每一个任务的结果。

于是,DevAgile团队又引入了与DevSpec和DevTest可以集成的DevTrack。这是一个开发任务的跟踪管理工具,提供既固化又可灵活更改的流程,对每一个任务的生命周期进行严格管理。它保证该走的过程一定走过;该反馈的一定反馈;该提醒的一定提醒;若任务需被升级,那就一定会被自动升级。更令人兴奋的是,当任务完成之后,其结果会自动返回需求管理工具DevSpec或测试管理工具DevTest。Smart先生可以轻易地由DevSpec看到针对6.1版本发布的所有功能和开发任务是否全部做完,对发布的管理省时省事。

直到实施了任务执行管理工具DevTrack,Smart先生才逐渐认识到由DevSpec引导的“功能驱动开发”是如何实现的。DevPlan中的迭代计划、DevTest中的测试任务和DevTrack中的开发任务,都是围绕DevSpec中的功能展开的。这不仅使整个敏捷过程都严格围绕最终产品进行,而且其中的可追溯性和可核查性,也正是敏捷开发思想的有益补充。

现在,当项目成员在会议室和用户讨论得热火朝天的时候,Smart先生可以悠闲地在电脑前喝咖啡了,他知道整个过程都是可以控制的,需求和设计变化再多再大,经历再多的迭代和小型发布,只要所有功能都按照计划被开发和测试,项目还是会如期完成。

敏捷团队的成功案例总结

毫无疑问,DevAgile团队最终用敏捷开发方式取得了项目成功。让我们再来总结一下,他们是如何具体做到的呢?首先,需求被搜集和整理,产品功能和简单设计产生,将这些结构框架和相关文档存入DevSpec之后,开始制定迭代计划,并定义模块接口。紧跟着,针对接口做出测试代码。这些知识文档全由DevSpec来管理,因此DevSpec中形成了由需求、功能和知识文档组成的“概念产品”。

最后,功能点被导入DevTest而产生一个或多个测试任务,每一个测试任务都能按照DevTrack中定义的工作流(图2)进行。

图2:DevTrack中定义的测试任务工作流示例

图2的工作流被启动之后,编码人员在第一状态负责编写代码、重构和白盒测试。项目经理为了实现配对检入,把第二状态设为需有A和B两人一起检入的“配对检入”。每一个状态都有明确的负责人。A可以是第一状态负责人,而与A配对的人员则可以是跟A 所做的任务有关的人员。第三状态负责人可以是测试人员,在单元测试成功后便完成了整个流程。反之,则重新回到第一状态。

以上的案例中,对所提到的四个敏捷特点都有所注解。当然,这是一个可行的方案,而绝非唯一。

另外,面对面沟通也是个很好的敏捷操作,但是实际上却不易实现。客户或熟知商业逻辑的同事通常是无法长时间和开发设计人员在一起工作的。若一定要面对面,很可能会以高昂的费用为代价。更实际的方式是通过一定的沟通平台(如一些即时语音或视频通讯工具)来达到类似面对面的沟通。

无论采用何种方式,沟通后的结果都要能妥善地记录下来。知识的分类和历史的记录会使清晰度达到最高,进而使后来的一切活动,包括编码、测试、分析等,都变得容易。

除了以上所提到的工具,软件配置管理、单元测试、软件的基础架构管理等工具,都是决定敏捷开发项目是否能够取得成功的关键因素。

总的来说,工具的使用要能帮助敏捷团队达到下列几项目的:能针对迭代进行灵活的计划,能管理需求变更,能始终体现最终产品的框架,能将关键过程既用流程固化又随时可调整,能对需求和供能点排列优先级,能使各方沟通更加便利等等。只有这样,才能使敏捷方法真正受益于工具,而不是受工具所累。

链 接

配对编程

开发人员每两人一组编写所有的代码,其中一人作为“驱动者”,关注的是为实现眼前目标而涉及的编码细节,而另一个人同驱动者一道解决问题和规划更大的图景。这两个角色可以按需要进行轮换。

 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号