文章目录
前言
本章介绍两个重要概念:软件生存周期和软件过程,这两个概念在早期的软件工程当中常不加区分使用,以后演变为相互联系又有重要差异的不同概念,苯扎个将对他们及相关问题进行说明
一、软件生存周期
(一)概念
1.软件生存周期:
一个软件从定义到开发、使用和维护,直到最终被弃用,要经历一个漫长的时期,通常把软件经历的这个漫长的时期称为生存周期。
- 特点:时间跨度长(通常数年甚至数十年)
- 分为多个具有明确任务的阶段
- 每个阶段都有明确的输入和输出
- 强调阶段性审查和验证
2.软件开发过程:
指的是软件设计思路和方法的一般过程。包括设计软件的功能和实现的算法和方法、软件的总体结构设计和模块设计、编程和调试、程序联调和测试以及编写、提交程序.
(二)阶段及环节
1.三个大阶段
计划阶段、开发阶段和维护阶段。
| 阶段 | 主要任务 | 产出文档 |
|---|---|---|
| 计划阶段 | 可行性研究、项目计划 | 可行性报告、项目计划书 |
| 开发阶段 | 需求分析、设计、编码、测试 | 需求规格说明书、设计文档、源代码、测试报告 |
| 维护阶段 | 纠错性维护、适应性维护、完善性维护 | 维护记录、更新版本 |

2.七个环节
问题定义:确定要解决的问题是什么
可行性研究:技术上、经济上是否可行
需求分析:明确系统必须做什 么
系统设计:系统架构设计、模块划分
开发:模块内部算法、数据结构设计、实现程序
测试:运行程序、发现并修正错误
运行维护:保证系统长期正常运行
(三)生存周期与软件过程的关系
1.从软件生存周期到过程模型
**生存周期定义了"阶段划分",过程模型定义了"如何执行各阶段":**各阶段的活动分步完成,前一阶段的活动没有结束,下一阶段的活动就不能进行,
软件开发模型: 人们随时间的流逝而进行的各种活动均可称之为过程,特定的说,软件过程可以理解为围绕软件开发所进行的一系列活动。
常见映射:瀑布模型对应经典生存周期
2.软件过程的演变
-
早期:个人作坊式开发
-
1970s:结构化方法(瀑布模型)瀑布模型在软件的开发和维护中被广泛采用
-
1980s-1990s:原型化、迭代思想。20世纪80年代中期 ,人们发现,这种线性开发模型不适合于大型复杂系统的开发。软件需求频繁更改时开发大型复杂系统的特点,而一律采用线性模型显然是不合适的。
-
2000s至今:敏捷方法、软件开发模型开始演变
二、传统的软件过程
(一)瀑布模型
1.阶段间的顺序性和依赖性
(1)顺序性
线性顺序进行,只有等前一阶段的工作完成之后,后一阶段的工作才能开始。
(2)依赖性
**前一阶段的输出文档是后一阶段的输入文档。**这表明,只有当前一阶段有正确的输出的时候,后一阶段才能获得正确的结果。如果某一阶段出现问题,需追溯到之前所在阶段,必要时可能修改此前已完成的文档。
2.推迟实现的观点
"推迟实现" :即为将待开发软件的逻辑设计与物理实现区分,在需求分析和软件设计阶段 只考虑系统的逻辑模型。等到编码阶段,在完成程序清单。
3.保证质量的观点
- 每一阶段必须完成规定的文档
- 每一阶段必须对完成的文档进行复审,以便尽早发现问题。

4.优缺点
瀑布模型具有阶段清晰、易于管理、文档完备的特点,适用于需求明确、技术成熟的项目;
其不足在于:难以面对需求变更,由于线性顺序进行的特点,用户要到后期才能看到产品,风险发现晚,所以为了解决这一问题,人们提出了"快速原型模型"
(二)快速原型模型
1.核心思想
快速构建一个可运行的原型,获取用户反馈,逐步完善,直至建立完全符合用户要求的新系统。
2.优越性
**快速原型模型能够使用户立刻与想象中的目标系统做出比较。**即:软件开发人员向用户提供一个样品,用户向软件开发人员迅速做出反馈。逼真,快速。这就是原型软件开发的优越性。

