
1.2 软件工程的定义
1.软件危机
软件工程来源于软件危机,即先有软件危机,后有软件工程。
20世纪60年代中期,在美国出现了软件危机(Software Crisis),它表现在研发大型软件时,软件开发的成本增大、进度延期、维护困难和质量得不到保障。最突出的例子是美国IBM公司于1963—1966年开发的IBM360系列机操作系统。该软件系统花了大约5000人年的工作量,最多时有1000人投入开发工作,源程序代码近100万行。尽管投入了这么多的人力和物力,得到的结果却极其糟糕。据统计,该操作系统每次发行的新版本,都是从前一个旧版本中找出1000个程序错误而修正的结果。可想而知,这样的软件质量糟糕到什么地步。
由此可见,所谓软件危机,就是在软件开发和维护过程中所遇到一系列难以控制的问题。“软件危机”这个专业术语的首次出现,是1968 年NATO(North Atlantic Treaty Organization,北约)的计算机科学家,在联邦德国召开的国际学术会议上提出的。
为了克服软件危机,同样是在1968年,北约科技委员会召集了近50名一流的编程人员、计算机科学家和工业界巨头,讨论和制定摆脱“软件危机”的对策。就在那次会议上,第一次提出了软件工程(Software Engineering)这个专业术语。当时人们的想法是:若借用建筑工程或机器制造工程的思想、标准、规范、规程去开发软件与维护软件,也许能克服软件危机。以后的实践证明:用工程的方法开发软件与维护软件是个好主意,但是要完全克服软件危机,还有许多其他工作要做。
2.软件工程定义
1993年,权威杂志IEEE对软件工程的定义是:软件工程是将系统化的、严格约束的、可量化的方法,应用于软件开发、运行和维护中去。
2001年,软件工程大师Roger S Pressman对软件工程的定义是:软件工程是一个过程、一组方法和一系列工具。
由于软件技术飞速发展,所以软件工程的定义也要与时俱进。下面,根据当前软件技术的进展状况,给出现代软件工程的最新定义。
软件工程是研究软件开发和软件管理的一门工程学科。
这里,一是强调开发。开发是软件工程的主体,开发是在规定的时间、按照规定的成本、开发出符合规定质量要求的软件。二是强调管理,或过程管理。当然,开发中有管理,管理是为了更好地开发。所以开发和管理是一个问题的相辅相成的两个方面。许多软件项目的失败,不是在开发技术上出了问题,而是在管理过程上出了问题。所以在某种程度上说,对于一个软件企业,过程管理比开发技术更重要。三是强调工程。要将软件的开发(包括维护)当作一项工程,既要按照工程的办法去开发,又要按照工程的办法去管理。四是强调学科。时至今日,软件工程不只是一门课程,而是一个学科体系,即软件工程知识体系。
3.软件工程学科体系
软件工程作为一个学科体系,到21世纪初才初步形成。2001年4月18日,美国发布了软件工程知识体系指南SWEBOK(guide to the SoftWare Engineering Body Of Knowledge)0.95版。2004年,软件工程学科体系的内容才基本确立,就在这一年,美国ACM和IEEE-CS联合制订了SWEBOK 2004年版,它将软件工程学科体系的知识划分为如下10个知识域:
(1)软件需求(Software Requirements)。软件需求是真实世界中的问题而必须展示的特性。软件需求知识域有7 个子域:需求基础、需求过程、需求获取、需求分析、需求规格说明、需求确认、实践考虑。
(2)软件设计(Software Design)。软件设计既是定义一个系统的体系结构、组件、接口和其他特征的过程,又是这个过程的结果。软件设计知识域有6 个子域:软件设计基础、软件设计关键问题、软件结构与体系结构、软件设计质量的分析与评价、软件设计符号、软件设计的策略与方法。
(3)软件构造(Software Construction)。它指通过编码、验证、单元测试、集成测试和排错的组合,具体创建一个可以工作的、有意义的软件。其知识域有3个子域:软件构造基础、管理构造、实际考虑。
(4)软件测试(Software Testing)。它是由在有限测试用例集合上,根据期望的行为对程序的行为进行的动态验证组成,测试用例是从实际上无限的执行域中适当选择出来的。软件测试知识域有5 个子域:软件测试基础和测试级别、测试技术、需求分析、与测试相关的度量、测试过程。
(5)软件维护(Software Maintenance)。软件一旦投入运行,就可能出现异常,运行环境可能发生改变,用户会提出新的需求。生命周期中的软件维护,从软件交付时开始。软件维护的知识域有4个子域:软件维护基础、软件维护的关键问题、维护过程、维护技术。
(6)软件配置管理(Software Configuration Management)。软件配置是为了系统地控制配置的变更,维护软件在整个系统生命周期中的完整性及可追踪性,而标志软件在不同时间点上的配置的学科。软件配置管理知识域有6个子域:软件配置管理过程管理、软件配置标志、软件配置控制、软件配置状态统计、软件配置审核、软件发行管理和交付。
(7)软件工程管理(Software Engineering Management)。进行软件工程的管理与度量,虽然度量是所有知识域的一个重要方面,但是这里所说的是度量程序的主题。软件工程管理知识域有6 个子域:启动和范围定义、软件项目计划、软件项目实施、评审与评价、关闭、软件工程度量。前5个覆盖软件过程工程管理,第6个描述软件度量的程序。
(8)软件工程过程(Software Engineering Process)。涉及软件工程过程本身的定义、实现、评定、度量、管理、变更和改进。软件工程过程知识域有4 个子域:过程实施与改变、过程定义、过程评定、过程和产品度量。
(9)软件工程工具和方法(Software Engineering Tool and Method)。它有软件工程工具、软件工程方法两个子域。
(10)软件质量(Software Quality)。处理跨越整个软件生命周期过程的软件质量的考虑,由于软件质量问题在软件工程中无处不在,其他知识域也涉及质量问题。软件质量知识域有3个子域:软件质量基础、软件质量过程、实践考虑。
在上述软件工程学科体系中,前5个知识域是讲软件开发,后5个知识域是讲软件管理。由此可见,软件工程知识体系包括软件开发和软件管理两大部分,所以软件工程的定义也应该包括软件开发和软件管理两项内容。
4.软件工程课程研究的内容
软件工程课程与软件工程学科体系是有区别的:前者是一门或一组课程,后者是一个知识体系;前者是一个局部问题,后者是一个整体问题。
作为一门软件工程课程,它研究的内容至今没有统一的说法。可以这么认为,软件工程课程研究的内容,应该涵盖“软件生命周期模型、软件开发方法、软件支持过程、软件管理过程”这4个方面,如表1-4所示。
表1-4 软件工程课程研究的内容

