软件工程
软件工程复习¶
第一章 软件工程学概述¶
软件定义
Software = Program + Data + Document
软件(software)是计算机系统中与硬件(hardware)相互依存的,另一部分,它包括程序(program)、相关数据(data)及其说明文档 (document)。
程序:是按事先设计的功能和性能要求执行的指令序列;
数据:是使程序能正常操纵信息的数据结构;
文档:是与程序开发、维护和使用有关的图文材料。
软件的特点
-
软件是一种逻辑实体,具有抽象性;
-
软件是开发的,而不是制造的;
-
在软件的运行和使用期间,没有硬件那样的机械磨损,老化问题;
- 软件的开发至今尚未完全摆脱手工作坊式的开发方式,生产效率低;
- 软件具有复杂性;
- 软件的成本相当昂贵;
- 软件对硬件和环境有着不同程度的依赖性;
- 软件工作牵涉到很多社会因素。
软件工程三要素
- 软件工程的方法:为软件开发提供“如何做”的技术,当前有传统的软件开发方法和面向对象的软件开 发方法。
-
软件工程的过程:是管理和控制产品质量的关键,实现在规定的时间和预算内开发高质量软件的目标。
-
软件工程的工具:为软件工程方法 提供了自动的或半自动的软件支撑 环境,辅助软件开发任务的完成。 CASE
软件工程层次:质量焦点>过程>方法>工具
喷泉模型
喷泉模型是一种以用户需求为动力, 以对象为驱动的模型,主要用于描述面向对象的软件开发过程。
软件开发过程自下而上周期的各阶段是相互重叠和多次反复的,就像水喷上去又可以落下来,类似一个喷泉。 各个开发阶段没有特定的次序要求,并且可以交互进行,可以在某个开发阶段中随时补充其他任何开发阶段中的遗漏。
优点: 该模型的各个阶段没有明显的界限,开发人员可以同步进行开 发,可以提高软件项目开发效率,节省开发时间,适应于面向对象 的软件开发过程。
缺点: 由于该模型在各个开发阶段是重叠的,在开发过程中需要大量 的开发人员,因此不利于项目的管理。 该模型要求严格管理文档,使得审核的难度加大,尤其是面对 可能随时加入各种信息、需求与资料的情况。
软件工程与一般工程的差异
软件是逻辑产品而不是实物产品 、软件的功能依赖于硬件和软件的运行环境以 及人们对它的操作、软件设计的复杂性、软件特征: 功能的多样性 实现的多样性 能见度低 软件结构合理性差 、智力密集及知识产权保护
第二章 可行性研究¶
数据流图的层次结构
为了表达数据处理过程的数据加工情况,需要采用层次结构的数据流图。按照系统的层次结构进行逐步分解,并以分层的数据 流图反映这种结构关系,能清楚地表达和容易理解整个系统。
在多层数据流图中,顶层流图仅包含一个加工,它代表被开发系统。它的输入流是该系统的输入数据,输出流是系统所输出数据。顶层数据流图的作用在于表明被开发系统的范围以及它和周围环境的数据交换关系。对于顶层数据流图通常可以不考虑数据 存储。
底层流图是指其加工不需再做分解的数据流图,它处在最底层。
中间层流图则表示对其上层父图的细化。它的每一加工可能继续细化,形成子图。
数据字典实例
数据流图实例
第四章 总体设计¶
理想模块的特点:
-
每个理想模块只解决一问题;
-
每个理想模块的功能都应该明确,使人容易解;
- 理想模块之间的联结关系简单,具有独立性;
- 由理想模块构成的系统,容易使人解于编程测 试,易于修改和维护。
非直接耦合
两个模块之间没有直接关系,它们之间的联系完全是通过主 模块的控制和调用来实现的。
非直接耦合的模块独立性最强。
外部耦合
一组模块都访问同一全局简单变量而不是同一全局数据结构, 而且不是通过参数表传递该全局变量的信息,则称之为外部 耦合。
例如:C语言程序中各个模块都访问被说明为extern类型的 外部变量。
控制耦合
控制耦合增加了理解和编程的复杂性,调用模块必须知道被 调模块的内部逻辑,增加了相互依赖。去除模块间控制耦合的方法:将被调用模块内的判定上移到调用模块中进行;被调用模块分解成若干单一功能模块。
公共耦合
公共耦合的复杂程度随耦合模块的个数增加而显著增加。若只 是两模块间有公共数据环境,则公共耦合有两种情况,即松散公 共耦合和紧密公共耦合。
公共耦合会引起下列问题: 所有公共耦合模块都与某一个公共数据环境内部各项的物理安 排有关,若修改某个数据的大小,将会影响到所有的模块; 无法控制各个模块对公共数据的存取,严重影响软件模块的可靠性和适应性; 公共数据名的使用,明显降低了程序的可读性。
模块的作用域应该在控制域之内设计原则 课本 P100
A.对于任何一个内部存在判断调用的模块,它的判断作用的范 围应该是其控制范围的一个子集;
B.存在判断调用的模块,所在层次不要与那些属于判断作用范 围的模块所在的层次相隔太远。
数据流图转软件结构第二级分解的方法举例 数据流程图的划分 课本P109
面向数据流设计小结
-
对于一个大系统,常常把变换分析和事务分析应用到同一个数 据流图的不同部分,由此得到的子结构形成“构件” ,可以利用 它们构造完整的软件结构;
-
应该灵活运用,合并不必要的控制模块,分解功能过分复杂的 控制模块。
-
由于任何软件系统都可以用数据流图表示,因此,面向数据流 的设计方法理论上可以设计任何软件的结构。通常所说的结构化设计方法(简称SD方法)也是基于数据流的设计方法。
第五章 详细设计¶
详细设计阶段的主要任务
为每一模块确定算法、确定每一模块使用的数据结构、确定模块的外部接口和用户界面、为每一模块设计一组测试用例
人机界面设计过程
程序流程图使用五种基本控制结构
向数据结构的设计方法
该方法的基本思想是使程序结构与问题结构相对应,即与数据结构相对应。因此它按输入输出以及内部存储信息的数据结构进行设计,把数据结构的描述变换为对程序结构的描述。
Jackson方法设计实例
问题描述
某仓库存放多种零件(如P1,P2, ……),每个零件的每次 进货、发货都有一张卡片作出记录,每月根据这样一叠卡片打印 一张月报表。报表每行列出某种零件本月库存量的净变化。用JSD 方法对该问题进行设计。
(3)导出程序结构
找出对应关系后,根据以下规则导出程序结构:对于输入数据 结构与输出数据结构中的数据单元,每对有对应 关系的数据单元 按照它们所在的层次,在程序结构图适当位置画一个处理框,无对应关系的数据单元,各画一 个处理框。 根据以上规则,画出的程序结构图如图所示。
在分配操作时注意:为了能获得重复和选择的条件,Jackson 建议至少超前读一个记录,以便使得程序不论在什么时候判定, 总有数据已经读入,并做好使用准备。因此在图中,将操作E(读 一张卡)放在打开文件之后,同时在处理完一张卡片后再读一次。
(5) 用伪码写出程序 Jackson方法中的伪码与Jackson所示的程序结构图完全对应,用 伪码写出程序的过程,实际上就是自顶向下用这些伪码替换 Jackson图中每个处理框的过程,每个处理框都看作是下层处理框 及分配在上面的操作组成。
Jackson方法小结
优点:简单,适合于规模不大的系统,建立了问题的数据结构 之后,可直接推导出相应的程序结构。
局限性:当输入数据结构与输出数据结构不相同且无对应关系 时,难于应用。当数据结构发生变化时,程序结构也发生变化,一 般是总体上用SD方法,局部范围用JSD方法。
SD方法和JSD方法的异同:面向数据流的设计(SD方法)和面向数据结构的设计(JSD方法) 的共同点都是数据信息驱动的,都试图将数据表示转换成软件表示; 不同之处在于面向数据结构的设计不利用数据流图,而根据数据结 构的表示来设计。
Halstead估计复杂度方法 课本 P139
在定义中,运算符包括: 算术运算符、赋值符(=或:=)、逻辑运算符、分界符(,或;或:) 、关系运算符、 括号运算符、子程序调用符、数组操作符、循环操作符等;
特别地,成对的运算符,例如 begin…end、if…then…else、for…to、repeat …until、while…do、(…)等 都当做单一运算符。
运算对象包括变量名和常数。
第六章 系统实现¶
软件测试的基本原则
-
尽量不由程序设计者进行测试
-
关键是注重测试用例的选择
输入数据的组成(输入数据、预期的输出结果)、既有合理输入数据,也有不合理的输入数据、用例既能检查应完成的任务,也能够检查不应该完成的任 务、长期保存测试用例。
- 所有的测试都应当追溯到用户要求,导致程序不能满足用户 要求的错误是严重错误
- 充分注意测试中的群集现象 测试发现的错误中的80%很可能出自20%的模块
- 妥善保存测试计划、测试用例、出错统计和最终分析报告, 为维护提供方便
软件测试步骤及策略
确认测试
确认测试步骤
- 有效性测试 制定测试计划和测试过程,运用黑盒法,验证软件特性是否与 需求符合。
- 软件配置复查 软件配置是指软件工程过程中所产生的所有信息项:文档、报告、 程序、表格、数据。随着软件工程过程的进展软件配置项快速增 加和变化,应复查软件配置项是否齐全、一致。
软件测试平行运行
所谓平行运行就是同时运行新开发出来的系统和将被它取代的 旧系统,以便比较新旧两个系统的处理结果。这样做的具体目的 有如下几点: 可以在准生产环境中运行新系统而又不冒风险; 用户能有一段熟悉新系统的时间; 可以验证用户指南和使用手册之类的文档; 能够以准生产模式对新系统进行全负荷测试,可以用测试结果验证性能指标。
如何测试
关键 ---- 设计测试方案。
测试方案 ---- 包括:具体的测试目的,应该输入的测试数据和预期的结果。 通常又把测试数据和预期的输出结果称为测试用例。其中最困难的问题是设计测试用的输入数据。 不同的测试数据发现程序错误的能力差别很大,为了提高测试效率降低测试成本,应该选用高效的测试数据。
白盒测试步骤
选择逻辑覆盖标准;按照覆盖标准列出所有情况; 选择确定测试用例; 验证分析运行结果与预期结果。
实际测试策略
黑盒+白盒测试 在任何情况下,都应使用边界值分析方法; 必要时用等价划分法补充测试用例; 必要时再用错误推测法补充测试用例; 对照组件的逻辑,检查已设计出的测试用例。
白盒测试与黑盒测试对比
软件调试原则
1.注意错误的“群集现象”; 2.不能只修改错误的征兆、表现。还应该修改错误的本质; 3.注意在修改一个错误的同时,不要引入新的错误。
软件可靠性计算例题 MTTF
第七章 软件维护¶
提高可维护性的方法
建立明确的软件质量目标和优先级 使用提高软件质量的技术和工具 进行明确的质量保证审查 选择可维护的程序设计语言 改进程序的文档
软件再工程
软件再工程是一类软 件工程活动,是一个 工程过程, 它将逆向 工程、重构和正向工 程组合起来,将现存系 统重新构造为新的形 式。
第九章 面向对象分析设计与实现¶
软件生存期各阶段所使用的方法、技术具有高度的连续性,用 符合人类认识世界的思维方式来分析、解决问题。将OOA、OOD、 OOP有机地集成在一起。
面向对象的分析(Object-Oriented Analysis,OOA ) 强调的是对一个系统中的对象特征和行为的定义。建立系统的 三类模型。
面向对象的设计(Object-Oriented Design,OOD) 与OOA密切配合,顺序实现对现实世界的进一步建模。
面向对象的编程(Object-Oriented Program,OOP ) 是面向对象的技术中发展最快的,使用面向对象的程序设计语 言,进行编码。
第十章 软件项目管理¶
项目具有的基本特性
项目的一次性 项目的组织性 项目的生命期 项目的资源消耗性 项目后果的不确定性 项目的目标冲突性
项目管理
在项目活动中运用一系列的知识、技能、工具和技术,以满足 或超过相关利益者对项目的要求。(PMI)
软件项目管理
软件项目是指对软件系统进行开发、集成和服务为主要目的的 项目。软件项目管理和其他项目管理相比,具有很大的独特性: 软件项目管理尚不规范,经验成分明显; 过程没有明显的划分; 大都是“一次性”的人力消耗型项目
甘特图
甘特图也称为条型图,或横道图。它以横坐标表示时间,工程 活动在图的左侧纵向排列,以活动所对应的横道位置表示活动的 起始时间,横道的长短表示持续时间的长短。它是一种比较简便 的工期计划和进度安排工具。
关键路径法
对关键路径的计算与调整优化
-
清醒的认识:关键路径是网络图中最长的线路,它决定了项 目的总耗时。
-
必须把注意力集中于那些优先等待完成的任务,确保它们准 时完成。关键路径上的推迟即是整个项目推迟。
-
向关键路径要时间,向非关键路径要资源。
-
调整进度,平衡资源。
能力成熟度模型
⚫ 初始级 ✓ 组织:组织通常没有提供开发和维护软件的稳定的环境。 ✓ 项目:当发生危机时,项目通常放弃计划的过程,回复到编码和测试。 ✓ 过程能力:不可预测。(unpredictable)
⚫ 可重复级 ✓ 组织:将软件项目的有效管理过程制度化,这使得组织能够重复以前项 目中的成功实践。 ✓ 项目:配备了基本的软件管理控制。 ✓ 过程能力:严格的。(disciplined)
⚫ 已定义级 ✓ 组织:在组织范围内开发和维护软件的标准过程被文档化,其中包括软 件工程过程和管理过程,它们集成为一个一致的整体。 ✓ 项目:对组织的标准软件过程进行裁剪,来开发它们自己的定义软件过 程。 ✓ 过程能力:标准的和一致的。(standard and consistent)
⚫ 已管理级 ✓ 组织:为软件产品和过程都设定了量化的质量目标。 ✓ 项目:项目减小过程性能的变化性,使其进入可接收的量化边界,从而 达到对产品和过程的控制。 ✓ 过程能力:可预言的。(predictable)
⚫ 持续优化级 ✓ 组织:关注于持续的过程改进。 ✓ 项目:软件过程被评价,以防止过失重复发生,从中获得的教训散布给 其它项目。 ✓ 过程能力:持续的改善。(continuously improving)