1 软件工程基本概念
1.1 软件
程序、数据、相关文档三部分组成的集合。
它具有以下特点(大致了解即可):
- 无形智产:没有物理形态,只能通过运行状况了解功能、特性、质量,渗透了大量的脑力运动,人的逻辑思维、智能活动和技术水平是软件产品的关键。
- 可靠可用:不会磨损,不会老化,能被多次使用,但商业寿命短。
- 可复制性:容易被复制,形成多个副本。
- 依赖性:依赖于特定的计算机系统和硬件。
- 可移植性:一些软件可在多个平台上使用。
- 可维护性:后台可以维护。
1.2 软件分类
- 系统软件:操作系统、编译程序、汇编程序、网络软件、数据库管理系统(DBMS)。
- 应用软件:事务处理软件、工程与科学计算软件、实时处理软件、人工智能软件、办公软件、教务管理(以及学籍管理)系统、通讯软件等。
支撑软件(工具软件):需求分析工具软件、编译工具软件、测试工具软件、维护工具软件、网络连接方面的工具等。
1.3 软件危机
需求增长、成本增长、开发难控、质量难保、维护度低、生产率低
巧记:增难低,各两个1.4 软件工程
软件工程:应用于计算机软件的定义、开发、维护的整套方法、工具、文档、实践标准和工序。
其目的是:提高软件生产率、提高软件质量、降低软件成本、提高可维护性。
其核心思想:将软件当作一个工程产品来处理。
软件工程三要素:方法:完成软件工程项目的技术手段。
- 工具:支持软件的开发、管理和文档生成。
- 过程:支持软件开发的各环节的控制和管理。
1.4.1 软件生命周期
将软件产品从提出、实现、使用维护到停止使用退役的过程称为软件的生命周期。
分为软件定义、软件开发、运行维护3个时期。维护耗时最长、花费代价最大。
3个时期共8个阶段:2+4+2
1.4.2 需求分析
需求分析定义:确定系统的逻辑模型。参加人员有用户、项目负责人、系统分析员。
工作:需求获取、需求分析、编写需求规格说明书、需求评审。
产生文档:需求规格说明书。
该说明书的作用:
- 方便用户、开发人员进行理解交流;
- 反映用户问题的结构,可以作为软件开发工作的基础和依据;
- 作为确认测试和验收的依据。
需求规格说明书(SRS)特点(大致了解即可):
正确性:体现待开发系统的真实要求;
无歧义性:对每个需求只有一种解释;
完整性:包括全部有意义的需求;
可验证性:每个需求都是可验证的;
一致性:各个需求的描述不矛盾;
可理解性:需求说明书必须简明易懂;
可修改性:结构风格在改变时,是易于实现的;
可追踪性:每个需求的来源和流向都是清晰的。
2 结构化分析方法
需求分析会使用到需求分析方法:结构化需求分析方法、面向对象分析方法。
2.1 结构化分析概念
结构化分析方法:使用数据流图(DFD)、数据字典(DD)、判定表和判定树等工具,来建立系统的逻辑模型。
2.2 数据流图(DFD)
数据流图的图形元素
以上加工也成为转换,注意,DFD图中箭头是数据流,流程图中的箭头是控制流。源属于系统之外的元素,在数据流图中,对所有的图形元素进行命名,要注意它们都是对一些属性和内容的抽象概括,一个软件系统对其数据流图的命名必须有相同的理解,否则将产生严重的后续开发工作影响。
2.3 数据字典(DD)
数据字典是数据流图中所有元素定义的集合,它是结构化分析的核心。
注:数据字典和数据流图共同构建了系统的逻辑模型,如果没有数据字典,数据流图就不会严格,若是没有数据流图,数据字典也不会发挥作用,两者相辅相成,缺一不可。
3 结构化设计方法
结构化分析方法解决了做什么的问题,而结构化设计方法解决了怎么做的问题。
软件分析是确定系统的逻辑模型,软件设计是确定系统的物理模型。
3.1 软件设计划分
按照工程管理角度:概要设计、详细设计
按照技术观点:结构设计、数据设计、接口设计、过程设计
3.2 软件设计基本原理
- 抽象:在软件设计中,可以定出多个抽象级别,抽象层次从概要设计到详细设计逐步降低。
- 模块化:把一个待开发的软件分解成若干个小的简单的部分,自顶向下逐层把软件分解成若干模块。
- 信息屏蔽:一个模块内的信息,对于不需要这些信息的其他模块来说不能访问。
模块独立性:每个模块只完成独立的子功能,并且与其他模块的联系少且接口简单。模块的独立程度是评价设计好坏的重要度量标准——“高内聚,低耦合”
3.2.1 软件模块独立性
高内聚性:一个模块内部各个元素间彼此结合的紧密程度。
低耦合性:指模块之间互相连接的紧密程度。
比如一个人的手脚脑等等是不同的模块,我们的手上有骨头、血肉组成,结合、联系都很紧密,这就是高度内聚,而手、脚、脑之间的耦合性如果太高,当手被割伤时,脚受之影响而走不了路,耦合程度高了导致这种情况,岂不是滑天下之大稽。
耦合分为:非直接耦合、数据耦合、标记耦合、控制耦合、外部耦合、公共耦合、内容耦合,以上的耦合度由小到大。
3.3 概要设计与详细设计
3.3.1 概要设计
概要设计的任务:
设计软件系统结构;
- 数据结构及数据库设计;
- 编写概要设计文档;
- 概要设计文档评审。
3.3.2 详细设计
详细设计的任务:
确立每个模块实现算法和局部数据结构,用适当方法表示算法和数据结构的细节。
详细设计的常用工具:
图形工具:程序流程图、N-S图、问题分析图(PAD)、HIPO图
表格工具:判定表
语言工具:PDL(伪码|过程设计语言)
程序流程图
控制流……箭头表示(数据流图中箭头是表示数据流)
加工步骤……方框
逻辑条件……菱形
三种基本结构:顺序、选择(分支)、循环(重复)
4 软件测试
4.1 软件测试概要
软件测试的目的:发现程序中的错误。
软件测试的准则:
- 所有测试都应该追溯用户需求;
- 在测试之前制定测试计划,并严格执行;
- 充分注意测试中的群集现象;
- 避免由程序的编写者测试自己的程序;
- 不可能进行穷举测试;
- 妥善保存测试分析报告,为维护提供方便。
群集现象:某个功能部件已发现的缺陷越多,找到它的更多未发现的缺陷的可能性就越大。
穷举测试:程序运行的各个可能分支都应该调试到
4.2 测试方法分类
根据是否需要被执行:
静态测试:不实际运行软件,通过人发挥思维优势发现程序中的错误;
动态测试:基于计算机的测试,是为了发现错误而执行程序的过程。
根据功能划分:
白盒测试:把测试对象看作一个打开的盒子,利用程序内部的逻辑结构,对程序所有逻辑路径进行测试;然后白盒测试可以分为逻辑覆盖测试、基本路径测试;
黑盒测试:完全不考虑程序内部的逻辑结构,只检查程序是否能接收输入数据而产生正确的输出信息;黑盒测试可以划分为等价类划分法、边界值分析法、错误推测法。
注意:白盒测试针对内部逻辑结构,黑盒测试针对外部功能
4.3 软件测试步骤
单元测试:对软件设计的最小单位进行测试,目的是发现各模块内部的错误。
集成测试:把模块按照设计要求组装起来同时进行测试,目的是发现与接口有关的错误。
确认测试:验证软件的功能和性能是否满足各种需求,以及软件配置是否完全、正确。
系统测试:将软件作为一个元素,与计算机系统其他元素组合在一起,进行集成测试。
四者由小到大,由软件内到软件外。
5 程序的调试
对程序进行了成功的测试之后将进入程序调试,通常称为Debug(排错),主要在开发阶段进行。
程序调试的目的是诊断和改正程序的额错误。
基本步骤:
- 错误定位;
- 修改设计和代码,以排除错误;
- 进行回归测试,防止引进新的错误。
软件调试方法:
- 强行排除法
- 回溯法
- 原因排除法
总结:
可行性分析阶段产生可行性分析报告。
需求分析产生需求规格说明书。
设计的概要和详细两阶段各自产生对应的设计说明书。
实现阶段产生用户操作手册。
测试阶段产生测试分析报告。
需求分析:数据流图(DFD),数据字典(DD),判定表,判定树;
概要设计:程序结构图(SC);
详细设计:程序流程图,N-S图,PAD,HIPO,判定表,PDL;
测试阶段:静|动态,黑|白盒。
