01、软件工程基础
软件工程的定义
软件工程是一门指导进行计算机软件开发和维护的工程学科,涉及计算机科学、工程科学、管理科学等多学科,主要研究如何应用软件开发的科学理论和工程技术来指导大型软件系统的开发。
1983年,IEEE给出的定义为:“软件工程是开发、运行、维护和修复软件的系统方法”。主要思想是强调在软件开发过程中需要应用工程化原则的重要性。
概括来说,软件工程涵盖了工程原理、技术方法和管理技术。其中,工程原理用于制定规范、设计范型、评估成本及确定权衡;技术方法用于构建模型与算法;管理技术用于计划、资源、质量、成本等管理。
软件工程的发展历程
随着计算机软件从简单地用于数值计算到广泛应用于各行各业,软件工程的发展经历了结构化开发软件工程、面向对象开发软件工程、构件化开发软件工程、网构技术软件工程和智能化开发软件工程五个阶段。
(1) 结构化开发软件工程阶段。
20世纪60年代末,人们主要采取“生产作坊”的开发方式,软件开发效率低下,产品质量低劣,引发了“软件危机”。为解决这些问题,1968年北大西洋公约组织(NATO)第一次提出“软件工程”的概念,核心是将软件工程纳入工程化的轨道,保证软件开发的质量和效率,被称为第一代软件工程。
(2) 面向对象开发软件工程阶段。
20世纪80年代中到90年代,以Smalltalk为代表的面向对象程序设计语言相继推出,面向对象的方法和技术得到发展。软件工程研究的重点从程序设计语言转移到面向对象的分析和设计,其核心是CASE工具和环境的研发。面向对象方法通过设计模式、软件体系结构和体系结构描述语言以及UML技术得到进一步发展,这一阶段又称为第二代软件工程。
(3) 构件化开发软件工程阶段。
20世纪90年代,随着软件规模和复杂度不断增大,为了降低生产成本,适应需求变化,软件复用和构件技术受到关注。软件构件可封装高密度的、高复杂度的业务逻辑,软件系统的开发可通过使用现成的、可复用的软件构件组装完成,无须全部重新构造,以此达到提高效率和质量,降低成本的目的,这一阶段又称为第三代软件工程。
(4) 网构技术软件工程阶段。
2000年左右,互联网逐渐发展为一种全球泛在的计算基础设施,形成一个互联网计算平台,此时网构软件技术得到发展。网构软件包括一组分布于环境下各个节点的、具有主体化特征的软件实体,以及一组用于支撑这些软件实体以各种交互方式进行协同的连接子,具备自主性、协同性、情景性、涌现性和演化性,这一阶段又称为第四代软件工程。
(5) 智能化开发软件工程阶段。
2010年以后,以深度学习为代表的人工智能迅猛发展,智能化开发软件工程泛指将演化计算、机器学习、深度学习等人工智能新技术应用于软件工程领域,解决围绕软件全生命周期的各种典型软件工程任务(如代码生成、软件测试与缺陷定位、自动修复等),以提高软件的质量和开发效率。2020年以后,随着云原生的普及,容器化、微服务化、虚拟化成为许多云技术产品的基础性技术。这一阶段又称为第五代软件工程。
软件工程开发方法
在软件开发的过程中,软件开发方法是关系到软件开发成败的重要因素。软件开发方法就是软件开发所遵循的办法和步骤,以保证所得到的运行系统和支持的文档满足质量要求。
软件开发的基本方法包括结构化方法、面向对象方法、面向构件方法和面向行业领域方法等,本书鉴于篇幅原因,仅介绍结构化方法和面向对象方法。
(1) 结构化方法。
结构化方法是较传统的软件开发方法。结构化的基本思想可以概括为自顶向下、逐步求精,采用模块化技术和功能抽象将系统按功能分解为若干模块,从而将复杂的系统节解为若干子系统,子系统又可以分解为更小的子任务,最后的子任务都可以独立编写成子程序模块。模块内部由顺序、选择和循环等基本控制结构组成。
这些模块功能相对独立,接口简单,使用维护非常方便。所以,结构化方法是一种非常有用的软件开发方法,是其他软件工程方法的基础。
但是,由于结构化方法将过程和数据分离为相互独立的实体,因此开发的软件可复用性较差,在开发过程中要使数据和程序始终保持相容也很困难。这些问题通过面向对象方法能得到很好的解决。
(2) 面向对象方法。
面向对象方法是针对结构化方法的缺点,为了提高软件系统的稳定性、可修改性和可重用性而逐渐产生的。面向对象方法最开始主要用在程序编码中,之后又逐渐出现了面向对象的分析和设计方法,是当前软件开发方法的主要方向。
面向对象方法的出发点和基本原则,主要体现在开发软件的过程中,尽可能模拟人类习惯的思维方式,将客观世界的实体抽象成程序语言中的封装对象,它主要有以下几个特点。
① 认为客观世界是由各种对象组成的,任何事物都是对象。
② 把所有对象都划分为各种对象类,每个类定义一组数据和一组方法。
③ 按照子类与父类的关系,把若干对象类组成一个层次结构的系统。
④ 对象彼此之间仅能通过传递消息相互联系。
面向对象方法的主要优点是使用现实的概念抽象地思考问题,从而自然地解决问题,保证软件系统的稳定性、可重用性以及良好的维护性。但是面向对象方法也不是十全十美的,在实际的软件开发中,常常要综合地应用结构化方法和面向对象方法。