1,敏捷过程
为了使软件开发团队具有高效工作和快速响应变化的能力,17位著名的软件专家于2001年2月联合起草了敏捷软件开发宣言。
敏捷软件开发宣言由下述4个简单的价值观声明组成。
(1)个体和交互胜过过程和工具
优秀的团队成员是软件开发项目获得成功的最重要因素;当然,不好的过程和工具也会使最优秀的团队成员无法发挥作用。
团队成员的合作、沟通以及交互能力要比单纯的软件编程能力更重要。
正确的做法是,首先致力于构建软件开发团队(包括成员和交互方式等),然后再根据需要为团队配置项目环境(包括过程和工具)。
(2)可以工作的软件胜过面面俱到的文档
软件开发的主要目标是向用户提供可以工作的软件而不是文档;但是,完全没有文档的软件也是种灾难。开发人员应该把主要精 力放在创建可工作的软件上面,仅当迫切需要并且具有重大意义时,才进行文档编制工作,而且所编制的内部文档应该尽量简明扼要、主题突出。
(3)客户合作胜过合同谈判
客户通常不可能做到一次性地把他们的需求完整准确地表述在合同中。能够满足客户不断变化的需求的切实可行的途径是,开发团队与客户密切协作,因此,能指导开发团队与客户协同工作的合同才是最好的合同。
(4)响应变化胜过遵循计划
软件开发过程中总会有变化,这是客观存在的现实。一个软件过程必须反映现实,因此,软件过程应该有足够的能力及时响应变化。然而没有计划的项目也会因陷入混乱而失败,关键是计划必须有足够的灵活性和可塑性,在形势发生变化时能迅速调整,以适应业务和技术等方面发生的变化。
在理解上述4个价值观时应该注意,这些声明只不过是对不同因素在保证软件开发成功方面所起作用的大小做了比较,说一个元素更重要并不是说其他因素不重要,更不是说某个因素可以被其他因素代替。
根据上述价值观提出的软件过程统称为敏捷过程,其中最重要的是极限编程
2,极限编程
极限编程(eXtreme Programming,XP)是敏捷过程中最富盛名的一个,其名称中“极限”二字的含义是指把好的开发实践运用到极致。目前.极限编程已经成为种典型的开发方法,广泛应用于需求模糊且经常改变的场合。
(1)极限编程的有效实践
下面简述极限编程方法采用的有效的开发实践。
客户作为开发团队的成员
必须至少有一名客户代表在项目的整个开发周期中与开发人员在- -起紧密地配合工作,客户代表负责确定需求、回答开发人员的问题并且设计功能验收测试方案。
使用用户素材
所谓用户素材就是正在进行的关于需求的谈话内容的助记符。根据用户素材可以合理地安排实现该项需求的时间。
短交付周期
每两周完成一次的迭代过程实现了用户的一些需求,交付出目标系统的-个可工作的版本。通过向有关的用户演示迭代生成的系统,获得他们的反馈意见。
验收测试
通过执行由客户指定的验收测试来捕获用户素材的细节。
结对编程
结对编程就是由两名开发人员在同一台计算机上共同编写解决同-个问题的程序代码,通常一个人编码,另一个人对代码进行审查与测试,以保证代码的正确性与可读性。结对编程是加强开发人员相互沟通与评审的一种方式。
测试驱动开发
极限编程强调“测试先行”。在编码之前应该首先设计好测试方案,然后再编程,直至有测试都获得通过之后才 可以结束工作。
集体所有
极限编程强调程序代码属于各个开发小组集体所有,小组每个成员都有更改代码的权利,每个成员都对全部代码的质量负责。
持续集成
极用编程主张在一天之内多次集成系统,而且随着需求的变更 .应该不断地进行回归测试
可持续的开发速度
开发人员以能够长期维持的速度努力工作,XP规定开发人员每周工作时间不超过40小时 、连续加班不可以超过两周,以免降低生产率。
开放的工作空间
XP项目的全体参与者(开发人员、客户等)一起在个开放的场所中工作。项目组成员在这个场所中自由地交流和讨论。
及时调整计划
计划应该是灵活的、循序渐进的。制定出项目计划之后.必须根据项目进展情况及时进行调整,没有一成不变的计划。
简单的设计
开发人员应该使设计与计划要在本次迭代过程中完成的用户索材完全匹配,设计时不需要考虑未来的用户素材。在一次次的迭代过程中,项目组成员不断变更系统设计,使之相对于正在实现的用户素材而言始终处于最优状态。
重构
所谓代码重构就是在不改变系统行为的前提下,重新调整和优化系统的内部结构,以降低复杂性、消除冗余、增加灵活性和提高性能。应该注意的是.在开发过程中不要过分依赖重构。特别是不能轻视设计,对于大中型系统而言,如果推迟设计或者干脆不做设计,将造成一场灾难。
使用隐喻
可以将隐喻看作把整个系统联系在一起的全局视图,它描述系统如何运作,以及用何种方式把新功能加人到系统中。
(2)极限编程的整体开发过程
上图描述了极限编程的整体开发过程。首先,项目组针对客户代表提出的“用户故事"(用户故事类似于用例,但比用例更简单,通常仅描述功能需求)进行讨论,提出隐喻,在此项话动中可能需要对体系结构进行“试探"(所谓试探就是提出相关技术难点的试探性解决方案)。然后,项目组在隐喻和用户故事的基础上,根据客户设定的优先级制订交付计划(为了制订出切实可行的交付计划,可能需要对某些技术难点进行试探)。接下来开始多个选代过程(通常每个迭代历时1~3周),在迭代期内产生的新用户故事不在本次迭代内解决,以保证本次开发过程不受干扰。开发出的新版本软件通过验收测试之后交付用户使用。
(3)极限编程的迭代过程
上图描述了极限编程的迭代开发过程。项目组根据交付计划和“项目速率”(即实际开发时间和估计时间的比值),选择需要优先完成的用户故事或待消除的差错,将其分解成可在1~2天内完成的任务,制订出本次迭代计划。然后通过每天举行一次的“站立会议”(与会人员站着开会以缩短会议时间,提高工作效率),解决遇到的问题,调整迭代计划,会后进行代码共享式的开发工作。所开发出的新功能必须100%通过单元测试,并且立即进行集成,得到的新的可运行版本由客户代表进行验收测试。开发人员与客户代表交流此次代码共享式编程的情况,讨论所发现的问题,提出新的用户故事,算出新的项目速率,并把相关的信息提交给站立会议。
综上所述,以极限编程为杰出代表的敏捷过程,具有对变化和不确定性的更快速、更敏捷的反应特性,而且在快速的同时仍然能够保持可持续的开发速度。上述这些特点使得敏捷过程能够较好地适应商业竞争环境下对小型项目提出的有限资源和有限开发时间的约束。