第一章软件工程概述 复习要求 1.了解软件概念、特点及分类方法 2.了解软件发展及软件危机的起因 3.了解软件工程过程及软件生存期的概念。 4.了解软件工程的概念及其要素。 5.了解软件工程的基本目标和原则。 内容提要 1.软件的概念、特点 软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的 完整集合。其中,程序是按事先设计的功能和性能要求执行的指令序列;数据是使程序能正 常操纵信息的数据结构;文档是与程序开发,维护和使用有关的图文材料 软件的特点是: (1)软件是一种逻辑实体,而不是具体的物理实体。因而它具有抽象性。 (2)软件的生产与硬件不同,它没有明显的制造过程。对软件的质量控制,必须着重在 软件开发方面下功夫 (3)在软件的运行和使用期间,没有硬件那样的机械磨损,老化问题。任何机械、电子 设备在运行和使用中,其失效率大都遵循如图1.1(a)所示的U型曲线(即浴盆曲线)。而软 件的情况与此不同,因为它不存在磨损和老化问题。然而它存在退化问题,必须要多次修改 (维护)软件,如图1.1(b)所示。 效 效|修改点 磨合 磨损 率 调整用坏 线 理想曲线 a)硬件失效率曲线时间 b)软件失效率曲线时间 图1.1失效率曲线 (4)软件的开发和运行常常受到计算机系统的限制,对计算机系统有着不同程度的依赖 性。为了解除这种依赖性,在软件开发中提出了软件移植的问题。 (5)软件的开发至今尚未完全摆脱手工艺的开发方式 (6)软件本身是复杂的。软件的复杂性可能来自它所反映的实际问题的复杂性,也可能 来自程序逻辑结构的复杂性
1 第一章 软件工程概述 一、复习要求 1. 了解软件概念、特点及分类方法。 2. 了解软件发展及软件危机的起因。 3. 了解软件工程过程及软件生存期的概念。 4. 了解软件工程的概念及其要素。 5. 了解软件工程的基本目标和原则。 二、内容提要 1. 软件的概念、特点 软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的 完整集合。其中,程序是按事先设计的功能和性能要求执行的指令序列;数据是使程序能正 常操纵信息的数据结构;文档是与程序开发,维护和使用有关的图文材料。 软件的特点是: (1) 软件是一种逻辑实体,而不是具体的物理实体。因而它具有抽象性。 (2) 软件的生产与硬件不同,它没有明显的制造过程。对软件的质量控制,必须着重在 软件开发方面下功夫。 (3) 在软件的运行和使用期间,没有硬件那样的机械磨损,老化问题。任何机械、电子 设备在运行和使用中,其失效率大都遵循如图 1.1(a)所示的U型曲线(即浴盆曲线)。而软 件的情况与此不同,因为它不存在磨损和老化问题。然而它存在退化问题,必须要多次修改 (维护)软件,如图 1.1(b)所示。 图 1.1 失效率曲线 (4) 软件的开发和运行常常受到计算机系统的限制,对计算机系统有着不同程度的依赖 性。为了解除这种依赖性,在软件开发中提出了软件移植的问题。 (5) 软件的开发至今尚未完全摆脱手工艺的开发方式。 (6) 软件本身是复杂的。软件的复杂性可能来自它所反映的实际问题的复杂性,也可能 来自程序逻辑结构的复杂性
(⑦)软件成本相当昂贵。软件的研制工作需要投入大量的、复杂的、高强度的脑力劳动, 它的成本是比较高的 (8)相当多的软件工作涉及到社会因素。许多软件的开发和运行涉及机构、体制及管理 方式等问题,甚至涉及到人的观念和人们的心理。它直接影响到项目的成败。 2.软件的分类 (1)按软件的功能进行划分: 系统软件:能与计算机硬件紧密配合在一起,使计算机系统各个部件、相关的软件和 数据协调、高效地工作的软件。例如,操作系统、数据库管理系统、设备驱动程序以及通信 处理程序等。 支撑软件:是协助用户开发软件的工具性软件,其中包括帮助程序人员开发软件产品 的工具,也包括帮助管理人员控制开发的进程的工具。 应用软件:是在特定领域内开发,为特定目的服务的一类软件 2)按软件规模进行划分 按开发软件所需的人力、时间以及完成的源程序行数,可确定六种不同规模的软件 表1.1软件规模的分类 类别 人员数 研制期限 规模(源程序行数) 微型 1~4周 小型 1~6月 lkk 中型 2年 大型 2~3年 甚大型 100~1000 5年 IM(=1000l 2000~5000 IMI0M 规模大、时间长、很多人参加的软件项目,其开发工作必须要有软件工程的知识做指导。 而规模小、时间短、参加人员少的软件项目也得有软件工程概念,遵循一定的开发规范。其 基本原则是一样的,只是对软件工程技术依赖的程度不同而已 (3)按软件工作方式划分 ·实时处理软件:指在事件或数据产生时,立即予以处理,并及时反馈信号,控制需要 监测和控制的过程的软件。主要包括数据采集,分析,输出三部分。 ·分时软件:允许多个联机用户同时使用计算机。 交互式软件:能实现人机通信的软件。 批处理软件:把一组输入作业或一批数据以成批处理的方式一次运行,按顺序逐个处 理完的软件。 (4)按软件服务对象的范围划分 项目软件:也称定制软件,是受某个特定客户(或少数客户)的委托,由一个或多个 软件开发机构在合同的约束下开发出来的软件。例如军用防空指挥系统、卫星控制系统。 ·产品软件:是由软件开发机构开发出来直接提供给市场,或是为千百个用户服务的软 件。例如,文字处理软件、文本处理软件、财务处理软件、人事管理软件等 (5)按使用的频度进行划分 有的软件开发出来仅供一次使用。例如用于人口普查、工业普查的软件。另外有些软件 具有较高的使用频度,如天气预报软件。 (6)按软件失效的影响进行划分:
2 (7) 软件成本相当昂贵。软件的研制工作需要投入大量的、复杂的、高强度的脑力劳动, 它的成本是比较高的。 (8) 相当多的软件工作涉及到社会因素。许多软件的开发和运行涉及机构、体制及管理 方式等问题,甚至涉及到人的观念和人们的心理。它直接影响到项目的成败。 2.软件的分类 (1) 按软件的功能进行划分: ·系统软件: 能与计算机硬件紧密配合在一起,使计算机系统各个部件、相关的软件和 数据协调、高效地工作的软件。例如,操作系统、数据库管理系统、设备驱动程序以及通信 处理程序等。 ·支撑软件: 是协助用户开发软件的工具性软件,其中包括帮助程序人员开发软件产品 的工具,也包括帮助管理人员控制开发的进程的工具。 ·应用软件: 是在特定领域内开发,为特定目的服务的一类软件。 (2) 按软件规模进行划分: 按开发软件所需的人力、时间以及完成的源程序行数,可确定六种不同规模的软件。 表 1.1 软件规模的分类 类别 参加人员数 研制期限 产品规模(源程序行数) 微型 1 1~4 周 0.5k 小型 1 1~6 月 1k~2k 中型 2~5 1~2 年 5k~50k 大型 5~20 2~3 年 50k~100k 甚大型 100~1000 4~5 年 1M(=1000k) 极大型 2000~5000 5~10 年 1M~10M 规模大、时间长、很多人参加的软件项目,其开发工作必须要有软件工程的知识做指导。 而规模小、时间短、参加人员少的软件项目也得有软件工程概念,遵循一定的开发规范。其 基本原则是一样的,只是对软件工程技术依赖的程度不同而已。 (3) 按软件工作方式划分: ·实时处理软件: 指在事件或数据产生时,立即予以处理,并及时反馈信号,控制需要 监测和控制的过程的软件。主要包括数据采集,分析,输出三部分。 ·分时软件: 允许多个联机用户同时使用计算机。 ·交互式软件: 能实现人机通信的软件。 ·批处理软件: 把一组输入作业或一批数据以成批处理的方式一次运行,按顺序逐个处 理完的软件。 (4) 按软件服务对象的范围划分: ·项目软件: 也称定制软件,是受某个特定客户(或少数客户)的委托,由一个或多个 软件开发机构在合同的约束下开发出来的软件。例如军用防空指挥系统、卫星控制系统。 ·产品软件: 是由软件开发机构开发出来直接提供给市场,或是为千百个用户服务的软 件。例如,文字处理软件、文本处理软件、财务处理软件、人事管理软件等。 (5) 按使用的频度进行划分: 有的软件开发出来仅供一次使用。例如用于人口普查、工业普查的软件。另外有些软件 具有较高的使用频度,如天气预报软件。 (6) 按软件失效的影响进行划分:
有的软件在工作中出现了故障,造成软件失效,可能给软件整个系统带来的影响不大 有的软件一旦失效。可能酿成灾难性后果。例如财务金融、交通通信、航空航天等软件。我 们称这类软件为关键软件。 3软件的发展和软件危机 自20世纪40年代中出现了世界上第一台计算机以后,就有了程序的概念。其后经历了 几十年的发展,计算机软件经历了三个发展阶段 程序设计阶段,约为50至60年代 程序系统阶段,约为60至70年代 软件工程阶段,约为70年代以后 几十年来最根本的变化体现在 (1)人们改变了对软件的看法。50年代到60年代时,程序设计曾经被看做是一种任人 发挥创造才能的技术领域。当时人们认为,写出的程序只要能在计算机上得出正确的结果 程序的写法可以不受任何约束。随着计算机的广泛使用,人们要求这些程序容易看懂、容易 使用,并且容易修改和扩充。于是,程序便从个人按自己意图创造的“艺术品”转变为能被 广大用户接受的工程化产品。 (2)软件的需求是软件发展的动力。早期的程序开发者只是为了满足自己的需要,这种 自给自足的生产方式仍然是其低级阶段的表现。进入软件工程阶段以后,软件开发的成果具 有社会属性,它要在市场中流通以满足广大用户的需要 (3)软件工作的范围从只考虑程序的编写扩展到涉及整个软件生存周期 在软件技术发展的第二阶段,随着计算机硬件技术的进步,要求软件能与之相适应。然 而软件技术的进步一直未能满足形势发展提出的要求。致使问题积累起来,形成了日益尖锐 的矛盾。这就导致了软件危机。问题归结起来有: (1)缺乏软件开发的经验和有关软件开发数据的积累,使得开发工作的计划很难制定。致 使经费预算常常突破,进度计划无法遵循,开发完成的期限一拖再拖。 (2)软件需求,在开发的初期阶段提得不够明确,或是未能得到确切的表达。开发工作 开始后,软件人员和用户又未能及时交换意见,造成开发后期矛盾的集中暴露 3)开发过程没有统一的、公认的方法论和规范指导,参加的人员各行其事。加之设计 和实现过程的资料很不完整:或忽视了每个人工作与其他人的接口,使得软件很难维护 (4)未能在测试阶段充分做好检测工作,提交用户的软件质量差,在运行中暴露出大量 的问题 如果这些障碍不能突破,进而摆脱困境,软件的发展是没有出路的。 4.软件工程过程和软件生存周期 许多计算机和软件科学家尝试,把其它工程领域中行之有效的工程学知识运用到软件开 发工作中来。经过不断实践和总结,最后得出一个结论:按工程化的原则和方法组织软件开 发工作是有效的,是摆脱软件危机的一个主要出路 (1)软件工程过程( Software Engineering Process 软件工程过程是为获得软件产品,在软件工具支持下由软件工程师完成的一系列软件工 程活动。软件工程过程通常包含四种基本的过程活动: P(Plan):软件规格说明。规定软件的功能及其运行的限制; D(Do):软件开发。产生满足规格说明的软件; C( Check):软件确认。确认软件能够完成客户提出的要求 A( Action):软件演进。为满足客户的变更要求,软件必须在使用的过程中演进
3 有的软件在工作中出现了故障,造成软件失效,可能给软件整个系统带来的影响不大。 有的软件一旦失效。可能酿成灾难性后果。例如财务金融、交通通信、航空航天等软件。我 们称这类软件为关键软件。 3.软件的发展和软件危机 自 20 世纪 40 年代中出现了世界上第一台计算机以后,就有了程序的概念。其后经历了 几十年的发展,计算机软件经历了三个发展阶段: ·程序设计阶段,约为 50 至 60 年代 ·程序系统阶段,约为 60 至 70 年代 ·软件工程阶段,约为 70 年代以后 几十年来最根本的变化体现在: (1) 人们改变了对软件的看法。50 年代到 60 年代时,程序设计曾经被看做是一种任人 发挥创造才能的技术领域。当时人们认为,写出的程序只要能在计算机上得出正确的结果, 程序的写法可以不受任何约束。随着计算机的广泛使用,人们要求这些程序容易看懂、容易 使用,并且容易修改和扩充。于是,程序便从个人按自己意图创造的“艺术品”转变为能被 广大用户接受的工程化产品。 (2) 软件的需求是软件发展的动力。早期的程序开发者只是为了满足自己的需要,这种 自给自足的生产方式仍然是其低级阶段的表现。进入软件工程阶段以后,软件开发的成果具 有社会属性,它要在市场中流通以满足广大用户的需要。 (3) 软件工作的范围从只考虑程序的编写扩展到涉及整个软件生存周期。 在软件技术发展的第二阶段,随着计算机硬件技术的进步,要求软件能与之相适应。然 而软件技术的进步一直未能满足形势发展提出的要求。致使问题积累起来,形成了日益尖锐 的矛盾。这就导致了软件危机。问题归结起来有: (1) 缺乏软件开发的经验和有关软件开发数据的积累,使得开发工作的计划很难制定。致 使经费预算常常突破,进度计划无法遵循,开发完成的期限一拖再拖。 (2) 软件需求,在开发的初期阶段提得不够明确,或是未能得到确切的表达。开发工作 开始后,软件人员和用户又未能及时交换意见,造成开发后期矛盾的集中暴露。 (3) 开发过程没有统一的、公认的方法论和规范指导,参加的人员各行其事。加之设计 和实现过程的资料很不完整;或忽视了每个人工作与其他人的接口,使得软件很难维护。 (4) 未能在测试阶段充分做好检测工作,提交用户的软件质量差,在运行中暴露出大量 的问题。 如果这些障碍不能突破,进而摆脱困境,软件的发展是没有出路的。 4. 软件工程过程和软件生存周期 许多计算机和软件科学家尝试,把其它工程领域中行之有效的工程学知识运用到软件开 发工作中来。经过不断实践和总结,最后得出一个结论:按工程化的原则和方法组织软件开 发工作是有效的,是摆脱软件危机的一个主要出路。 (1) 软件工程过程 (Software Engineering Process) 软件工程过程是为获得软件产品,在软件工具支持下由软件工程师完成的一系列软件工 程活动。软件工程过程通常包含四种基本的过程活动: ·P (Plan) : 软件规格说明。规定软件的功能及其运行的限制; ·D (Do) : 软件开发。产生满足规格说明的软件; ·C (Check) : 软件确认。确认软件能够完成客户提出的要求; ·A (Action) : 软件演进。为满足客户的变更要求,软件必须在使用的过程中演进
事实上,软件工程过程是一个软件开发机构针对某一类软件产品为自己规定的工作步 它应当是科学的、合理的,否则必将影响到软件产品的质量。 (2)软件生存周期( life cycle) 正如同任何事物一样,软件也有一个孕育、诞生、成长、成熟、衰亡的生存过程。我们 称其为计算机软件的生存周期。根据这一思想,把上述基本的过程活动进一步展开,可以得 到软件生存周期的六个步骤 ·制定计划:确定要开发软件系统的总目标,给出它的功能、性能、可靠性以及接口等 方面的要求:研究完成该项软件任务的可行性,探讨解决问题的可能方案;制定完成开发任 务的实施计划,连同可行性研究报告,提交管理部门审查 ·需求分析:对待开发软件提出的需求进行分析并给出详细的定义。编写出软件需求说 明书及初步的用户手册,提交管理机构评审 软件设计:把已确定了的各项需求转换成一个相应的体系结构。进而对每个模块要完 成的工作进行具体的描述。编写设计说明书,提交评审 程序编写:把软件设计转换成计算机可以接受的程序代码。 软件测试:在设计测试用例的基础上检验软件的各个组成部分。 个,运行/维护:已交付的软件投入正式使用,并在运行过程中进行适当的维护。 3)软件生存周期模型 软件生存周期模型是从软件项目需求定义直至软件经使用后废弃为止,跨越整个生存周 期的系统开发、运作和维护所实施的全部过程、活动和任务的结构框架。 a)瀑布模型:瀑布模型规定了各项软件工程活动,包括:制定开发计划,进行需求分 析和说明,软件设计,程序编码。测试及运行维护,参看图1.2。并且规定了它们自上而下 相互衔接的固定次序,如同瀑布流水,逐级下落 立[计划 阶段 需求分析 段 测试 隹护阶段 -运行维护 图12软件生存周期的瀑布模型 然而软件开发的实践表明,上述各项活动之间并非完全是自上而下,呈线性图式。实际 情况是,每项开发活动均处于一个质量环(输入-处理-输出-评审)中。只有当其工作得到确 认,才能继续进行下一项活动,在图1.2中用向下的箭头表示:否则返工,在图12中由向上 的箭头表示 b)演化模型:由于在项目开发的初始阶段人们对软件的需求认识常常不够清晰,因而 使得开发项目难于做到一次开发成功,出现返工再开发在所难免。因此,可以先做试验开发, 其目标只是在于探索可行性,弄清软件需求:然后在此基础上获得较为满意的软件产品。通 常把第一次得到的试验性产品称为“原型” ε)螺旋模型:对于复杂的大型软件,开发一个原型往往达不到要求。螺旋模型将瀑布
4 事实上,软件工程过程是一个软件开发机构针对某一类软件产品为自己规定的工作步 骤,它应当是科学的、合理的,否则必将影响到软件产品的质量。 (2) 软件生存周期 (life cycle) 正如同任何事物一样,软件也有一个孕育、诞生、成长、成熟、衰亡的生存过程。我们 称其为计算机软件的生存周期。根据这一思想,把上述基本的过程活动进一步展开,可以得 到软件生存周期的六个步骤。 ·制定计划 : 确定要开发软件系统的总目标,给出它的功能、性能、可靠性以及接口等 方面的要求;研究完成该项软件任务的可行性,探讨解决问题的可能方案;制定完成开发任 务的实施计划,连同可行性研究报告,提交管理部门审查。 ·需求分析 : 对待开发软件提出的需求进行分析并给出详细的定义。编写出软件需求说 明书及初步的用户手册,提交管理机构评审。 ·软件设计 : 把已确定了的各项需求转换成一个相应的体系结构。进而对每个模块要完 成的工作进行具体的描述。编写设计说明书,提交评审。 ·程序编写 : 把软件设计转换成计算机可以接受的程序代码。 ·软件测试 : 在设计测试用例的基础上检验软件的各个组成部分。 ·运行/维护 : 已交付的软件投入正式使用,并在运行过程中进行适当的维护。 (3) 软件生存周期模型 软件生存周期模型是从软件项目需求定义直至软件经使用后废弃为止,跨越整个生存周 期的系统开发、运作和维护所实施的全部过程、活动和任务的结构框架。 a) 瀑布模型 : 瀑布模型规定了各项软件工程活动,包括:制定开发计划,进行需求分 析和说明,软件设计,程序编码。测试及运行维护,参看图 1.2。并且规定了它们自上而下, 相互衔接的固定次序,如同瀑布流水,逐级下落。 图 1.2 软件生存周期的瀑布模型 然而软件开发的实践表明,上述各项活动之间并非完全是自上而下,呈线性图式。实际 情况是,每项开发活动均处于一个质量环(输入-处理-输出-评审)中。只有当其工作得到确 认,才能继续进行下一项活动,在图 1.2 中用向下的箭头表示;否则返工,在图 1.2 中由向上 的箭头表示。 b) 演化模型 : 由于在项目开发的初始阶段人们对软件的需求认识常常不够清晰,因而 使得开发项目难于做到一次开发成功,出现返工再开发在所难免。因此,可以先做试验开发, 其目标只是在于探索可行性,弄清软件需求;然后在此基础上获得较为满意的软件产品。通 常把第一次得到的试验性产品称为“原型”。 c) 螺旋模型 : 对于复杂的大型软件,开发一个原型往往达不到要求。螺旋模型将瀑布
模型与演化模型结合起来,并且加入两种模型均忽略了的风险分析。螺旋模型沿着螺线旋转 如图1.3所示,在笛卡尔坐标的四个象限上分别表达了四个方面的活动,即 ·制定计划——一确定软件目标,选定实施方案,弄清项目开发的限制条件; ·风险分析—分析所选方案,考虑如何识别和消除风险 ·实施工程——实施软件开发 ·客户评估——评价开发工作,提出修正建议 沿螺线自内向外每旋转一圈便开发出更为完善的一个新的软件版本。 制定计划 成本 风险分析 评价方案 方案和限制 别风险 风险分 析 风险分析 风险分 析 可运行 提交线 原型原型2原型3原型 需求计划 生存期 软件 需求/软件产/详细 漆品设计 设计 划 与訓试与验证 设计确认 单元编码 组装{测试 验收/与 实现|测试 实施工程 开发、验证 评估 下一产品 图1.3螺旋模型 d)喷泉模型:喷泉模型对软件复用和生存周期中多项开发活动的集成提供了支持,主 要支持面向对象的开发方法。“喷泉”一词本身体现了迭代和无间隙特性。系统某个部分常 常重复工作多次,相关功能在每次迭代中随之加入演进的系统。所谓无间隙是指在开发活动 即分析、设计和编码之间不存在明显的边界。如图14所示 演维确实设分 化护认现计析 图14喷泉模型
5 模型与演化模型结合起来,并且加入两种模型均忽略了的风险分析。螺旋模型沿着螺线旋转, 如图 1.3 所示,在笛卡尔坐标的四个象限上分别表达了四个方面的活动,即: 制定计划──确定软件目标,选定实施方案,弄清项目开发的限制条件; 风险分析──分析所选方案,考虑如何识别和消除风险; 实施工程──实施软件开发 客户评估──评价开发工作,提出修正建议。 沿螺线自内向外每旋转一圈便开发出更为完善的一个新的软件版本。 图 1.3 螺旋模型 d) 喷泉模型 : 喷泉模型对软件复用和生存周期中多项开发活动的集成提供了支持,主 要支持面向对象的开发方法。“喷泉”一词本身体现了迭代和无间隙特性。系统某个部分常 常重复工作多次,相关功能在每次迭代中随之加入演进的系统。所谓无间隙是指在开发活动, 即分析、设计和编码之间不存在明显的边界。如图 1.4 所示。 图 1.4 喷泉模型