6 软件工程

优质
小牛编辑
135浏览
2023-12-01

软件工程

指导计算机软件开发和维护的工程学科。通过分析、设计、实现、测试、实施、维护、项目管理,最终如何提高软件生产率。

过程模型

软件开发机构针对一类软件产品为自己规定的工作步骤

RUP统一过程

九个核心规程(6个技术规程,3个管理规程)

技术规程:

业务建模:理解系统的组织结构及其商业运作

需求分析:定义系统功能与界面

分析和设计:将需求分析转化为实现规格

实现:组织代码结构、实现代码、单元测试、系统集成

测试规程:各子系统的交互与集成

部署规程:打包、分发、安装软件,培训用户,技术支持

管理规程:

配置和变更管理规程

项目管理规程

环境规程

开发周期四阶段:

初始阶段焦点:需求和分析工作流

细化阶段焦点:需求、分析和设计工作流

构建阶段焦点:实现工作流

交付阶段焦点:实现和测试工作流

瀑布模型

适用于需求明确、大型项目;

结构化

特点:最传统最广泛,面向数据流,自顶向下

适用:规模较大,结构稳定,过程规范,需求明确,变化不大

Jackson

特点:面向数据结构进行设计,面向数据流进行分析

适用:适用于输入、输出数据结构明确的中小型系统

RAD模型

开发时间短快速发布、多团队协调困难、不注意小细节

原型模型

适用于中小规模、生存期短的系统,适用于客户对细节没有规定,需求不明确。

增量(演化)模型

以占领市场为目的,逐步发布版本,适用于用户需求不明确、设计用户界面

渐增模型:快速版本发布,可能消弱结构和设计

螺旋模型:适用大型昂贵系统级软件,是瀑布与原型的合并,增加风险分析。

并发开发模型:适合任何类型软件开发,对管理要求较高

形式化开发模型

基于构件的开发

敏捷软件开发

(轻量级方法):高效聚群工作,不断发布

XP方法

SCRUM方法

DSDM方法

Scrum方法

Crystal方法

喷泉模型

适用:开发人员同步进行开发,节省开发时间,适用于面向对象的软件开发过程

特点:以用户需求为动力,以对象为驱动,各阶段无界限

软件工具

开发工具

需求分析工具、设计工具、编码与排错工具、测试工具

维护

版本控制工具、文档分析工具、开发信息库工具、逆向工程工具、再工程工具

管理和支持工具

项目管理工具、配置管理工具、软件评价工具

项目管理

PERT/Gantt进度管理

PERT计划评审技术

任务何时开始、结束、依赖

CPM关键路线法:是PERT网络中花费时间最长的事件和活动的序

最少时间:即所有路径走完所花时间(由最长路径决定)

松弛时间:与关键路径对比,若在关键路径则=0;

Gantt 图

任务并行

ISO/IEC软件质量

功能性:适合性、准确性、互用性、依从性、安全性

可靠性:成熟性、容错性、易恢复性

易使用性:易理解性、易学性、易操作性

效率:时间特性、资源特性

可维护性:易分析性、易改变性、稳定性、易测试性

可移植性:适应性、易安装性、一致性、易替换性

软件度量

McCabe 软件复杂度

环路复杂度=弧数-点数+2=封闭/开放空间数

系统工程

分业务过程工程、产品工程

任务

识别用户要求

系统建模和模拟:

硬件系统模型、软件系统模型、人机接口模型、数据模型

成本估算及进度安排

可行性分析

生成系统规格说明

业务过程工程

有效使用信息的体系结构

数据体系结构:框架

应用体系结构:软件

技术基础设施:网络、客户端、服务器

层次

产品工程

软件、硬件、数据(数据库)、人员

层次

可行性分析 (可行性分析报告)

项目是否值得开发、关键技术、难点、能否解决、怎么样达到目标

社会可行性

(也称法律可行性)

是否存在侵权、妨碍、责任等问题

合同、社会影响

其他:市场分析、政策分析、竞争实力分析、时间和资源可行性

技术可行性

能否实现功能、性能,可以得到的硬件、软件、人员等

相关技术的发展是否支持,关键技术、算法、过程

经济可行性

成本估计

购置并安装软件、硬件及有关设备的费用

系统开发一次性费用,方法:

自顶向下成本估计、自底向上成本估计

算法模型估计、类比估计、专家判断

Parkinson估计和销价取胜法

系统安装、运行和维护费用、人员培训费用

效益分析

社会效益、经济效益(货币的时间价值,投资回收期,投资回收率,纯收入)

示例:一个系统需要5000元,每年节省2500元,假定年利率为12%

第1年底,省2500元,相当于现在少投资2232.14元

第2年底,省2500元,相当于现在少投资的1992.98元

第3年底,省2500元,相当于现在少投资的1779.45元

第4年底,省2500元,相当于现在少投资的1588.80元

第5年底,省2500元,相当于现在少投资的1418.57元

