【总结】 软件工程过程及模型概括
一、定义
软件工程 (Software Engineering) 是一门研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来的学科。
实际上就是技术人员在开发软件过程中,需要遵循的一个流程规范标准,但这个标准又不是定死的,根据技术的革新规范也可以适当的改进。
二、软件工程的过程
- 软件生命周期
软件的生命周期就好比人的一生,从被开发出来,到使用维护,再到消亡。
软件生命周期阶段包括:
1.可行性研究及项目定义
也可叫做问题定义及可行性研究,具体的做法是:
确定要开发软件系统的总目标和规模。
从技术、经济和社会因素等方面的要求来论证完成该软件任务的可行性。
估计可利用的资源(计算机硬件,软件,人力等)、成本、效益、开发进度。
制定出完成开发任务的实施计划,连同可行性研究报告,提交管理部门审查。
2.需求分析
理解用户需求,并将用户需求用书面形式表达出来。
编写软件需求规格说明书或系统功能说明书及初步的系统用户手册。需求说明书是以后阶段工作的基础。
将需求规格说明书提交管理机构评审。
3.设计
总体设计 — “如何解决问题”:在需求说明书的基础上建立软件的体系结构。结构中每一组成部分都是意义明确的模块,每个模块都和某些需求相对应可以列出多种解决方案进行比较
详细设计 — 对每个模块要完成的工作进行具体的描述,为源程序编写打下基础
编写设计说明书(模块说明书、数据库或文件结构说明书等),提交评审。
4.编程实现
把软件设计转换成计算机可以接受的程序代码,即写成以某一种特定程序设计语言表示的“源程序清单”。
写出的程序应当是结构良好、清晰易读的(如匈牙利法则) ,且与设计相一致的。
5.测试
单元测试:查找各模块在功能和结构上存在的问题并加以纠正。
将已测试过的、并且相关的模块按一定顺序组装起来进行集成测试。
按规定的各项需求,逐项进行系统测试,决定已开发的软件是否合格,能否交付用户使用。
验收测试:由用户进行的交付之前的最终测试。
6.使用与维护
改正性维护:运行中发现了软件中的错误需要修正。
适应性维护:为了适应变化了的软件工作环境,需做适当变更。
完善性维护:为了增强软件的功能需做变更。
预防性维护:修改软件为将来的维护活动预先做准备
放一张图,让这个过程更加清晰:
三、软件工程的模型
1.瀑布模型
所有过程模型的鼻祖。
瀑布模型把软件开发过程划分成若干阶段,每个阶段的任务相对独立,便于不同人员分工协作,从而降低了整个软件开发工程的困难程度。在软件生存期的每个阶段都采用科学的管理技术和良好的方法与技术,而且每个阶段结束之前,都从技术和管理两个角度进行严格的审查,经确认之后才开始下一阶段的工作。---- 项目是按照一定的顺序执行。
瀑布模型是文档驱动的,各个阶段不连续也不交叉。
阶段间具有顺序性和依赖性。 (两重含义)
推迟程序的物理实现。(重要指导思想)
质量保证:每个阶段必须完成规定的文档;每个阶段结束前完成文档审查,及早改正错误。(两个重要做法)
易于组织,易于管理:因为你可以预先完成所有计划。
是一种严格线性的、按阶段顺序的、逐步细化的过程模型(开发模式)。
缺点:
在项目开始的时候,用户常常难以清楚地给出所有需求;用户与开发人员对需求理解存在差异。
缺乏灵活性:因为瀑布模型确定了需求分析的绝对重要性,但是在实践中要想获得完善的需求说明是非常困难的,导致“阻塞状态”。反馈信息慢,开发周期长。
实际的项目很少按照顺序模型进行。
2.(快速)原型模型
从实践中学习
用户参与
使部分已知需求逐渐清晰化
提高系统的实用性、可维护性
节省开发的投入、缩短整个软件的开发周期
缺点:
用户有时误解了原型的角色,例如他们可能误解原型应该和真实系统一样可靠。
缺少项目标准,进化原型方法有点像编码修正。
缺少控制,由于用户可能不断提出新要求,因而原型迭代的周期很难控制。
额外的花费:研究结果表明构造一个原型可能需要10%额外花费。 为了尽快实现原型,采用了不合适的技术,运行效率可能会受影响。
原型法要求开发者与用户密切接触,有时这是不可能的。例如外包软件。
3.喷泉模型
是典型的面向对象生命周期模型
“喷泉”这个词体现了面向对象软件开发过程迭代和无缝的特性
应该把线性过程作为总目标
4.演化模型
演化模型是利用一种迭代的思想方法,它的特征是使软件工程师渐进地开发逐步完善的软件版本。
增量模型 (Incremental Model)
融合了瀑布模型的基本成分和快速原型的迭代特征;
以功能递增的方式进行软件开发;
能较快地产生可操作的系统;
在每一步递增中,均发布一个新的增量版本,把用户/开发者的经验结合到不断求精的产品中。
缺点:
很难把用户的需求映射到适当规模的增量上。
大多数系统需要一组在系统许多部分都会用到的基本服务。但由于增量实现前,需求不能被详细定义,所以,明确所有增量都会用到的基本服务就比较困难。
系统的整体性较差
螺旋模型 (Spiral Model)
把软件开发过程组成为一个逐步细化的定义周期(螺旋周期)序列,每经历一个周期,系统就得到进一步的细化和完善;
紧密围绕开发中的风险问题,用风险分析推动软件设计向深一层扩展、求精;
强调持续地判断、确定和修改用户任务目标,并按成本、效益来分析候选的软件产品性质对任务目标的贡献;
可结合采用多种软件开发方法,但究竟结合哪一种方法仍由风险分析来决定。
对于大型软件系统的开发,螺旋模型是一个很现实的方法。
随着迭代的增加(成本的增加),风险程度随之降低。
缺点:
比较复杂,需要相当的风险评估技术,且成功依赖于这种技术。