尽管软件生命周期模型和软件支持过程非常重要,但是现代软件工程研究的重点,仍然是软件开发方法和软件管理过程。在软件管理过程的内容中,除了ISO 9001和CMMI之外,还将软件企业文化也列入其中,如微软企业文化、敏捷文化现象和IBM企业文化。
【例1-2】 请读者开发一个“图书馆信息系统”,即图书馆MIS。这是一项小型软件工程,为了完成这项任务,读者首先要选择软件生命周期模型,确定开发方法,准备开发工具,设计开发环境和运行环境,然后进行需求分析、概要设计、详细设计、编程、测试、试运行、正式运行、验收和交付,最后是系统维护或系统升级换代。这样,读者就按照所选择的开发模型,走完了软件的一个生命周期。这一系列的软件开发过程和管理过程,就是软件工程。
5.软件工程基本原理
习惯上,人们常常把软件工程的方法(开发方法)、工具(支持方法的工具)、过程(管理过程)称为软件工程三要素。而把美国著名的软件工程专家B.W Boehm于1983年提出的7条原理,作为软件工程的基本原理。
(1)用分阶段的生命周期计划严格管理软件开发。阶段划分为计划、分析、设计、编程、测试和运行维护。
(2)坚持进行阶段评审。上一阶段评审不通过,就不能进入下一阶段开发。
(3)实行严格的产品版本控制。
(4)采用现代程序设计技术。
(5)结果应能清楚地审查。因此,对文档要有严格要求。
(6)开发小组的成员要少而精。
(7)要不断地改进软件工程实践的经验和技术,要与时俱进。
上述7 条原理,虽然是在面向过程的程序设计时代(结构化时代)提出来的。但是,直到今天,在面向元数据和面向对象的程序设计新时代,它仍然有效。根据“与时俱进”的原则,还有一条基本原理在软件的开发和管理中特别重要,需要补充进去,作为软件工程的第8条基本原理。
(8)二八定律。对软件项目进度和工作量的估计:一般人主观上认为已经完成了80%,但实际上只完成了20%;对程序中存在问题的估计:80%的问题存在于20%的程序之中;对模块功能的估计:20%的模块,实现了80%的功能;对人力资源的估计:20%的人,解决了软件中80%的问题;对投入资金的估计:企业信息系统中80%的问题,可以用20%的资金来解决。
在软件开发和管理的历史上,有无数的案例都验证了二八定律。所以,软件工程发展到今天,可以认为它的基本原理共有8条。
研究二八定律的现实意义,在于指导软件开发计划的制订与执行。如果事先掌握了二八定律,就能自觉地用二八定律去制订、跟踪与执行软件开发计划。也就是说,计划中要用开始的20%时间,去完成80%的开发进度;剩下20%的进度,要留下80%的时间去完成。只有这样,项目的开发计划与项目的开发进度才能吻合。
6.软件工程在中国
1982年,软件工程的创始人、美藉华人叶祖尧博士,带着自己开创的“软件工程学”理论来到中国,成为当时中国政府计算机领导小组的顾问。他制定了一项“中国软件发展计划”,提交给当时的国务院主要领导,从此,软件工程在中国开始启动。1984年,国家科委在北京召开“软件工程”大会。会议期间,国防科技大学陈火旺院士与孟庆余教授,宴请了美国软件工程专家叶祖尧博士。席间,时任美国马里兰大学计算机系主任的叶祖尧博士说:“软件工程,只有你们长沙(国防科技大学)并行机的研究搞得最好!”
根据《软件工程技术概论》(北京:科学出版社,2002)一书的记载,中国软件工程的第一本书籍,是由朱三元等人编著的《软件工程指南》,出版时间为1985年。