十一、软件工程

1,软件工程概述

软件开发生命时期:定义--开发--运行维护

软件系统的文档可以分为用户文档和系统文档两类

软件工程过程是指为获得软件产品包括以下4个方面活动:P(plan)软件规格说明 D(Do)软件开发 C(Check)软件确认 A(Action)软件演进。

软件设计的四个活动:数据设计、架构(体系结构)设计、人机界面(接口)设计和过程(功能)设计。

软件系统工具通常可以按软件过程活动将软件工具分为:·

1软件开发工具:需求分析工具、设计工具、编码与排错工具、测试工具等。·

2软件维护工具:版本控制工具、文档分析工具、开发信息库工具、逆向工程工具、再工程工具。·

3软件管理和软件支持工具:项目管理工具、配置管理工具、软件评价工具、软件开发工具的评价和选择

2,能力成熟度模型

能力成熟度模型CMM:初始级(个人主义)可重复级(可重复,有经验)已定义(文档化、标准化)已管理(详细度量标准,软件质量管理和定量过程管理 )优化级(不断改进)

能力成熟度模型集成CMMI(不只针对软件):初始级(过程不可预测)、已管理级(过程为项目服务)、已定义(过程为组织服务)、定量管理(度量过程已度量和控制)、优化级(过程改进优化)

3,软件过程模型

软件过程模型:是一种规划和组织软件开发过程的方法

软件过程模型:

瀑布模型(SDLC):经典的软件生命周期(需求明确线性、输入输出)

原型化模型:快速原型,需求不明确、动态响应、具有最终系统的基本特征。(为了演示)

螺旋模型(增加风险评估):将原型实现的迭代特征和瀑布模型的线性特征结合。(一系列增量发布)

V模型(测试先行):适用于需求明确,需求变更不平凡的。

左边的下画线分别代表了需求分析、概要设计、详细设计、编码。边的上画线代表了单元测试、集成测试、系统测试与验收测试。

增量模型:首先开发核心模块,每一次增量版本都是一个独立的作品。

喷泉模型:面向对象

基于构建的开发模型(CBSD):构件,复用性,节省时间和成本

形式化开发方法模型:数学基础

敏捷模型:适应性、面向人,迭代增量式。(4大价值观,5大原则,12个最佳实践)

主要的敏捷方法:

极限编程XP:交流朴素反馈勇气,实事求是,测试先行

水晶系列方法:机动性,独特的角色

并列争球法(Scrum)冲刺,按照优先级来实现产品

特性驱动开发方法(FDD):特征

4,统一过程模型(RUP)

定义:重量级过程二维开发模型:

RUP流程 业务建模--需求--分析与设计--实现--测试--部署--配置与变更管理--项目管理--环境

初始阶段(产品视图和业务模型)--细化(系统结构、工作计划、资源需求)--构造(演进至提交)--移交(给用户使用)

RUP特点:

1用例驱动

2以体系结构为中心

3迭代与增量

典型的4+1视图模型:

逻辑视图(系统功能--用户)--实现视图(系统的配置、装配、开发--程序员)--进程视图(性能--系统集成人员)--部署视图 (系统工程师安装)+用例视图(系统行为描述--分析人员和测试人员)

5,逆向工程

逆向工程:分析程序,用更高抽象来表示。设计的恢复过程

软件复用:用已有的软件建立新的。包括文档,知识等

逆向工程的四个级别:实现级(符号,语法)--结构级(程序,图)--功能级(控制流)--领域级 (领域级抽象级别最高,完备性(完整)最低。)

重构:改变内部结构,不改变外部行为

设计恢复:还原设计和结构,帮助理解

再工程:先逆向工程--修改或者重构系统--新版本

正向工程: 正常开发过程,UML建模工具

6,需求工程

软件需求:用户对系统的功能、行为、性能、设计约束等方面的期望。

分为需求开发和需求管理

需求开发:

1需求获取

2需求分析 三大模型 功能模型(数据流图DFD)、行为模型(状态装换图STD)、数据模型(E-R图)及数据字典(DD)

3需求定义(需求规划说明书SRS) 两种方法 严格定义也称为预先定义(结构化定义),需求的严格定义建立在以下的基本假设之上:所有需求都能够被预先定义。原型方法,迭代的循环型开发方式

4需求验证 1需求评审:正式评审和非正式评审 2需求测试:设计概念测试用例,设计场景来测试需求,没有代码。

需求管理:

1变更控制

2版本控制

3需求跟踪 正向跟踪(判断有没有少实现)、反向跟踪(判断有没有多实现)

4需求状态跟踪

需求获取

1常见的需求获取法包括:

2用户访谈:不容易记录

3问卷调查:收集到的需求不够精准,比较杂乱

4采样:数学中的数理统计

5情节串联板:一系列图片,通过这些图片来把需求给进行叙述出来,这样虽然生动,但是耗时

6联合需求计划(JRP):有组织的会议来讨论

7需求记录技术:任务卡片、场景说明、用户故事、Volere白卡。

需求分析:

结构化分析特点:自顶向下,逐步分解,面向数据

DFD中数据流向必须经过加工 (黑洞、奇迹、灰洞(输入不足以产生输出))

面向对象分析:类

需求变更:

需求验证通过后,要请用户签字确认,作为验收标准之一,此时,这个需求规格说明书就是需求基线,不可以再随意更新,如果需要更改必须走需求变更流程。

7,系统设计:

业务流程设计工具:

程序流程图(PFD) 顺序、选择、加工

IPO图 描述每个模块的输入输出加工

