教材:普通高等教育软件工程专业“十二五”规划教材
书名:《实用软件工程技术》
出版社:科学出版社2013.7
ISBN:978-7-03-037569-8

【软件工程概念】

第1章 软件工程概述

1.1 软件及其本质特性

软件的概念
  • Q1:软件设计不能与飞机制作相比,软件的错误一般不会带来像飞机失事那样严重的后果;修改的代价也远远小于飞机的修理。重新启动、修改程序是十分容易的事情。(B: 错误

  • Q2:软件和硬件具有完全不同的特征:软件不会“磨损”。(A: 正确

  • Q3:软件和硬件具有完全不同的特征:软件不会“磨损”,所以软件不会失效。(B:错误

  • Q4:在软件开发过程中,编程花费占总花费的比例?(软件编程20%;需求分析40%;软件测试40%)

  • 软件是:

    • 指令的集合(计算机程序),通过执行这些指令可以满
      足预期的特征、功能和性能需求;
    • 数据结构,使得程序可以合理利用信息;
    • 软件描述信息,它以硬拷贝和虚拟形式存在,用来
      描述程序的操作和使用。

      软件是逻辑的而非物理的系统元素,因此,软件具有完全不同的特性:软件不会“磨损”。

  • 软件的特性:

    • 无形性;
    • 成本主要体现在软件的开发和研制上;
    • 软件不会用坏,只能被淘汰;
    • 软件生成方式原始;
    • 软件成本昂贵
  • 软件的概念:软件具有复杂性一致性可变性不可见性

软件的分类
  • 按功能划分:系统软件,支撑软件,应用软件

  • 按工作方式划分:实时处理软件,分时处理软件,交互式软件,批处理软件

  • 按服务对象的范围划分:项目软件,产品软件

  • 按使用频度划分:一次使用的软件,频繁使用的软件

  • 失效的影响划分:高可靠性软件,一般可靠性软件

软件的发展
软件危机

什么是软件危机?
软件危机是指计算机开发和维护过程中所遇到的一系列严重的问题,这些问题不仅仅是不能正常运行的软件才具有的,而是几乎所有软件都不同程度上存在的。

  • 软件危机:软件质量令用户难以接受,研制周期一拖再拖,预算不断突破,软件研制成为计算机技术发展的“瓶颈”

  • 产生的根本原因

    • 人类智能的局限性(软件规模越来越大,结构越来越复杂)
    • 协同工作的困难性(开发管理困难,开发费用增加)
    • 缺乏正确的方法和工具(软件开发技术、工具和方式的落后)
  • 软件危机的表现:

    • 开发的软件不能满足用户的要求
    • 软件费用和进度失控
    • 软件可维护性差
    • 软件的生产率低
    • 软件规模的增长,导致软件复杂度增加
    • 软件文档不完整
  • 解决途径软件工程,用工程的、科学的概念、原理、技术和方法,进行软件的开发、管理和维护。

1.2 软件工程

  • 软件:软件工程的研究对象,也是软件工程的产品形态
    与客观存在。

  • 工程:将理论和知识应用于实践的科学,其目的是经济
    有效地解决实际问题。

  • 软件工程:为了解决开发成本效益和软件质量的问题而
    产生的,它借鉴了传统工程的原则和方法,用系统的、
    有效的、和可控的方法构建高质量的软件产品。以提高
    质量,降低成本为目的。

定义

“将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程,即将工程化应用于软件中。”

研究内容
  • 软件开发技术:软件结构、开发方法、工程与软件工程环境,软件工程标准化
  • 软件工程管理:质量管理,软件工程经济学、软件心理学,成本估算,计划安排
目标
  • 较低的开发成本
  • 实现客户要求的功能
  • 能够按时完成开发任务及时交付使用
  • 具有良好性能、可靠性、可扩展性、可移植性
  • 软件维护费用低
基本原则
  • 用分阶段的生命周期计划严格管理
  • 坚持阶段性评审
  • 实施严格的产品控制
  • 采用现代程序设计技术
  • 结果应能清楚地审查
  • 开发小组的人员应该少而精
  • 承认不断改进软件工程实践的必要性
三要素

软件工程的三要素是哪三大要素?

  1. 过程:将各个技术层次结合在一起,使得合理、及时地开发计算机软件成为可能
  2. 方法:为构建软件提供技术上的解决方法
  3. 工具:为过程和方法提供自动化或半自动化的支持

第2章 软件过程

软件过程也称为软件生存周期过程 (Life Cycle)

软件生命周期有哪几个阶段?
软件定义阶段、软件设计阶段、运行与维护阶段

2.1 生命周期的基本任务

软件定义阶段

确定软件开发的目标及其可行性,说明软件要解决的问题是什么

软件设计阶段

将需求分析时期得到的逻辑模型设计成自己的计算机软件方案

运行与维护阶段

保障软件的正常运行以及对软件进行维护,是软件周期最长、工作量最大、费用最昂贵的一项任务

2.2 软件生命周期模型

  • 瀑布模型:从上到下,不可逆
  • 增量模型:按照功能排序,逐个实现交付使用
  • 同步-稳定模型:尽早测试,定期软件集成与测试,及时反馈
  • 螺旋模型:增加了风险分析,对安全性保密性高的软件,适用于指导大型项目的开发
  • 喷泉模型:开发过程具有迭代性和无间隙性
  • 基于知识的模型:通过软件工程知识、特定领域知识来帮助开发
  • 统一过程模型(UML建模,现代的生命周期模型)上面的都是传统的模型

详细知识点请见PPT或课本P13-18页,要知道每一种模型的特点和适用情况

2.3 软件开发方法

知道有哪些开发方法

  • 结构化方法
  • Jackson方法
  • 维也纳方法
  • 面向对象的方法

【软件工程工具】

略。

CASE是一个计算机辅助工具


【软件工程方法学】

第7章 结构化的分析技术

7.1 可行性分析

  • 可行性分析任务:明确应用开发的必要性和可行性。
数据流图(DFD图)

重点是P57数据流图(DFD图)!

要知道有哪些符号,每种符号代表的名称。如果出案例让画数据流图要能画出来

7.2 需求分析

任务
  • 确定要做什么,而不是怎么做
    1. 确定对系统的综合要求
    2. 对系统的数据要求进行分析
    3. 导出系统的逻辑模型
    4. 修正系统开发计划
过程
  • 五个步骤
    1. 获取用户需求
    2. 分析用户需求
    3. 编写需求文档
    4. 评审需求文档
    5. 需求管理

需求分析过程需要建立三种模型,分别用不同的工具设计实现:

  • 数据模型:实体-联系图(E-R图)
  • 功能模型:数据流图
  • 行为模型:状态转换图
技术
  1. 实体联系图
  2. 状态转换图
  3. 层次方框图
  4. Warnier图
  5. IPO图(输入、处理、输出)
  6. 数据流图

第8章 结构化的设计技术

8.1 概要设计(结构设计)

任务

把数据分析得到的DFD图(数据流图)转换为软件结构和数据结构。

原则

要知道概要设计的原则,其中模块独立里,要知道耦合的强弱高低,建议使用哪种耦合。
详见课本P72或复习资料第8章概要设计_part1.pdf

1.模块化
  • 模块化的优点:
    • 使软件结构清晰,容易设计、阅读和理解
    • 有利于测试和调试
    • 有助于提高软件的可靠性和可修改性
2.抽象
3.逐步求精
4.信息隐藏和局部化
5.模块独立

在考虑模块之间耦合性的时候,应该采取下述设计原则:
尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,杜绝使用内容耦合。

  • 耦合P74
    1. 数据耦合(尽量用):模块间通过参数传递基本类型的数据
    2. 控制耦合(少用):一个模块向另一个模块传递一个控制信号,接受信号的模块将依据该信号值进行必要的活动
    3. 特征耦合(少用):把整个数据结构作为参数传递,而被调用的模块只需要使用其中一部分数据元素(复杂类型的数据)
    4. 公共环境耦合(限制):两个以上的模块共同引用一个全局数据项
    5. 内容耦合(坚决避免):一个模块直接修改或操作另一个模块的数据

模块的高内聚往往意味着松耦合,但实践表明内聚更重要,要追求:「高内聚,低耦合」,尽量使用功能内聚。

  • 内聚P76
    1. 偶然内聚:一个模块之内各成分之间没有任何关系
    2. 逻辑内聚:几个逻辑上相关的功能放在一个模块中
    3. 时间内聚:一个模块完成的功能必须在同一时间内完成,而这些功能只是因为时间因素关联在一起
    4. 过程内聚:处理成分必须以特定的次序执行
    5. 通信内聚:各成分都操作在同一数据集或生产同一数据集
    6. 顺序内聚:格成分与一个功能相关,且一个成分的输出作为另一个成分的输入
    7. 功能内聚(尽量用):模块的所有成分对完成单一功能是最基本的,且该模块对完成这一功能而言是必要充分的
6.启发原则
  1. 改进软件结构提高模块独立性
  2. 模块规模应该适中
  3. 深度、宽度、扇出和扇入都应适当
  4. 模块的作用域应该在控制域之内
  5. 力争降低模块接口的复杂程度
  6. 设计单入口单出口的模块
  7. 模块功能应该可以预测
规则和图形工具的应用

如何区分顶层和0层数据流图?学会画顶层、0层、1层或总的数据流图。

8.2 详细设计(过程设计)

概念和任务
  • 概念:

    • 又称为过程设计、程序设计
    • 设计每一个模块的实现算法及其过程的详细描述
    • 承上启下的作用:
    • 向上承接概要设计阶段对系统功能分解并划分模块结果
    • 向下又为编码设计阶段构造源程序起到启下的基础作用

  • 任务:严格依据软件需求规格说明书中关于功能的需求信息,选择并设计每个模块的实现算法及其过程的详细描述。

过程设计的工具

对以下每种工具都要了解和知道,优缺点和如何画

程序流程图

又称为框图,用于表达问题求解过程控制流的有效方法。直观易掌握,但可读性差。

结构流程图(N-S图)

又称为盒图、N-S图

  • 优点:

    • 能有效保证设计的质量,从而也保证了程序的质量
    • 比较直观、易于绘制
    • 简单、易学易用

  • 缺点:

    • 手工修改比较麻烦

问题分析图(PAD图)

采用二维树型结构的图形符号表示程序的控制结构

  • 优点:

    • 定义的程序结构清晰,层次分明,逻辑关系直观
    • 表达的程序逻辑易懂、易读、易记、易修改
    • PAD图表达的算法转换成高级程序设计语言的源代码非常容易,有自动转换软件支持
    • 不仅可以标识程序的算法结构,又可表示数据结构

判定表
  • 表示复杂的条件组合与应做动作之间的对应关系

    • 描述加工“做什么”,即加工逻辑
    • 适用于加工的输入数据和输出数据之间的逻辑关系比较复杂的加工描述

  • 优点:

    • 能够直观而无二义地描述算法的处理规则

  • 缺点:

    • 判定表无法表示算法中的顺序和重复等处理特性,只适合用于描述条件组合关系比较复杂的一类算法的定义,不能作为一种算法描述的通用工具
    • 所有的独立条件不分主次,一律同等对待
    • 当数据元素多于两个时,判定表的简洁性下降

判定树

适用于加工的输入数据和输出数据之间的逻辑关系比较复杂的加工描述

优点:比较直观,含义明确,便于写程序

过程定义语言(PDL)

又称伪码语言、结构化语言和类程序设计语言

  • 伪码是一种混合语言:

    • 外部:形式语言定义控制结构和数据结构
    • 内部:自然语言描述

  • 优点:

    • 不仅可以作为设计工具,也可以作为注释工具

  • 缺点:

    • 不如图形工具那样形象直观
    • 当描述复杂的条件组合与动作间的对应关系时,不如判定表和判定树那样清晰简单

面向数据结构的设计方法
  • 数据结构既影响程序的结构也影响程序的处理过程
  • 在许多领域中信息都有清楚的层次结构,层次的数据组织通常和使用这些数据的程序的层次结构十分相似
  • 在完成软件结构设计之后,可使用面向数据结构的方法设计每个模块的处理过程
  • 面向数据结构设计方法:

    • Jackson 方法
    • Warnier方法

Jackson图

Jackson方法从目标系统的输入、输出数据结构入手,导出程序框架结构,再补充其他细节,即可得到完整的程序结构图

Jackson程序设计方法步骤

详见课本P96或复习资料第8章详细设计.pdf

  1. 确定输入数据输出数据逻辑结构,用Jackson图表达
  2. 找出输入结构和输出结构中有对应关系(因果)的单元
  3. 描绘数据结构的Jackson图导出描绘程序结构Jackson图
  4. 列出所有操作条件,分配到Jackson图中
  5. 用纲要逻辑表示程序
人机交互界面设计
  • 人机交互界面的质量直接影响用户对软件产品的评价
  • 人机交互界面是接口设计的一个重要组成部分
  • 人机交互设计遵循的认知原则:
    1. 一致性原则
    2. 兼容性
    3. 适应性
    4. 指导性
    5. 结构性
    6. 经济性
设计原则
  • 用户原则: 确立用户类型,针对不同用户特性进行设计
  • 信息量最小量原则:减少用户记忆负担
  • 帮助和提示原则:帮助用户处理问题,要有恢复出错现场的能力
  • 媒体最佳组合原则:处理好各种媒体间的关系
设计问题
  • 系统响应时间: 从用户完成某个控制动作到软件给出预期响应的这段时间
  • 用户帮助设施: 每个用户都需要帮助,大多数软件都提供联机帮助设施
  • 出错信息处理
    • 出错信息和警告信息是出现问题时交互系统给出的“坏消息”
    • 可理解描述、建设性意见、声明负面后果、听觉、视觉提示,不指责
  • 命令交互
    • 命令行曾是用户和系统软件交互的最常用方式
    • 用户既可以从菜单中选择功能,也可以通过键盘命令序列调用
程序复杂度的度量

计算某一个方法的环形复杂度

  • 程序的复杂度:定量地度量一个算法的复杂性
  • 复杂度度量方法:

    • Halstead方法(文本复杂性度量)
    • McCabe方法(环形复杂性度量)

环形复杂度度量

要会把一个算法的程序流程图转换为有向程序图,然后P104环形复杂度度量的方法(3种)

  1. 流图中的区域数等于环形复杂度
  2. 流图G的环形复杂度 V(G)=E-N+2,其中E是流图中边的条数,N是节点数
  3. 流图G的环形复杂度 V(G)=P+1,其中P是流图中判定节点的数目

第9章 结构化的实现技术

软件实现

  1. 程序语言的选择
  2. 编码风格的重要性

软件测试

  • 目的:在软件投入生产性运行之前,尽可能多的发现软件中的错误
  • 是保证软件质量的关键步骤,是对软件规格说明、设计、编码的最后复审
任务和目标
  • 根本目标:尽可能多地发现并排除软件中潜藏的错误,最终把一个高质量的软件系统交给用户使用
测试方法

详情见课本P111或复习资料第9章结构化的实现技术.pdf

静态代码审查
  • 人工测试源程序(代码审查:由审查小组完成),最好由下述4人组成:
    1. 组长(未直接参与)
    2. 程序的设计者
    3. 程序的测试者
    4. 程序的编写者
  • 可以查出30~70%的逻辑设计错误和编码错误
  • 代码审查可以减少系统验证的总工作量
动态测试
  • 黑盒测试:已知产品应具有的功能,验证是否每个功能都能正常使用
  • 白盒测试:已知产品内部工作过程,验证内部动作是否按规格说明书规定正常进行

黑白盒测试详见课本P112、P114、P116或复习资料第9章结构化的实现技术.pdf

黑盒测试

又称功能测试数据驱使测试,主要用于测试过程的后期阶段进行

  • 测试用例设计方法:

    1. 等价划分
    2. 边界值分析
    3. 错误推测
  • 优点:

    • 比较简单,无需了解程序内部的代码及实现
    • 与软件的内部实现无关
    • 从用户角度出发,很容易知道用户会用到哪些功能,会遇到哪些功能
    • 在做软件自动化测试时较为方便

  • 缺点:

    • 不可能覆盖所有代码,大概只能达到总代码的30%
    • 自动化测试的复用性较低

白盒测试

又称结构测试,主要在测试过程的早期阶段进行

  • 逻辑覆盖

    1. 语句覆盖
    2. 判定覆盖
    3. 条件覆盖
    4. 判定/条件覆盖
    5. 条件组合覆盖
    6. 路径覆盖
  • 控制结构测试

    1. 基本路径测试(如何进行测试用例 ?步骤是什么?)P117
    2. 条件测试
    3. 循环测试
测试步骤
  1. 模块测试(单元测试)
  2. 集成测试(非渐增式、渐增式)
  3. 确认测试
  4. Alpha 和 Beta 测试
  5. 平行运行
  6. 回归测试
调试策略和技术
  • 调试过程:

    • 不是测试,但总发生在测试之后
    • 试图找出产生和预期不一样结果的原因,以便修改

  • 调试途径:

    • 蛮干法:最低效,仅当所有其他方法都失效时采用
    • 回溯法:从发现症状的地方开始,人工沿程序的控制流往回追踪分析源程序代码,直至找出错误
    • 原因排除法:对分查找法、归纳法和演绎法

估算软件平均无障碍时间

结合课本P127课后题第5题,会用公式求剩余错误总数。P125

  • 软件可靠性
  • 软件的可用性
  • 估算平均无故障时间的方法
  • 估算平均无故障时间
  • 估算错误总数的方法

第11章 面向对象方法应用

不考,详见课本P147或复习资料第11章面向对象的方法学_part1.pdf

第12章 软件维护

软件维护的分类

  1. 改正性维护
  2. 适应性维护
  3. 完善性维护
  4. 预防性维护

软件可维护性度量指标

  1. 可理解性
  2. 可靠性
  3. 可测试性
  4. 可修改性
  5. 可移植性
  6. 效率
  7. 可使用性

【软件工程管理】

略。