3.方法
- 首先,原型系统只包括未来系统的主要功能及系统的重要接口,它不包括系统的细节,例如:异常处理、对非有效输入的反应等,对系统的性能需求可推迟考虑
- 其次,开发原型系统应尽量使用能缩短开发周期的语言和工具。
- 最后,由于原型系统使用的语言存在效率不高等原因,除了少数很简单的系统,大多数原型废弃不用,仅仅把建立原型的过程当做帮助定义软件需求的一种手段
4.启示
改变了"把生存周期等同于过程模型的"习惯性思维,使人们意识到:"声讯周期只指出了整个周期中应当包含哪些活动,并未规定这些活动应该发生多少次。"
三、软件演化模型
(一)增量模型
1.核心思想
增量模型是瀑布模型的顺序特征与快速原型法的迭代特征相结合的产物。 这种模型把软件看做一系列相互联系的增量 ,将系统分解为多个增量,分批开发、分批交付 与瀑布模型的区别:瀑布是一次性交付,增量是分批交付 。
2.过程
- 第一个增量实现核心功能 。(一般情况下,第一个增量通常是软件的核心部分,首先完成,有利于增强开发者和用户的信息。有利于控制技术风险)
- 后续增量逐步添加新功能(分批开发)
- 每个增量都经历完整的开发周期(分批交付)

3.优缺点
优点:
- 将待开发的软件系统模块化 ,分批次地提交软件产品,用户能及时了解软件项目的进展。
- 以组件为单位进行开发,降低了软件开发的风险。
- 开发顺序灵活 。可以对组件的实现顺序进行优先级排序,先完成需求稳定的核心组件。
缺点:
- 要求待开发的软件系统可以被模块化。如果待开发的软件系统很难被模块化,那么将会给增量开发带来很多麻烦。
- 容易给概要设计和详细设计带来很大的工作量。
(二)螺旋模型
1.概念及提出
螺旋模型是目前软件开发中最常用的一种软件开发模型 ,于Barry Boehm在1988年提出,是在结合瀑布模型与快速原型模型基础上演变而成的,适用于大型软件的开发。
螺旋模型的基本思想是: 使用原型及其他方法以尽可能地降低风险。
理解这种模型的一个简易方法, 是把它看作在每个阶段之前都增加了风险分析过程的快速原型模型。

2.过程
- 制定计划:确定目标、方案和限制
- 风险分析:识别风险,制定对策
- 工程实施:开发、验证下一产品
- 客户评估:评价成果,计划下一轮循环

3.特点
在项目的所有阶段都考虑各类风险,从而能在风险变成问题之前降低危害。可以说,螺旋模型开发的成败很大程度上依赖于风险评估的准确性。
四、统一过程和敏捷过程
(一)统一过程(RUP)
1.介绍
统一过程(RUP)是一种用例驱动、以架构为中心,并采用迭代与增量开发的软件过程框架,现为IBM公司的一个产品。它以用户需求(用例)为核心驱动力,描述了一组以某种顺序完成的活动。其结果是一组有关系统的文档。例如模型和一些其他描述,以及对问题最初的解决方案。该过程框架归纳了六项最佳实践,包括迭代开发、需求管理、组件复用、可视化建模、持续的质量验证以及对变更的控制管理。
2.开发过程
统一过程在一个二维空间描述软件开发活动,水平轴代表时间。其开发过程包含四个顺序阶段,每个阶段可以分为一个或多个迭代。迭代是一个完整的开发循环,结果是产品的一个可执行版本,是开发最终产品的一个子集,直至不断迭代,成为最终系统。
垂直轴代表静态,活动activity表示怎么做,产品artifact表示做什么,role人员表示谁来做,工作流workflow表示什么时候来描述。
3.四个阶段
- 初始阶段(确定项目范围与可行性):需要大致了解需求,确定系统中的大多数角色和用例,并划分主要子系统,分析项目执行风险。划分主要子系统,给出系统的体系结构概貌,制定开发计划等
- 细化阶段(建立核心架构并解决高风险问题):识别出剩余的大多数用例,对当前迭代的每个用例进行细化,分析用例的处理数据以及可能发生的状态变化。这一阶段将会进行风险分析,如:需求风险、技术风险、政策风险、高层分析与设计、以及产生简要体系结构,为构造阶段制定计划。
- 构造阶段(通过多次迭代增量式地完成产品构建):针对用例进行分析、设计、编码、测试和集成的过程
- 移交阶段(进行测试、部署和用户培训)。 :这一阶段完成最后的软件产品和验收测试,完成用户文档编制以及用户培训等工作。

