软件工程学概述 迄今为止,计算机系统已经经历了4个不同的发展阶段,但是,人们仍然没 有彻底摆脱“软件危机”的困扰,软件已经成为限制计算机系统发展的瓶颈。 为了更有效地开发与维护软件,软件工作者在20世纪60年代后期开始认 真研究消除软件危机的途径,从而逐渐形成了一门新兴的工程学科一—计算机 软件工程学(通常简称为软件工程)。 1.1软件危机 在计算机系统发展的早期时代(20世纪60年代中期以前),通用硬件 相当普遍,软件却是为每个具体应用而专门编写的。这时的软件通常是规 模较小的程序,编写者和使用者往往是同一个(或同一组)人。这种个体化 的软件环境,使得软件设计通常是在人们头脑中进行的一个隐含的过程, 除了程序清单之外,没有其他文档资料保存下来。 从20世纪60年代中期到70年代中期是计算机系统发履的第二个时 期,这个时期的一个重要特征是出现了“软件作坊”,广泛使用产品软件。但 是,“软件作坊”基本上仍然沿用早期形成的个体化软件开发方法。随者计算 机应用的日共普及,软件数最急别影账。在程序运行时发现的错误必须设法 改正;用户有了新的需求时必须相应地修改程序;硬件或操作系统更新时,通 常需要修改程序以适应新的环境。上述种种软件维护工作,以令人吃惊的比 例耗费资源。更严重的是,许多程序的个体化特性使得它们最终成为不可维 护的。“软件危机”就这样开始出现了!1968年北大西洋公约组织的计算机 科学家在联邦德国召开国际会议,讨论软件危机问题,在这次会议上正式提 出并使用了“软件工程”这个名词,一门新兴的工程学科就此诞生了。 1.1.1软件危机的介绍 软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严 重问题。这些问题绝不仅仅是不能正常运行的软件才具有的,实际上,几 www.TopSage.com
www.TopSage.com
2软件工程导论 乎所有软件都不同程度地存在这些问题。 概括地说,软件危机包含下述两方面的问题:如何开发软件,以满足对软件日益增长 的需求:如何维护数量不断膨胀的已有软件。鉴于软件危机的长期性和症状不明显的特 征,近年来有人建议把软件危机更名为“软件萧条(depression)”或“软件困扰 (affliction)”。不过“软件危机”这个词强调了问题的严重性,而且也已为绝大多数软件工 作者所熟悉,所以本书仍将沿用它」 具体地说,软件危机主要有以下一些典型表现: (1)对软件开发成本和进度的估计常常很不准确。实际成本比估计成本有可能高出 一个数量级,实际进度比预期进度拖延几个月甚至几年的现象并不罕见。这种现象降低 了软件开发组织的信誉。而为了赶进度和节约成本所采取的一些权宜之计又往往损害了 软件产品的质量,从而不可避免地会引起用户的不满, (2)用户对“已完成的”软件系统不满意的现象经常发生。软件开发人员常常在对用 户要求只有模糊的了解,甚至对所要解决的问题还没有确切认识的情况下,就匆忙着手编 写程序。软件开发人员和用户之间的信息交流往往很不充分,“闭门造车”必然导致最终 的产品不符合用户的实际需要。 (3)软件产品的质量往往靠不住。软件可靠性和质量保证的确切的定量概念刚刚出 现不久,软件质量保证技术(审查、复审、程序正确性证明和测试)还没有坚持不懈地应用 到软件开发的全过程中,这些都导致软件产品发生质量问题。 (4)软件常常是不可维护的。很多程序中的错误是非常难改正的,实际上不可能使 这些程序适应新的硬件环境,也不能根据用户的需要在原有程序中增加一些新的功能。 “可重用的软件”还是一个没有完全做到的、正在努力追求的目标,人们仍然在重复开发类 似的或基本类似的软件。 (5)软件通常没有适当的文档资料。计算机软件不仅仅是程序,还应该有一整套文 档资料。这些文档资料应该是在软件开发过程中产生出来的,而且应该是“最新式的”(即 和程序代码完全一致的)。软件开发组织的管理人员可以使用这些文档资料作为“里程 碑”,来管理和评价软件开发工程的进展状况;软件开发人员可以利用它们作为通信工具 在软件开发衬程中准确地交流信良:对于软件维护人员而言,这些文档资料更是必不可少 的。缺乏必要的文档资料或者文档资料不合格,必然给软件开发和维护带来许多严重的 困雅和问题。 (6)软件成本在计算机系统总成本中所占的比例逐年上升。由于微电子学技术的进 步和生产自动化程度的不断提高,硬件成本逐年下降,然而软件开发需要大量人力,软件 成本随着通货膨张以及软件规模和数量的不断扩大而持续上升。美国在1985年软件成 本大约已占计算机系统总成本的90%, (7)软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深人的趋势。软 件产品“供不应求”的现象使人类不能充分利用现代计算机硬件提供的巨大潜力。 以上列举的仅仅是软件危机的一些明显的表现,与软件开发和维护有关的问题远远 不止这些。 www.TopSage.com
www.TopSage.com
第1章软件工程学概述3 1.1.2产生软件危机的原因 在软件开发和维护的过程中存在这么多严重问题,一方面与软件本身的特点有关,另 一方面也和软件开发与维护的方法不正确有关。 软件不同于硬件,它是计算机系统中的逻辑部件而不是物理部件。由于软件缺乏“可 见性”,在写出程序代码并在计算机上试运行之前,软件开发过程的进展情况较难衡量,软 件的质量也较难评价,因此,管理和控制软件开发过程相当困雅。此外,软件在运行过程 中不会因为使用时间过长而被“用坏”,如果运行中发现了错误,很可能是遇到了一个在 开发时期引入的在测试阶段没能检测出来的错误。因此,软件维护通常意味着改正或修 改原来的设计,这就在客观上使得软件较难维护。 软件不同于一般程序,它的一个显著特点是规模庞大,而且程序复杂性将随着程序规 模的增加而呈指数上升。为了在预定时间内开发出规模庞大的软件,必须由许多人分工 合作,然而,如何保证每个人完成的工作合在一起确实能构成一个高质量的大型软件系 统,更是一个极端复杂困难的问题,这不仅涉及许多技术问题,诸如分析方法、设计方法 形式说明方法、版本控制等,更重要的是必须有严格而科学的管理 软件本身独有的特点确实给开发和维护带来一些客观困雅,但是人们在开发和使用 计算机系统的长期实践中,也确实积累和总结出了许多成功的经验。如果坚持不懈地使 用经过实践考验证明是正确的方法,许多困难是完全可以克服的,过去也确实有一些成功 的范例。但是,目前相当多的软件专业人员对软件开发和维护还有不少糊涂观念,在实践 过程中或多或少地采用了错误的方法和技术,这可能是使软件问题发展成软件危机的主 要原因 与软件开发和维护有关的许多错误认识和作法的形成,可以归因于在计算机系统发 展的早期阶段软件开发的个体化特点。错误的认识和作法主要表现为忽视软件需求分析 的重要性,认为软件开发就是写程序并设法使之运行,轻视软件维护等。 事实上,对用户要求没有完整准确的认识就匆忙着手编写程序是许多软件开发工程 失败的主要原因之一。只有用户才真正了解他们自己的需要,但是许多用户在开始时并 不能准确具体地叙述他们的需要,软件开发人员需要做大量深入细致的调查研究工作,反 复多次地和用户交流信息,才能直正全面、准确、具体地了解用户的要求,对问题和目标 的正确认识是解决任何问题的前提和出发点,软件开发同样也不例外,急于求成,仓促上 阵,对用户要求没有正确认识就匆忙着手编写程序,这就如同不打好地基就盖高楼一样, 最终必然垮台。事实上,越早开始写程序,完成它所需要用的时间往往越长。 一个软件从定义、开发、使用和维护,直到最终被废弃,要经历一个漫长的时期,这就 如同一个人要经过胎儿、儿童、青年、中年和老年,直到最终死亡的漫长时期一样。通常把 软件经历的这个漫长的时期称为生命周期。软件开发最初的工作应是问题定义,也就是 确定要求解决的问题是什么:然后要进行可行性研究,决定该问题是否存在一个可行的解 决办法:接下来应该进行需求分析,也就是深入具体地了解用户的要求,在所要开发的系 统(不妨称之为目标系统)必须做什么这个问题上和用户取得完全一致的看法。经过上述 软件定义时期的准备工作才能进入开发时期,而在开发时期,首先需要对软件进行设计 www.TopSage.com
www.TopSage.com
4软件工程导论 (通常又分为概要设计和详细设计两个阶段),然后才能进人编写程序的阶段,程序编写完 之后还必须经过大量的测试工作(需要的工作量通常占软件开发全部工作量的40% 50%)才能最终交付使用,所以,编写程序只是软件开发过程中的一个阶段,而且在典型 的软件开发工程中,编写程序所需的工作量只占软件开发全部工作量的10%~20%。 另一方面还必须认识到程序只是完整的软件产品的一个组成部分,在上述软件生命 周期的每个阶段都要得出最终产品的一个或几个组成部分(这些组成部分通常以文档资 料的形式存在)。也就是说,一个软件产品必须由一个完整的配置组成,软件配置主要句 括程序、文档和数据等成分。必须清除只重视程序而忽视软件配置其余成分的糊涂观念 作好软件定义时期的工作,是降低软件成本提高软件质量的关键。如果软件开发人 员在定义时期没有正确全面地理解用户需求,直到测试阶段或软件交付使用后才发现“已 完成的”软件不完全符合用户的需要,这时再修改就为时已晚了。 严重的问题是,在软件开发的不同阶段进行修改需要付出的代价是很不相同的,在早 期引入变动,涉及的面较少,因而代价也比较低:而在开发的中期,软件配置的许多成分已 经完成,引人一个变动要对所有已完成的配 置成分都做相应的修改,不仅工作量大,而 且逻辑上也更复杂,因此付出的代价剧增: 在软件“已经完成”时再引入变动,当然需要 付出更高的代价。根据美国一些软件公司 的统计资料,在后期引入一个变动比在早期 后 引入相同变动所需付出的代价高2~3个数 变化出现的时期 量级。图1,1定性地描绘了在不同时期引 图1.1引人同一变动付出的代 入一个变动需要付出的代价的变化趋势。 价随时间变化的趋势 通过上面的论述不难认识到,轻视维护 是一个最大的错误。许多软件产品的使用寿命长达10年甚至20年,在这样漫长的时期 中不仅必须改正使用过程中发现的每一个潜伏的错误,而且当环境变化时(例如硬件或系 统软件更新换代)还必须相应地修改软件以适应新的环境,特别是必须经常改进或扩充原 来的软件以满是用户不断变化的需要。所有议些改动都属于维护工作,而且是在软件已 经完成之后进行的,因此维护是极端艰巨复杂的工作,需要花费很大代价。统计数据表 明,实际上用于软件维护的费用占软件总费用的55%~70%。软件工程学的一个重要目 标就是提高软件的可维护性,减少软件维护的代价。 了解产生软件危机的原因,澄清错误认识,建立起关于软件开发和维护的正确概念 还仅仅是消除软件危机的开始,全面消除软件危机需要一系列综合措施。 1.1.3消除软件危机的途径 为了消除软件危机,首先应该对计算机软件有一个正确的认识。正如1.1.2节中讲 过的,应该彻底消除在计算机系统早期发展阶段形成的“软件就是程序”的错误观念。 个软件必须由一个完整的配置组成,事实上,软件是程序、数据及相关文档的完整集合。 www.TopSage.com
www.TopSage.com
第1章软件工程学概述 其中,程序是能够完成预定功能和性能的可执行的指令序列;数据是使程序能够适当地处 理信息的数据结构;文档是开发、使用和维护程序所需要的图文资料。1983年IEEE为 软件下的定义是:计算机程序、方法、规则、相关的文档资料以及在计算机上运行程序时所 必需的数据。虽然表面上看来在这个定义中列出了软件的5个配置成分,但是,方法和规 则通常是在文档中说明并在程序中实现的。 更重要的是,必须充分认识到软件开发不是某种个体劳动的神秘技巧,而应该是一种 组织良好、管理严密、各类人员协同配合、共同完成的工程项目。必须充分吸取和借鉴人 类长期以来从事各种工程项目所积累的行之有效的原理、概念、技术和方法,特别要吸取 几十年来人类从事计算机硬件研究和开发的经验教训。 应该推广使用在实践中总结出来的开发软件的成功的技术和方法,并且研究探紫更 好更有效的技术和方法,尽快消除在计算机系统早期发展阶段形成的一些错误概念和 做法。 应该开发和使用更好的软件工具。正如机械工具可以“放大”人类的体力一样,软件 工具可以“放大”人类的智力。在软件开发的每个阶段都有许多繁琐重复的工作需要做, 在适当的软件工具辅助下,开发人员可以把这类工作做得既快又好。如果把各个阶段使 用的软件工具有机地集合成一个整体,支持软件开发的全过程,则称为软件工程支撑 环境 总之,为了解决软件危机,既要有技术措施(方法和工具),又要有必要的组织管理措 施。软件工程正是从管理和技术两方面研究如何更好地开发和维护计算机软件的一门新 兴学科。 1.2软件工程 1.2.1软件工程的介绍 概括地说,软件工程是指导计算机软件开发和维护的一门工程学科。采用工程的概 念、原理,技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前 能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这 就是软件工程 人们曾经给软件工程下过许多定义,下面给出两个典型的定义。 1968年在第一届NATO会议上曾经给出了软件工程的一个早期定义:“软件工程就 是为了经济地获得可靠的且能在实际机器上有效地运行的软件,而建立和使用完善的工 程原理.”这个定义不仅指出了软件工程的目标是经济地开发出高质量的软件,而且强调 了软件工程是一门工程学科,它应该建立并使用完善的工程原理。 1993年IEEE进一步给出了一个更全面更具体的定义:“软件工程是:①把系统的 规范的、可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件; ②研究①中提到的途径。” 虽然软件工程的不同定义使用了不同词句,强调的重点也有差异,但是,人们普遍认 www.TopSage.com
www.TopSage.com