“软件工程”的概念起源于20世纪60年代,当时硬件(即计算能力)飞速发展,应用领域不断拓展,随之对软件的能力也寄予很大希望,而软件开发很难跟上硬件的发展并满足日益增长的应用需求,从而带来了很多问题,包括项目超出预算、延迟交付、需要大量调试和维护、未能完全满足需求,甚至完全不能满足需求等,这在当时被称为“软件危机”。1968年,北大西洋公约组织(North Atlantic Treaty Organization,NATO)召开了第一次涉及软件工程的会议,讨论了如何解决“软件危机”的问题,包括制定软件开发的指导方针和最佳实践,之后引出了关于软件开发范型、开发方法以及支持工具的研究,
20世纪70年代的发展主要体现出3个方面的成果:①提出了瀑布模型、演化模型、螺旋模型等软件开发的过程模型。②提出了结构化方法,它是一种面向数据流的开发方法,包括结构化分析、结构化设计、结构化程序设计等,也出现了与之相应的软件开发支撑工具。③随着软件项目规模的扩大,围绕软件项目管理提出了一些管理方法和支持工具。
20世纪80年代,计算机辅助软件工程(CASE)开始引起广泛关注,涉及用于设计和实现软件的一体化软件开发工具及环境,其目的是提高软件开发效率和质量。CASE工具和环境在20世纪90年代初达到顶峰。
面向对象的概念诞生于20世纪80年代,到20世纪90年代,面向对象方法受到广泛关注,包括面向对象分析、面向对象设计和面向对象语言,出现了多个面向对象方法。后来基于这些主要面向对象方法,提出了统一建模语言(UML),随之还出现了统一软件开发过程。基于构件的软件工程(CBSE)也是这个时代的重要成果之一,这是一种基于可复用构件组装系统的开发方法。软件体系结构的研究也始于这个阶段。针对软件开发组织的软件过程模型成为热点,其中代表性成果之一是能力成熟度模型(CMM),它于1986年开始创建,对五个成熟度级别的过程域和实践的完整定义在20世纪90年代完成。
进入21世纪以来,在软件开发方法方面,随着软件服务化成为趋势,出现了面向服务的软件工程,其基本理念是通过组合可复用服务来开发软件系统。在软件开发过程方面,开始关注敏捷的或轻量级的软件开发,即敏捷开发过程(Agile)。开源、众包等基于互联网的软件工程实践蓬勃发展,成为新的软件开发模式,并催生新的软件生态。随着人工智能技术特别是深度学习的发展,在软件开发任务上引入基于深度学习的技术正在得到越来越多的重视。
1963~1964年,美国女数学家、计算机科学家M.汉密尔顿[注](Margaret Hamilton,玛格丽特·汉密尔顿,1936-08-16~ )在为阿波罗航天器开发制导和导航系统的时候发明了“软件工程”这一术语。
1965年6月,《计算机与自动化》杂志给出的公司提供服务列表中正式出现“软件工程”这个词。1966年8月,在美国计算机协会(Association for Computing Machinery,ACM)的《计算机协会通讯》(Communications of the ACM,1958~ )(第9卷第8期)中,“软件工程”一词在时任主席的A.A.奥廷格[注](Anthony A.Oettinger,安东尼·奥廷格,1929-03-29~ )的“致计算机协会会员”的信中出现。
1968年,F.L.鲍尔[注](Friedrich L.Bauer,1924-06-10~ )主持召开了NATO关于“软件工程”的会议,这是第一次关于“软件工程”的研讨会。
1984年,作为美国联邦政府资助的研发中心,软件工程研究所(Software Engineering Institute,SEI)正式成立,其总部设在美国卡内基梅隆大学(Carnegie Mellon University,CMU)。
软件工程要解决的问题是如何高效率高质量地开发出符合要求的软件产品。包含3个方面的含义:①软件工程的产出是产品,产品形态是软件,这决定了软件工程学科的研究对象。②软件工程需要高效高质地开发出这类产品,工程化是实现这个目标的手段,一般来说,需要依据合适的方法,遵循管理有序的生成过程,以及可操作的质量保障手段。这形成了软件工程学科的核心研究范畴。③软件产品要用于解决现实世界中领域相关的问题,其产品的使用需要能为相关领域带来价值。软件价值观的理念,将软件工程学科的研究范畴拓展到领域工程,需求工程成为领域工程和软件开发过程间的桥梁。
软件工程的研究内容主要包括软件开发方法、软件开发过程、软件质量保障和软件过程管理,以及软件工程工具等。代表性的软件开发方法类别有结构化系统分析和设计方法、面向对象分析和设计方法、基于构件的软件开发方法、面向服务的软件开发方法和网构化软件开发方法等。
软件开发活动指生产一个最终满足需求且达到工程目标的软件产品所需要的活动,包括需求分析、设计、实现、验证/确认和维护。需求分析在一个抽象层上建立系统模型,它产生的需求规约作为软件开发人员和客户之间的契约,并作为后续开发阶段的输入。设计定义实现需求规约的软件解决方案,产生设计规约。实现完成从设计规约到代码的转换,需要选择实现语言和相应工具。验证/确认则对需求规约、设计规约和实现代码进行评估,包括单元测试、集成测试和系统测试等。维护是在软件发布后的包括对错误的修正以及为应对环境变化所进行的必要调整等。
软件工程管理围绕5大要素(人员、进度、质量、成本和实现)进行软件项目的规划、组织、控制和评估,是传统工程管理原理和方法针对软件特点的延伸和适应性定制。20世纪90年代出现的能力成熟度模型(CMM)是已主要采用的一种管理标准,它将软件能力成熟度分为5个等级,结构化地描述了处于不同等级的组织的软件开发行为、遵循的流程以及产生的结果,为软件开发组织建立了改善其开发过程的一个框架,为评估软件开发组织的能力给出了一种度量方法。软件质量保障分为4个方面:①确定正确性、功效性、方便性、易维护性、可测性、鲁棒性、可用性等特性,定义软件质量体系。②建立软件质量标准,包括软件质量需求评价准则、软件质量设计评价准则和软件质量度量评价准则。③提出软件能力的形式规约和验证技术,倡导“保证正确性的构造”的形式化方法。④提出一系列软件分析和软件测试技术和工具。例如,ISO9000标准主要提供过程和质量管理体系的基础知识和管理原则。
软件工程工具包括集成化软件开发环境(IDE)、软件运维工具和软件管理工具等,前者包括如分析和建模工具、代码编辑工具、代码测试工具、程序分析和验证工具、以及软件度量工具,软件运维工具指软件交付之后支持软件的运行和维护的工具。随着软件服务化与云化,软件开发运维一体化(DevOps)逐步兴起,形成涵盖开发、构建、测试、集成及交付、容器平台等子领域的工具集。软件管理工具主要包括项目进度管理工具、软件版本配置管理工具等,对软件开发过程和制品进行管理等。
软件工程领域重要的学术机构和刊物包括:①卡内基梅隆大学-软件工程学院(CMU-SEI),其网址:https://www.sei.cmu.edu;②IEEE软件工程汇刊(IEEE Transactions on Software Engineering, 1975~ );③《计算机协会软件工程和方法论汇刊》(ACM Transactions on Software Engineering and Methodology, 1992~ );④国际软件工程大会(The International Conference on Software Engineering, ICSE);⑤计算机协会(ACM)欧洲软件工程会议和软件工程基础联合研讨会(The ACM Joint European Software Engineering Conference and Symposium on the Foundations of Software Engineering, ESEC/FSE)。
在人、机、物三元融合的“泛在计算”时代,软件工程面临应用范围的扩展、计算平台的泛化和方法技术的发展等三个方面的挑战。在“软件定义一切”的时代背景下,软件需求空间大幅度扩展,需求场景和运行环境增大软件系统的规模和复杂性,这都给软件开发和演化带来巨大挑战,对软件质量的要求日益提高,除系统复杂性给软件功能正确性和性能提出更高的要求外,软件的可靠性、安全性、保密性和隐私性等引起广泛关注。这些需求也引出了观察软件工程学科的新视角,包括以驾驭复杂性为目标的系统观、以泛在服务和持续演化为特征的形态观、以使用质量为核心的价值观和以关注群体协作平衡的生态观,这些构成了软件工程未来发展的核心内涵。