30
第1第 1.1 第第第第第第 1.2 第第第第 1.3 第第第第 1.4 第第第

第 1 章 绪 论

  • Upload
    haruko

  • View
    59

  • Download
    0

Embed Size (px)

DESCRIPTION

1.1 软件发展简史 1.2 软件危机 1.3 软件工程 1.4 关于本书. 第 1 章 绪 论. 1.1 软件发展简史. 1.1.1 什么是软件 什么是软件?有人说软件就是计算机程序,开发软件就是编写程序。还有人会说软件就是计算机程序和说明书。这种看法对不对呢? - PowerPoint PPT Presentation

Citation preview

Page 1: 第 1 章  绪  论

第 1 章 绪 论

1.1 软件发展简史 1.2 软件危机 1.3 软件工程 1.4 关于本书

Page 2: 第 1 章  绪  论

1.1 软件发展简史 1.1.1 什么是软件 什么是软件?有人说软件就是计算机程序,开发软件就是编写

程序。还有人会说软件就是计算机程序和说明书。这种看法对不对呢?

计算机系统是通过运行程序来实现各种不同应用功能的。各种不同功能的程序,包括用于特定目的的程序、支持这些程序运行的系统程序(如操作系统)、管理和控制计算机系统的资源的程序、检查和诊断计算机系统的程序等,统称为软件。软件是计算机系统中与硬件相对应、又相互依存的另一部分,与硬件合二为一共同完成系统的功能。软件是一种产品,作为一种产品,它表达了由计算机硬件体现的计算潜能。不管是驻留在设备中,还是在主机中,软件是一个信息转换器,能产生、管理、获取、修改、显示和转换信息。

软件可以有如下定义:计算机程序及其说明程序的各种文档的集合。

Page 3: 第 1 章  绪  论

1.1 软件发展简史1.1.2 软件的分类 根据软件的功能可以将软件划分为:系统

软件、支撑软件、应用软件。 根据软件的工作方式可以将软件划分为:

实时软件、分时软件、交互式软件、批处理软件。

根据软件的规模可以将软件划分为:微型软件、小型软件、中型软件、大型软件、超大型软件、极大型软件。

Page 4: 第 1 章  绪  论

1.1 软件发展简史 根据软件服务对象的范围可以将软件划分

为:定制软件、产品软件。 根据应用领域可以将软件划分为:操作系

统、数据库管理系统、软件开发系统、办公软件(包括字处理软件、电子表格软件等)、财务软件、网络工具软件、图形图像处理软件、多媒体软件、游戏软件、家庭教育软件等。

根据软件的规模可以将软件划分为:微型软件、小型软件、中型软件、大型软件、超大型软件、极大型软件。

Page 5: 第 1 章  绪  论

1.1 软件发展简史 1.1.3 软件技术的发展 从第一台计算机问世以来,为满足日益增长的

需求,每次硬件技术的突破都为软件技术新发展提供了更为广阔的空间,开拓了广阔的应用领域。计算机的应用领域从单纯的科学计算发展到军事、经济、科学、文化以及社会生活的各个方面,进而要求计算机的运算速度不断提高,存储容量不断扩大、体积不断缩小。而计算机数量的聚增使得软件系统从简单到复杂,从小型到大型,从封闭式自动化孤岛到网络化的开放式系统。

Page 6: 第 1 章  绪  论

1.1 软件发展简史 1.1.4 软件开发技术的发展 计算机诞生以来,软件开发技术在观念、目标等方面发生了很大

的变化。总体上看大致经历了如下三个阶段。 个体手工劳动阶段( 20 世纪 50年代初期~60年代中期)。计

算机发展早期,软件的生产方式主要是个体手工劳动的方式,这一阶段称作程序设计阶段。这一时期硬件系统价格昂贵、运行速度慢、存储容量小、可靠性差。程序员使用机器语言或汇编语言,怀着极大的热情,将编写程序视作艺术创作,将开发出来的软件视为艺术品。开发程序的目标之一是追求编程技巧和程序的运行效率;同时由于缺少文档,往往导致所开发出来的程序难读、难懂、难修改。当然,由于此时程序规模很小,程序开发似乎还不需要采用系统化的方法进行管理。一旦出了问题,诸如计划推迟、超过成本预算,或软件出现错误,程序员才开始弥补。