累加起来,到第5年底,节省12500元,相当于现在少投资9011.94元

如果投资2年,相当于现在少投资4225.12元,比系统投资5000元少774.88元

第3年节省1779.45元,所以774.88/1779.45*1=.044年,投资回收期为2.44年

5年的投资回收率为9011/5000=180%

纯收入9011.94-5000=4011.95元

效益来源

自动化水平提高减少工作人员、减少运行费用、由于自动编辑,减少错误

交易处理速度提高、较少货币管理上的损失、减少不良帐单或信贷损失

更快的收取应收帐款、库存减少与库存过期损失

分析的结论

1可以进行开发

2需要等待某些条件

3需要对开发目标进行某些修改之后才能开发

4不能进行或不必要进行开发

需求分析(软件需求说明书)

需求获取

需求类型

领域需求:反映了应用领域的基本问题

非功能性需求:定义了系统工作时的特性

详细需求类别:功能、性能、环境、界面、易用、文档、数据、资源、安全、成本、交付、质量

获取方法

建立顺畅的通信途径

访谈与调查

观察用户操作流程

组成联合小组

用例

阶段结果

要开发的系统或产品的范围

参加需求获取过程的利害人名单

描述考虑要用于系统的技术环境的文档

通过功能组织起来的需求列表

在适当时为每个需求指定领域约束的一系列语句

用例的规格说明

需求分析与协商

发现、求精、建模和规约的过程

需求管理

需求标志和分类

变更管理

需求跟踪

系统建模

系统功能结构设计(模块结构图)

抽象

上层模块只规定下层模块功能/关系,不管如何实现

模块化

自顶向下原则:先确定上层模块,再确定下层模块

设计原则:独立性、规模适度、控制范围>作用范围,避免病态链接,减少接口冗余

模块结构图P642

信息隐蔽

模块独立

模块划分、功能、层次结构、调用关系、数据交互(接口)

耦合(越低越好):模块相对独立,耦合性由低到低,模块独立性由高到低:

无直接耦合:两模块没有直接关系

数据耦合:传递简单数据,相当于值传递

标记耦合:传递数据结构,有数据模板作用

控制耦合:传递控制变量,被调用模块判断变量执行多个功能

外部耦合:模块间通过软件之外环境连接

公共耦合:通过公共数据环境相互作用

内容耦合:直接使用另一个模块的内部数据

内聚(越高越好):模块内各元素结合紧密程度,内聚性由低到高,模块独立性由低到高

偶然内聚:模块内各元素没有任何联系

逻辑内聚:通过参数决定模块内执行逻辑相似的哪一功能

时间内聚:需要同时执行的动作组合在一起

过程内聚:一模块完成的多个任务,必须按指定过程执行

通信内聚:模块内所有处理元素都在同一个数据结构上操作

顺序内聚:各元素密切相关同一功能并且顺序执行

功能内聚:所有元素共同作用完成一个功能

结构化分析SA->设计SD->程序设计SP

将数据和处理(加工)作为分析对象

DFD数据流图

要素:源点和终点、数据流、加工、文件

分层

0层图P640:系统与外部实体之间数据流的输入和输出

1层图P640:按功能分解后的子加工数据流图

2层图P641:较复杂子加工(功能)的内部

原则

方向:实体开头,实体结束,实不接实,实不接数,数不接数

数量:有出有入,名称不同,事出有因

DD数据字典

数据项描述(DFD中每条数据流)=数据项名+含义说明+别名+数据类型

+长度+取值范围+取值含义+与其他数据项的关系

数据结构描述=数据结构名+含义说明+组成(数据项/数据结构)

数据流描述=数据流名+说明+来源+去向+组成(数据结构)+平均流量

+高峰期流量

数据存储描述=数据存储名+说明+编号+流入数据流+流出数据流

+组成(数据结构)+数据量+存取方式

加工描述=加工名+说明+输入(数据流)+输出(数据流)+处理(说明)

描述工具

程序流程图

NS盒图:清楚表示复杂条件组合与应做动作之间的对应关系

形式语言

PAD图

决策树

决策表

面向对象分析OOA->设计OOD->程序设计OOP

继承父类

是子类和父类之间共享数据和方法的机制

父类描述共有属性和操作,子类可以在此基础上加入新的内容

父类可以有多个子类,子类都是父类的特例

子类继承父类的属性和操作不必定义,也可以定义新的属性和操作

若覆盖(重写)方法名、参数相同。重载方法名相同,参数列表不同。

使用接口

接口中的抽象方法,必须由实现类(不一定是继承类)实现

UML图

用例图

定义业务流程,包括:用例、参与者,以及它们间的关系(扩展/包含) P552

确定系统边界:系统边界、系统、系统参与者

用例关系

用况与参与者之间的关系:关联,双向实线 / 单向箭头连接两者

用况与用况之间的关系:包含 / 扩展

包含关系:避免重复行为,把重复行为放在“基用况”再引入“供应者用况”

