6 软件工程
软件工程
指导计算机软件开发和维护的工程学科。通过分析、设计、实现、测试、实施、维护、项目管理,最终如何提高软件生产率。
过程模型
软件开发机构针对一类软件产品为自己规定的工作步骤
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未找到原因,调试人员假设问题设计测试用例验证假设,直至改正错误
方法
试探法、回溯法、对分查找法、归纳法、演绎法