Page 7: 第 1 章  绪  论

1.1 软件发展简史 “软件作坊”阶段( 20 世纪 60年代中期~70年代末期)。

由于计算机应用领域的不断扩大,软件需求不断增长,软件变得越来越复杂,设计者不得不组织为合作组织采用分工合作的方式开发程序,即作坊式的软件开发模式,这一阶段称为程序系统阶段。这一时期硬件速度、存储容量以及可靠性有了明显提高,价格明显降低,计算机应用迅速普及,软件需求迅猛增加。程序员采用高级程序设计语言编写程序,虽然有所分工,但仍然依靠个人技巧,开发人员无规范约束,又缺乏软件理论方法,开发技术也没有新的突破。开发人员的素质和落后的开发技术不适应规模日益增长的、越来越复杂的软件系统的开发。软件错误严重,维护费用巨大,更为严重的是,如此开发出来的软件根本就不能维护。最终,“软件危机”出现了。

Page 8: 第 1 章  绪  论

1.1 软件发展简史 软件工程阶段( 20 世纪 70年中期 ~ 现在)。面对软件开发所遇到的严重问题, 1968年由北大西洋公约组织( NATO )在前联邦德国格密斯( Garmish )举行的国际学术会议上正式提出并使用了“软件工程”的概念,软件工程阶段开始了。这一时期硬件向超高速、大容量、微型化、网络化、智能化方向发展。软件应用渗透到人类生活的每个角落,软件的种类空前繁荣,软件的结构空前复杂、规模空前庞大,软件以产品化、系列化、工程化、标准化和产业化向前发展。软件开发必须打破个体化特征,采用工程化的原理和方法,综合运用数据库技术、网络技术、分布式、面向对象技术及相应的开发工具和开发环境来开发软件。但是,软件工程至今并未取得突破性进展,软件价格仍然高居不下,软件产业仍然是劳动密集型产业,软件生产的自动化水平仍然很低,这与人类已经进入的信息社会应有的生产方式显得格格不入 .

Page 9: 第 1 章  绪  论

1.1 软件发展简史 1.1.5 面向对象软件开发技术 不同的计算机语言适合不同的需求,低级语言往往能够带来

更高的运行效率并且占用更少的计算机资源。但是,在客观条件许可的情况下,我们应该尽量使用高级语言,以便于软件工程管理。

计算机语言是一种对计算机本身的抽象,计算机以机器码运行程序。因为人类难以理解掌握这种机器码,所以出现了方便人类使用的编程语言。所有的编程语言都是对机器码的一种抽象,汇编语言几乎就是机器码本身。随后的 C 是对汇编语言作了抽象,它较汇编语言有了很大的进步,但是依然是一种初级的抽象。 Java等面向对象的语言是一种更高程度的抽象。

Page 10: 第 1 章  绪  论

1.1 软件发展简史 面向对象编程语言减少了这两个模型之间的鸿沟。 Booch给对象作了个简单的定义:对象有状态、行为和标识。这里说的标识,是指每个对象的名字,这使得它能同其它对象区分开来。状态是指对象的具体特征,行为是指它能够做的事情。比如说,现实世界中的出纳员,映射到面向对象模型中,可以是这样的:

类 :出纳员 { 状态: 姓名 行为: 收钱();发钱(); }

Page 11: 第 1 章  绪  论

1.1 软件发展简史

面向对象编程语言提供了一些特性,善于利用这些特性,可

以使得我们的软件在逻辑上更简单、优雅、方便以后的升级和修改。简单地说,面向对象语言提供了以下几个特性:封装、继承、多态性。

