1.2 软件工程
软件工程(Software Engineering)是有创造力、有知识的人在定义好的、成熟的软件过程框架中进行的。软件工程术语首次出现在1968年北大西洋公约组织(NATO)会议上,是针对当时软件开发过程中存在的一些问题提出的一种解决思路,试图建立并使用正确的工程方法开发出成本低、可靠性好并能在机器上高效运行的软件。
1.2.1 软件工程的概念
软件工程师(Software Engineer)采用问题求解的过程,通过使用计算机来解决实际问题。大多数问题大而复杂,很难加以控制,特别是一些以前从没有遇到过的问题。那么,首先需要对问题进行分析,把一个大问题分解成许多能够理解的小的部分,对这些小的部分加以描述,如图1-4所示。
图1-4 问题分解的特征
罗马城不是一夜造成的,而是一天一天地逐步修建的。解决问题也是如此,要有耐心,从局部问题入手,不知不觉中你会发现,全局问题已经被解决了。从局部问题入手,将大问题分解成小问题,这一原则放之四海而皆准。经过分析之后,从各个子问题所代表的各个方面出发构造问题的解决方案,即从小的结构综合成大的结构。因此,任何一个问题的求解过程都是由两部分组成:一是分析问题、分解问题,寻求问题本质;另一个是基于分析的结果归纳综合问题的解决办法。为了解决问题,通常采用一系列的方法、工具、过程和模式。方法是对产生结果的标准规程描述;工具是一种仪器或者是自动化系统,可以提供更精确、更有效、更高质量的产品,如经常使用的剪刀比用手撕来得更直接、更有效;过程给出了任务完成的步骤或者活动;模式是一种风格,代表了一种特殊方式的执行过程。
软件工程师运用方法、工具、过程和模式来提高软件产品的质量,对实际问题给出有效的解决方案。
目前,在软件开发过程中主要存在以下一些问题。
(1)软件需求急剧增长。由于大规模集成电路的出现,使得计算机的硬件成本降低,对计算机使用的需求急剧增加,然而软件生产率远远低于硬件生产率和计算机应用的增长率。
(2)软件开发成本和进度估计不准确。通常实际软件成本远远高于预计的成本;开发进度估计不足,实际进度延期。
(3)软件产品不满足用户需求。软件开发人员对用户需求缺乏深入、准确的了解,软件开发人员与用户之间缺乏很好的沟通,经常是闭门造车,致使软件产品不能满足用户的需求。
(4)软件难以维护。软件中存在的错误很难进行修改,并且为适应新的需要,在没有相应说明的情况下很难添加相应的程序,维护的成本相当高。
(5)软件价格昂贵。软件成本要远远高于硬件成本,与硬件性能价格比迅速提高形成反差。
提示:人们常常谈到的软件中的“病虫”——Bug,可能是一段代码中的错误,或者是引起系统崩溃的原因。IEEE729标准中给出了Bug的定义:
(1)可能是在执行软件活动中引发的错误或缺陷。如设计者错误地理解了需求并且构造了一个不满足需求的设计,必然导致其他错误。不正确的代码、不正确的用户操作手册以及一个简单的错误可能引发许多错误,这个缺陷驻留在产品的开发和维护过程中。
(2)不能按系统要求正确运行也是一种错误,通常在系统发布、测试、运行和维护的前后发生。开发人员能够看到的错误或缺陷,是系统内部的;而失败是系统外部的,是用户看到系统存在的问题。
因此,为解决上述问题,从以下几个方面入手。
(1)采用工程化原理和方法系统地研制和维护软件。
(2)采用软件开发技术、方法和工具开发和设计软件。
(3)采用规范的管理措施对软件开发过程进行管理。
由此,得到软件工程的基本定义。
软件工程是采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术与当前能够得到的最好的技术和方法结合起来,达到按预期的时间和费用完成满足用户需求的软件的最终目的。
软件工程与其他工程一样,要有自己的目标、活动和原则,软件工程框架如图1-5所示。
图1-5 软件工程框架
软件工程的基本目标是生产具有正确性、可用性及开销合宜(合算性)的产品。
● 正确性意指软件产品达到预期功能的程度;
● 可用性意指软件基本结构、实现及文档达到用户可用的程度;
● 开销合宜意指软件开发、运行的整个开销满足用户的需求。
以上目标的实现不论在理论上还是在实践中均存在很多有待解决的问题,制约了对过程、过程模型及工程方法的选取。
软件工程活动是“生产一个最终满足用户需求且达到工程目标的软件产品所需要的步骤”,主要包括需求、设计、实现、确认以及支持等活动。
● 需求活动是在一个抽象层上建立系统模型的活动,该活动的主要产品是需求规约,是软件开发人员和客户之间契约的基础,是设计的基本输入。
● 设计活动定义实现需求规约所需的结构,该活动的主要产品包括软件体系结构、详细的处理算法等。
● 实现活动是设计规约到代码转换的活动。
● 验证与确认是一项评估活动,贯穿于整个开发过程,包括动态分析和静态分析,主要技术有模型评审、代码走查以及程序测试等。
● 维护活动是软件发布之后所进行的修改,包括对发现错误的修正、对环境变化所进行的必要调整等。
围绕工程设计、工程支持以及工程管理,提出以下软件工程基本原则。
(1)选取适宜的开发风格。保证软件开发的可持续性,并使最终的软件产品满足客户的要求。
(2)采用合适的设计方法。支持模块化、信息隐蔽、局部化、一致性、适应性、构造性、集成组装性等问题的解决和实现,以达到软件工程的目标。
(3)提供高质量的工程支持。提供必要的工程支持,例如配置管理、质量保证等工具和环境,以保证按期交付高质量的软件产品。
(4)有效的软件工程管理。仅当对软件过程实施有效管理时,才能实现有效的软件工程。
由以上软件工程的概念和框架可以看出,软件设计的主要目标就是要实现好的结构,使开发的软件具有良好的构造性和演化性。软件工程学科所研究的内容主要包括:软件开发范型、软件设计方法、工程支持技术和工程管理技术。其中,软件开发范型涉及软件工程的“方向”问题,研究正确的求解软件的计算逻辑;软件设计方法涉及软件工程的“途径”问题,研究“高层概念模型和处理逻辑”到“低层概念模型和处理逻辑”的映射;工程支持技术和工程管理技术涉及工程质量和产品质量问题,研究管理学理论在软件工程中的应用。如上所述,软件开发就是实施了一个从“高层概念模型”到“低层概念模型”的映射,从“高层处理逻辑”到“低层处理逻辑”的映射,而且在这一映射中还涉及人员、技术、成本、进度等要素,那么必须研究映射模式即软件生产模式问题。
软件工程也是一种层次化技术,由方法、工具和过程三个方面组成。任何工程方法必须以有组织的质量为基础。全面的质量管理推动了过程改进,从而导致了更加成熟的软件工程方法的不断出现。支持软件工程的根基在于对质量的关注。
● 软件工程的基层是过程层,软件工程过程是将技术层结合在一起,合理地、及时地开发出软件产品,过程定义了软件开发的框架、软件开发的活动和活动之间的关系,规定了采用的技术方法、文档和数据的形式、质量保证等要求;
● 软件工程的方法层提供了构造软件在技术上需要的原则和基本描述形式;
● 软件工程的工具层对过程和方法提供了软件开发过程的自动化或半自动化的支持,形成了支持软件开发的系统,称为计算机辅助软件工程(CASE), CASE集成了软件、硬件和软件工程开发过程所需要的信息,形成了软件工程环境。
因此,软件工程是从软件开发技术和软件工程管理两个方面,对实践过程中的经验不断总结、归纳整理,研究和实施软件开发方法、软件开发工具、软件工程管理方法和规范,能够更好地开发和维护软件。软件工程成为指导计算机软件开发、维护、管理的理论依据,同时,从实践过程中获得的经验又进一步推动软件工程学科的完善与发展。
1.2.2 软件工程学的范畴
软件工程作为一门新兴的学科,结合了工程学和计算机科学的部分内容,面向工程项目的开发与管理,主要包含了开发技术和管理技术两方面内容,具体的组成形式如图1-6所示。
图1-6 软件工程学范畴
软件开发技术包括软件开发方法学、软件工具和软件工程环境。随着软件的发展历程——从程序、软件到软件产品,软件的开发方法也经历了很大的变化,在20世纪60年代后期兴起的结构化程序设计,又将结构化思想应用于需求分析、系统设计过程,形成了传统的结构化分析与设计方法;在20世纪80年代出现的Smalltalk、C ++等语言,促进了面向对象程序设计的使用,同时,也获得了面向对象的开发方法;目前,软件组件化的设计理念,已成为现代开发普遍采用的技术。
软件工具是帮助软件开发的软件,在软件开发过程中形成了许多能够提高软件生产率的辅助工具,促进软件生产的自动化,如C语言的编辑程序、编译程序,称为软件编写的辅助工具。
软件工程环境一直是软件工程研究的主要课题,寻求软件开发方法和工具,以及相应配套的软件、硬件支持就构成了软件工程环境。这方面主要体现在CASE计算机辅助软件工程的设计与实现,能够支持软件开发过程的辅助工具。在后面的章节中会详细地加以描述。
人们不断寻求软件开发技术的同时,也更加注重软件工程管理方面的研究。由于软件本身的特性,软件工程管理既运用管理学的知识,又结合软件特性,形成了软件管理学、软件经济学和软件度量学。
1.2.3 软件工程的开发原则
自从提出软件工程思想以来,软件工程的思想、方法一直应用于各种软件系统开发过程中,并针对软件规模的不同,应用的方面也有很大的不同。为了开发出能够降低成本、提高开发效率和质量的软件,软件工程必须遵循以下基本原则。
1.分解
任何任务都是由多个小任务组成,通过由不同的人负责不同的小任务,使得整个任务可以在并行的状态下缩短完成时间、减少任务的复杂性,因此,在软件开发过程中,通常对一个软件项目通过不断分解的过程降低项目的复杂程度,提高开发效率。但是,任何事情都有它的两面性,不能无限制地分解下去,不能把一个任务分解到可能仅仅只是一条指令的程度,这是毫无意义的。在分解的过程中,很多个小任务之间又构成了相互的联系,增加了任务之间联系的复杂程度,因此,任何任务的分解都有一个最佳的分解区域,使得小任务之间联系的复杂程度和各自小任务的复杂程度加起来构成的总任务工作量在减少。
2.信息隐蔽
信息隐蔽是指某些局部的元素对外部或其他无关部分的程序隐藏起来,以免不同部分的程序在执行过程中相互影响。
3.模块化
模块是程序逻辑上相对独立的部分,是一个独立的编程单元。对一个软件按照功能分成许多部分单独开发,然后再组装起来。
4.标准化
在软件开发过程中通常采用统一的标准,可以实现不同部分之间描述的一致性。采用统一的开发方法、开发描述文档,整个软件系统的各个模块使用标准的符号、术语和概念,有利于团队沟通和交流,以及软件系统的后期维护。
1.2.4 软件工程面临的挑战
软件的编写如同一门艺术,软件工程师要研究计算机的基本原理和执行过程并将其运用到软件开发过程中,以便生产出高效的软件产品。然而,如何能够生产出高效的软件产品,实践过程中包含了许多艺术、技能和才能。获得高效、更精确、容易修改、容易理解、高质量的软件产品一直以来是软件工程追求的目标。计算机软件作为非传统产业的制成品,有着许多独特的性质。它具有不可见性、易变更性,对于这样一种智力劳动的成果,人们难于把握它的质量,也难于组织好它的开发和生产过程。对软件的分析和研究,绝不可忽视其与传统产品开发过程相异的特殊性。然而,从另一方面看,软件工程也是工程,虽然它是一门年轻的工程学课,仍然可以借鉴人们千百年来所积累的在传统工程领域行之有效的规律和经验,例如规范化、标准化和模块化等。显然,软件工程需要综合与兼顾上述两个方面的特征。任何过分强调某一方面或是忽略某一方面的思维方式和行为都是错误的,并且这种综合与兼顾需要在不断探索中前进和发展。
软件工程的应用成为软件开发的主要规范和支持,特别是面对以下三个方面的开发。
1.过去系统的更新与维护
目前很多软件系统都是很多年以前开发的,虽然仍然在继续使用,但需要在功能、性能上进一步适应新的要求。对这一类软件系统的更新,会存在巨大的问题,因为以前的系统遵循的软件规范比较少,修改起来会很困难,而且过去的开发方法同现在的方法有很大的不同,软件工程师需要运用现在的方法修改过去的程序。
2.软件应用的复杂性
软件的应用范围越来越广泛,复杂程度在增加,如何更好地运用软件工程思想开发各种各样的不同的应用领域的软件系统,并且适应规模大、复杂度高的系统开发,成为软件工程探究的热门课题。
3.交付上的挑战
软件市场面临着激烈的竞争,更快、更准确、更能够满足用户需求的软件系统是现代软件开发的最终目标,如何既能够充分地运用软件工程方法规范地开发软件系统,又能够及时地发布软件,适应社会的需要,成为软件工程不断寻求改进方法的动力源泉。
在经济全球化的推动下,计算机网络得到了广泛应用和发展。信息交流、资源共享已成为软件工程的主流,以高度的群组协作为手段的虚拟组织正在成为世纪企业的主要组织形式,而软件工程走规模化、标准化、集约化、智能化、开放性的发展道路也势在必行。因此,软件复用技术、软件标准、分布式计算、智能代理等技术以及各种技术的集成方法已成为软件工程中最受关注的研究方向。软件工程是多个领域技术与方法的交叉和集成。面对新的环境和需求,21世纪软件工程的发展方向是利用各种先进的知识和工具,在对现有的理论和实践加以发展创新的同时,研究降低软件开发成本、缩短开发周期、实现软件复用的途径和方法,从根本上解决软件危机问题,逐步实现软件工程的标准化、规模化和柔性化。
1.2.5 软件工程师的未来
软件工程作为一门新兴的学科,从最初的思想、简单方法到现在的规范、系统化的方法、工具等变化过程,逐渐走向成熟。在软件工程作为独立专业出现以后,软件工程师也就像所有工程类的专业人员一样有自己的独立职业,它不同于计算机专业,同时,由于软件的特性,也不同于其他工程行业的工程师。因此,软件工程师作为独立的职业会随着社会需求的增加而更加规范化,同样会出现各种资格认证,以及规范化的操作规程,这将促进软件工程学科领域的发展与壮大。
软件工程师必须结合软件工程理论与实践,将软件工程知识渗透到任何的应用领域中为之服务,必须具有商业知识、工程知识、管理知识、经济知识等作为基础知识结构,并且不能脱离计算机知识。此外,软件工程师还必须具备其他领域知识。
软件工程师的工作不仅是技术的应用,也要担负起许多责任。因为软件工程受到地方、国家、国际的各种法律的约束,所以软件工程师要得到人们的尊敬,其行为应符合道德规范和法律要求,形成一定的职业道德规范。在ACM/IEEE(1999)软件工程师的职业道德准则中给出了对软件工程人员的要求的高度抽象概括,用以规范软件工程专业人员的工作方式。
软件工程人员应当遵守以下8条准则:
(1)公众感(Public):软件工程师始终与公众利益保持一致。
(2)客户和雇主(Client and Employer):满足客户和雇主的最大利益。
(3)产品(Product):保证产品达到尽可能高的行业标准。
(4)判断力(Judgement):具有公正和独立的职业判断力。
(5)管理(Management):提倡合乎道德的软件开发和维护的管理办法。
(6)职业感(Profession):弘扬职业正义感和荣誉感,尊重社会公正利益。
(7)同事(Colleagues):公平对待和协助每一位同事。
(8)自己(Self):毕生学习专业知识,倡导合乎职业道德的职业活动方式。
软件工程师应当做出承诺,使软件的分析、设计、实现、测试和维护等工作对社会有益且受人尊敬。随着社会的进步、技术的发展,在各行各业都会出现软件工程师,成为企业信息化道路的支持者、推进者。