第一章 绪论

软件工程概念的提出与发展

软件:是按照特定顺序组织的计算机数据和指令的集合(计算系统中的程序及文档)
软件危机:随着计算机的广泛应用,软件的生产率与软件质量远远满足不了社会发展的需求。
软件工程:应运软件危机而生,应用计算机科学理论和技术以及管理原则和方法,按预算进度实现满足用户要求的软件产品的工程.

两个发展阶段:

1960年代末至1980年代末 面向过程阶段
成果:瀑布模型

1980年以来 面向对象阶段
成果:《软件生存周期过程》、计算机辅助软件工程(CASE)

软件开发本质

    可以将软件开发的本质概括为不同抽象层术语之间的 映射以及不同抽象层处理逻辑之间的 映射

涉及两个问题:

  1. 如何实现这样的映射?
  2. 如何管理这样的映射?

涉及的两类技术

  1. 过程方向。即求解软件的开发逻辑
  2. 过程途径,即求解软件的开发手段

  问题建模与模型,所谓 模型是指待建系统的任意抽象,其中包括所有的基本能力、特殊或其他一些方面,而没有任何冗余细节,通常包含对该系统边界的描述、对系统内各模型元素以及他们之间的语义描述

软件系统模型大致可以分为两类:

  1. 概念模型 ->需求
  2. 软件模型

    设计模型->设计;
    实现模型-> 实现
    部署模型-> 部署

如上所述,分层的基本动机是为了控制开发的复杂性。系统的概念模型是对事务系统的抽象即标识要解决的问题,或称问题定义。软件模型则是给出问题解决的方案

第二章 软甲需求与软件需求规约

需求与需求获取

  1. 需求:描述待开发产品/系统功能上的能力、性能参数或其性质。
  2. 单一一个需求必须具备如下5个性质
    1) 必要的,该需求用户所要求的
    2) 无歧义的,该需求只能用一种方式解释
    3) 可测试,该需求可进行测试
    4) 可跟踪的 ,该需求可以从一个开发阶段跟踪另一个开发阶段
    5) 可测量的,需求可测量
  3. 需求分类:
    1) 功能需求
    功能需求规约了系统或系统构件必须执行的功能。
    2) 非功能需求
    a 性能需求
    规约了系统或系统构件在某方面必须具有的一些特性
    b外部接口需求
    规约了系统和系统构件必须与之交互的用户、硬件、软件或元素,其中也可能规约交互格式、时间或其他因素
    c 设计约束需求
    设计约束是一种需求,它限制了软件系统软或软件系统构件的设计方案
    d 质量属性需求
    规约了软件产品所具有的一个性质(包括功能和其他需求)必须达到质量方面一个所期望的水平。
    例如:
    可靠性、存活性、可维护性、用户友好性
  4. 需求发现技术
    1) 自悟
    需求人员把自己作为最终用户,审视系统,并提出问题。
    成功条件: 需求人员必须具有比最终用户还要多的应用领域和过程方面知识,并具有丰富想象力。
    2) 交谈
    为了确定系统应该提供的功能,需求人员通过提出问题/用户回答这一方式,直接询问用户需要的 是什么样的系统
    成功条件: 需求人员剧本“正确提出问题”的能力;回答人员具备“揭示需求本意的能力”
    3) 观察
    通过观察用户执行其现行的任务和过程
    成功和条件: 需求人员具有洞察事物本质的能力
    4) 小组会
    举行客户和开发人员的联席会议,与客户代表共同开发需求
    成功条件: 会议组织得当,责权分明,参与会议的人员具有良好的需求发现能力
    5) 提炼
    复审技术文档,并提取相关信息系
    成功条件: 已存在项目背景文档以及一些紧密相关的需求文档,并且需求人员具有很好的想象力和需求标识能力,包括熟息相关的 技术。

需求规约

  1. 需求规约定义
    1) 重要性与稳定性程度
    2) 可修改的
    3) 完整的
    4) 一致的
  2. 需求规约的表达
    1) 非形式化的需求规约
    2) 半形式化的需求规约
    标准化的表达式标识了一些元信息,支持更加清晰的方式系统化的编制文件
    3) 形式化的需求规约
    一种基于良构数学概念的符号体系来编制需求规约,一般往往伴有解释注释的支持。其中:
    以数学概念来定义该符号体系的词法和语义
    定义一组支持逻辑推理的证明规则,并支持这一符号体系的定义和引用
  3. 需求规约的作用
    1) 需求规约是软件开发组织和用户之间一份事实上的技术合同书,是产品功能及其环境的体现。
    2) 对于项目的大多数工作,需求规约是一个管理控制点
    3) 对于产品/系统的设计,需求规约是一个正式的、受控的起始点
    4) 需求规约是创建产品验收测试计划用户指南的基础,及基于需求规约一般还会产生另外两个文档——初始测试计划用互系统操作描述