封装 简单地说,封装是指隐藏具体的代码。一个程序员写好了一段代码,另外一个程序员打算使用它。对于那个使用者来说,这段代码只是提供了一种服务,比如说驱动打印机,或者说把报表存入数据库。至于打印机具体是怎么被驱动的,使用者并不想知道。

封装的第一个好处就是合作开发软件更方便。一个程序员写了一个对象,他把无关的代码封装起来,只开放几个接口。使用这个对象的程序员只要知道怎么使用这个接口,就可以在自己的代码中使用这个对象,享受到这个对象的服务

Page 12: 第 1 章  绪  论

1.1 软件发展简史 继承 封装很容易理解和使用。继承容易理解却不容易使用。所谓继承,就是一个类是别的类的子类。他继承了父类的特性,他还可以有自己的特性。

在我们写程序的时候,经常会发现,我们正打算写的一段代码跟程序中已经存在的某段代码功能非常类似,但是却不完全一样。如果那段代码是一个对象的话,我们就可以继承那个对象。当然我们也可以创建一个新对象,然后把那个旧对象中的代码都贴过来,修改一下。但是这在软件工程上是一种错误的做法,它违背了软件工程中的 OAOO原则( Once and only once ,一段实现特定功能的代码只出现一次,决不粘贴拷贝到其它地方)。

继承的另外一个优点就是,它支持渐进式的开发。

Page 13: 第 1 章  绪  论

1.1 软件发展简史 多态性 最常见的多态性,就是 java或者 C++语言中的“+”号,它

是一个操作符,整型数可以用,浮点型也可以用,字符串也可以用。这个拥有多态性的加号可以自动识别类型。在这个用法中,它的好处就是方便,增加了代码的可读性。

其实多态性还有其它的软件工程方面的好处。在多人合作开发一个软件的时候,一个人的代码会被另外一个人使用。虽然一个类被正式完成之后,其它人可以方便地使用。但是在没有写完之前,同事也可能需要使用它。

Page 14: 第 1 章  绪  论

1.2 软件危机 1.2.1 什么是软件危机 软件危机是指在计算机软件开发和维护过程中所遇到的一系列严重问题。其具体表现如下 :

软件不符合用户的实际需要。一般情况下,由于开发人员在软件开发初期对用户的要求上不够明确,就闭门造车,急于开始编程。开发工作开始后,软件开发人员又未能与用户及时与用户交换意见,使得一些问题不能得到及时解决,导致所开发出来的软件不能完全满足用户的要求,用户对已完成的软件不满意的现象常常发生。有的软件甚至因为合作与技术问题出现开发失败的情况。

Page 15: 第 1 章  绪  论

1.2 软件危机 软件价格昂贵。 20 世纪 50年代,软件成本在整个计算机系统

中所占的比例并不大,约为 10% ~ 20% 。但随着软件产业的发展,软件成本随着人力成本日益提高。与此相反,计算机硬件成本随着技术的进步和生产规模的扩大却不断下降,软件代价在计算机系统中所占的比例越来越大。到 60年代中期,软件成本占整个计算机系统的比例增长为 50%左右, 1985年就已增长到大约 90% 。

软件开发项目超支和延期。难以按进度完成软件开发,难以估计软件开发的工作量。实际成本比估计成本有可能高出一个数量级,实际进度比预期进度又可能拖延几个月甚至几年。这种现象降低了软件开发者的信誉。而为了赶进度和节约成本所采取的一些权宜之策又往往降低了软件产品的质量,从而不可避免地会引起用户不满。经验表明,当软件项目组织者发现无法按进度完成项目开发时,往往采取增加开发人员的措施,而这不仅不会解决问题,反而造成进一步的延期,原因是新增人员一般并不熟悉正在开发的项目,老的开发人员花在培训新来人员上的时间往往会更多。

Page 16: 第 1 章  绪  论

1.2 软件危机 软件质量低,可靠性差。由于在开发过程中,没有确保软件质

