购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3 软件工程的发展历史

1.3.1 软件开发历程

软件是由计算机程序和程序设计的概念发展演化而来的,是在程序和程序设计发展到一定规模并且逐步商品化的过程中形成的。伴随着计算机技术的发展,软件开发经历了程序设计阶段、软件设计阶段和软件工程阶段。

程序设计阶段出现在1946—1955年。世界上第一台通用计算机ENIAC于1946年在美国宾夕法尼亚大学诞生。它是一个庞然大物,用了18000个电子管,占地170平方米,重达30吨,耗电功率约150千瓦,每秒钟可进行5000次运算。ENIAC是研究用大型机,以电子管作为元器件,体积很大,耗电量大,易发热,工作的时间不能太长。在此第1代计算机(电子管)阶段尚无软件的概念,程序设计主要围绕硬件进行开发,追求节省空间和编程技巧,规模很小,工具简单,无明确分工(开发者和用户),无文档资料(除程序清单外),主要用于科学计算。

软件设计阶段出现在1956—1970年。这是第2代计算机(晶体管数字机)和第3代计算机(集成电路数字机)阶段,逐渐出现了商业大型机和商业微型机。其特点是:硬件环境相对稳定,出现了软件作坊式的开发组织形式;开始广泛使用产品软件(可购买),从而建立了软件的概念,出现了BIOS、操作系统、数据库管理系统等系统软件,并出现了瀑布模型。随着计算机技术的发展和计算机应用的日益普及,软件系统的规模越来越庞大,从科学计算转向业务应用,高级编程语言层出不穷,应用领域不断拓宽,开发者和用户有了明确的分工,社会对软件的需求量剧增,逐渐形成了结构化编程和结构化分析设计的软件开发技术,但软件产品的质量不高,生产效率低下,从而导致了软件危机的产生,即落后的软件生产方式无法满足迅速增长的计算机软件需求,导致软件开发与维护过程中出现了一系列的严重问题。

软件工程阶段出现在1970年后至今。这是第4代计算机(大规模集成电路机)及其后的阶段,个人计算机开始流行,也有了图形化操作系统。软件危机迫使人们不得不研究、改变软件开发的技术手段和管理方法,形成了现代结构化方法、面向对象编程和软件复用,开始使用增量演化的开发模型,从此软件生产进入了软件工程时代。此阶段的特点是:硬件已向巨型化、微型化、网络化和智能化四个方向发展,数据库技术已成熟并被广泛应用,第三代、第四代编程语言出现;第一代软件技术(结构化程序设计)在数值计算领域取得优异成绩;第二代软件技术(软件测试技术、方法、原理)用于软件生产过程;第三代软件技术(处理需求定义技术)用于软件需求分析和描述。

随着Intranet和Internet技术的蓬勃发展,网络操作系统、中间件平台、面向Web的中间件平台等也促进了软件开发技术的发展和成熟,敏捷开发日益流行。未来将在Internet平台上进一步整合资源,形成巨型的、高效的、可信的虚拟环境,使所有资源能够高效、可信地为所有用户服务,这成为软件技术的研究热点之一。软件复用和软件构件技术被视为解决软件危机的一条现实可行的途径,是软件工业化生产的必由之路。软件工程会朝着开放性计算的方向发展,朝着可以确定行业基础框架、指导行业发展和技术融合的开放计算前进。

1.3.2 软件工程定义

软件工程是把系统的、有序的、可量化的方法应用于软件的开发、运营和维护的过程。软件工程包括下列领域:软件需求分析、软件设计、软件构建、软件测试和软件维护。软件工程和下列学科相关:计算机科学、计算机工程、管理学、数学、项目管理学、质量管理、软件人体工学、系统工程、工业设计和用户界面设计。

“软件工程”一词于1968年北大西洋公约组织(NATO)在德国召开的一次会议上首次被提出。它的主要思想是:把软件当成一种产品,并要求采用工程化的原理与方法对软件进行计划、开发和维护。

著名软件工程专家B. Boehm综合有关专家和学者的意见并总结了多年来开发软件的经验,于1983年在一篇论文中提出了软件工程的7条基本原理:用分阶段的生命周期计划进行严格的管理,坚持进行阶段评审,实行严格的产品控制,采用现代程序设计技术,软件工程结果应能清楚地审查,开发小组的人员应该少而精,承认不断改进软件工程实践的必要性。