第三章 结构化方法

  结构化功能方法作为一种“思想”工具,可用于定义需求,建立待建系统的功能模型,可用于定义满足需求的结构,给出一种特定的软件解决方案。分析确定系统必须做什么,设计确定怎么做

结构化需求分析

  1. 在软件系统产品中面临的三大挑战
    1) 空间问题理解
    2) 人与人之间通信
    3) 需求变化
  2. 面对挑战需求技术应具备
    1) 提供方便通信机制,列如在不同开发阶段使用先关人员容易理解的语言
    2) 鼓励需求分析人员使用问题空间的术语思考问题,编写文档
    3) 提供定义系统边界的方法
    4) 提供支持抽象的基本机制
    5) 为需求分析人员提供多种可供选择的方案
    6) 特工特定的技术,适应需求变化
  3. 软件开发方法
    1) 结构化方法
    2) 面向数据结构的软件开发方法
    3) 面向对象方
  4. 数据流图基本术语
    1) 数据流
    2) 数据存储
    3) 加工
    4) 数据源与数据谭
    数据流图(DFD)
  5. 在使用数据流图表达产品系统模型时,应注意以下3个问题
    1) 数据流起到连接其他实体的作用,
    2) 加工之间可以有多个数据流,这些数据流之间可以没有任何关系
    3) 对于比较大的软件系统,往往需要采用 多层次的数据流图
    注意:顶层数据流图省去数据存储部分
  6. 建模过程
    机构化分析方方法给出建模基本步骤,该过程属于“自顶向下,功能分解”
    1) 建立系统环境图,确定系统环境
    2) 自顶向下,逐步求精,建立系统层次数据流
    自顶向下的画出各层次的数据流图,直到底层加工足够精细,功能清晰移动啊,不必继续分解为止,并把这样的加工称为“叶加工
    3) 定义数据按字典
  7. 数据基本结构
    1) 顺序结构
    2) 选择结构
    3) 重复结构
  8. 描述加工
    1) 结构化自然语言
    结构化自然语言介于形式语言和自然语言之间
    2) 判定表
    如果一个加工的输入数据与输出数据之间的逻辑关系比较复杂可以用一定的表达工具。由条件类别(考试总分、单科成绩)、条件组合、操作、操作执行组成。
    判定表
    3) 判定树
    判定树是一种描述加工的工具。由功能、条件、结果组成。
    判定树

结构化设计

为了控制软件设计的复杂性,结构化设计又分为总体设计与详细设计

总体设计

