软件过程模型
软件过程模型习惯上也称为软件开发模型,它是软件开发全部过程、活动和任务的结构框架。
典型的软件过程模型有瀑布模型、增量模型、演化模型 (原型模型、螺旋模型)、喷泉模型、基于构件的开发模型和形式化方法模型等。
瀑布模型 (Waterfall Model)
瀑布模型是将软件生存周期中的各个活动规定为依线性顺序连接的若干阶段的模型,包括需求分析、设计、编码、测试、运行与维护。它规定了由前至后、相互衔接的固定次序,如同瀑布流水逐级下落,如图 5-2 所示。
瀑布模型的一个变体是 V 模型,如图 5-3 所示。V 模型描述了质量保证活动和沟通、建模相关活动以及早期构建相关的活动之间的关系。随着软件团队工作沿着 V 模型左侧步骤向下推进,基本问题需求逐步细化,形成问题及解决方案的技术描述。一旦编码结束,团队沿着 V 模型右侧的步骤向上推进工作,其实际上是执行了一系列测试 (质量保证活动),这些测试验证了团队沿着 V 模型左侧步骤向下推进过程中所生成的每个模型。
瀑布模型的优点是,容易理解,管理成本低;强调开发的阶段性早期计划及需求调查和产品测试。不足之处是,客户必须能够完整、正确和清晰地表达他们的需要;在开始的两个或 3 个阶段中,很难评估真正的进度状态;当接近项目结束时,出现了大量的集成和测试工作;直到项目结束之前,都不能演示系统的能力。在瀑布模型中,需求或设计中的错误往往只有到了项目后期才能够被发现,对于项目风险的控制能力较弱,从而导致项目常常延期完成,开发费用超出预算。
增量模型 (Incremental Model)
增量模型融合了瀑布模型的基本成分和原型实现的选代特征,它假设可以将需求分段为一系列增量产品,每一增量可以分别开发。该模型采用随着日程时间的进展而交错的线性序列,每一个线性序列产生软件的一个可发布的 “增量”,如图 5-4 所示。
当使用增量模型时,第 1 个增量往往是核心的产品。客户对每个增量的使用和评估都作为下一个增量发布的新特征和功能,这个过程在每一个增量发布后不断重复,直到产生了最终的完善产品。增量模型强调每一个增量均发布一个可操作的产品。
增量模型作为瀑布模型的一个变体,具有瀑布模型的所有优点。此外,它还有以下优点:第一个可交付版本所需要的成本和时间很少;开发由增量表示的小系统所承担的风险不大;由于很快发布了第一个版本,因此可以减少用户需求的变更;运行增量投资,即在项目开始时,可以仅对一个或两个增量投资。
增量模型有以下不足之处:如果没有对用户的变更要求进行规划,那么产生的初始增量可能会造成后来增量的不稳定;如果需求不像早期思考的那样稳定和完整,那么一些增量就可能需要重新开发,重新发布;管理发生的成本、进度和配置的复杂性可能会超出组织的能力。
演化模型 (Evolutionary Model)
演化模型是选代的过程模型,使得软件开发人员能够逐步开发出更完整的软件版本。
演化模型特别适用于对软件需求缺乏准确认识的情况。典型的演化模型有原型模型和螺旋模型等。
原型模型 (Prototype Model)
并非所有的需求都能够预先定义,大量的实践表明,在开发初期很难得到一个完整的、准确的需求规格说明。这主要是由于用户往往不能准确地表达对未来系统的全面要求,开发者对要解决的应用问题模糊不清,以至于形成的需求规格说明常常是不完整的、不准确的,有时甚至是有歧义的。此外,在整个开发过程中,用户可能会产生新的要求,导致需求的变更。
原型是预期系统的一个可执行版本,反映了预期系统的一个选定的子集。开发原型首先确定用户需求,开发初始原型 (不必满足目标软件的所有约束,其目的是能快速、低成本地构建原型),然后征求用户对初始原型的改进意见,这些改进意见可在下一轮中对原型进行改进。原型模型如图 5-5 所示。
根据使用原型的目的不同,原型可以分为探索型原型、实验型原型和演化型原型 3 种。
- 探索型原型的目的是要弄清目标的要求,确定所希望的特性,并探讨多种方案的可行性。
- 实验型原型的目的是验证方案或算法的合理性,是在大规模开发和实现前,用于考查方案是否合适、规格说明是否可靠等。
- 演化型原型的目的是将原型作为目标系统的一部分,通过对原型的多次改进,逐步将原型演化成最终的目标系统。
螺旋模型 (Spiral Model)
对于复杂的大型软件,开发一个原型往往达不到用户要求。螺旋模型将瀑布模型和演化模型结合起来,加入了这两种模型所忽略的风险分析,弥补了这两种模型的不足。
螺旋模型将开发过程分为几个螺旋周期,每个螺旋周期大致和瀑布模型相符合,如图 5-6 所示。每个螺旋周期分为如下 4 个工作步骤。
- 制订计划。确定软件的目标,选定实施方案,明确项目开发的限制条件。
- 风险分析。分析所选的方案,识别风险,消除风险。
- 实施工程。实施软件开发,验证阶段性产品。
- 用户评估。评价开发工作,提出修正建议,建立下一个周期的开发计划。
螺旋模型强调风险分析,使得开发人员和用户对每个演化层出现的风险有所了解,从而做出应有的反应。因此,该模型特别适用于庞大、复杂并且具有高风险的系统。
与瀑布模型相比,螺旋模型支持用户需求的动态变化,为用户参与软件开发的所有关键决策提供了方便,有助于提高软件的适应能力,并且为项目管理人员及时调整管理决策提供了便利,从而降低了软件开发的风险。另外,过多的选代次数会增加开发成本,延迟提交时间。
喷泉模型 (Water Fountain Model)
喷泉模型是一种以用户需求为动力,以对象作为驱动的模型,适合于面向对象的开发方法,它克服了瀑布模型不支持软件重用和多项开发活动集成的局限性。喷泉模型使开发过程具有选代性和无间隙性,如图 5-7 所示。
选代意味着模型中的开发活动常常需要重复多次,在选代过程中不断地完善软件系统。无间隙是指在开发活动 (如分析、设计、编码) 之间不存在明显的边界,也就是说,它不像瀑布模型那样,在需求分析活动结束后才开始设计活动,在设计活动结束后才开始编码活动,而是允许各开发活动交叉、选代地进行。
喷泉模型的各个阶段没有明显的界线,开发人员可以同步进行。其优点是可以提高软件项目的开发效率,节省开发时间。由于喷泉模型在各个开发阶段是重叠的,在开发过程中需要大量的开发人员,不利于项目的管理。此外,这种模型要求严格管理文档,使得审核的难度加大。
统一过程 (UP) 模型
统一过程模型是一种 “用例和风险驱动,以架构为中心,选代并且增量” 的开发过程,由 UML 方法和工具支持。迭代的意思是将整个软件开发项目划分为许多个小的 “袖珍项目”,每个 “袖珍项目” 都包含正常软件项目的所有元素:计划、分析和设计、构造、集成和测试,以及内部和外部发布。
统一过程定义了 4 个技术阶段及其工作产品。
起始阶段 (Inception Phase)
起始阶段专注于项目的初创活动,产生的主要工作产品有构想文档 (Vision Document)、初始用例模型、初始项目术语表、初始业务用例、初始风险评估、项目计划 (阶段及选代)、业务模型以及一个或多个原型 (需要时)。
精化阶段 (Elaboration Phase)
精华阶段在理解了最初的领域范围之后进行需求分析和架构演进,产生的主要工作产品有用例模型、补充需求 (包括非功能需求)、分析模型、软件体系结构描述、可执行的软件体系结构原型、初步的设计模型、修订的风险列表、项目计划 (包括选代计划、调整的工作流、里程碑和技术工作产品) 以及初始用户手册。
构建阶段 (Construction Phase)
构建阶段关注系统的构建,产生实现模型,产生的主要工作产品有设计模型、软件构件、集成的软件增量、测试计划及步骤、测试用例以及支持文档 (用户手册、安装手册和对于并发增量的描述)。
移交阶段 (Transition Phase)
移交阶段关注于软件提交方面的工作,产生软件增量,产生的主要工作产品有提交的软件增量、𝞫 测试报告和综合用户反馈。
每次选代产生包括最终系统的部分完成的版本和任何相关的项目文档的基线,通过逐步迭代基线之间相互构建,直到完成最终系统。
在每个选代中有 5 个核心工作流:捕获系统应该做什么的需求工作流,精化和结构化需求的分析工作流,在系统构架内实现需求的设计工作流,构造软件的实现工作流,验证实现是否如期望那样工作的测试工作流。
敏捷方法 (Agile Development)
敏捷开发的总体目标是通过 “尽可能早地、持续地对有价值的软件的交付” 使客户满意。通过在软件开发过程中加入灵活性,敏捷方法使用户能够在开发周期的后期增加或改变需求。
敏捷过程的典型方法有很多,每一种方法基于一套原则,这些原则实现了敏捷方法所宣称的理念。
极限编程 (XP)
XP 是一种轻量级 (敏捷)、高效、低风险、柔性、可预测的、科学的软件开发方式。它由价值观、原则、实践和行为 4 个部分组成,彼此相互依赖、关联,并通过行为贯穿于整个生存周期。
- 4 大价值观:沟通、简单性、反馈和勇气。
- 5 个原则:快速反馈、简单性假设、逐步修改、提倡更改和优质工作。
- 12 个最佳实践:计划游戏 (快速制定计划、随着细节的不断变化而完善)、小型发布 (系统的设计要能够尽可能早地交付)、隐喻 (找到合适的比喻传达信息)、简单设计 (只处理当前的需求,使设计保持简单)、测试先行 (先写测试代码,然后再编写程序)、重构 (重新审视需求和设计,重新明确地描述它们以符合新的和现有的需求)、结队编程、集体代码所有制、持续集成 (可以按日甚至按小时为客户提供可运行的版本)、每周工作 40 个小时、现场客户和编码标准。
水晶法 (Crystal)
水晶法认为每一个不同的项目都需要一套不同的策略、约定和方法论,认为人对软件质量有重要的影响,因此随着项目质量和开发人员素质的提高,项目和过程的质量也随之提高。通过更好地交流和经常性的交付,软件生产力得到提高。
并列争求法 (Scrum)
并列争求法使用选代的方法,其中,把每 30 天一次的选代称为一个 “冲刺”,并按需求的优先级别来实现产品。
多个自组织和自治的小组并行地递增实现产品。协调是通过简短的日常情况会议来进行,就像檄榄球中的 “并列争球”。
自适应软件开发 (ASD)
ASD 有 6 个基本的原则:
- 有一个使命作为指导。
- 特征被视为客户价值的关键点。
- 过程中的等待是很重要的,因此 “重做” 与 “做” 同样关键。
- 变化不被视为改正,而是被视为对软件开发实际情况的调整。
- 确定的交付时间迫使开发人员认真考虑每一个生产的版本的关键需求。
- 风险也包含其中。
敏捷统一过程 (AUP)
敏捷统一过程 (Agile Unified Process, AUP) 采用 “在大型上连续” 以及在 “在小型上迭代” 的原理来构建软件系统。采用经典的 UP 阶段性活动 (初始、精化、构建和转换),提供了一系列活动,能够使团队为软件项目构想出一个全面的过程流。在每个活动里,一个团队选代使用敏捷,并将有意义的软件增量尽可能快地交付给最终用户。每个 AUP 选代执行以下活动:
- 建模:建立对商业和问题域的模型表述,这些模型 “足够好” 即可,以便团队继续前进。
- 实现:将模型翻译成源代码。
- 测试:像 XP 一样,团队设计和执行一系列的测试来发现错误以保证源代码满足需求。
- 部署:对软件增量的交付以及获取最终用户的反馈。
- 配置及项目管理:着眼于变更管理、风险管理以及对团队的任一制品的控制。项目管理追踪和控制开发团队的工作进展并协调团队活动。
- 环境管理:协调标准、工具以及适用于开发团队的支持技术等过程基础设施。