第8章:软件工程基础知识
一、软件工程概述
1、、软件生存周期
同任何事物一样,软件也有一个孕育、诞生、成长、成熟、衰亡的生存过程,我们称其为计算机软件的生存周期。通常,软件生存周期包括可行性分析、项目开发计划、需求分析、设计(概要设计和详细设计)、编码、测试、维护等活动。
- 可行性分析:由软件开发方与需求方共同讨论,主要确定软件的开发目标及其可行性。
- 求分析:在确定软件开发可行的情况下,对软件需要实现的各个功能进行详细分析。主要解决“做什么”的问题。
- 概要设计:主要根据需求分析的结果,对整个软件系统进行设计,如系统框架设计、数据库设计等。
- 详细设计:是对每个模块完成的功能进行具体描述,要把功能转变为精确的、结构化的过程。
- 程序编码:将 **软件设计的结果转换为计算机可运行的程序代码。**在程序编码时,必须要制定统一、符合规范的编写规范,以保证程序的可读性、易维护性,提高程序的运行效率。
- 软件测试:在软件设计完成后要经过严密的测试,以发现软件在整个设计过程中存在的问题并加以纠正。
- 维护:在软件开发完成并投入使用后,由于各种原因,软件不能继续适应用户的要求。延续软件爱你的使用寿命,就要对软件进行维护,包括纠错性维护和改进性维护两个方面。
1.1 能力成熟度模型(CMM)
软件能力成熟度模型(CMM)将软件组织的过程能力分成5个成熟度级别:初始级、可重复级、已定义级、已管理级和优化级。按照成熟度级别由低到高,软件开发生成精度越来越高,没单位工程的生产周期越来越短。
- 初始级:软件过程是无序的,有时甚至是混乱的,对过程几乎没有定义,成功取决于个人努力。
- 可重复级:建立了基本的项目管理过程来跟踪费用,进度和功能特性,制定了必要的过程纪律,能重复早先类似应用项目取得的成功。
- 已定义级:已将软件管理和工程两方面的过程文档化、标准化,并综合合成该组织的标准软件过程。所有项目均使用经批准、裁剪的标准软件过程来开发和维护软件。
- 已管理级:收集对软件过程和产品质量的详细度量,对软件过程和产品都有定量的理解和控制。
- 优化级:过程的量化反馈和先进的新思想、新技术促使过程不断改进。
1.2 能力成熟度模型(CMMI)
1、**阶段式模型:**结构类似于CMM ,它关注组织的成熟度。有5个成熟等级。
初始的:过户车呢个不可预测且缺乏控制。
已管理的:过程为项目服务。
已定义的:过程为组织服务。
定量管理的:过程已度量和控制。
优化的:集中过程改进。
2、**连续式模型:**关注每个过程域的能力,一个组织对不同的过程域可以达到不同的过程域能力等级。CMMI中包括6个过程域能力等级,登记号为0~5。
CL0(未完成的):过程域未执行或未得到CL1中定义的所有目标。
CL1(已执行的):其共性目标是过程将可标识的输入工作产品转换成可标识的输出工作产品,以实现支持过程域的特定目标。
CL2(已管理的):其共性目标集中于已管理的过程化的制度化 。根据组织级政策规定过程的运作将使用哪个过程,项目遵循已文档化的计划和过程描述,所有正在工作的人都有权使用足够的资源,所有工作任务和工作产品都被监控控制和评审。
CL3(已定义级的):其共性目标集中于已定义的过程的制度化。过程是按照组织的剪裁指南从组织的标准过程集中剪裁得到的,还必须收集过程资产和过程的度量,并用于将来对过程的改进。
CL4(定量管理的):其共性目标集中于可定量管理的过程的制度化。使用测量和质量保证来控制和改进过程域,建立和使用关于质量和过程执行的定量目标作为管理准则。
CL5(优化的):使用量化(统计学)手段改变和优化过程域,以满足客户要求的改变和持续改进计划中的过程域的功效。
1.3 统一过程模型
**统一过程(UP)模型:**是一种“用例和风险驱动,以架构为中心,迭代并且增量的开发过程,由UML方法和工具支持。迭代的意思是将整个软爱你开发项目划分为许多”袖珍项目“,每个”袖珍项目“都包含正常软件项目的所有元素:计划、分析和设计、构造、集成赫尔测试。以及内部和外部发布。
统一过程包括4个阶段:初始阶段、精化阶段、构建阶段、移交阶段。
- 初始阶段——生命周期目标
- 精化阶段——生命周期架构
- 构建阶段——初始运作功能
- 移交阶段——产品发布
二、软件开发模型
瀑布模型:迭代模型/迭代开发方法
演化模型:快速应用开发
增量模型:构件组装模型/基于构件的开发方法
螺旋模型:统一过程/统一开发方法。
快速原型模型:敏捷开发方法
V模型:基于构架的开发方法
喷泉模型:模型驱动的开发方法
基于构件的开发模型本质上是演化模型,以迭代方式构件软件。
2.1 瀑布模型
2.2 演化模型
演化模型:在获取一组基本的需求后,通过快速分析构造出该软件的一个初始版本,这个初始的软件通常称为“原型”,然后根据用户在使用原型的过程中提出的意见和建议对原型进行改进,获得原型进行改进,获得原型的新版本。重复这一过程,最终可得到令用户满意的软件产品。
2.3 增量模型
增量模型融合了 **瀑布模型的基本成分和原型实现的迭代特征,**该模型采用了随着日程时间的进展而交错的线性序列,每个线性序列产生的软件的一个可发布的“增量”。
2.4 螺旋模型
螺旋模型:将瀑布模型和演化模型相结合,就成了螺旋模型,这种规模性综合了瀑布模型和演化模型的优点。
螺旋模型包括4个方面的活动:制定计划、风险分析、实施工程、客户评估。
2.5 V模型(瀑布模型的变体)
2.6 喷泉模型
喷泉模型是一种 **以用户需求为动力,以对象为驱动的模型,主要用于采用对象技术的软件开发过程,具有迭代和无间隙特性。**迭代意味着模型中的开发活动常常需要重复多次,在迭代中不断完善软件系统。无间隙是指开发活动之间不存在明显的边界,允许开发活动交叉、迭代地进行。### 2.7 基于构件的开发模型
基于构件的开发模型:是指利用预先包装的构件来构造应用系统。构建可以是组织内部开发的构件,也可以是商品化成品软件构件。基于构件的开发模型本质上是 演化模型,需要 以迭代方式构件软件不同之处在于采用预先打包的软件构件开发应用系统。
三、软件开发方法
3.1 结构化方法
结构化方法由结构化分析、结构化设计、结构化程序设计构成,它是一种 面向数据流开发方法。结构化分析是指根据 分解与抽象的原则,按照系统中数据处理流程,用 数据流图来建立系统的功能模型,从而完成需求分析工作。
结构化方法总的指导思想是 **自顶向下、逐层分解,其基本的原则是功能的分解与抽象,**它是软件工程中最早出现的开发方法,特别适合于数据处理领域的问题,但是不适和解决大规模、特别复杂的项目,且难以适应需求的变化。
3.2 Jackson方法
Jackson方法是一种 面向数据结构的开发方法。因为一个问题的数据结构与处理该数据结构的控制结构有着惊人的相似之处。这种方法首先描述问题的输入、输出数据结构,分析其对应性,然后推出相应的程序结构,从而给出问题的软件过程描述。
JSP方法是 以数据结构为驱动的,适合于小规模的项目。当输入数据结构与输出数据结构之间没有对应关系时,难以应用此方法,基于JSP方法的局限性,又发展了JSD方法,它是JSP方法的扩充。
3.3 原型化方法
**原型化方法:**并非所有需求都能够预先定义,而且反复修改时不可避免的。开发原型化系统首先要确定用户需求,开发原始模型,然后征求用户对初始原型的改进意见,并根据意见修改原型。
原型化方法比较适合于 **用户需求不清、业务理论不确定、需求经常变化的情况,**当系统规模不是很大也不太复杂时,采用该方法是比较好的。
3.4 面向对象方法
面向对象方法是包括面向对象分析、面向对象设计和面向对象实现。面向对象开发方法有Booch方法,Coad方法和OMT方法等。
为了统一面型对象方法的术语、概念和模型,OMG1997年推出了 统一建模语言(Unified Modeling Language ,UML).它是面向对象的标准建模语言,通过统一的语义和符号表示,使各种方法的建模过程和表示都统一起来,已成为面向对象建模的工业标准。
3.4 敏捷开发方法
敏捷开发的总体目标是通过 “尽可能早地、持续地对有价值的软件的交互”使客户满意。
敏捷过程的典型方法很多,主要有极限编程、水晶法、并列争球法、自适应软件开发几种。
极限编程(XP)是一种 轻量级(敏捷)、高效、低风险、柔性、可预测、科学的软件开发方式。它又由价值观、原则、实践火绒行为4个部分组成,它们彼此相互依赖、关联,并通过行为贯穿整个生存周期。
3.5 敏捷开发方法:极限编程(XP)
四、需求分析
4.1 分类
- 功能需求:考虑软件要做什么
- 性能需求:考虑软件开发的技术性指标。
- 用户或人的因素:考虑用户的类型
- 环境需求:考虑未来软件应用的环境,包括软件和硬件。
- 界面需求:考虑对数据格式、数据存储介质的规定。
- 文档需求:考虑需要哪些文档,针对哪些读者。
- 数据需求:考虑数据的格式、接收、发送数据的频率等。
- 资源使用需求:考虑软件爱你运行时所需数据、内存空间等资源。
- 安全保密要求。
- 可靠性要求:考虑系统的可靠性。
- 软件成本消耗与开发进度需求。
- 其他非功能性要求。
五、系统设计
5.1 采用了结构化方法的结构化设计
5.2 内聚和耦合
内聚类型 | 描述 |
---|---|
功能内聚 | 完成一个单一功能,各个部分协同工作,缺一不可 |
顺序内聚 | 处理元素相关,而且必须顺序执行 |
通信内聚 | 所有处理元素集中在一个数据结构的区域上 |
过程内聚 | 处理元素相关,而且必须按特定的次序执行 |
瞬时内聚(时间内聚) | 所包含的任务必须在同一时间间隔内执行 |
逻辑内聚 | 完成逻辑上相关的一组任务 |
偶然内聚(巧合内聚) | 完成一组没有关系或松散关系的任务 |
耦合 | 描述 |
---|---|
非直接耦合 | 两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的 |
数据耦合 | 一组模块借助参数表传递简单数据 |
标记耦合 | 一组模块通过参数表传递记录信息(数据结构) |
控制耦合 | 模块之间传递的信息中包含用于控制模块内部逻辑的信息 |
外部耦合 | 一组模块都访问同一全局简单变量,而且不是通过参数传递该全局变量的信息 |
公共耦合 | 多个模块都访问同一个公共数据环境 |
内容耦合 | 一个模块直接 访问另一个模块的内部数据; 一个模块不通过正常入口转到另一个模块的内部; 两个模块有一个部分程序代码重叠; 一个模块有多个入口. |
六、系统测试
6.1 原则和目的
尽早、不断的进行测试。
程序员避免测试自己设计的程序
既要选择有效、合理的数据,也要选择无效、不合理的数据。
修改后应进行回归测试。
尚未发现的错误数量与该程序已发现错误数成正比。
6.2 测试方法
静态测试:
- 人工检测
- 计算机辅助静态检测
动态测试:
- 黑盒测试
- 白盒测试
6.3 测试阶段
- 单元测试:也称为模块测试,在模块编写完成且无编译错误后可以进行。单元测试侧重于模块中的内部处理逻辑和数据结构。一般用白盒测试法。
- 集成测试:就是把模块按系统设计说明书的要求组合起来进行测试。即使所有的模块都通过了测试,在集成之后,仍然可能出现问题。
- 确认测试:始于集成测试的结束,那时已测试完单个构件,软件已组装成完整的软件包,且接口错误已被发现和改正。
- 系统测试:是将已经确认的软件、计算机应将、外设和网络等其他因素结合在一起,进行信息系统的各种集成测试和确认测试,其目的是通过与系统的需求相较,发现所开发的系统与用户需求不符或矛盾的地方。
七、软件开发项目管理
7.1 Gantt图
Gantt图是一种简单的水平条形图,它以日历为基准描述项目任务。。水平轴表示日历时间线(如时、天、周、月和年等),每个条形表示一个任务,任务名称垂直地列在左边的列中,图中水平条的起点和终点对应水平轴上的时间,分分别表示该任务的开始时间和结束时间,水平条的长度表示完成该任务所持续的时间。当日历中同一时段存在多个水平条时,表示任务之间的并发。
下图所示的Gant图描述了3个任务的进度安排。任务1首先开始,完成它需要6个月时间。任务2在1个月后开始,完成它需要9个月时间。任务3在6个月后开始,完成它需要5个月时间。
注意:不能清晰反映出各任务之间的依赖关系
7.2 PERT图
PERT图是一个有向图,用箭头表示任务,它可以表示完成该任务所需的时间,箭头指向节点表示流入节点的任务的结束,并开始流出节点的任务,这里把节点当成事件。
只有当流入该节点的所有任务都结束时,节点所表示的事件才出现流出节点的任务才可以开始。事件本身不消耗时间和资源,它仅表示某个时间点。一个事件有一个事件号和出现该事件的最早时刻和最迟时刻。每个任务还有一个松弛时间,表示在不影响整个工期的前提下,完成该任务有多少机动余地。
PERT图不仅给出了每个任务的开始时间、结束时间和完成该任务所需的时间,还给出了任务之间的关系,即哪些任务完成后才能开始另外一些任务,以及如期完成整个工程的关键路径。松弛时间则反映了完成某些任务时可以推迟其开始时间或延长其所需的完成时间。但是PERT图不能反映任务之间的并行关系。
例
进度安排的常用图形描述方法有Gantt图和PERT图。。Gantt图不能清晰地描(1) ,PERT图可以给出哪些任务完成后才能开始另一些任务。下图所示的PERT图中,事件6 的最晚开始时间是_(2)
(1)
A.每个任务从何时开始 B.每个任务到何时结束
C.每个任务的进展情况 D.各任务之间的依赖关系
(2) A.0 B.3 C.10 D.11
解:DC
7.3 风险管理
风险是指:损失或伤害的可能性。
风险管理包含:
- 风险识别
- 风险预测
- 风险评估
- 风险控制
八、软件质量
8.1 软件质量特性
软件质量模型是由3个层次组成:
- 质量特性
- 质量子特性
- 度量指标
该模型的质量特性和质量子特性的含义如下:
-
功能性:与一组功能及其性质有关的一组属性,这里的功能是指满足明确或隐含需求的那些功能。
- 适合性:与规定任务能否提供一组功能以及这组功能的适合程度有关的软件属性。
- 准确性:与能否得到正确的或相符的结果或效果有关的软件属性。
- 互用性:与同其他指定系统进行交互操作的能力有关的软件属性。
- 依从性:使软件服从有关的标准、约定、法规及类似规定的软件属性。
- 安全性:与避免对程序及数据的非授权的故意或意外访问的能力有关的软件属性。
-
可靠性:与在规定的一段时间内和规定的条件下,软件维持其性能水平的能力有关的一组属性。
- 成熟性:与有软件故障引起失效的频度有关的软件属性。
- 容错性:与在软件错误或违反指定接口情况下,维持指定的性能水平的能力有关的软件属性。
- 易恢复性:与在故障发生后重新建立其性能水平并恢复直接受影响数据的能力,以及为达此目的所需的时间有关的软件属性。
-
易使用性:为使用所需的努力和由一组规定的或隐含的用户对这样的使用所做的个别评价有关的一组属性。
- 易理解性:与用户为理解逻辑概念及其应用范围所需努力有关的软件属性。
- 易学性:与用户为学习软件应用所需努力有关的软件属性。
- 易操作性:与用户为进行操作或控制所需努力有关的软件属性。
-
效率:与在规定条件下,软件的性能水平与所用资源量之间的关系有关的一组属性。
- 时间特性:与软件执行其功能时的响应和处理时间以及吞吐量有关的软件属性。
- 资源特性:与软件执行其功能时所使用的资源量以及使用资源的持续时间有关的软件属性。
-
可维护性:进行规定的修改所需努力有关的一组属性。
- 易分析性:诊断缺陷或失效原因,或为判定待修改的部分所需努力有关的软件属性。
- 易改变性:与进行修改、调试或适应环境变化所需努力有关的软件属性。
- 稳定性:与修改造成的未预料后果的风险有关的软件属性。
- 测试性:与为确认经修改软件所需努力有关的软件属性。
-
可移植性:软件从一种环境转移到另一种环境的能力有关的一组属性。
- 适应性:与软件无须采用有别于为该软件准备的处理和手段就能适应规定的环境有关的软件属性。
- 易安装性:与在指定环境下安装软件所需努力有关的软件属性。
- 一致性:使软件服从与可移植性有关的标准或约定的软件属性。
- 易替换性:与软件在该软件环境中用来替代指定的其他软件的可能和努力有关的软件属性。
九、软件度量
**McCabe复杂性度量又称为环路度量,**认为程序的复杂性很大程度上取决于控制的复杂性。单一的顺序程序结构最为简单,循环和选择所构成的环路越多,程序就越复杂。根据图论,在一个强连通的有向图G中,环的个数V(G)由以下公式给出:
V(G) = m - n + 2
式中,V(G)为有向图G中的环路数,m为图G中弧的个数,n为图G中的节点数。
> 数环的个数!!!