60年代以前,计算机刚刚投入实际使用,软件的规模比较小,很少使用系统化的开发方法,基本上是个人设计、个人使用、个人操作、自给自足的私人化的软件生产方式。60年代中期,大容量、高速度计算机的出现,使计算机的应用范围迅速扩大,软件开发急剧增长。高级语言开始出现,软件系统的规模越来越大,复杂程度越来越高,软件可靠性问题也越来越突出。1968年,北大西洋公约组织(NATO)在联邦德国的国际学术会议创造软件危机(Software crisis)一词。
一、软件危机与软件工程
1、软件危机
软件危机是指落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。
2、软件工程
软件工程是将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件。
软件工程方法学包括三个要素:方法、工具和过程。
二、软件生命周期
软件生命周期(SDLC,软件生存周期)是指软件的产生直到报废的生命周期,包括:问题定义、可行性分析、需求分析、总体设计、详细设计、编码、测试、运行维护等阶段。
阶段 | 关键问题 | 结束标准 |
问题定义 | 问题是什么? | 关于规模和目标的报告书 |
可行性研究 | 可行吗? | 系统的高层逻辑模型:数据流图、成本/效益分析 |
需求分析 | 系统必须做什么? | 系统的逻辑模型:数据流图、数据字典、算法描述 |
概要设计 | 如何解决已提出的问题 | 可能的解法:系统流程图 推荐的系统结构:层次图或结构图 |
详细设计 | 如何具体实现这个系统 | HIPO图或者PDL |
编码 | 正确的编程 | 源程序 |
单元测试和综合测试 | 得到符合要求的软件 | 单元测试方案和结果,综合测试方案和结果 |
维护 | 得到持久满足用户要求的软件 | 完整准确的维护记录 |
这种按时间分程的思想方法是软件工程中的一种思想原则,即按部就班、逐步推进,每个阶段都要有定义、工作、审查、形成文档以供交流或备查,以提高软件的质量。
三、软件开发模型
常见的开发模型有:瀑布模型、增量模型、螺旋模型、喷泉模型、智能模型、V模型、快速应用开发模型、构件组装模型、敏捷方法和统一过程等。
1、瀑布模型
瀑布模型也称为生命周期法,是结构化方法中最常用的开发模型,它把软件开发的过程分为软件计划、需求分析、软件设计、程序编码、软件测试和运行维护6个阶段。

