软件工程这一概念已提出40多年,对软件工程的理解是不断深入的。作为一门新兴的交叉性学科,它所研究的对象、适用范围和所包含的内容都在不断发展和变化。
1.软件工程的定义
在NATO会议上,软件工程被定义为:“为了经济地获得可靠的和能在实际机器上高效运行的软件,而建立和使用的健全的工程原则。”这个定义虽然没有提到软件质量的技术层面,也没有直接谈到用户满意程度或要求按时交付产品等问题,但人们已经认识到借鉴和吸收对各种工程项目开发的经验,对软件的开发无疑是有益的。
软件工程是指导计算机软件开发和维护的工程学科。它强调按照软件产品的生产特性,采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前最好的技术结合起来,以便经济地开发出高质量的软件并有效地维护它。
由于引入了软件工程的思想,把其他工程技术研究和开发领域中行之有效的知识和方法运用到软件开发工作中来,提出了按工程化的原则和方法组织软件开发工作的解决思路和具体方法,在一定程度上缓解了“软件危机”。
2.软件工程的目标
软件工程的目标是基于软件项目目标的成功实现而提出的,主要体现在以下几方面。
·软件开发成本较低。
·软件功能能够满足用户的需求。
·软件性能较高。
·软件可靠性高。
·软件易于使用、维护和移植。
·能按时完成开发任务,并及时交付使用。
在实际开发中,企图让以上几个质量目标同时达到理想的程度往往是不现实的。软件工程目标之间存在的相互关系如图1-1所示。从图中可以看出:有些目标之间是相互补充的,如易于维护和高可靠性之间、低开发成本与按时交付之间;有些目标是彼此相互冲突的,如若只考虑降低开发成本,很可能同时也降低了软件的可靠性,如果一味追求提高软件的性能,可能造成开发出的软件对硬件的依赖性较强,从而影响到软件的可移植性;不同的应用对软件质量的要求不同,如对实时系统来说,其可靠性和效率比较重要;对生命周期较长的软件来说,其可移植性、可维护性比较重要。