软件工程的定义(IEEE610.12—1990)为:①应用系统、规范、可量化的方法来开发、运行和维护软件,即将工程应用到软件;②对①中各种方法的研究。

因此,软件工程是一种工程活动,具有解决实际问题的动机,应用科学知识指导工程活动,并以成本效益比有效为基本条件,构建机器或事物,以服务人类为最终目的。

为何要以工程的方式进行软件的开发维护?这是因为:软件需求日益复杂,需要满足不同类型用户的多种需求,并且能长时间提供稳定可靠的服务;软件系统太复杂,可能包含数以百万计的代码行;人们的生命、财产依赖于软件,因此软件的责任重大,尤其是在如今“软件定义一切”的时代。

“工程”在各种行业都有,通常包括构想、分析、建设、交付、运行这几大阶段。工程具有系统性、规范性、可度量性,因而软件工程也以科学性、实践性、工艺性并重:计算机科学建立了软件生产的知识基础,例如软件开发的理论、方法、技术、模型等;给出了多种实践方法(配置管理、风险控制、需求管理等)与原则(模块化、信息隐藏、OO设计等);工艺性则体现在个人的直觉和非理性能力上,尤其在软件分析与设计活动中。

在现实世界中,软件危机、焦油坑比比皆是,但遗憾的是“没有银弹”;且要解决的实际问题范围广泛,没有行业和领域限制,需要客户和用户的紧密合作;另外,要解决的实际问题通常模糊不清,用户通常有很多疑问:为什么软件需要如此长的开发时间?为什么开发成本居高不下?为什么在将软件交付顾客使用之前无法找到所有的错误?为什么维护已有的程序要花费如此多的时间和人工?为什么软件开发和维护的进度仍旧难以度量?

为达到软件“优质高产”这个目标,人们从技术到管理都做了大量的努力,逐渐形成了“软件工程学”这一新学科。软件工程学的主要组成成分包括软件工程方法学、软件工程环境以及软件工程管理的基本内容和作用,既包括了计算机科学家的研究成果,也总结了广大软件工作者的实践经验。软件开发技术可涵盖形式化方法与非形式化方法两大分支。前者以形式化的程序变化和验证为主要内容,目的在于达到程序设计的自动化,多用于计算机应用人员。后者主要讨论的是工程化的软件开发技术,包括软件开发方法、软件工具、软件工程环境、软件工程管理学等多个方面,这也是本书重点介绍的内容。

1.软件开发方法

软件工程的方法提供了构建软件在技术上需要“如何做”,涵盖了一系列的任务——需求分析、设计、编程、测试和维护。这是在20世纪60年代后期逐步形成的一种软件开发方法,在不同的软件开发阶段对应有不同的方法。

例如,在软件的设计阶段,有结构化分析与设计方法以及面向对象的程序设计方法等。在面向对象的程序设计方法中,数据和数据的操作被封闭在一个称为对象(Object)的统一体中,对象之间则通过消息(message)进行沟通。软件所描述的系统与客观世界的系统在结构上十分相似,不仅提高了软件的可修改性与可维护性,也提高了软件的可重用性,这是工程多年来所追求的目标。从结构化程序设计到面向对象程序设计是程序设计方法的又一次飞跃。

在软件测试阶段,有黑盒与白盒测试技术。其中黑盒强调功能测试,在接口层面上工作包括等价类划分、边界值分析、决策表、因果图等技术;白盒强调结构测试,在源代码基础上工作,包括语句覆盖、分支覆盖、条件覆盖、基本路径覆盖等技术。

2.软件工具

为了提高软件设计的质量和生产效率,目前已经实现了许多帮助开发和维护软件的软件,即工具。在不同的开发时期,要用到不同的软件开发工具。

例如,我们要用某种语言来开发一个应用软件,就要涉及编辑程序、编译程序、连接程序等;另外,在软件测试阶段还要用到测试数据产生器、排错程序、跟踪程序、静态分析工具和覆盖监视工具等。软件工具发展迅速,许多用于软件分析和设计的工具正在建立,其目标就是要实现软件生产的自动化。

