快速的软件开发过程就是为迅速制造可用软件而设计的。软件的开发和部署不是一次完成的,而是以一系列增量的形式完成的,每一个增量包括新的系统功能。尽管有很多快速软件开发的方法,它们都有一些基本的特性:
描述、设计和实现过程是交织在一起的。没有详细的系统描述,设计文档得到了最少化,或者是由实现系统所采用的编程环境所自动生成。用户需求文档只定义最为重要的系统特性。系统通过一系列版本开发出来。最终用户和其他系统信息持有者都参与了每个版本的定义和评估。他们提出对软件的变更建议和对系统后一个版本应该实现的新需求的提议。系统用户界面通常是采用交互式开发系统开发的,这些开发系统允许通过绘图和在界面上摆放图标的方式迅速完成界面的设计。系统可以为浏览器生成基于Web的界面,或者是为专门平台比如微软视窗设计一个界面。
敏捷方法是增量式开发方法,每个增量一般都比较小,通常,每两三个星期就会创建系统的新版本并提供给用户使用。用户参与开发过程,以便快速地获得变更需求的反馈。利用非正式的沟通、而不是采用有书面文件的正式会议,这样使文档制作量最少化。
敏捷方法
敏捷方法关于软件开发成功的理解
虽然没有成功地生产出软件产品,但是在软件过程中如果及时发现风险,及时结束项目开发,避免更大的损失,敏捷方法认为成功;
虽然存在一定的超支、超期现象,但是软件产品成功生产,并在实际业务应用中创造了巨大价值,敏捷方法也认为成功。
敏捷宣言
强调灵活、快速地生产可用的软件产品强调敏捷团队成员个体活动及个体间的交互,而不是强调过程、开发工具强调花更多时间生产能够服务于用户的软件产品,而不注重生产详尽的文档资料强调敏捷团队的用户协作开发,而不是基于死板的合约注重应对变更,而不是遵守一成不变的开发计划关于敏捷方法的敏捷的理解
交流:用户与开发人员持续沟通、交流简单设计:软件设计、实现都简单的选择方案(简单地设计,给出粗略的、可行方案,不做详尽、全面、细致的方案设计)频繁交付:尽快的、频繁的交付,不要害怕软件存在缺陷应对反馈:软件开发过程的不同活动都相应反馈,解决变更问题敏捷方法的基本原则:
对于系统描述,计划驱动和敏捷方法之间的不同:
极限编程
极限编程的版本循环:
如下图,反映了敏捷方法的一些原则:
增量式开发是通过系统小的频繁的版本来支持的,其间所采用的对需求描述的方法是基于客户故事情节或脚本,这样的故事情节或脚本作为决策哪些功能需要放在增量里的根据。客户的参与是采用全时雇佣到开发团队的方式。客户代表参与开发并负责定义系统的接收测试。人,而不是过程,是通过结对编程、对系统代码的集体拥有、可持续的开发过程而无需超额的工作时间来运作的。对变更的支持是通过经常性的系统版本发布、测试优先开发、重构以避免代码退化以及连续的集成新功能等方法实现的。对简单性的维护是通过持续的重构来改善代码质量、使用简单的设计以减少系统将来的变更等方式来支持的。
增量开发的一个普遍问题是,它有使软件结构变坏的趋势,所以变更越来越难以实现。本质上,程序员总是在想方设法找到一个变通方法以解决问题,代码经常重复,部分软件不恰当地使用,代码添加到系统中使整体结构变坏。
极限编程对此问题的解决是通过对软件的不断重构。这意味着编程团队对软件查找可能的改善并马上实现它。当一个团队成员发现代码可改进,即使在没有紧急需要的情况下,他们也会改进它。重构的例子包括:类的层次结构重组以消除重复代码,整理和重命名属性和方法,调用程序库中的方法替换代码。程序开发环境,比如Eclipse ( Carlson,),包括重构的工具,可以简化寻找代码不同部分间的依存关系并进行全局代码修改。
敏捷项目管理
Scrum方法是一个通用的敏捷方法,但主要是注重迭代开发的管理,而不是管理敏捷软件工程的专门的技术方法。Scrum的管理过程图:
Scrum有3个阶段。第一个是规划纲要阶段,建立大致的项目目标和设计软件体系结构。接下来是一系列的冲刺循环,每个循环开发出一个系统增量。最后,项目结束阶段总结项目,完善需要的文档,如系统帮助和用户手册,并总结从项目中学到的经验。
Scrum的创新在于它的中心阶段,也就是冲刺循环。一个循环是一个计划单元,需要做的工作有:评估,特征的选择和开发,软件实现。循环的最后一个阶段,所开发的全部功能都将交付给信息持有者。这个过程的主要特点如下:
冲刺有一个固定的长度,一般是2~4周。在XP中,对应于一个系统版本的开发。规划的起点是所谓的backlog(积压的任务),是项目中要完成的工作清单。在评估阶段,这些积压的任务经过审查,对它们进行优先级排序并进行风险的指派。此过程中,用户都紧密地参与,在每一个循环开始时提出新的需求或任务的建议。在选择阶段,项目团队的所有人员都要参加,和用户一起选择在冲刺循环中要开发的特性和功能。一旦这些都得到同意,团队将组织进行软件开发。每天,团队的开发成员都要参加短时会议,回顾开发过程,若有必要,将重新安排工作。这个阶段,开发团队是隔离于客户和机构的,所有的交流都通过所谓的“Scrum master”进行。Scrum master使开发团队免受外界干扰。工作方式取决于遇到的问题和团队。不像XP,Scrum对于如何写需求、测试优先开发等不做具体要求。但是,如果团队觉得合适,这些XP的实践也可以用。冲刺循环的结束,对已做工作复查并交付给用户。接着,下一个循环就开始了。
优点:
产品被分解成一组可管理的和可被理解的块。不稳定的需求并不阻碍工程进展。整个团队的所有事情都是可见的,因此改善了团队的沟通。用户看到增量的及时交付,且得到对于产品如何工作的反馈。客户和开发者之间彼此信任,创造了积极的文化,每个人都希望项目成功。
结论:
敏捷方法是一种专注于快速开发的增量式开发,频繁地发布软件、降低过程开销、生产高质量的代码。他们使用户直接地参与到开发过程中。决断是否是使用敏捷或计划驱动的方法取决于所开发系统的类型、开发团队的能力和开发系统的公司的文化。极限编程是一种著名的敏捷方法,它集成了一系列好的编程经验,例如频繁地软件发布,连续软件改善和客户参与到软件开发团队。极限编程的一个特别长处是在创建程序特征之前开发自动测试。在增量集成进系统的时候所有的测试必须成功执行。Scrum方法是一种提供项目管理框架的敏捷方法。它的核心是一组冲刺循环,开发一个系统增量是有固定的时间周期的。规划是基于积压的工作的优先权安排的,选择高优先权的任务开始冲刺循环。伸缩的敏捷方法对于大型系统是很困难的。大型系统需要前期设计和一些文档。在实践中,当一个项目有几个独立的开发团队时,连续的集成是不可能的。