瀑布模型的优点:
- 为项目提供了按阶段划分的检查点。
- 当前一阶段完成后,只需要去关注后续阶段。
- 它提供了一个模板,这个模板使得分析、设计、编码、测试和支持的方法可以在该模板下有一个共同的指导。
瀑布模型的缺点:
- 各个阶段之间产生大量的文档,极大地增加了工作量。
- 由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发风险。
- 不适应用户需求的变化,并且在需求分析阶段不可能完全获取。
- 在软件开发前期未发现的错误传到后面的开发活动中时,可能会扩散,进而可能会导致整个软件项目开发失败。
所以,瀑布模型适用于需求明确或很少变更的项目。
2、快速原型模型
快速原型是利用原型辅助软件开发的一种新思想。
经过简单快速分析,快速建造一个可以运行的软件原型 ,以便理解和澄清问题,使开发人员与用户达成共识,最终在确定的客户需求基础上开发客户满意的软件产品。
原型可以分为三类:
(1)探索型模型
主要用于需求分析阶段,目的是要弄清用户的需求,并探索各种方案的可行性。它主要针对开发目标模糊,用户与开发人员对项目都缺乏经验的情况,通过对原型的开发来明确用户的需求。
(2)实验型原型
主要用于设计阶段,考核实现方案是否合适,能否实现。对于大型系统,若对设计方案心中没有把握时,可通过这种原型来证实设计方案的正确性。
(3)演化型原型
主要用于及早向用户提交一个原型系统,该原型系统或者包含系统的框架,或者包含系统的主要功能,在得到用户的认可后,将原型系统不断扩充演变为最终的软件系统。
它将原型的思想扩展到软件开发的全过程。
3、演化模型
也称为变换模型,根据用户的基本需求,通过快速分析构造出一个初始可运行版本(原型),然后根据用户在使用原型的过程中提出的意见和建议对原型进行改进,获得原型的新版本。重复这一过程,最终可得到令用户满意的软件产品。
快速原型模型是“抛弃式”的,演化模型是“渐进式”原型方法。演化模型特别适用于对软件需求缺乏准确认识的情况。
演化模型的优点:
- 很早就可以验证是否符合产品需求。
- 风险管理可以在早期就获得项目进程数据,可据此对后续的开发进度作出比较切实的估算。增加项目成功的机率。
- 经验教训能反馈于本产品的下一个循环过程,提高质量效率。
- 心理上,开发人员早日见到产品的雏型,是一种鼓舞。
- 使用户可以在新的一批功能开发测试后,立即参加验证,以便提供非常有价值的反馈。
演化模型的缺点:
- 产品需求在一开始并不完全弄清楚的话,会给总体设计带来困难及削弱产品设计的完整性,并影响产品性能的优化。
- 如果缺乏严格的过程管理,这个生命周期模型可能退化为一种原始的无计划的“试-错-改”模式。
- 用户接触开发中的尚未测试稳定的功能,可能对用户都产生负面的影响。
4、增量模型
融合了瀑布模型的基本成分和原型实现的迭代特征,是第三种原型化开发方法,但它不是“抛弃式”的,也不是“渐进式”的。增量模型把软件产品划分为一系列的增量构件,第一个增量往往是核心的产品,即第一个增量实现了基本的需求。客户对每一个增量的使用和评估都作为下一个增量发布的新特征和功能,这个过程在每一个增量发布后不断重复,直到产生了最终的完善产品。
增量模型与原型实现模型和其他演化方法一样,本质上是迭代的,但与原型实现不一样的是其强调每一个增量均发布一个可操作产品。
增量模型的特点是引进了增量包的概念,无须等到所有需求都出来,只要某个需求的增量包出来即可进行开发。
增量模型优点:
- 人员分配灵活,初期不用太大投入。
- 每隔一小段时间就提交用户部分功能,用户可以直观感受项目进展,及时试用产品功能。
- 有利于风险的把控。
增量模型将功能细化、分别开发的方法适应于需求经常改变的软件开发过程。
5、螺旋模型
将瀑布模型和演化模型相结合,综合了两者的优点,并增加了风险分析。它以原型为基础,沿着螺线自内向外旋转,每旋转一圈都要经过制订计划、风险分析、实施工程及客户评价等活动,并开发原型的一个新版本。经过若干次螺旋上升的过程,得到最终的系统。

螺旋模型的优点:
- 设计上灵活,可以在项目的各个阶段进行变更;
- 以小的分段来构建大型系统,使成本计算变得简单容易;
- 客户始终参与每个阶段的开发,保证了项目不偏离正确方向;
- 随着项目推进,客户始终掌握项目的最新信息 , 从而能够和管理层有效地交互。
螺旋模型的缺点:
- 需要具有相当丰富的风险评估经验和专门知识,如果未能够及时标识风险,势必造成重大损失;
- 过多的迭代次数会增加开发成本,延迟提交时间。
6、喷泉模型
是一种以用户需求为动力,以对象为驱动的模型,主要用于描述面向对象的软件开发过程,该模型认为软件开发过程自下而上的,各阶段是相互迭代和无间隙的。
无间隙是指在开发活动中,分析、设计和编码之间不存在明显的边界。

例:某开发小组欲为一公司开发一个产品控制软件,监控产品的生产和销售过程,从购买各种材料开始,到产品的加工和销售进行全程跟踪。购买材料的流程、产品的加工过程以及销售过程可能会发生变化。该软件的开发最不适宜采用( 瀑布)模型,主要是因为这种模型( 难以适应变化的需求 )。