2.了解软件工程过程与软件的生命周期,以及软件工程的目标和原则;
3.了解利用结构化分析法进行软件工程中的需求分析的方法,并了解需求分析的方法和需要完成的任务;
4.了解数据流图的使用方法;
5.了解如何利用结构化设计方法进行软件设计,并了解软件设计的一些常用用工具;
6.了解软件测试的目的和方法,以及软件测试的准则,了解常用的软件测试方法的区别和各自的功能与特点;
7.了解程序调试的方法和原则。
二、内容要点
(一)软件工程基本概念
1.软件定义与软件特点
1)软件的定义
2)软件的特点
(1)软件是一种逻辑实体,而不是物理实体,具有抽象性;
(2)软件的生产与硬件不同,它没有明显的制作过程;
(3)软件在运行、使用期间不存在磨损、老化问题;但为了适应硬件、环境以及需求的变化要进行修改,会导致一些错误的引入,导致软件失效率升高,从而使得软件退化;
(5)软件复杂性高,成本昂贵。软件开发需要投入大量、高强度的脑力劳动,成本高,风险大;
(6)软件开发涉及诸多的社会因素。许多软件的开发和运行涉及软件用户的机构设置,体制问题以及管理方式等,甚至涉及到人们的观念和心理,软件知识产权及法律等问题。
3)软件的分类
按功能分,可分为:
应用软件:为解决特定领域的应用而开发的软件
支撑软件(或工具软件):介于系统软件和应用软件之间,协助用户开发软件的工具性软件,包括辅助和支持开发和维护应用软件的工具软件
2.软件危机与软件工程
1)软件危机
泛指在计算机软件的开发和维护过程中所遇到的一系列严重问题。它主要表现在:
(1)软件需求的增长得不到满足,用户对系统不满意的情况经常发生;
(2)软件开发成本和进度无法控制。开发的成本超预算和开发周期的超期经常出现;
(3)软件质量难以保证;
(4)软件不可维护或维护程度非常低;
(5)软件成本不断提高;
(6)软件开发生产率的提高赶不上硬件的发展和应用需求的增长。
2)软件工程
软件工程的定义:是应用于计算机软件的定义、开发和维护的一整套方法、工具、文档、实践标准和工序。
软件工程包括3个要素:方法、工具和过程。
方法:完成软件工程项目的技术手段;
工具:支持软件的开发、管理、文档生成;
过程:支持软件开发的各个环节的控制、管理。
3.软件工程过程与软件生命周期
1)软件工程过程
(1)软件工程过程是指为获得软件产品,在软件工具支持下由软件工程师完成的一系列软件工程活动。它包括4种基本活动:
P—软件规格说明。规定软件的功能及其运行时的限制;
D—软件开发。产生满足规格说明的软件;
C—软件确认。确认软件能够满足客户提出的要求;
A—软件演进过程。为满足客户的变更要求,软件必须在使用的过程中演进。
软件工程过程是将软件工程的方法和工具综合起来,以达到合理、及时地进行计算机软件开发的目的。
2)软件生命周期
将软件产品从提出、实现、使用维护到停止使用退役的过程称为软件生命周期。即软件的生命周期就是软件产品从开始考虑其概念开始,到软件产品不能使用为止的整个时期都属于软件生命周期。一般包括可行性研究与需求分析、设计、实现、测试、交付使用以及维护等活动。这些活动可以有重复,执行时也可以有迭代。
生命周期的主要阶段:
软件定义
软件开发
软件维护
软件生命周期的主要活动阶段是:
(1)可行性研究与计划制定:确定待开发软件系统的开发目标和总的要求,给出它的功能、性能、可靠性以及接口等方面的可能方案,制定完成开发任务的实话计划;
(2)需要分析。对待开发软件提出的需求进行分析并给出详细的定义;
(3)软件设计。系统设计人员和程序设计人员给出软件的结构、模块的划分、功能的分配以及处理流程;
(4)软件实现。把软件设计转换成计算机可以接受的程序代码。即完成源程序的编码,编写用户手册、操作手册等面向用户的文档,编写单元测试计划;
(5)软件测试。在设计测试用例的基础上,检验软件的各个组成部分,编写测试分析报告;
(6)运行和维护。将已交付的软件投入运行,并在运行使用中不断地维护,根据新提出的需求进行必要且可能的扩充和删改。
4.软件工程的目标与原则
1)软件工程的目标
软件工程的目标:在给定成本、进度的情况下,开发出具有有效性、可靠性、可理解性、可维护性、可重用性、可适应性、可移植性、可追踪性和可互操作性且满足用户需求的产品。
软件工程需要达到的基本目标:
付出较低的开发成本
达到要求的软件功能
取得较好的软件性能
开发的软件易于移植
需要较低的维护费用
能按时完成开发,及时交付使用
软件工程的理论和技术性研究的内容包括:软件开发技术和软件工程管理。
(1)软件开发技术
软件开发方法学、开发过程、开发工具和软件工程环境,其主体内容是软件开发方法学。软件开发方法学是根据不同的软件类型,按不同的观点和原则,对软件开发中应遵循的策略、原则、步骤和必须产生的文档资料都做出规定,从而使软件开发能够进入规范化和工程化的阶段。
(2)软件工程管理
软件工程管理:软件管理学、软件工程经济学、软件心理学等内容。
软件工程管理学包括:人员组织、进度安排、质量保证、配置管理、项目计划等。
软件工程经济学:是研究软件开发中成本的估算、成本效益分析的方法和技术,用经济学的基本原理事研究软件工程开发中的经济效益问题。
软件心理学:从个体心理、人类行为、组织行为和企业文化等角度来研究软件管理和软件工程。
2)软件工程的原则
(1)抽象。抽取事物取基本的特征和行为,忽略非本质细节。采用分层次抽象,自顶向下,逐层细化的办法控制软件开发过程的复杂性;
(2)信息隐蔽。采用封装技术,将程序模块的实现细节隐藏起来,使模块接口尽量简单;
(3)模块化。模块是程序中相对独立的成分,一个独立的编程单位,应有良好的接口定义。块太大会使模块内部过渡复杂,不利于对模块的理解和修改,也不利于模块的调试和重用;模块太小会使程序结构过于复杂,难于控制;
(4)局部化。在同一个物理模块中集中逻辑上相互关联的计算资源,保证模块间具有松散的耦合关系,模块内部有较强的内聚性;
(5)确定性。所有的概念表达应是确定的、无歧义且规范。
(6)一致性。包括程序、数据和文档的整个软件系统的各模块应使用已知的概念、符号和术语;程序内外部接口保持一致,系统规格说明与系统行为应保持一致;
(7)完备性。软件系统不丢失任何重要成份,完全实现系统所需要的功能;
(8)可验证性。开发大型软件系统需要对系统自顶向下,逐层分解。
5.软件开发工具与软件开发环境
1)软件开发工具
早期的软件开发,最早使用的是单一的程序设计语言,没有相应的开发工具,效率很低,随着软件开发工具的发展,提供了自动的或半自动的软件支撑环境,为软件开发提供了良好的环境。
2)软件开发环境
软件开发环境或称软件工程环境是全面支持软件开发全过程的软件工具集合。
计算机辅助软件工程将各种软件工具、开发机器和一个存放开发过程信息的中心数据库组成起来,形成软件工程环境。
(二)结构化分析方法
1.需求分析与需求分析方法
1)需求分析
软件需求分析是指用户对目标软件系统在功能、行为、性能、设计约束等方面的期望。需求分析的任务是发现需求、求精、建模和定义需求的过程。
(1)定义
软件需求分析是指用户对目标软件系统在功能、行为、性能、设计约束等方面的期望。
(2)需求分析阶段的工作
①需求获取。需求获取的目的是确定对目标系统的各方面需求;
②需求分析。对获取的需求进行分析和综合,最终给出系统的解决方案和目标系统的逻辑模型;
③编写需求规格说明书。为用户、分析人员和设计人员之间进行交流提供方便。
④需求评审。对需求分析阶段的工作进行复审,验证需求文档的一致性、可靠性、完事性和有效性。
2)需求分析方法
(1)结构化分析方法
包括:
面向数据流的结构化分析方法
面向数据结构的Jackson方法
面向数据结构的结构化数据系统开发方法
(2)面向对象的分析方法
从需求分析建立模型的特性分,需求分析方法又分为静态分析方法和动态分析方法。
2.结构化分析方法
1)关于结构化分析方法
结构化分析方法的实质是:着眼于数据流,自顶向下,逐层分解,建立系统的处理流程,以数据流图和数据字典为主要工具,建立系统的逻辑模型。
结构化分析的步骤:
通过对用户的调查,以软件需求为线索,获得系统的具体模型;
去掉模型的非本质因素,抽象出系统的逻辑模型;
根据计算机的特点分析当前系统与目标系统的差别,建立目标系统的逻辑模型;
完善目标系统交补充细节,写出目标系统的软件需求规格说明;
评审直到确认完全符合用户对软件的需求。
2)结构化分析的常用工具
(1)数据流图
数据流图从数据传递和加工的角度,来刻画数据流从输入到输出的移动变换过程。
数据流图下的图形元素:
(圆),加工(转换)。输入数据经过加工变换产生输出
(箭头),数据流。沿箭头方向传送数据的通道,一般在旁边标注数据流名
(平行的二条直线),存储文件(数据源)。表示处理过程中存放各种数据的文件。
(长方形),源,潭。表示系统和环境的接口,属于系统之外的实体。
(2)数据字典
数据字典是结构化分析方法的核心。对数据流图中出现的被命名的图形元素的确切解释。通常包括:名称、别名、何处使用/如何使用、内容描述、补充信息等。
(3)判定树
利用判定树,对数据结构中的数据之间的关系进行描述,弄清楚判定条件之间的从属关系、并列关系、选择关系。
(4)判定表
在数据流图中的加工要依赖于多个条件的取值,即完成该加工的一组动作是由于某一组条件取值的组合而引发的情况。它与判定树是相似的,但更适宜于较复杂的条件组合。
3.软件需求规格说明书
是需求分析阶段的最后成果,是软件开发的重要文档之一。
1)作用
便于用户、开发人员进行理解和交流
反映用户问题的结构,可以作为软件开发工作的基础和依据
作为确认测试和验收的依据
2)内容
在软件计划中确定的软件范围加以展开,制定出完整的信息描述、详细的功能说明、恰当的检验标准以及其他与要求有关的数据。
3)特点
软件需求规格说明书是确保软件质量的措施,它的内涵是:
正确性
无歧义性
完整性
可验证性
一致性
可理解性
可修改性
可追踪性
(三)结构化设计方法
1.软件设计的基本概念
1)软件设计的基础
软件设计包括软件结构设计、数据设计、接口设计、过程设计。其中,结构设计是定义软件系统各主要部件之间的关系;数据设计是将分析时创建的模型转化为数据结构的定义;接口设计是描述软件内部、软件和协作系统之间以及软件与人之间如何通信;过程设计是把系统结构部件转换成软件的过程性描述。
软件设计的一般过程:软件设计是一个迭代的过程;先进行高层次的结构设计;后进行低层次的过程设计;穿插进行数据设计和接口设计。
2)软件设计的基本原理
(1)抽象
抽象的层次从概要设计到详细设计逐渐降低。在软件概要设计中的模块分层也是由抽象到具体逐步分析和构造出来的。
(2)模块化
模块是指把一个待开发的软件分解成若干小的简单的部分。
模块化是指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程。
(3)信息隐蔽
在一个模块内包含的信息(过程或数据),对于不需要这些信息的其他模块来说是不能访问的。
(4)模块独立性
独立性是指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。
衡量软件的模块独立性的标准:
内聚性:一个模块内部各个元素间彼此结合的紧密程度的度量
耦和性:模块间相互连接的紧密程序的度量
3)结构化设计方法
即将软件设计成相对独立、单一功能的模块组成结构。
2.概要设计
1)概要设计的任务
①设计软件系统结构
即将系统划分成模块以及模块的层次结构。
②数据结构及数据库设计
数据设计是实现需求定义和规格说明过程中提出的数据对象的逻辑表示。
数据设计的具体任务是:
确定输入、输出文件的详细数据结构
结合算法设计,确定算法所必须的逻辑数据结构及其操作
确定对逻辑数据结构所必须的那些操作的程序模块,限制和确定各个数据设计决策的影响范围
需要与操作系统或调度程序接口所必须的控制表进行数据交换时,确定其详细的数据结构和使用规则
数据的保护性设计:防卫性、一致性、冗余性设计
③编写概要设计文档
需要编写的文档有:
概要设计说明书
数据库设计说明书
集成测试计划
④概要设计文档评审
需要评审的内容:设计部分是否完整地实现了需求中规定的功能、性能等要求,设计方案的可行性,关键的处理及内外部接口定义的正确性、有效性,各部分之间的一致性等
软件结构设计工具是结构图,描述软件系统的层次和分块结构关系,它反映了整个系统的功能实现以及模块与模块之间的联系与通讯,是未来程序中的控制层次体系。
结构图的元素:
矩形表示一个模块,在矩形内注明模块的功能和名字
箭头表示模块间的调用关系。带实心圆的箭头表示传递的是控制信息,带空心圆的箭头表示传递的是数据
结构图中常有的模块类型:
传入模块
传出模块
变换模块
协调模块
2)面向数据流的设计方法
①数据流类型
变换型。将数据流分成三个部分:输入数据、中心变换和输出数据三个部分。
事务型。在事务中心接收数据,分析数据以确定它的类型,再选取一条活动的通路
②面向数据流设计方法的实施要点与设计过程
3)设计的准则
提高模块的独立性
模块规模适中
深度、宽度、扇出和扇入适当
使模块的作用域在该模块的控制域内
应减少模块的接口和界面的复杂性
设计成单入口、单出口的模块
设计功能可预测的模块
3.详细设计
详细设计,即为软件结构图中的每一个模块确定实现算法和局部数据结构,用某种工具表示算法和数据结构的细节。
常用的设计工具有:
图形工具:程序流程图,N-S,PAD,HIPO
表格工具:判定表
语言工具:PDL(伪码)
(四)软件测试
1.软件测试的目的
使用人工或自动手段来运行或测定某个系统的过程,其目的在于检验它是否满足规定的需求或是否弄清预期的结果与实际结果之间的差别。
2.软件测试的准则
所有测试应追溯到需求
严格执行测试计划,排除测试的随意性
充分注意测试中的群集现象
程序员应避免检查自己的程序
穷举测试不可能
妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便
3.软件测试技术与方法综述
1)静态测试与动态测试
静态测试包括:代码检查、静态结构分析、代码质量度量等。
动态测试是基于计算机的测试,根据软件需求设计测试用例,利用这些用例去运行程序,以发现程序错误的过程。
2)白盒测试方法与测试用例设计
白盒测试也称结构测试或逻辑驱动测试。
白盒测试的原则:保证所有的测试模块中每一条独立路径至少执行一次;保证所有的判断分支至少执行一次;保证所有的模块中每一个循环都在边界条件和一般条件下至少各执行一次;验证所有内部数据结构的有效性
主要的方法有:逻辑覆盖(包括语句覆盖、路径覆盖、判定覆盖、条件覆盖和判断—条件覆盖)、基本路径测试等
3)黑盒测试方法与测试用例设计
黑盒测试方法也称功能测试或数据驱动测试,是对软件已经实现的功能是否满足需求进行测试和验证。
黑盒测试主要诊断功能不对或遗漏、界面错误、数据结构或外部数据库访问错误、性能错误、初始化和终止条件错。
黑盒测试方法主要有:等价类划分法(包括有效等价类和无效等价类)、边界值分析法、错误推测法、因果图等,主要用于软件确认测试。
4.软件测试的实施
1)单元测试
对模块进行测试,用于发现模块内部的错误
2)集成测试
测试和组装软件的过程,主要用于发现与接口有关的错误。
集成测试包括的内容:软件单元的接口测试、全局数据结构测试、边界条件和非法输入的测试等。
集成测试分为:增量方式组装(包括自顶而下、自底而上、自顶向下和自底向上的混合增量方式)与非增量方式组装。
3)确认测试
验证软件的功能和性能及其他特征是否满足了需求规格说明中确定的各种需求,以及软件配置是否完全、正确。
4)系统测试
将经过测试后的软件,与计算机的硬件、外设、支持软件、数据和人员等其他元素组合在一起,在实际运行环境中进行一系列的集成测试和确认测试。
(五)程序的调试
1.基本概念
程序调试活动包括:根据错误的迹象确定程序中错误的确切性质、原因和位置;对程序进行修改,排除错误。
1)基本步骤
2)程序调试的原则
(1)确定错误的性质和位置
分析与错误有关的信息
避开死胡同
调试工具只是一种辅助手段,只能帮助思考,不能代替思考
避免用试探法
(2)修改错误的原则
一定要注意错误代码的修改,不要只注意表象,而要注意错误的本身,把问题解决
注意在修正错误时,可能代入新的错误,错误修改后,一定要进行回归测试,避免新的错误产生
修改错误也是程序设计的一种形式
修改源代码程序,不要改变目标代码
2.软件调试方法
1)强行排错法
通过内存全部打印来排错
在程序特定部位设置打印语句—即断点法
自动调试工具。
2)回溯法
适合小规模程序的排错。发现错误,分析错误表象,确定位置,再回溯到源程序代码,找到错误位置或确定错误范围。
3)原因排除法
原因排除法包括:演绎法、归纳法和二分法。
演绎法:是一种从一般原理或前提出法,经过排除和精化的过程来推导出结论的思考方法。
归纳法:从一种特殊推断出一般的系统化思考方法。其基本思想是从一些线索着手,通过分析寻找到潜在的原因,从而找出错误。
二分法:如果已知每个变量在程序中若干个关键点的正确值,则可以使用定值语句在程序中的某点附近给这些变量赋值,然后运行程序并检查程序的输出。
三、例题分析
1.选择题
1)软件开发的需求活动,其主要任务是
A)给出软件解决方案
B)给出系统模块结构
C)定义模块算法
D)定义需求并建立系统模型
【答案】D
2)软件可用性意指
A)用户界面友好的程度
B)软件结构、实现及文档为用户可用的程度
C)修改软件错误的难易程度
D)符合用户使用习惯的程度
【答案】B
3)软件过程是
A)特定的开发模型
B)一种软件求解的计算逻辑
C)活动的集合
D)软件生存周期模型
4)需求分析阶段的任务是确定
A)软件开发方法
B)软件开发工具
C)软件开发费
D)软件系统的功能
5)软件测试方法中的静态测试方法之一为
A)静态结构分析
B)黑盒法
C)路径覆盖
D)边界值分析
【答案】A
6)可行性研究要进行一次什么类型的需求分析
A)详细的
B)全面的
C)简化的、压缩的
D)彻底的
【答案】C
7)软件开发过程中,抽取和整理用户需求并建立问题域精确模型的过程叫
A)生存期
B)面向对象设计
C)面向对象程序设计
D)面向对象分析
8)原型化方法是一种什么型的设计过程
A)自外向内B)自顶向下
C)自内向外D)自底向上
9)为了提高测试的效率,应该__________。
A)随机地选取测试数据
B)取一切可能的输入数据作为测试数据
C)在完成编码以后制定软件的测试计划
D)选择发现错误可能性大的数据作为测试数据
10)使用白盒测试方法时,确定测试数据应根据什么和指定的覆盖标准。
A)程序的内部逻辑
B)程序的复杂结构
C)使用说明书
D)程序的功能
2.填空题
1)软件工程的基本原则包括抽象、信息隐蔽、模块化、局部化、确定性、__________和__________。
【答案】完备性可验证性
2)系统流程图是描述物理模型的传统工具,用图形符号表示系统中各个元素表达了系统中各种元素之间的__________情况。
【答案】信息流动
3)详细设计的任务是确定每个模块的内部特性,即模块的算法、__________。
【答案】使用的数据
4)所有软件维护申请报告要按规定方式提出,该报告也称__________报告。
【答案】软件问题
5)软件测试过程一般包括4个步骤,即单元测试、集成测试、验收测试(确认测试)和__________。
【答案】系统测试
四、小结
通过本章的学习,要求了解软件工程的基本概念;了解软件工程过程与软件的生命周期,以及软件工程的目标和原则;了解利用结构化分析法进行软件工程中的需求分析的方法,并了解需求分析的方法和需要完成的任务;了解数据流图的使用方法;了解如何利用结构化设计方法进行软件设计,并了解软件设计的一些常用工具;了解软件测试的目的和方法,以及软件测试的准则,了解常用的软件测试方法的区别和各自的功能与特点;了解程序调试的方法和原则。