量的体系和措施,在软件测试时,又没有严格的、充分的、完全的测试,提交给用户的软件质量差,在运行中暴露出大量问题。这种不可靠的软件轻者会影响系统正常工作,重者会发生事故,造成生命财产的重大损失。例如, 1965 ~1970年间,美国范登堡基地发射火箭多次失败,绝大部分出于控制系统故障,故障主要是由于程序错误所造成。

软件缺少适当的文档资料。开发过程无完整、规范的文档,发现问题后进行杂乱无章的修改,结果越改越是错误百出。从软件的使用角度,由于缺少完备的、详细的、明确的说明书,用户往往不能正确使用系统,不仅增加了不必要的误操作,也大大增加了软件的售后服务成本。

难于修改和维护软件。由于软件开发过程没有统一的、公认的规范,软件开发人员按各自的风格工作,各行其是,很多程序中的错误非常难以修改,并且难以使这些程序适应新的软硬件环境,难以根据用户的要求在程序中增加新的功能。

Page 17: 第 1 章  绪  论

1.2 软件危机 1.2.2 软件危机的形成原因 软件危机的出现一方面固然与软件本身的特点有关,另一方面也与软件的开发和维护方法有关,具体原因如下 :

软件本身是逻辑部件,是无形的产品,看不见摸不着,质量往往难以评价,潜在的错误在所难免,并且质量检测非常复杂,往往不能在交付使用之前检查出所有错误。软件在运行中不会因为使用时间长而损坏,如果运行中出现问题,一般是由于在开发阶段引入而在测试阶段没有发现的问题。因此,软件的修改和维护实际是对原有设计的修改和改进。

Page 18: 第 1 章  绪  论

1.2 软件危机 软件规模越来越大,软件结构越来越复杂。 1968年美国航空

公司订票软件系统规模达到 30万条指令; IBM360 操作系统的16版达到 100万条指令; 1973年美国阿波罗项目达到 1000万条指令。这些庞大的软件功能非常复杂,其调用关系、接口信息、数据结构都十分复杂,其复杂程度远远超过了人所能接受的程度。

忽视需求分析的重要性,急于开始编程,往往造成开发出来的软件不能满足用户的要求而导致返工甚至作废。这是由于早期软件开发的个体化特征造成的,主要表现为对软件需求分析重视不够,错误地认为软件开发就是编写程序并使之运行,不重视软件需求和软件维护。许多程序员不愿意编写文档,而热衷于编写程序。往往直到软件开发临近结束时,才为了应付任务,而匆匆编写文档,草草了事,责任心不强,可以想象其文档的质量。

Page 19: 第 1 章  绪  论

轻视软件测试和软件维护。如前所述,许多人认为软件开发就是写程序,殊不知软件开发过程中绝大部分工作是花在需求分析、测试和维护阶段。 B.Boehm认为软件是程序以及开发、使用和维护程序所需要的所有文档的集合,即软件 = 程序 + 文档。

软件开发技术落后,生产方式落后,开发工具落后。 20 世纪 60年代人们注重于一些计算机理论问题的研究,如编译原理、操作系统原理、数据库原理、人工智能原理、形式语言理论等,不注重软件开发技术的研究,用户要求的软件复杂性与软件技术解决复杂性的能力不相适应。同时,与计算机硬件生产形成鲜明反差的是,软件开发仍然采用个体手工方式,根据个人爱好工作,无章可循,无规范可依,靠言传身教、师傅带徒弟的方式进行。

1.2 软件危机

Page 20: 第 1 章  绪  论

1.2.3 软件危机的解决方法 20 世纪 60年代后期人们惊呼发生了软件危机,于是人们坐到一起开始讨论解决软件危机的方法 .1968年由北大西洋公约组织在前联邦德国格密斯举行的国际学术会议上正式提出并使用了“软件工程”的概念,运用工程学的基本原理和方法来组织和管理软件生产 .后来还发展了相关的心理学、生理学和经济学等方面的学科。软件工程诞生了 ,它是解决软件危机惟一有效的方法。

首先,必须消除存在的错误认识,借鉴人类长期以来的工程原理、概念、技术、方法,用工程化方法和途径来开发和维护软件。