软件方法和工具是软件开发的两大支柱,它们之间密切相关。软件方法提出了明确的工作步骤和标准的文档格式,这是设计软件工具的基础;而软件工具的实现又将促进软件方法的推广和发展。

3.软件工程环境

“环境”一词对不同用户有着不同的含义。

对最终用户(end user)而言,环境是他们运行程序所使用的计算机系统。这类用户对环境的要求主要是运行可靠、操作方便、容易学习和使用。

对软件开发人员(developer)来说,环境是他们进行软件开发活动的舞台,例如集成开发环境(IDE)的界面采用菜单来完成各种功能。目前生产数据库管理软件的环境有大型数据库软件Sybase、能帮助进行程序设计的PB软件等。

4.软件工程管理学

对于一个企业来说,如果只有先进的设备和技术,而没有完善的管理,是不可能获得应有的经济效益的。软件生产也一样,如果管理不善,是不可能高质量、按时完成任务的。软件工程管理就是对软件工程生命周期内的各阶段的活动进行管理。软件工程管理的目的是能按预期的时间和费用,成功地完成软件的开发和维护任务。

软件工程管理学的内容包括软件费用管理、人员组织、工程计划管理、软件配置管理等各项内容。软件工程管理也可借助计算机来实现,估算成本、指定进度、生成报告的管理工具已经在许多公司得到了使用。一个理想的软件工程环境,应该同时具备支持开发和支持管理的工具。

1.3.3 软件工程生命周期模型

一切工业产品都有自己的生命周期,软件(产品)也不例外。生命周期是软件工程的重要概念,刻画软件从产生、发展到成熟直至衰亡的过程。它把软件形成产品的整个过程划分为若干个阶段,并赋予每个阶段相对独立的任务。我们可以从软件开发模型观测出软件生命周期中每个阶段的任务。目前使用较多的软件工程生命周期模型有:瀑布模型、原型模型、进化树模型、迭代-递增模型、编码-修补模型和开源模型等。下面介绍瀑布模型和原型模型。

1.瀑布模型

瀑布模型是1970年由W. Royce首先提出的。瀑布模型把软件生命周期分为计划时期、开发时期、运行时期。每个时期又可划分为若干个阶段。计划时期可分为问题定义、可行性研究两个阶段;开发时期包括需求分析、概要设计、详细设计、编码、测试等阶段;运行时期主要进行软件的维护和重构。这反映了软件开发中串行、连贯的步骤,其优点是:每一步的结果都是可验证的,能够减少风险并给团队提供稳定的流程支持。各阶段任务说明如下。

●问题定义:这是计划时期的第一步,主要是为了弄清楚“用户要计算机解决什么问题”。该阶段是软件生命周期中最短的阶段,一般只需要一两天左右。

●可行性研究:此阶段主要是论证解决问题的方案是否可行,由此确定工程规模和目标,再由系统分析员更准确地估算出系统的成本和效益。

●需求分析:此阶段的主要任务是确定系统必须具备哪些功能,并设计出由用户确认的系统逻辑模型。这一阶段要产生的文档资料比较多,包括数据流图、数据字典、简要的数据描述等。

●概要设计:此阶段主要是建立起系统的总体结构,并画出由模块组成的软件结构图。

●详细设计:此阶段需要把问题具体化,也就是把概要设计阶段所产生出的模块图进一步细化,设计出系统的详细规格说明书。

●编码:此阶段是由程序员来完成的,主要是利用指定的语言,把设计阶段所产生的各种图和文字描述翻译成源程序。

●测试:这是开发时期的最后一个阶段,通常是先进行每个模块的测试,即单元测试,然后再将模块装配在一起进行测试,即集成测试。

●运行维护时期:这是软件生命周期的最后一个阶段,此阶段的主要任务是对已实现的软件进行维护,其目的是延长软件的使用寿命并提高软件的运行效率。软件在运行期间会由于潜在的问题而发生错误;用户在使用后也会提出一些改进或扩充软件的要求;另外软件运行的硬件、软件环境有时也会发生变化。这些情况使软件需要不断地进行维护,才能继续使用而不至于被废弃。软件维护是软件生命周期中比较长的一个阶段。