结构化设计在结构化设计中引入两个模块
1) 模块 软件中具有特殊标识的独立成分
2) 模块调用,即指模块之间的一种使用关系

  1. 模块结构图
    是一种描述软件“宏观”结构的图形工具。
    1) 矩形:模块(功能)
    2) 空心圆:数据信息
    3) 实心圆:控制信息
  2. 层次图(H图)
    主要用于描述软件层次结构,适合在自顶向下设计软件的过程使用。
  3. HIPO图
    其中HIPO是“层次图+输入/处理/输出”的英文缩写。实际上,HIPO是由H图和IPO图两部分组成
  4. 总体设计步骤
    1) 待建系统的数据流图一般分为变换型数据流图事务型数据流图
    2) 结构化设计方法基于“自顶向下,功能分解”的基本原则。针对两种不同类型的数据流图,分别提出了变换设计事务设计
  5. 模块化
    该步的目标是:基于模块“高内聚低耦合”的原则
    结构化设计是一种典型的模块化方法,
    耦合:耦合是指不同模块之间相互依赖程度的度量。
    1) 内容耦合:当一个模块直接修改或操作另一个模块的数据,或一个模块不通过正常入口转入到另一个模块时,这样的耦合被称为内容耦合。
    2) 公共耦合: 两个或两个以上的模块共同引用一个全局数据项
    3) 控制耦合: 一个模块通过接口向另一个模块传递控制信息
    4) 标记偶合:若一个模块A通过接口向两个模块B和C传递一个公共参数,那么称模块B和C之间存在一个标记耦合。
    5) 数据耦合: 模块之间通过参数来传递数据,则称为数据耦合
    内聚: 是指模块内部个 成分之间相互关联程度的度量。
    1) 偶然内聚:如果一个模块内部的各个成分之间基本不存在任何关系
    2) 逻辑内聚:几个逻辑上相关的功能被放在同一模块中则称为逻辑内聚。
    3) 时间内聚:如果一个模块完成的功能必须在同一时间内执行
    4) 通信内聚:如果模块内部所有的成分都操作同一数据集或生成同一数据集,则称为通信内聚
    5) 过程内聚:如果一个模块内部的处理成分是相关的,而且这些处理必须一特定的次序执行,则称为过程内聚
    6) 顺序内聚: 如果一个模块的各个成分和同一功能密切相关,而且一个成分的输出作为另一个成分的输入
    7) 功能内聚:最理想的内聚是功能内聚,模块的所有成分对于完成单一功能都是基本的。
  6. 启发规则
    实现出一些模块“高内聚低耦合”的启发规则:
    1) 改进软件结构,提高模块独立性
    2) 力求模块规模适中
    3) 力求深度、宽度、扇入、扇出适中
    模块扇入扇出是指一个模块直接控制(不存在共同控制)的下级模块数目。
    2022年四月份例题

    扇出与作用域控制域

    4) 尽力使模块的作用域在其控制域之内。
    如果一个模块的作用域不再控制域之内,这样的结构一方面难以理解,另一方面会产生较为复杂的控制耦合
    5) 尽力降低模块接口的复杂度
    6) 力求模块功能可以测试

详细设计

  1. 结构化程序设计
    软件设计的两个抽象层:高层模块结构描述每一模块结构描述,完成软件结构定义。
    顺序、选择和循环结构可以用流程图表示,实际上,用顺序结构和循环结构完全可以实现选择结构,因此在理论上最基本的控制结构只有两种。
  2. 详细设计工具
    1) 程序流程图
    使用最广泛的就是,顺序结构、选择结构、循环结构
    缺点
    不是一种逐步求精的工具,它诱使程序员过早的考虑流程控制,而不去考虑程序的全局结构。
    所表达的控制流程,往往不受任何约束可随意转移,从而影响甚至破坏好的结构设计
    不易表示数据接结
    2) 盒图(N-S)
    盒图支持自顶向下逐步求精的详细设计,为不违背结构化程序设计而提出。
    3) PAD(问题分析图)
    采用二维属性结构图来表示程序控制流程,采用PAD图设计的模型一定是结构化的,并且所有描述都十分清晰,即图中最左边的竖线是程序的主线,是第一层控制结构,每增加一层图形向右扩展一条竖线。
    4) PDL类程序设计语言
    PDL类程序设计语言也称为伪码,且PDL是一种混合语言,一方面借用某种结构化程序语言的关键字作为语法框架,用于定义 控制结构和数据结构,另一方面PDL菜用某种自然语言的词汇,灵活地表示实际操作和判定条件
    5) 另外IPO图、判定表、判定树也可以作为详细设计的工具。

第四章 面向对象的方法——UML

UML术语

UML是面向对象的统一建模语言,引入了8个术语:类与对象、接口、协作、用况、主动类、构件、制品、节点。UML把这些术语统称为类目
参与者是类的变体。类的变体还有实用信号,实用程序等,主动类的变体是进程和线程;制品的变体有应用、文档、库、页和表
OOA面向对象分析
OOD面向对象设计

  1. 类与对象
    可见性:可见性的目的是为了支持信息的隐蔽这一软件设计原则。
    1) +公有的。该属性可供其他类目使用
    2) #受保护的。该属性只有其子类才能使用
    3) -私有的。该属性只有本类操作才能使用
    4) ~包内的。该属性只有在同一包中声明的类才能使用。
  2. 接口
    接口可以被其他类使用但本身不能访问其他类,没有属性和状态,等价于没有属性和方法的抽象类
    1) 采用分栏和关键字《interface》的矩形符号表示
    2) 采用小圆圈和半圆圈来表示左边的圈表示由类提供的接口,简称供接口,右边的半圈表示类需要的接口表示需接口。
    接口表示示例
    3) 用虚线空心箭头表示接口
    4) 可以使用状态机来描述接口的预期行为,也可以使用一系列的交互图和协作图,详细描述接口的预期行为
  3. 协作
    协作是一个交互,涉及交互的三要素:交互各方、交互方式、交互内容、
  4. 用况
    用况是对一组动作序列的描述,系统执行这些动作应产生对特定与者有值的,可观察的效果。参
    协作与用况表示
  5. 主动类
    至少有一个进程或线程的类。可以控制系统启动活动。并且其对象行为通常是用于其他元素行为并发的。
  6. 构件
    构件是系统设计中的一种模块化部件,通过外部接口隐藏他的内部实现。构件是可以嵌套的,及一个构件包含另一个更小的构件
  7. 制品
    制品是系统中包含物理信息的、可替代的物理部件
  8. 节点
    节点是在运行时存在的物理元素,通常表示一种具有记忆能力处理能力的计算机资源。