基用况本身不完整,要依赖供应者用况才有意义(本身不完整,要绕弯)

扩展关系:存在可选的描述系统行为的片段,把可选行为描述部分抽取为“扩展用况”

基用况本身完整,可以单独存在。(本身完整,路上采花)

另外可以添加扩展点,起判别作用。扩展点为假,扩展不会发生。

继承关系:特殊用况继承一般用况的行为,可以覆盖或增加行为。

特殊用况带有封闭的空心箭头的实线指向一般用况

用例分类

业务用例:描述业务的具体工作流

系统用例:系统参与者与计算机系统

用例识别:

可观测→用例止于系统边界:描述交互,而不是内在的系统活动

结果值→用例是有意义的目标:业务功能,而非系统处理

系统执行→结果值由系统生成:系统需要处理的,由系统生成

由参与者观测→用户观点而非系统观点

一组用例实例→用例的粒度

四轮马车:C(Create)R(Read)U(Update)D(Delete)

最常犯的错误:粒度过细,陷入功能分解

把步骤当用例:

把系统活动当用例

这样才对,或者

把包含复杂交互的路径独立出去形成用例

用例命名:(状语)动词+(定语+ )宾语

类图

属性和关联描述状态,操作描述个体行为,方法是操作的实现

类的分类:

边界类:负责系统与系统外部环境的通信,提供系统和用户、系统和其他系统的界面

实体类(域类)

普通类:

关联类:可以有自己的属性和操作

控制类

时序图(顺序图/序列图)

描述消息如何在对象间发送和接受,纵轴时间、横轴对象P553

协作图(通信图)

收发消息的对象的结构组织,强调空间P554

状态图

对单个对象建立模型,表达对象所处的可能的状态及状态之间的转移

状态、转换、事件、活动组成P555

活动图

分析业务流程,包括:活动状态、动作状态、转换、对象P557

对工作流建模:泳道

对操作建模:流、合并分叉、合并汇合、动作、监护表达式

组合结构图

描述分类器(如类、构件、用例)的内部结构P559

构件图

将系统中可重用的模块封装为物理单元(即构件) P558

提供一个或多个接口,主要以文件形式存在,包括:

软件代码(源码,二进制代码,可执行文件,脚本,命令行等)

带有身份标识并且有物理实体的文件(文档,数据库)

包图

包图展现模块与模块之间的依赖关系P560

把建立的各种模型组织起来,形成各种功能/用途的模块

部署图

描述系统运行的硬件(处理器/设备)、软件、所接中间件P560

处理器:具备处理能力,如服务器

设备:不具备处理能力,如打印机

系统设计(系统方案说明书)

概要设计(概要设计说明书、数据库设计说明书、用户手册)

数据结构设计

根据数据字典,使用抽象数据类型

线性表、栈、队列、串

数组、矩阵、广义表

二叉树(遍历方法和哈弗曼树)

二叉树中叶子节点(度为0)的个数 =度为2节点个数+1;

Q.front=(Q.rear+1+M-Q.len)%M,Q.rear=(Q.front+Q.len-1)%M。

图查找(哈希表)

AOV有向连接图

关键路径:最长路径

最迟发生时间:关键路径长度-从终点到该点的最长距离;

最早发生时间:从起点 到该点最长距离;

松弛时间:最迟-最早;

DB数据库设计(E-R->三大范式)

概念设计P374(E-R模型P376)

E-R实体联系图

逻辑设计(DBMS表结构设计)

关系规范化、关系代数

物理设计(三层结构,数据项存储要求、存取方法、建立索引)

SQL数据库体系结构,定义,增删改查,语句

访问控制,规范化,数据库设计步骤,方法

详细设计(详细设计文档)

算法设计(程序流程图)

各模块功功能描述->过程描述/算法描述P642

各模块的控制结构(先后关系,判定关系,递归关系)

各模块内数据结构设计,输入/输出格式设计

模块页面交互设计,前/后台界面框架

测试(软件测试计划、测试用例、软件测试报告)

测试步骤

单元测试

驱动模块与桩模块

测试模块的输入参数和调用模块形参在个数、属性、单位上是否一致

全局变量在各模块中的定义和用法是否一致

外部输入输入是否改变了形式参数、输出等等。

集成测试

自顶向下集成测试

自底向上集成测试

三明治集成:具有以上2种测试优点,减少桩/驱动模块开发,并行程度高,弥补中间层问题

回归测试

冒烟测试

确认测试

α测试:开发者与最终用户同测,记录错误

β测试:最终用户自测,定期上报错误

系统测试

恢复测试

安全性测试

压力测试

性能测试

部署测试

测试方法

静态测试

不运行程序,分为人工检测、静态分析工具

动态测试

运行程序,分为黑盒测试(功能测试)、白盒测试(结构测试)

调试程序

过程

1发现问题原因并改正

2未找到原因,调试人员假设问题设计测试用例验证假设,直至改正错误

方法

试探法、回溯法、对分查找法、归纳法、演绎法