NS图 不适用复杂程序设计

问题分析图(PAD)支持结构化程序设计

业务流程设计分类:

业务流程管理(BPM)关注管理

业务流程重组(BPR)进行根本性的再次思考和彻底性的再设计

业务流程管理:规范流程、优化流程、再造流程

系统设计(概要设计(系统结构图、概要设计说明书)和详细设计(详细设计说明书)):勾画新系统的详细设计方法。

系统设计基本原理:抽象化,自顶向下,逐步求精,信息隐蔽,模块独立(高内聚低耦合)

软件设计基本原则:多扇入(模块应该允许多个模块调用它)、少扇出(本身应尽量少调用其他模)、单入口、单出口。高内聚低耦合

内聚

偶然(无直接关系--逻辑(逻辑相似、参数决定)--时间(同时运行)--过程(指定过程顺序)--通信(相同数据结构、相同的输入输出)--顺序(顺序执行,输入作为输出)--功能(共同作用缺一不可) 低到高

耦合

无直接(无直接关系)--数据(数据值调用)--标记(传递数据结构)--控制(控制变量)--外部(外部环境)--公共(公共数据结构)--内容(模块内部管理) 低到高

机界面设计三大黄金原则:置于用户控制之下,减少用户的记忆负担,保持界面的一致性。

8,软件测试

软件测试:成功的测试是发现了至今没有发现的错误,测试团队一般是独立的,不参与开发。

测试原则:

1应尽早并不断的进行测试,比如V模型,从设计的时候就开始测试;

2测试工作应该避免由原开发软件的人或小组承担;

3在设计测试方案时,不仅要确定输人数据,而且要根据系统功能确定预期的输出结果;

4既包含有效、合理的测试用例,也包含不合理、失效的用例;

5检验程序是否做了该做的事,且是否做了不该做的事;

6严格按照测试计划进行;

7妥善保存测试计划和测试用例;

8测试用例可以重复使用或追加测试。

软件测试方法可分为静态测试和动态测试。

静态测试:人工检测和计算机辅助(桌前检查(个人)、代码审查(团队)、代码走查(测试团队等))

动态测试:实际运行测试。黑盒测试(功能测试,不可细节。)白盒测试(结构测试,查看模块内部结构)灰盒测试、自动化

测试的阶段

单元测试(功能模块,依据软件详细设计说明书)

集成测试(模块之间、接口。依据软件概要设计文档)

系统测试(完整的、集成的系统--性能测试和功能测试)

确认测试:与用户需求是否一致,依据的是需求文档

1内部确认:按照SRS测试

2Alpha:用户在开发环境测试

3Beta测试:实际使用环境测试

4验收测试:针对SRS,交付前测试

回归测试:变更后回归测试,原有的正确性,和对其他模块的影响

黑盒测试方式:

等价类划分(编写代表性的测试用例)

边界值划分(取数据的边界值,只是边界值)

错误推测(经验而言,来推测有可能产生问题的地方)

因果图(一个结果来反推原因的方法)

白盒测试方式:

语句覆盖SC:执行所有语句,不代表执行了所有条件判断(覆盖层级最低)

判定覆盖DC:真假分支都执行一次

条件覆盖CC:if中的每个判定都执行一次

条件判定组合覆盖CDC:满足判定和条件。

路径覆盖:所有代码都执行(覆盖层级最高)

调试:找出错误的代码和原因。测试是发现错误,调试是找出错误的代码和原因。

蛮力法:

回溯法:从出错的地方开始,向回找

原因排除法:找出所有可能的原因,逐一进行排除

软件属性:外部属性(指向管理者和用户,可直接测量)。内部属性(产品本身属性如可靠性,只能间接测量)

McCabe度量法(环路复杂度):有向图。有向边m ,节点数n M-n+2

注意m和n代表的含义不能混淆,可以用一个最简单的环路来做特殊值记忆此公式,另外,针对一个程序流程图,每一个分支边(连线)就是一条有向边,每一条语句(语句框)就是一个顶点。

9,系统维护

遗留系统演化:

技术^

业务价值>

集成 改造

淘汰 继承

系统转换

是指新系统开发完毕,投人运行,取代现有系统的过程。

直接转换,并行转换(新系统和老系统并行工作一段时间),分段转换(分期分批逐步转换)

数据转换与迁移:将数据从旧数据库迁移到新数据库中。

有三种方法:系统切换前通过工具迁移、系统切换前采用手工录人、系统切换后通过新系统生成。

系统维护是整个系统开发过程中耗时最长的。

系统的可维护性可以定义为维护人员理解、改正、改动和改进这个软件的难易程度,其评价指标如下:

易分析性,易改变性,稳定性,易测试性

系统维护包括硬件维护、软件维护和数据维护,其中软件维护类型如下

正确性维护(改bug) 适应性维护(因为环境,被动维护) 完善性维护(主动提出需求,增加功能) 预防性维护(对未来可能发生的问题维护)

净室软件工程

是一种应用数学与统计学理论以经济的方式生产高质量软件的工程技术。

净室软件工程(CSE)的理论基础主要是函数理论和抽样理论。

净室软件工程应用技术手段:

1统计过程控制下的增量式开发。

2基于函数的规范与设计。

3正确性验证 (CSE的核心)

4统计测试和软件认证。

基于构件的软件工程(CBSE) 分布式对象技术 购买而不是重新构造

构件组装:顺序(上输入下输出) 、层次(服务调用)、叠加(两个以上)

构件组装三个不兼容问题:参数(参数)、操作不兼容(接口)、操作不完备(子集)