表达关系的术语

  1. 关联
    关联是类目之间的一种结构关系,是对一组具有相同结构、相同链的描述。
    为了表达关联语义UML采用了一下途径
    1) 关联名
    2) 导航:对于一个给定类目,可以找到与之关联的另一个类目
    3) 角色
    4) 可见性
    5) 多重性
    类中对象参与一个关联的数目,称为该关联的多重性
    6) 聚合: 聚合是关联的一种特殊形式(带有空心菱形的实线)
    7) 组合: 组合又是聚合的一种特殊形式(带有实心菱形的线段)
    8) 关联类
  2. 泛化
    泛化是一般类目和它的较为特殊性类目之间的一种关系,有时称is-a-kind-of关系,
    子类可继承父类的属性和操作,并可有更多的属性和操作,子类可替换父类声明,也可实现多态,可以在其他类目之间创造泛化。例如节点、类和接口之间。
    UML为进一步表达泛化的语义,提出来4个约束
    1) 完整
    2) 不完整
    3) 互斥
    4) 重叠
  3. 细化
    细化化是类目之间的语义关系,其中一个类目规约了另一个类目执行的契约。
    一般一下两个地方会使用细化关系:
    1) 接口与实现他们的类接口和构件
    2) 用况与实现他们的协作之间
  4. 依赖
    依赖是一种使用关系,用于描述一个类目使用另一个类目的信息和服务。
    箭头示例

表达组合信息的术语包

为了控制信息组织的复杂性,UML提供了组织信息的一种通用机制包。
包可以作为“模块化”和“构件化”的一种机制。
为模块化包之间的关系UML给出了两种依赖,
1) 访问
表明目标包可以被原包所引用,或被那些递归嵌套在原包中的其他包所引用。
2) 引入
表明目标包中具有适当的可见性的内容,被加入到原包的公共命名空间中,相当于原包对其做了声明。

UML的模型表达格式

  1. 类图
    类图是可视化地表达系统静态结构模型工具,通常含类、接口、关联、泛化、依赖等关系。
  2. 用况图
    用况图是一种表达系统功能模型的图型化工具。
    用况图包含的内容,确定了一个特定的抽象层,该抽象层决定了系统的模型形态。
    主要包含:
    1) 主题
    2) 用况
    3) 参与者
    4) 关联、泛化与依赖
  3. 状态图
    状态图是显示一个状态机的图,从一个 状态到另一状态的控制流
    主要构成:
    1) 初始状态
    2) 最终状态
    3) 正常状态
    4) 转移及其相关的事件和动作消息
  4. 顺序图
    顺序图是一种交互图,即由一组对象以及按时序组织的对象之间的关系组成,其中还包含对象之间所发送的消息

第五章 面向对象方法——RUP

一种软件开发方法学至少由3部分组成,一是用来表达基本信息的术语,二是用于组织基本信息的格式,三是在不同抽象层之间的映射的过程指导。

  1. RUP的特点
    是一种一用况为驱动,以体系结构为中心的,迭代、增量开发。
  2. 增量
    每次迭代都要按照专门的计划和评估标准,通过一组明确的活动,产生一个内部的或外部的发布版本,两次相邻迭代所得的发布之差称为一个增量。
  3. 迭代的4个阶段
    1) 初始化阶段的基本目标:结构轮廓
    2) 精华阶段的基本目标:捕获和描述系统的大部分需求
    3) 构造阶段的基本目标:通过演化,形成系统最终的体系结构基线,具有初始操作能力。
    4) 移交项目阶段的基本目标:确保有一个实在的产品发布给用户群。

核心工作流

RUP每次迭代中都要经历一个核心工作流,及需求获取、分析、设计、实现和测试

需求获取