1.2 软件危机

Page 21: 第 1 章  绪  论

其次,应该开发和使用更好的软件工具。在软件开发的每个阶段都由许多繁琐重复的工作要做,在适当的软件工具的辅助下,开发人员可以做得又快又好。把各个阶段使用的软件工具有机地集合起来构成一个整体,支持软件开发的全过程,这称为软件工程支撑环境。

最后,应该采取必要的管理措施。软件产品是一种无形的产品,它不同于一般工程项目的管理。必须采取适合软件产品特点的管理措施,通过人员组织管理、项目计划管理、配置管理等环节来保证软件开发按时按质量完成。

1.2 软件危机

Page 22: 第 1 章  绪  论

1.3 软件工程 1.3.1 什么是软件工程 本书采用如下定义:软件工程是指导计算机软件开发和维护的一门学科,它采用工程的概念、原理、技术和方法,把经过时间考验而证明是正确的管理技术与技术 方法结合起来用于开发软件。

软件工程是一门指导性的学科,它在宏观上或总体上指导人们如何开发软件系统。可以说,软件工程就是“软件的哲学”。软件工程的目标是指导成功地开发大型软件系统,达到降低开发成本、实现要求的功能、取得较好的性能和可靠性、软件系统易于移植、降低维护费用、按时完成开发任务、及时交付使用等具体的目标。

Page 23: 第 1 章  绪  论

低开发成本

按时交付

高性能

易于维护

高可靠性

互斥关系

互补关系

图 1.1 软件工程目标之间的关系

1.3 软件工程

Page 24: 第 1 章  绪  论

1.3.2 软件工程的基本原理 自从软件工程的概念提出以来,专家学者们陆续提出了 100

多条关于软件工程的准则。 1983 年 B.Woehm 提出了软件工程的七条基本原理。

用分阶段的生命周期计划严格管理。这条原则是吸取前人的经验教训而得到的。统计表明,失败的项目有 50% 以上是由于计划不周而造成的。在软件开发和维护的漫长生命周期中,需要完成许多性质各异的工作。我们应该把整个软件生命周期划分为若干阶段,为每个阶段制定不同的任务,并制定出切实可行的计划,然后严格按照计划对软件的开发和维护进行管理。这些计划包括:项目总体计划、里程碑计划、项目控制计划、产品控制计划、验证计划、运行维护计划。不同层次的管理人员都必须严格按照计划各尽其职,绝不能受客户或上级人员的影响而擅自背离预定的计划。

1.3 软件工程

Page 25: 第 1 章  绪  论

1.3 软件工程 坚持进行阶段评审。统计结果显示,大约 63% 的软件错误

是在编码之前造成的,错误发现得越晚,改正错误花费的代价就越高,相差达到 2~3 个数量级。因此,软件的质量保证工作不能等到编码结束后再进行,应当坚持严格的阶段评审,以便及早发现错误。

实行严格的产品控制。在软件的开发过程中不能随意改变需求,否则将会付出较高的代价。软件开发过程中最糟糕的是莫过于改动需求,而实践告诉我们,改动需求往往是不可避免的。作为软件开发人员,我们往往不能禁止用户提出修改需求的要求,而只能依靠科学的产品控制技术来适应用户的这种要求。也就是要采用变动控制(又叫基准配置管理)。当需求变动时,使其他各个阶段的文档和代码随之相应变动,以保证软件的一致性。

Page 26: 第 1 章  绪  论

1.3 软件工程 采用现代程序设计技术。从提出软件工程的概念开始,人们

的主要精力都用于研究各种新的程序设计技术, 20 世纪 60年代的结构化程序设计技术随后发展为结构化分析技术和结构化设计技术,已成为被大多数人认可的先进技术,后来又出现了面向对象技术。计算机程序设计语言也从一代、二代、三代发展到第四代语言。人们已经充分认识到,采用先进的技术可以极大地提高软件开发效率,降低软件维护成本。

