(第一部分:软件工程概述,第2章)
Created: 2022-04-06 Wed 00:52
第一部分:软件工程概述
第2章:软件生存期模型
软件生存期模型 也称为 软件过程模型 , 是从 软件项目需求定义 直至 软件运行维护 为止, 跨越整个生命周期的系统开发、运行和维护所实施的全部过程 、 活动和任务的结构框架 。 到目前位置,已经提出了多种软件生存期模型, 典型的包括 瀑布模型 、 原型模型 、 增量模型 、 螺旋模型 、 统一过程 、 敏捷过程 等。
在20世纪80年代之前, 瀑布模型 一直是唯一被广泛采用的 软件生存期模型 。 传统软件工程方法学 的 软件过程 基本上可以用 瀑布模型 来描述。
传统瀑布模型的特点:
实际瀑布模型的特点:
经典生存期模型 和 V模型 没有本质区别, V模型 提供了一种将 测试活动应用于早期软件工程工作中的方法 。
瀑布模型优点 :
瀑布模型缺点 :
快速原型 是快速建立起来的可以在计算机上运行的程序, 它所能完成的功能往往是
最终产品功能的一个子集 。
增量模型 也称为 渐增模型 ,是Mills等人于1980年提出来的。 使用增量模型开发软件时,把软件产品作为一系列的 增量构件 来 设计 、 编码 、 集成 和 测试 。 每个构件由多个相互作用的模块构成,并且能够完成特定的功能。
例如,使用增量模型开发字处理软件时,
增量模型的优点:
将 软件产品 分解成一系列的 增量构件 ,在 增量开发迭代 中逐步加入。 为此,要求构件的 规模适中 ,并且新构件集成到已有软件所形成的新产品必须是 可测试 的。
因此,采用 增量模型 比采用 瀑布模型 和 快速原型模型 更需要 精心的设计
螺旋模型 最初是Boehm于1988年提出来的。 该模型将 瀑布模型 与 快速原型模型 结合起来, 并且加入两种模型均忽略了的 风险分析 。
螺旋模型的基本思想是, 使用原型及其他方法来尽量降低风险。 理解这种模型的一个简便方法, 是把它看作 在每个阶段之前都增加了 风险分析过程 的快速原型模型 。
在螺旋模型中,软件过程表示成一个螺线, 而不是像以往的模型那样表示为一个具有回溯的活动序列。 在螺线上的 每一个循环 表示 过程的一个阶段 。
螺线上的每一个循环可划分为 4个象限 ,分别表达了 4个方面的活动 。
螺旋模型优点 :
螺旋模型缺点 :
喷泉模型 是典型的面向对象生命周期模型。 “喷泉”一词体现了 迭代 和 无间隙 特性。 图中代表不同阶段的圆圈相互重叠, 这表示 两个活动之间存在重叠 。
20世纪90年代早期,Grady Booch、Ivar Jacobson和James Rumbaugh开始研究 统一方法 , 他们的成果就是统一建模语言UML(Unified Modeling Language)。 UML提供了支持 面向对象软件工程实践 必要的技术, 但它 没有 提供 指导项目团队应用该技术时的过程框架 。
UML是一种语言,并不是方法论。
Booch、Jacobson及Rumbaugh接下来的努力是发布完全、统一的面向对象分析与设计的方法学, 这种统一的方法学最初称为Rational统一过程(Rational Unified Process, RUP), 为简洁起见,使用 统一过程 这个术语。 统一过程 是 用UML进行面向对象软件工程的框架 。 目前, 统一过程 和 UML 广泛应用在各种各样的面向对象项目中。
尽管6个核心过程工作流可能使人想起传统瀑布模型中的几个阶段, 但应注意迭代过程中的阶段是完全不同的, 这些工作流在整个生命周期中一次又一次被访问。 9个核心工作流在项目中轮流被使用, 在每一次迭代中以不同的重点和强度重复。
统一过程中有6个 核心过程工作流(Core Process Workflows) 。
统一过程中有3个 核心支持工作流(Core Supporting Workflows) 。
统一过程有4个阶段,均以 里程碑 结束。 里程碑 的意图是捕捉 项目生命周期中的点 , 在这些点上可能进行重大的 管理决策 和 进展评估 。
基于构件的开发 是利用预先包装的 构件 来构造应用系统。 构件可以是 组织内部开发的 ,也可以是现有的 商业成品构件(Commercial Off-The-Shelf, COTS) 。
基于构件的软件工程(Component-Based Software Engineering, CBSE) 强调使用可复用的软件 构件 来设计和构造基于计算机的系统。
通常来讲, 构件 是计算机软件中的一个模块化的构造块。
OMG(Object Management Group)统一建模语言规范是这样定义构件的,
系统中 模块化的 、 可部署的 和 可替换的 部件, 该部件 封装了实现 并 暴露一系列接口 。
— Object Management Group
国际上第一本软件构件专著 《构件化软件—超越面向对象编程》(Szyperski) 给出的构件定义是,
一个构件是一个组装单元,它具有约定式规范的接口,以及明确的依赖环境。 构件可以被独立部署,由第三方组装。
CBSE软件团队针对每一系统需求并不急于进行设计,而是询问如下问题。
团队可以试图 修改 或 去除 那些不能用 COTS 或 自有构件 实现的系统需求。 如果不能 修改 或 去除 这些需求,则必须 应用软件工程方法构造满足这些需求的新构件 。
基于构件的开发模型中, 需求分析和设计建模活动 开始于 识别可选构件 , 这些构件有些设计成 通用的软件模块 ,有些设计成 面向对象的类或软件包 。 不考虑构件的开发技术, 基于构建的开发模型 由以下步骤组成。
软件复用是提高 软件生产率 及 软件质量 的最有效的途径, 而 基于构件的软件开发 比 面向对象的软件开发 实现了 更大粒度 的 软件复用 , 能够 最大限度 地 减少重复劳动 、 缩短开发周期 、 降低开发成本 , 从而使 软件生产率 得到提高。
由于已有的构件大都经过了很长时间的运行和测试,在 质量方面比新开发的软件更有保证 , 同时软件构件技术有助于 软件设计的标准化 和 设计风格的改进与统一 , 进而提高系统间的互操作性, 软件可靠性 和 可维护性 可以得到增强。
构件技术的研究和实践,能够积累和共享相关知识,使软件在 灵活性 和 标准化 等方面均得到改善, 有助于实现软件开发的 工程化 、 工业化 和 产业化 。
2001年,以Kent Beck为首的敏捷联盟发表了 敏捷软件开发 宣言。
我们正在通过亲身实践以及帮助他人实践的方式来揭示更好的软件开发之路, 通过这项工作,我们认为:
- 个体和交互 胜过 过程和工具 ;
- 可工作软件 胜过 宽泛的文档 ;
- 客户合作 胜过 合同谈判 ;
- 响应变更 胜过 遵循计划 。
也就是说,虽然上述内容中右边的各项很有价值, 但我们认为左边的各项具有更大的价值。
Ivar Jacobson给出以下论述:
敏捷团队是能够适当相应变更的灵活团队。 变更就是软件开发本身, 软件构建过程 有变更、 团队成员 在变更、使用新 技术 会带来变更, 各种变更都会对开发的软件产品以及项目本身造成影响。 我们必须接受 支持变更 的思想, 它应当根植于软件开发中的每一件事中, 因为它是软件的心脏与灵魂。
敏捷团队意识到软件是团队中所有人 共同 开发完成的, 这些人的 个人技能 和 合作能力 是项目成功的关键所在。
在Jacobson看来, 普遍存在的变更是敏捷的基本动力 , 软件工程师必须加快步伐以适应Jacobson所描述的快速变更。
从本质上讲,敏捷方法是 为了克服传统软件工程中认识和实践的弱点 而形成的。 敏捷开发 可以带来多方面的好处 ,但它并 不适用于所有项目及产品 。 一般来说,敏捷方法更适合具有 以下特征 的软件开发项目。
敏捷联盟定义了以下12条敏捷原则:
并不是每一个敏捷模型都同等使用这12项原则,一些模型可以选择忽略或淡化一个或多个原则的重要性。
极限编程(eXtreme Programming, XP) 是 使用最广泛的敏捷过程 , 其相关思想和方法最早出现于20世纪80年代后期, 但直到2000年Kent Beck撰写的《Extreme Programming Explained: Embrace Change》一书出版, 它才引起软件业的极大关注。
XP使用 面向对象方法 作为推荐的开发范型, 它包含了 策划 、 设计 、 编码 和 测试 4个框架活动的规则和实践。
策划
策划活动 属于 需求获取活动 , 通过 倾听用户对软件需求的一系列描述 (主要为功能描述,也成为 用户故事 ), 使XP团队成员理解软件的 商业背景 以及 要求的输出 、 主要特征 及 主要功能 。
客户 和 XP团队 共同决定 如何把故事分组 ,并置于XP团队将要开发的下一个发行版本中。 一旦认可对下一个发行版本的基本承诺(包括故事、交付日期和其他项目事项), XP团队将按以下三种方式之一对 待开发的故事 进行排序:
项目的第一个发行版本交付之后, XP团队计算 项目的速度 ,即 第一个发行版本 中 实现的用户故事个数 , 帮助建立 后续发行版本 的 发布日期 和 进度安排 , 确定 是否对整个开发项目中的所有故事有过分承诺 。 一旦发生过分承诺,则 调整软件发行版本的内容 或者 改变最终交付日期 。
设计
XP设计 严格遵循保持简洁(Keep It Simple, KIS)原则, 使用 简单而不是复杂 的表述。 另外,设计为故事提供 不多也不少的实现原则 , 不鼓励额外功能性(开发者假定以后会用到)的设计。
XP的中心思想 使设计可以在编码开始前后同时进行 , 重构意味着 设计随着系统的构建而连续进行 。 实际上,构建活动本身将给XP团队 提供关于如何改进设计的指导 。
编码
XP推荐在故事开发和初步设计完成之后 不应直接开始编码 , 而是开发一系列用于检测本次(软件增量)发布的包括 所有故事的单元测试 。 一旦建立了单元测试,开发者就可以把精力更集中于 必须实现的内容 ,以通过单元测试。 不需要加任何额外的东西(保持简洁)。 一旦编码完成,就可以立即完成单元测试,从而向开发者提供 即时的反馈 。
XP编码活动中的关键概念之一是 结对编程 。 XP推荐两个人面对同一台计算机 共同为一个故事开发代码 。 这一方案提供 实时解决问题 和 实时质量保证机制 , 同时也使 开发者能集中精力解决当前的问题 。 实施中 不同成员担任的角色略有不同 。
测试
在编码开始之前 建立单元测试 是XP方法的关键因素。 所建立的单元测试应当 使用一个可以自动实施的框架 , 因此 易于执行并可重复 ,这种方式支持 代码修改之后及时的回归测试策略 。
一旦将 个人的单元测试 组织到一个 通用测试集 , 就可以每天进行 系统的集成和确认测试 , 这可以为XP团队提供 连续的进展指示 , 也可在 一旦发生问题的时候及早提出预警 。
敏捷过程模型中除了适用最广泛的XP,还有许多其他敏捷过程模型,它们也在行业中使用。 较普遍的有自适应软件开发(ASD)、Scrum、敏捷建模(AM)、敏捷统一过程(AUP)等。