目标:是UML中的用况、参与者以及依赖等术语来抽象客观实际问题形成系统的需求获取模型————一种特定的系统/产品模型
要做的工作:
1) 列出候选需求
产生制品——特征列表
2) 理解系统语境
产生制品——领域模型和业务模型
业务用况模型与业务对象模型
3) 捕获功能需求
产生制品——用况模型
用况模型是一种概念模型,是对系统功能的抽象,包括系统参与者、系统用况以及他们之间的关系。
为创建系统用况模型应进行一下活动:
活动一:发现并描述参与者
活动二:发现并描述用况
活动三:确定用况优先级
活动四:精华用况
活动五:构造用户界面原型
活动六:用况模型结构化
4) 捕获非功能需求
产生制品——补充需求或针对一些特定需求的用况

需求分析

RUP的需求分析目标是:在系统用况模型的基础上,创建系统分析模型以及在该分析模型视角下的体系结构描述

  1. 基本术语
    1) 分析类
    边界类
    实体类

    控制类

    1) 用况细化
    用况细化是一个协作
    1) 分析包
    一个具有良好结构的分析包:
    体现问题分离、高内聚、低耦合、尽可能的体现一个系统完整的顶层设计
  2. 分析模型表达
  3. 分析的主要活动
    3) 体系结构分析
    4) 用况分析
    5) 类分析
    6) 包分析

  4. 用况模型和分析模型的比较

第六章 软件测试

软件测试:按照规定程序发现软件错误的过程。
软件评估:可以分为静态评估和动态评估,评审、走查和形式化证明等是静态评估技术,而软件测试是动态评估技术。

软件测试技术

软件测试技术分为两大类:
白盒测试(结构测试技术) 路径测试技术,依据是程序的逻辑结构 ;
黑盒测试技术(功能测试技术): 事务处理技术、状态测试技术、定义域测试技术、依据是软件行为描述 ;

路径测试技术

(1) 采用控制流图来表述测试程序模型,揭示程序中控制结构
(2) 通过合理地选择一组穿过程序的路径,以达到某种测试度量。

控制流程图

基本元素 表示 属性
过程块 一组程序语句 一进一出
判定 程序点 一进多出
节点 程序点 多进一出
过程块

测试策略

(1)覆盖覆盖(px):执行所有可能穿过 程序控制流程快的路径(最强的测试度量)
(2)语句覆盖(p1):执行程序中 所以语句 一次。
(3)分支覆盖(p2):将程序中每一个分支执行一次。 100%覆盖
(4)条件覆盖:每个判定中的所有可能的条件取值至少执行一次。
(5)条件覆盖与条件组合覆盖

基于事务流的测试技术

1) 事务与事务流程图
2) 事务测试技术的应用

其他功能测试技术的简介

  1. 等价类划分
  2. 边界值分析
  3. 因果图

软件测试步骤

  1. 单元测试
  2. 集成测试
  3. 有效测试

第七章 软件生存周期过程与管理

《ISO/IEC系统与软件工程—软件生存周期过程12207—2008》标准简介

软件生存周期模型

  1. 瀑布模型
  2. 增量模型
  3. 演化模型
  4. 螺旋模型
  5. 喷泉模型

过程规划与管理

  1. 软件生存周期过程监控
    1) 进展与进程跟踪
    2) 质量数据趋势检查
    3) 设计、编码和测试计划复审记录和动作检查
    4) 变更异常和测试异常报告趋势检查
    5) 关键资源有效使用
    6) 与项目组成员有效交谈

第八章 集成化能力成熟度模型(CMMI)

CMMI部件

  1. CMMI由一些过程域组成,过程域有自己确定的专用目标和共同目标,
  2. 每个专用目标和过程目标的实现分别依赖一些实践,包括专用实践和共用实践
  3. 每个专用实践有自己的子实践和确定典型工作的产品,
  4. 为了将每个过程域表达清楚,每个过程域还有意图陈述、简介性注释以及相关过程域,

CMMI 等级

  1. 能力等级
    2) 0级:未完成等级
    3) 1级:已执行等级
    4) 2级:已管理等级
    5) 3级:已定义等级
    6) 4级:已定量管理等级
    7) 5级:持续优化等级

  2. 组织成熟度等级
    9) 1级:初始级
    10) 2级:已管理等级
    11) 3级:已定义等级
    12) 4级:一定量管理等级
    13) 5级:持续优化等级

软件生存周期过程与管理