工作成果应当能够清楚地审查。软件产品不同于一般的物理产品,软件是逻辑产品,看不见、摸不着。软件开发小组的工作进展情况可见性差,难于评价和管理。为了更好地管理,应根据软件开发的总目标及完成期限,尽量明确地规定开发小组的责任和产品标准,从而使所得到工作成果能按标准清楚地审查。

Page 27: 第 1 章  绪  论

1.3 软件工程 开发小组的成员应少而精。开发人员的素质和数量是影响软

件开发效率的重要因素,开发小组的人员应少而精。高素质的开发人员比低素质开发人员的效率要高几倍到几十倍,开发工作中所犯的错误也少得多。此外,开发小组成员之间的通信代价也随人员的增加而增加。当开发小组为 N人时,可能的通信信道为 N( N- 1 ) /2 ,可见随着人数增加,通信开销急剧增加。

承认不断改进软件工程实践的必要性。在软件工程基本原理中,一般认为只要遵循上述六条原理,就能较好地进行软件的工程化开发。但是, Beohm 还提出了第七条原理,要求承认不断总结经验、改进软件工程过程的必要性。根据这条原理,不仅要吸纳新的软件开发技术,还要注意不断总结经验,收集数据,进行出错类型和问题的报告统计。用这些数据评估新的软件技术的效果,指明必须要着重注意的问题和应该优先进行研究的工具和技术。

Page 28: 第 1 章  绪  论

1.3 软件工程 1.3.3 软件工程的基本内容 软件工程研究的主要内容是软件开发技术和软件开发管理两

个方面。软件开发技术主要包括软件开发方法、软件开发过程、软件开发工具和环境。软件开发管理主要包括软件管理学、软件经济学和软件心理学等,包括人员分配、制定计划、确定标准与配置、成本估算、质量评价等。

传统的软件工程学的基本内容如下 : 软件生存周期模型。描述软件开发总过程的理论模型,指导整个软件开发过程。

软件分析。确定待开发软件的总体要求和使用范围以及与之相关的硬件和支撑软件的要求,包括系统分析、可行性分析、软件开发计划、需求分析,主要介绍结构化分析方法。

Page 29: 第 1 章  绪  论

1.3 软件工程 软件设计。包括总体设计和详细设计两个阶段,产生软件的总体结构、软件包含的所有功能模块及其接口规范、全局数据结构和局部数据结构以及各模块的详细算法,涉及软件设计基本原理和软件设计基本方法等问题,主要介绍结构化设计方法。

软件实现。将设计阶段的数据结构和各功能模块采用某种程序语言“翻译”为可执行的程序,涉及程序设计语言的选择、程序设计方法、程序设计风格等问题的研究,主要介绍结构化程序设计方法。

软件测试。对已经用程序语言实现的程序模块进行单元测试,和对已经过测试的模块进行组装测试,以保证最终程序能正确可靠地运行。

软件维护。软件开发结束交付使用后,在整个使用期间可能需要不断地维护,以修改新发现的错误,或是为了适应变化了的环境,或是扩充原有的功能。

软件管理。包括成本估算、风险分析、进度安排、人员组织、 软件质量保证等基本内容。

Page 30: 第 1 章  绪  论

1.4 关于本课程本书分三大篇来介绍软件工程的知识,

包括原理篇、应用篇和管理篇。原理篇主要介绍了软件工程的由来及其基本概念、软件生存周期模型、软件分析、软件设计、软件实现、软件测试和软件维护等内容。应用篇以一个图书馆管理系统为案例,根据软件工程原理,完整地描述了案例的整个实施过程。管理篇主要介绍了软件管理方面的知识,包括项目管理、成本估算、质量保证以及极限变成等内容

建议在学习本课程的过程中,将重点放在对基本概念的理解以及对软件工程基本内容和基本过程的掌握上。而有关软件工程研究的最新成果,其本身一直处于不断变化的过程之中,相信读者在今后的学习和工作中通过自己的努力可以不断地充实自己的知识结构和视野。