瀑布模型在软件工程中占有很重要的地位,它提供了软件开发的基本框架,非常有利于大型软件开发过程中人员的组织、管理,有利于软件开发方法和工具的研究与使用,大大提高了大型软件项目开发的质量和效率。瀑布模型强调需求、设计的作用,前一阶段完成后只需关注后续阶段,为项目提供了按阶段划分的检查点,里程碑清晰,文档也很规范。

但瀑布模型也有其不足之处:直到循环结束才能得到软件,难以适应需求的频繁变化,里程碑、完成时间点是强制的,编写文档的工作量非常大。

因此,瀑布模型适合于稳定的软件产品定义和理解透彻的技术。

2.原型模型

在生产硬件或其他有形的工业产品时,我们常常会先制造一个样机,待成功后再批量生产。原型化软件开发的思想正是从硬件的样机生产借用过来的。但硬件生产的批量大,因制造样机增加的成本仅占很小的比例;而软件则属于单件生产,如果每开发一个软件都要先制造一个原型,那么成本就会成倍增加。

当我们获得一组基本需求说明后,可以通过快速分析构造出一个小型的软件系统,以满足用户的基本要求,接着用户可在试用原型系统的过程中得到亲身感受并受到启发,以做出反应和评价,然后开发者根据用户的意见对原型加以改进。通过不断试验、纠错、使用、评价和修改,获得新的原型版本,如此周而复始,逐步减少开发者与用户沟通中的误解,从而提高最终产品的质量。

因此在建立原型系统时,经常会这样处理:原型系统仅包括未来系统的主要功能,而不包括系统的细节,例如异常处理、对非有效输入的反应等;另外,为了尽快向用户提供原型,开发原型系统应尽量使用能缩短开发周期的语言和工具。

例如,早期UNIX支持的SHELL语言是一种功能很强的高级语言,有人用这种语言来编写办公室自动化的原型系统,仅用很短的时间就完成了编码和测试,比使用其他高级语言快许多倍。虽然SHELL语言在运行时需要很大的支撑系统,运行速度也比较慢,不适合用来实现最终的系统,但用它来开发原型系统能大大加快实现速度。

从瀑布模型开始的各种模型都有一个共同点:重计划、重事先设计、重文档表达。这类方法中的集大成者要算Rational统一流程(Rational Unified Process,RUP),RUP把软件开发的各个阶段整合在一个统一的框架里。在RUP中,一个项目分为几个里程碑(milestone),每个里程碑内部有几个迭代(iteration)。需要向开发团队提供开发环境、过程和工具,并提供配置和变更管理,以更好地进行项目管理。

1.3.4 软件工程的经济观点

作为一个工程项目,软件工程同样需要考虑成本、代价,但由于所属领域的特殊性,要注意以下较为特殊的经济观点。

1.开发的成本

使用新的编码技术CTnew比使用旧的编码技术CTold编写代码的时间少10%,那么选择哪种技术比较恰当?需要注意的是:引进新技术的花费包括培训费用以及学习过程、实践过程中的费用,维护问题也包括纠错性维护和增强性维护两大类。

2.纠错的代价

检测并纠正一个错误的成本在需求阶段可能只需要10美元,因为只要对文档进行修改即可;而到分析阶段就可能需要30美元,设计阶段可能需要40美元,到交互后维护阶段就可能需要2000美元,因为越到后期,成本代价就越高,需要编辑代码、重新编译和链接、验证问题是否解决,查看修改有无产生新的问题,更新相关文档,甚至重新交付、安装等。

3.人多不一定力量大

在实际项目开发中,个人编程较为少见,小组开发非常常见。这就涉及代码模块间的接口问题。例如,有模块P和Q,P调用Q,有5个参数,但顺序不同或者参数类型不同,需要花费很多的时间和精力来协调;又如,小组成员之间存在沟通问题,大量时间浪费在小组成员之间的协调上。试想一下:如果1个项目1个程序员1年完成,交给有6个人的小组,需要多长时间完成?具体可参见《人月神话》一书。 LxxGBVIK11DqZ3xDTJaUbjvCHNdUa8LFCJhh5KgM8SeC1ykyPjzylONgPZvQJQOX

点击中间区域
呼出菜单
上一章
目录
下一章
×