(二)敏捷过程
敏捷开发是一种以人为核心,以迭代方式循序渐进开发的方法 。在这一过程中,软件项目的构建被切分为多个子项目,各子项目的成果都经过测试,具备集成和可运行的特征。敏捷(Agile)在无过程和过于繁琐的过程中达到了一种平衡, 使得能以不多的步骤过程获取较满意的结果。
敏捷开发过程的方法很多, 主要有SCRUM, Crystal, 特征驱动软件开发(FDD), 自适应软件开发(ASD), 以及知名度很高的极限编程 (eXtreme Programming)。
软件开发的强度越来越大,周期越来越短,变化越来越快。一批业界专家概括出了可以让软件开发团队具有快速工作、响应变化能力的价值观和原则, 并于2001年2月在美国犹他州, 成立了敏捷软件开发联盟。
(三)极限编程
1.介绍
极限编程(XP)是敏捷过程中具有代表性的一种方法论,由1996年Kent Beck提出的轻量级的敏捷性软件开发方法,是敏捷软件开发中可能是最富有成效的几种方法学之一。
2.最佳实践
(1)完整团队
XP项目的所有参与者(开发人员、客户、测试人员等)一起工作在一个开放的场所中, 他们是同一个团队的成员。
这个场所的墙壁上随意悬挂着大幅的、显著的图表以及其他一些显示他们进度的东西.
(2)持续集成
团队总是使系统完整地被集成。
一个人拆入(Check in)后, 其它所有人责任代码集成。
(3)结对编程
所有的产品软件都是由两个程序员、并排坐在一起在同一台机器上构建的。
(4)重构
在当时的情况下,写的代码是解决已知问题的。
持续重构和修改代码,确保代码库能以最为高效的方式不断满足业务最新的需要。
(5)测试驱动的开发
XP中提出的测试,在其它软件开发方法中都可以见到,比如功能测试、单元测试、系统测试和负荷测试等;与众不同的是,XP将测试结合到它独特的螺旋式增量型开发过程中,测试随着项目的进展而不断积累。
由于强调整个开发小组拥有代码,测试也是由大家共同维护的。即任何人在往代码库中放程序(CheckIn)前,都应该运行一遍所有的测试。
任何人如果发现了一个BUG,都应该立即为这个BUG增加一个测试,而不是等待写那个程序的人来完成。
五、软件可行性研究
(一)可行性研究的内容和步骤
1.目的
弄清待开发的项目是不是可能实现和值得进行,通常由系统分析员完成,并写出可行性论证报告。如结论认为可行,即可制定项目实施计划,同时开始软件开发,如结论认为不可进行,则应提出终止该项目的建议。
2.内容
可行性研究主要包括五方面内容:
- 技术可行性(现有技术能否实现系统)、
- 经济可行性(效益是否大于成本)
- 运行可行性(新系统规定的运行方式是否可行)
- 法律可行性(是否符合法律法规)
- 时间可行性(能否按时完成)。
3.步骤
研究步骤一般包括:复查系统目标与规模、研究现有系统、导出新系统高层逻辑模型、重新定义问题、导出并评价可选方案、推荐行动方针、草拟开发计划、编写可行性研究报告。
成本效益分析是可行性研究的重要环节,需估计一次性成本(开发费用)与非一次性成本(运行维护费用),并分析有形效益(如节省人力)与无形效益(如提升服务质量)。常用度量指标包括投资回收期、净现值和投资回收率。
(二)软件风险分析
风险是指不利事件发生的概率与该事件造成的损失的乘积,具有不确定性和损失性两大特征。 教材中将风险分为项目风险(预算、进度等)、技术风险(技术不成熟)、商业风险(市场变化)、战略风险(与组织战略冲突)、管理风险(管理不善)和人员风险(人员流失或技能不足)。
风险管理过程包括:风险识别(通过检查表、头脑风暴等方法找出风险因素)、风险估计(评估发生概率与影响程度)、风险评估(计算风险暴露值并确定优先级)、风险应对(采取规避、转移、缓解或接受策略)以及风险监控(跟踪风险状态并执行应对措施)。
总结
本文系统介绍了软件生存周期及其相关过程模型。首先阐述了软件生存周期的概念、阶段划分及环节,包括计划、开发、维护三大阶段和七个具体环节。其次详细分析了传统软件过程模型(瀑布模型、快速原型模型)和软件演化模型(增量模型、螺旋模型)的特点、流程及适用场景。随后介绍了统一过程(RUP)和敏捷过程等现代开发方法。最后简要提及可行性研究和风险分析。全文通过比较不同模型的优缺点,为软件开发过程选择提供了理论依据,特别强调了迭代开发和风险管理在现代软件开发中的重要性。