摘要:目前, 软件开发组织在规范化管理软件的开发过程时倾向于使用 CMMI 模型。但是 CMMI 模型难以同时满足软件项目既生产高质量软件又缩短研制周期的要求。为了满足软件项目的需求,文章提出将敏捷开发方法融入 CMMI 模型,建立面向 CMMI 的敏捷开发过程管理模型。
关键词: 软件能力成熟度集成模型;敏捷方法;极限编程
一、引言
目前,为了在短周期内研发出高质量的软件,研发团队必须采用更高效、更规范的软件开发过程模式。CMMI对于规范化进行软件开发有重要帮助,但是CMMI过于繁杂的软件质量管理体系严重拖慢了软件的研制速度,难以满足一些软件设计周期短、淘汰率高的问题。所以我们急需一种既保证软件质量又能缩短软件研发周期的软件研制过程管理标准。敏捷开发作为一种能适应变化的需求的项目开发方法,能够被用于改进CMMI管理方式,这将有助于项目团队有效地管理成本和提高团队开发效率。将极限编程实践与CMMI结合并不是那么简单。以高效规范的开发软件为目的,提出将敏捷方法和CMMI模型相结合,形成一种新的软件开发过程模型。
二、相关工作
1.敏捷方法。与传统的重型软件开发方法相比,敏捷开发是一种新型轻量式的开发方法,它有利于软件产品的可管理性、可见性和团队沟通。极限编程是敏捷开发方法中较为突出的一种开发方法。极限编程适用于中小型团队,主要用于开发需求快速变化或者需求比较模糊的软件。图1表明了极限编程团队的软件开发过程。
策划是一个需求获取活动,极限编程团队成员在这个阶段需要倾听一系列的用户故事,用户故事是由客户书写的所有需求,客户会给每个用户故事确定优先级。极限编程团队评估每个用户故事对应的时间成本。极限编程团队根据用户故事确定验收测试的准则并确立迭代计划。
在设计过程中,极限编程团队严格遵循KIS(Keep It Simple,保持简洁)原则,设计为用户故事提供恰到好处的实现原则,不提供额外的功能性。CRC(类-责任-协作)卡是极限编程团队的设计工作产品,它用来确定和组织与当前软件增量相关的面向对象的类。如果在设计过程中遇到问题,极限编程建议建立这部分设计的可执行原型(Spike解决方案),团队需要实现并评估设计原型。
极限编程团队在软件需求分析和架构设计完成后,在正式程序编写时,还要同时编写用于测试本版软件新增需求是否完成的一套测试用例,以便在正式程序编写完成后可以马上开始进行测试。
极限编程团队的测试包括单元测试和验收测试,这两种测试都十分重要,极限编程通过测试来保证软件的质量。
2.CMMI框架。CMMI作为框架模型,是一个软件产品和服务的过程改善模型,该模型描述的是一组软件开发过程,提供了有效的实践过程。CMMI将过程划分为“过程管理类”、“项目管理类”、“工程类”及“支持类”四个方面。其中“项目管理类”和“支持类”与极限编程方法密切相关,从这两个方面可以将极限编程方法引入到CMMI框架中。
图2阐述了基本的项目管理类过程域之间以及它们与其他过程域类之间的关系,图3描述了基本的支持类过程域之间及与所有其他过程域之间的关系。
三、结合CMMI的软件敏捷开发过程管理模型
敏捷开发过程管理模型使用CMMI为框架,提高了极限编程方法的软件过程管理能力。同时,敏捷开发过程管理模型也为CMMI的开发团队提供了敏捷开发方法。在CMMI的框架下使用极限编程方法建立敏捷开发过程管理模型有一定的步骤。
第一步:寻找极限编程实践和CMMI过程域之间的联系,根据极限编程方法标识CMMI的过程域。
第二步:基于极限编程方法定义CMMI过程域的实践。
第三步:建立软件极限编程开发模型。
第四步:通过实际项目实现模型,验证模型的可行性。
1.过程标识。为了确定CMMI和极限编程实践能够融合的过程域,本文介绍极限编程的12个实践,并分析它们与CMMI过程域之间的联系,并初步建立极限编程和CM-MI融合的过程模型。
计划博弈:极限编程开发小组根据客户阐述的需求估算开发成本与风险。客户需要根据这种估算结果和每个需求的重要性,制定一个大致的项目计划。开发小组在迭代开发的过程中,对每一次迭代进行迭代策划,每一次策划都参考了上一次迭代的开发速度并对此次策划进行估算。计划博弈与CMMI项目策划过程域中的专用目标1(SG1)建立估计值和专用目标2(SG2)制定项目计划相匹配。
小型发布:在极限编程团队中,会在较短的时间发布一个软件的新版本,新版本软件的一致性和可靠性通过验收测试和测试驱动的开发来保证。同时,极限编程团队通过小型发布软件可以简单地估计每个迭代周期的进度并及时处理用户的反馈,这样做能够控制工作量和风险。在短期内,它与CMMI项目策划过程域中的专用实践 1.3(SP1.3)定义项目生存周期相匹配。
隐喻:隐喻可以被认为是一个名字系统或一个术语字典,隐喻提供了一个词汇表,这个词汇表包含了一个完整系统的所有组成元素名称,并能够定义这些元素之间的关系。隐喻能够让整个系统模型变得明显直观和易于理解。隐喻是一个相对较难理解的实践,它是否应该归属于极限编程实践也存在一些争议。CMMI中没有一个与这个实践完全匹配的过程域。
简单设计:极限编程团队需要尽可能的寻找能够实现当前用户需求的最简单的设计。简单设计认为极限编程产出的代码能够简单的被理解并且没有重复代码。CMMI中并没有一个与这个实践完全匹配的过程域。CMMI中技术解决方案过程域中的专用目标2(SG2)开发设计可以使用简单设计思想。
测试:极限编程的测试包括验收测试和单元测试。验收测试与用户密切相关,它是客户可见并且可以评审的功能性黑盒测试。验收测试的目的是保证软件产品的质量,这种质量保证过程在极限编程过程中不可替代。验收测试和过程与产品质量保证过程域中的专用目标1(SG1)客观的评价过程与工作产品相关。单元测试是在编码开始前,程序员先为大部分类写出对应的测试程序,这些测试程序应该简单且可以重复。技术解决过程域中的专用目标3(SG3)实现产品设计明确描述了单元测试应当测试的测试内容。
代码重构:代码重构一般与单元测试同时开始,代码重构是为了改善设计,代码重构需要确保加入了新功能后,代码仍然满足简单设计的原则,从而保证重构后的代码能够运行所有的测试。代码重构与CMMI技术解决方案过程域中的专用实践2.4(SP2.4)作开发、购买或重用分析相关。
结对编程和集体代码所有制:结对编程是两个程序员在一个工作台前工作的软件开发技术。一个程序员编写代码,另一个程序员审查代码。这两个程序员经常切换角色。在审查时,观察者思索工作的战略方向,提出改进的想法和定位未来可能要解决的问题,这使驾驶者能够集中所有注意力完成当前任务的“战术”方面。集体代码所有制则鼓励所有人对项目的每个部分提出新想法。任何开发人员都可以更改任何代码行以添加功能、修复错误或实现重构。CMMI验证过程域中的专用目标2(SG2)同行评审与集体代码所有制和结对编程有相同的价值观。
持续集成:持续集成是项目团队成员将个人研发的部分向软件整体部分交付,频繁地整合他们的工作的软件开发成果以便更快的发现软件中的错误。持续集成保证项目成员能够了解整个项目的进度并让程序员更加专注于代码,最大限度的减少了风险。持续集成能通过CMMI配置管理过程域中的专用实践1.2(SP1.2)建立一个配置管理系统实现。
可持续的速度:极限编程团队需要持久才能成功。死亡行军项目既不能生产很多软件也不能生产出高质量软件。CMMI的过程域中并没有规定工作时间。但是,可以通过测量与分析过程域中的专用目标(SG1)安排测量和分析活动控制项目开发速度。
现场客户:有一名客户代表会作为现场客户参与极限编程团队开发的全过程,现场代表会与程序员之间进行讨论需求和测试等问题,项目团队通过现场客户的存在能更好的理解客户需求,现场客户通过与团队工程师的交流能更好的确定自己的需求。这种做法与CMMI的需求管理过程域密切相关。
编码标准:极限编程团队遵循一个通用的编码标准,使所有的代码在系统看起来好像是由一个非常称职的程序员编写的。极限编程团队通常会建立一个共用的编程规范,所有开发人员必须遵循这个规范,这个编码标准的细节并不重要,重要的是所有代码的统一性。这种实践是在CMMI的技术解决方案过程域实现的。
2.过程定义。通过对CMMI各个过程域与极限编程各个实践之间的标识匹配,本文确定定义了软件敏捷开发模型的7个过程域:需求管理、项目策划、项目监控、技术解决方案、配置管理、测量与分析、过程与产品质量保证。
需求管理将管理项目产生的所有需求。首先,客户提出对他们最有价值的用户故事并建立用户故事的验收标准,开发人员判断客户提出的需求是否可以接受并建立需求可以被接受的准则,客户和开发人员在这个阶段建立了对需求的共同理解,对需求达成一致。然后开发者编制完成需求文档、组织客户一同参加文档评审并从项目参与者那里获得对需求的承诺。提出用户故事并参加需求文档评审的客户是现场客户,一般来说,现场客户将参与整个项目周期并且致力于整理需求细节。
项目策划旨在建立并维护规定项目各项活动的计划。项目策划无法实现一劳永逸,为了更好地完成项目团队的任务,整个项目组可能需要“与时俱进”,根据目前的项目发展情况反复进行策划。项目策划过程与极限编程中的小型发布和计划博弈在思想上有相通之处。
项目监督和控制过程是贯穿于整个项目生命周期。项目监控的存在具有必要性,这个过程让项目在管理、人员等方面具备可视性,管理部门能够根据项目监控做出决策,当项目的进度与计划有偏差时,项目团队成员能及时采取纠正措施。项目监控能够通过迭代开发来进行监测和重新策划。
技术解决方案在项目的迭代周期内,始终坚持极限编程实践中简单设计、代码重构和持续集成的原则。
配置管理的核心在于建立和维护软件产品的完整性。极限编程实践与配置管理过程域专用实践没有完全一致的部分。但是极限编程实践的结对编程、编码规范和持续集成都为配置管理中的版本控制带来了便利。
项目的整个生命周期都需要进行软件测量与分析活动,因此测量计划在项目的全生命周期内一直保持其有效性。为了实现测量与分析的目标,保证项目的可持续稳定开发,在这个过程中规定团队的每日工作时间。
过程和产品质量保证的目标是保证预定的流程能够被正常执行。项目团队往往通过迭代开发和测试来确认开发活动是否正确的创造了客户要求的产品。通过应用单元测试、验收测试和结对编程方式来保证软件质量。
3.过程模型。图4说明了CMMI框架下的软件敏捷过程管理模型。这个模型展示了如何在CMMI的框架下使用极限编程方法开发高质量软件。
开发过程从在需求管理过程中编写的用户故事开始。项目策划从需求开发过程或收集故事卡之后开始。在技术解决方案中开发人员实现相关的源代码,同时开发人员根据用户故事进行单元测试和验收测试实现过程和产品质量保证。项目监控过程观察所有的开发过程。同时,配置管理过程支持构建相关工具。最后,测量和分析过程在整个项目生命周期中执行对所有过程活动的测量分析。
四、总结和展望
CMMI与极限编程实践的核心思想都是为了响应客户需求并提升软件产品质量。CMMI关注整个组织级或企业级的完善,注重整个规范化的软件开发过程,以软件开发过程中应该做些什么为关注重点。另一方面,敏捷开发更加注重整个项目的完善,更加注重软件开发过程的确切实现方法,以怎样做才能实现目标为第一要义。在研究活动中这两者的互相借鉴与结合非常具有价值。通过将极限编程实践与CMMI的过程域相匹配,识别出过程域中敏捷和CMMI的共通之处,可以重定义CMMI过程域,并以此初步建立基于CMMI的敏捷开发过程管理模型。
参考文献:
[1]金敏,周翔.高级软件开发过程:Rational统一过程、敏捷过程与微软过程[M].北京:清华大学出版社,2005.
[2]隋立江.敏捷方法在软件开发过程中的实现[J].航空制造技术,2011,(10):64-67.[3]Roger S Pressman.软件工程:实践者的研究方法[M].北京:机械工业出版社,2011.
基金项目:中国科学院青年创新促进专项基金(项目号:CASYI2014135),中国科学院太空应用创新基金(项目号:CXJJ-16S064)。
作者简介:高铭(1964-),女,汉族,北京市人,中国科学院空间应用工程与技术中心主任、研究员,中国载人航天工程空间应用系统总指挥,国际宇航学院通讯院士,研究方向为工程项目管理;张慧玲(1992-),女,汉族,湖北省潜江市人,中国科学院大学经济与管理学院、中国科学院空间应用工程与技术中心硕士生,研究方向为工程项目管理。
(本文2017年发表于《现代管理科学》)