(第一部分:软件工程概述,第1章)
Created: 2022-04-06 Wed 00:50
教师姓名 | 李欣 |
工作单位 | 北方工业大学 信息学院 |
电子邮箱 | lx@ncut.edu.cn |
办公地点 | 瀚学楼1122 |
固定电话 | 010-8880-1685 |
书名 | 作者 | 出版社 | 年份 |
---|---|---|---|
软件工程实例教程 | 吴洁明 | 清华大学出版社 | 2010 |
软件工程导论(第5版) | 张海藩 | 清华大学出版社 | 2008 |
软件工程(第2版) | 齐治昌等 | 高等教育出版社 | 2004 |
软件工程:实践者的研究方法(第7版) | 郑人杰等译,Roger S Pressman著 | 机械工业出版社 | 2011 |
软件工程实践教程(面向对象) | 谭庆平等 | 高等教育出版社 | 2009 |
UML宝典 | 耿国桐等译,Tom Pender著 | 电子工业出版社 | 2004 |
UML面向对象分析 | 吴际等 | 北京航空航天大学出版社 | 2002 |
开发软件要有工程化意识
开发软件远远不只是写代码
软件工程主要讲述软件开发的道理, 基本上是软件实践者的成功经验和失败教训的总结。 软件工程的观念、方法、策略和规范都是朴实无华的, 平凡之人皆可领会,关键在于运用。 —知易行难
周次 | 讲课(教学大纲分章和题目名称) | 学时 |
---|---|---|
第1周(2.21—2.25) | 第一知识单元:软件工程概述与软件过程(软件工程的出现、软件工程的定义) | 2 |
第2周(2.28—3.4) | 第一知识单元:软件工程概述与软件过程(软件生命周期和软件过程) | 2 |
第3周(3.7—3.11) | 第二知识单元:结构化方法(需求工程) | 2 |
第4周(3.14—3.18) | 第二知识单元:结构化方法(结构化分析) | 2 |
第5周(3.21—3.25) | 第二知识单元:结构化方法(结构化分析、概要设计) | 2 |
第6周(3.28—4.1) | 第二知识单元:结构化方法(概要设计、详细设计) | 2 |
第7周(4.4—4.8) | 第二知识单元:结构化方法(详细设计) | 2 |
第8周(4.11—4.15) | 第二知识单元:结构化方法(结构化编码) | 2 |
第9周(4.18—4.22) | 第三知识单元:面向对象方法(面向对象基础) | 2 |
第10周(4.25—4.29) | 第三知识单元:面向对象方法(面向对象分析) | 2 |
第11周(5.2—5.6) | 第三知识单元:面向对象方法(面向对象设计) | 2 |
第12周(5.9—5.13) | 第三知识单元:面向对象方法(软件体系结构与设计模式、软件重构) | 2 |
第13周(5.16—5.20) | 第四知识单元:软件测试与维护(软件测试基础、白盒测试) | 2 |
第14周(5.23—5.27) | 第四知识单元:软件测试与维护(黑盒测试、软件维护) | 2 |
第15周(5.30—6.3) | 第五知识单元:软件项目管理(软件项目管理概述、项目估算) | 2 |
第16周(6.6—6.10) | 第五知识单元:软件项目管理(进度管理、配置管理、质量管理) | 2 |
第一部分:软件工程概述
第1章:软件与软件工程的概念
虽然软件对于现代的人并不陌生,但很多人对于软件的理解并不准确, “软件就是程序,软件开发就是编程序”的这种错误观点仍然存在。
软件 是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合。
其中,
软件是无形的、不可见的逻辑实体。 度量常规产品的几何尺寸、物理性质和化学成分对它却是毫无意义的。
软件是复杂的智力产品,它的开发凝聚了人们的大量脑力劳动, 它本身也体现了知识实践经验和人类的智慧,具有一定的智能。 它可以帮助我们解决复杂的计算、分析、判断和决策问题。
尽管已经有了一些工具(也是软件)来辅助软件开发工作, 但到目前为止尚未实现自动化。 软件开发中仍然包含了相当份量的个体劳动, 使得这一大规模知识型工作充满了个人行为和个人因素。
目前还无法得到完全没有缺陷的软件产品。
与硬件或传统的制造业产品的生产完全不同,软件一旦设计开发出来,如果需要提供多个用户,它的复制十分简单,其成本也极为有限。
由于上述的几个特点,使得软件的开发管理显得更为重要,也更为独特。
软件的开发和运行都离不开相关的计算机系统环境, 包括支持它的开发和运行的相关硬件和软件。 软件对于计算机系统的环境有着不可摆脱的依赖性。
软件投入使用以后需要进行维护,但这种维护与传统产业产品的维护概念有着很大差别。
与硬件不同,软件并不是由于被“用坏”而被废弃的。
软件的应用极为广泛,如今它已渗入国民经济和国防的各个领域, 现已成为信息产业、先进制造业和现代服务业的核心,占据了无可取代的地位。
按照软件的作用,一般可以将软件做如下分类:
系统软件 是能与计算机硬件紧密配合在一起, 使计算机系统各个部件、相关的软件和数据协调、高效地工作的软件。
例如,操作系统、数据库管理系统、设备驱动程序、通信和网络处理程序等。
支撑软件 亦称为工具软件,是协助用户开发软件的工具性软件, 其中包括帮助程序人员开发软件产品的工具, 也包括帮助管理人员控制开发进程的工具。
需求分析工具、设计工具、编码工具、测试工具、维护工具等。
项目管理工具、配置管理工具等。
应用软件 是在系统软件的支持下, 在特定领域内开发,为特定目的服务的一类软件。
例如,商业数据处理软件、工程与科学计算软件、 实时控制软件、智能化软件、事务管理软件、办公自动化软件等。
可复用软件 最典型的例子是各种标准函数库, 通常是由计算机厂商提供的系统软件的一部分。 后来可复用的范围扩展到算法之外,数据结构也可以复用。
到了20世纪90年代,作为复用的基础, 可复用的范围从代码复用发展到体系结构复用、开发过程复用。
面向对象开发方法的核心思想就基于复用, 为此,建立了可复用的类库,应用程序库,以及可复用的设计模式等。
软件危机暴发于上个世纪六十年代末。
主要表现为:软件的发展速度远远滞后于硬件的发展速度, 不能满足社会日益增长的软件需求。 软件开发周期长、成本高、质量差、维护困难。
美国IBM公司在1963年至1966年开发的IBM 360机的操作系统。 这个项目的负责人F.D.Brooks事后总结了他在组织开发过程中的沉痛教训时说:
…… 正像一只逃亡的野兽落到泥潭中做垂死的挣扎,越是挣扎,陷得越深。 最后无法逃脱灭顶的灾难, …… 程序设计工作正像这样一个泥潭, …… 一批批程序员被迫在泥潭中拼命挣扎, …… 谁也没有料到竟会陷入这样的困境 ……
以上列举的仅仅是软件危机的一些明显的表现, 与软件开发和维护有关的问题远远不止这些。
除了软件本身的特点,软件危机发生的主要原因有:
为了克服软件危机,1968年10月在北大西洋公约组织(NATO)召开的计算机科学会议上, Fritz Bauer首次提出 软件工程 的概念,试图将 工程化方法 应用于软件开发。
在NATO会议上,Fritz Bauer对 软件工程 的定义是: 软件工程 是为了 经济地 获得 可靠的 且能在实际机器上 有效地 运行的软件, 而建立并使用的完善的工程原理。
1993年IEEE给出的定义:
软件工程 是,
- 将 系统的 、 规范的 、 可度量 的方法用于 软件开发 、 运行 和 维护 的过程,即 将工程应用于软件 ;
- 研究1中提到的方法。
概括地说,
软件工程 是指导软件开发和维护的 工程性学科 , 它以计算机科学理论和其他相关学科的理论为指导, 采用 工程化 的 概念 、 原理 、 技术 和 方法 进行软件的开发和维护, 把经过时间考验且证明是正确的 管理技术 和当前能够得到的最好的 技术方法 结合起来, 以较少的代价获得高质量的软件并维护它 。
软件工程的目标 是运用先进的 软件开发技术 和 管理方法 来提高软件的 质量 和 生产率 , 也就是要以 较短的周期 、 较低的成本 生产出 高质量的软件产品 ,并最终实现软件的 工业化生产 。
生产率 与 成本 密切相关, 生产率的提高往往意味着成本的下降 , 开发周期的缩短 。
生产率 与 质量 之间也有着内在的联系, 表面上看,追求高质量会 延长软件开发时间 ,并因此 增加了成本 ,似乎降低了生产率。 但如果生产的软件质量差,虽然开发的时间可能缩短,但之后可能会造成返工,总的开发时间可能会更长。 即使不返工,也无疑会增加维护代价。
在软件开发与维护的漫长生命周期中,需要完成许多 性质各异 的工作, 这条基本原理意味着,应该 把软件生命周期划分成若干阶段 , 并相应地 制定 出 切实可行的计划 , 按照 计划 对软件的 开发与维护 工作进行控制。
软件的质量保证工作不能等到编码阶段结束之后再进行。 经过大量的统计数据表明,大部分错误是在编码之前造成的, 其中, 设计错误约占软件错误的63%,编码错误占37% 。 在前期改正错误所需要的可能只是橡皮和铅笔, 而在交付后改正错误需要的工作就太多了: 查找出错的代码、重新组织程序结构和数据结构、测试、修改文档。 也就是说, 错误发现与改正的越晚,所需付出的代价也越高 。 因此,在 每个阶段 都应该进行 严格的评审 , 以便尽早发现在软件开发过程中所犯的错误, 是一条必须遵循的重要原则。
一切有关修改软件的建议, 都必须按照严格的规程进行评审和控制, 获得批准以后才能实施修改。 目的是当需求变动时, 其它各阶段的文档或代码随之相应变动, 以保证 软件的一致性 。
自从提出软件工程概念后,人们一直把主要精力用于研究各种新的程序设计技术。 60年代末提出了 结构化程序设计技术 , 以后又进一步发展出 结构化分析与设计技术 、 面向对象的分析和设计技术 。 实践表明, 采用先进的技术 既可 提高软件开发和维护的效率 ,又可 提高软件质量 。
软件是一种看不见、摸不着的逻辑产品。 软件开发小组的工作进展情况难于评价和管理。 为更好地进行管理,应根据 软件开发的总目标 及 完成期限 , 明确地规定 开发小组的责任 和 产品标准 , 从而使所得到的产品有明确的标准能清楚地审查。
软件开发小组成员的素质应该好,人数不宜过多。 素质高的人员 开发 效率高 、 质量好 、 错误少 。 开发小组人员过多,信息交流造成的通信开销会急剧增加。
遵循上述六条基本原理,就能够按照当代软件工程基本原理实现软件的工程化生产。 但是,仅有上述六条原理并不能保证软件开发与维护的过程能赶上时代前进的步伐, 因此,应 积极主动采纳新的软件技术 , 不断总结经验 , 汲取教训 。
软件 同任何其他事物一样,也有着孕育、诞生、成长、成熟和衰亡的生存过程, 我们称这个过程为 软件生命周期 或 软件生存期 。
软件生存期由 软件定义 、 软件开发 和 运行维护 3个时期组成, 每个时期又可划分为若干个阶段。
主要任务是解决 做什么 的问题,即:
通常又分为3个阶段: 问题定义 、 可行性研究 和 需求分析 。
主要任务是解决 如何做 的问题,即
具体 设计 和 实现 在前一个时期定义的软件。 由 概要设计 、 详细设计 、 编码 和 测试 4个阶段组成。
主要任务是 使软件持久地满足用户的需要 ,通常有4类维护活动:
通常把 软件开发生命周期全过程 中使用的 一整套技术的集合 称为 方法学(methodology) , 也称为 范型(paradigm) 。 在软件工程的范畴,这两个词的含义基本相同 。 Paradigm vs Methodology - What's the difference?
软件工程方法学 包含三个要素:
传统方法 也成为 生命周期方法 或 结构化范型 。 它采用 结构化技术 来完成软件开发的各项任务。 这种方法学把软件生命周期的全过程 依次划分为若干个阶段 , 然后顺序地 逐步完成每个阶段的任务 。
面向对象方法 是 从面向对象的程序设计发展起来的 。 面向对象程序设计代表了一种全新的程序设计思路, 与传统的面向过程的开发方法不同, 面向对象的程序设计和问题求解更符合人们日常的思维习惯。
软件系统不断增加的规模 和 复杂度 已经给软件开发工作带来了巨大挑战, 为了提升 快速构建软件系统 以及 响应业务变化 的能力, 充分 复用(重用) 已有资源,以及实现 跨平台 的 数据共享 和 业务协同 , 面向服务的软件工程方法 应运而生。
与传统软件工程方法不同, 面向数据的方法 是 基于数据思维 。 从业务逻辑的角度 ,强调 一切业务“数据化” ; 从体系结构的角度 ,突出 “面向数据和以数据为核心”的思想 。
形式化方法 是一种基于 形式化数学变换 的软件开发方法, 它可将系统的规格说明转换为可执行的程序。
软件工具 是指能支持软件生存期中某一阶段的需要而使用的软件。 早期的软件工具主要用来辅助程序员编程,如 编辑程序 、 编译程序 等。
在提出软件工程的概念以后,又出现了软件生存期的概念, 出现了许多开发模型和开发方法,同时软件管理也开始受到人们的重视。 与此同时,出现了一批软件工具来辅助软件工程实施, 因此,软件工具通常也称为CASE (Computer Aided Software Engineering,计算机辅助软件工程)工具。
该时期出现了 程序设计语言 ,软件开发主要是 编程 ,出现的工具主要是为了 辅助软件编程活动 。
该时期提出了 软件工程 的概念,支持 软件开发 、 维护 、 管理 等过程的工具也应运而生。
(参考教材第15页)
SWEBOK(SoftWare Engineering BOdy of Knowledge)指南的目的是 确认软件工程学科的范围 , 并 为支持该学科的本体知识提供指导 。
SWEBOK指南的目标是:
软件生存期过程类 和 软件工程管理类 的知识域通常有 软件工程标准 的支持。 从图中还可看到, 管理类 和 基础类 是支持 软件生存期过程类 的。