图1-1 软件工程目标之间的关系
软件工程的首要问题是软件质量。软件工程的目的就是在以上目标的冲突之间取得一定程度的平衡。因此,在涉及平衡软件工程目标这个问题的时候,软件的质量应该摆在最重要的位置加以考虑。软件质量可用功能性、可靠性、可用性、效率、可维护性和可移植性等特性来评价。功能性是指软件所实现的功能能够达到它的设计规范和满足用户需求的程度;可靠性是指在规定的时间和条件下,软件能够正常维持其工作的能力;可用性是指帮助使用者完成预期目标的能力;效率是指在规定的条件下用软件实现某种功能所需要的计算机资源的有效性;可维护性是指当环境改变或软件运行发生故障时,为了使其恢复正常运行所做努力的程度;可移植性是指软件从某一环境转移到另一环境时所做努力的程度。在不同类型的应用系统中对软件的质量要求是不同的。
3.软件工程知识体系及知识域
软件工程作为一门学科,在取得对其核心的知识体系的共识方面已经达到了一个重要的里程碑。2005年9月,ISO/IEC JTC1/SC7正式发布为国际标准,即ISO/IEC 19759—2005软件工程知识体系指南(SWEBOK)。SWEBOK将软件工程知识体系划分为10个知识域,分为两类过程。一类是开发与维护过程,包括软件需求、软件设计、软件构造、软件测试和软件维护;另一类是支持过程,包括软件配置管理、软件工程管理、软件工程过程、软件工程工具与方法、软件质量。每个知识域还可进一步分解为若干个论题,在论题描述中引用有关知识的参考文献,形成一个多级层次结构,以此确定软件工程知识体系的内容和边界。每个知识域的具体内容如表1-1所示。有关知识的参考文献涉及相关学科包括计算机工程、计算机科学、管理学、数学、项目管理、质量管理、软件人类工程学、系统工程等。
表1-1 软件工程知识体系指南的内容(https://www.xing528.com)

软件工程知识体系中涉及的主要技术要素包括软件开发方法、软件开发工具和软件过程。
(1)软件开发方法
软件开发方法是在工作步骤、软件描述的文件格式、软件的评价标准等方面做出规定。它主要解决什么时候做什么,以及怎样做的问题,是软件工程最核心的研究内容。实践表明,在开发的早期阶段多做努力,就会使后来的测试和维护阶段缩短,从而使费用大大缩减,因此,针对分析和设计阶段的软件开发方法特别受到重视。目前,人们提出了结构化方法、面向数据结构方法、原型化方法、面向对象的方法、形式化方法等多种实用有效的软件开发方法,利用这些方法确实也开发出不少成功的系统,但各种开发方法具有一定的适用范围,所以选择正确的开发方法是非常重要的。
针对软件开发方法的评价一般是通过以下4个方面来进行。
①技术特征:支持各种技术概念的方法特征,如层次性、抽象性(包括数据抽象和过程抽象)、并行性、安全性、正确性等。
②使用特征:具体开发时的有关特征,如易理解性、易转移性、易复用性、工具的支持、使用的广度、活动过渡的可行性、易修改性、对正确性的支持等。
③管理特征:对软件开发活动管理的能力方面的特征,如易管理性、支持协同工作的程度、中间阶段的确定、工作产物、配置管理、阶段结束准则和代价等。
④经济特征:对软件机构产生的质量和生产力方面的可见效益,如分析活动的局部效益、整个生命周期效益、获得该开发方法的代价、使用它和管理它的代价等。
下面重点介绍一些常用的软件开发方法。
·结构化方法。结构化方法是传统的基于软件生命周期的软件工程方法,自20世纪70年代产生以来,获得了极有成效的软件项目应用。结构化方法是以软件功能为目标来进行软件构建的,包括结构化分析、结构化设计、结构化实现、结构化维护等内容。这种方法主要通过数据流模型来描述软件的数据加工过程,并可以通过数据流模型,由对软件的分析过渡到对软件的结构设计。
·JSD方法。JSD方法主要用在软件设计上,1983年由法国学者Jackson提出。它以软件中的数据结构为基本依据来进行软件结构与程序算法设计,是对结构化软件设计方法的有效补充。在以数据处理为主要内容的软件系统开发中,JSD方法具有比较突出的设计建模优势。
·面向对象方法。面向对象方法是从现实世界中客观存在的事物出发来构造软件,包括面向对象分析、面向对象设计、面向对象实现、面向对象维护等内容。一个软件是为了解决某些问题,这些问题所涉及的业务范围被称作该软件的问题域。面向对象强调以问题域中的事物为中心来思考问题、认识问题,并根据这些事物的本质特征,把它抽象地表示为系统中的对象,作为系统的基本构成单位。确定问题域中的对象成分及其关系,建立软件系统对象模型,是面向对象分析与设计过程中的核心内容。自20世纪80年代以来,人们提出了许多有关面向对象的方法,其中,由Booch、Rumbaugh、Jacobson等人提出的一系列面向对象方法成为主流方法,并被结合为统一建模语言(UML),成为面向对象方法中的公认标准。
(2)软件开发工具
软件开发工具是指用来辅助软件开发、维护和管理的软件。现代软件工程方法得以实施的重要保证是软件开发工具和环境。软件开发工具使软件在开发效率、工程质量、减少软件开发对人的依赖性等多方面得到改善。软件开发工具与软件开发方法有着密切的关系,软件开发工具是软件方法在计算机上的具体实现。
软件开发环境是方法与工具的结合,以及配套软件的有机组合。该环境旨在通过环境信息库和消息通信机制实现工具的集成,从而为软件生命周期中某些过程的自动化提供更有效的支持。集成机制主要实现工具的集成,使之能够系统、有效地支持软件开发。
(3)软件过程
尽管有软件开发工具与工程化方法,但这并不能使软件产品生产完全自动化,它们还需要合适的软件过程才能真正发挥作用。软件过程是指生产满足需求且达到工程目标的软件产品所涉及的一系列相关活动,它覆盖了需求分析、系统设计、实施以及支持维护等各个阶段。这一系列活动就是软件开发中开发机构需要制订的工作步骤。
软件过程有各种分类方法。按性质划分软件过程可概括为基本过程类、支持过程和组织过程类。按特征划分有管理过程、开发过程与综合过程。按人员的工作内容来分类有获取过程、供应过程、开发过程、运作过程、维护过程、管理过程与支持过程。软件过程研究的对象涉及从事软件活动的所有人。提高软件的生产率和质量,其关键在于管理和支持能力。所以,软件过程特别重视管理活动和支持活动。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
