1.2 软件工程定义
人们对软件工程的内涵有一个广泛讨论、研究和认识的过程,从而对软件工程有了各种各样的定义,例如:
●P.Wegner和B.Boehm将软件工程定义为:科学知识在设计和构造计算机程序,以及开发、运作和维护这些程序所要求的有关文档编制中的实际应用。
●F.L.Bauer认为软件工程可定义为:为了经济地获得软件,这个软件是可靠的并且能在实在的计算机上工作,所需要的健全的工程原理(方法)的确立和使用。
●1983年IEEE(国际电气与电子工程师协会)的《软件工程术语汇编》中,将软件工程定义为:对软件开发、运作、维护和退役的系统研究方法。1990年又将定义修改为:对软件开发、运作、维护的系统化的、有纪律的、可定量的方法的应用,即是对软件的工程化应用。
●《信息技术 软件工程术语》(GB/T 11457—2006)则把软件工程定义为:应用计算机科学理论和技术,以及工程管理原则和方法,按预算和进度,实现满足用户要求的软件产品的定义、开发、发布和维护的工程或进行研究的学科。
IEEE给出了一个更全面的软件工程的定义:软件工程是:①将系统化的、规范的、可量化的方法应用于软件的开发、运行和维护,即将工程化方法应用于软件;②对上面所述方法的研究。
对于某个软件开发队伍来说可能是“系统化的、规范的、可量化的”方法,对于另外一个团队却可能是负担。因此,软件开发既需要规范,也需要可适应性和灵活性。
1.2.1 软件工程的内容
从以上对软件工程的不同定义中可以看到,对其内容的理解是逐步深入的。发展到今天,软件工程已是一门交叉性学科,它是解决软件问题的工程,对它的理解不应是静止的和孤立的。软件工程是应用计算机科学、数学及管理科学等原理,借鉴传统工程的原则和方法来创建软件,从而达到提高质量、降低成本的目的。其中,计算机科学和数学用于构造模型、分析算法,工程科学用于制定规范、明确风格、评估成本、确定权衡,管理科学用于进度、资源、质量及成本等的管理。
软件工程是一种层次化的技术(见图1-7)。任何工程方法(包括软件工程)必须构建在质量承诺的基础之上。全面质量管理、六西格玛等类似的理念,促进了不断的过程改进文化,正是这种文化,最终引导人们开发更有效的软件工程方法。支持软件工程的根基在于质量关注点。
图1-7 软件工程层次图
软件工程的基础是软件过程。软件过程将各个技术层次结合在一起,使得合理、及时地开发计算机软件成为可能。软件过程定义了一个框架,构建该框架是有效实施软件工程技术必不可少的。软件过程构成了软件项目管理控制的基础,建立了工作环境以便应用技术方法、提交工作产品(如模型、文档、数据、报告和表格等)、建立里程碑、保证质量及正确管理变更。
软件工程方法为构建软件提供技术上的解决方法(“如何做”)。方法的覆盖面很广,包括沟通、需求分析、设计建模、编程、测试和技术支持。软件工程工具为过程和方法提供自动化或半自动化的支持。这些工具可以集成起来,使得一个工具产生的信息可被另外一个工具使用。这样就建立了软件开发的支撑系统,称为计算机辅助软件工程。
1.2.2 软件工程的基本目标和原则
软件工程的目标是明确的,就是研制开发与生产出具有良好的软件质量和费用合算的产品。费用合算是指软件开发运行的整个开销能满足用户要求的程度,软件质量是指该软件能满足明确的和隐含的需求能力的有关特征和特性的总和。
具体来说,软件工程研究的基本目标如下。
1)一种定义良好的方法学,该方法学是面向包括计划、开发和维护等阶段的软件生存周期的。
2)一组确定的软件成分,它对软件生存周期的每一步记录软件文件资料,并且具有按步显示轨迹的能力。
3)一组可以预测的里程碑,在整个软件生存周期中,每隔一段时间可以对它们进行复审。
软件工程方法依赖于一组基本的指导性原则,这些原则涵盖了软件工程的所有技术领域,包括建模和其他描述性技术等。列举如下。
●必须认识软件需求的变动性,并采取适当措施来保证结果产品能忠实地满足用户要求。在软件设计中,通常要考虑模块化、抽象与信息隐蔽、局部化、一致性等原则。
●稳妥的设计方法大大地方便了软件开发,为达到软件工程的目标,软件工具与环境对软件设计的支持来说颇为重要。
●软件工程项目的质量与经济开销直接取决于对它所提供的支撑的质量与效用。
●有效的软件工程只有在对软件过程进行有效管理的情况下才能实现。
为了达到“以较少的投资获得易维护、可靠、高效率和易理解的软件产品”这个最终目的,各种软件工程技术所遵循的基本原则如下。
1)分解。分解是分析解决复杂问题的重要手段,它的基本思想是将一个复杂的问题分成若干个较小的、相对独立的、较易解决的子问题,然后分别加以解决。将软件开发过程划分成几个阶段、结构化分析方法的分解、结构化设计方法和Jackson方法的模块化等都体现了“分解”的原则。
2)抽象和信息隐蔽。抽象和信息隐蔽也是解决复杂问题的重要手段,它的基本思想是在将复杂问题逐层分解时,将“怎么做”等大量细节隐蔽在下一层,从而使上一层突出“做什么”而得到简化。这里称上一层为下一层的抽象。
软件设计中常用的“模块化”和“局部性”方法就体现了这种抽象和信息隐蔽的原则。
3)一致性。一致性强调软件开发过程的标准化和统一化,包括软件文件格式的一致、工作流程的一致等。研究软件方法的目的之一,就是使开发过程走上标准化的轨道。
4)确定性。确定性要求软件开发过程中用确定的形式将一些较含糊的概念表达出来。如用数据流程图来精确地表达用户需求,用易维护性、可靠性、易理解性和高效率等指标来具体度量软件的质量等。确定性也是保证软件质量的前提。
但是,在具体项目的实际开发中,让几个目标都达到理想的程度往往是非常困难的,而且有些目标很可能还是互相冲突的。例如,若只顾降低开发成本,很可能同时也降低了软件的可靠性;另一方面,如果过于追求提高软件的性能,可能造成所开发软件对硬件有较大的依赖,从而直接影响到软件的可移植性等。
图1-8表明了软件工程目标之间存在的相互关系,其中有些目标之间是互补关系,如易于维护和高可靠性之间、低开发成本与按时交付之间,还有一些目标则是彼此相斥的。
图1-8 软件工程目标之间的关系
1.2.3 软件工程与一般工程的差异
软件工程是一门交叉性学科,又是工程学科家族中的新成员,在几十年的发展过程中,已经形成了其特有的形态。虽然软件产品在某些方面类似于其他工程中的有形产品,如桥梁、建筑物、机床和计算机等,但是它们之间也确有一些重要的差别,不能简单地把一般工程方面的知识、方法和技术直接应用到软件工程上来。
软件工程与一般工程的差别主要表现在以下几个方面。
1)软件是逻辑产品而不是实物产品,磁盘和集成电路只是软件的载体,这就意味着费用集中在研制开发上而不是生产上。当然,由于是逻辑产品,软件就不会用坏、磨损和老化,而且可以不断地改进、优化,其可靠性由逻辑性确定。开发软件在许多方面更像进行数学证明,但是,软件产品的评价却主要取决于它们在问题求解中是否有用,而不是取决于抽象的正确性判定标准。换句话说,开发软件产品时主要使用的是工程标准,而不是数学标准。
2)由于软件是逻辑产品,使得它的功能只能依赖于硬件和软件的运行环境以及人们对它的操作才能得以体现。没有计算机及其相关硬件的支持,软件难以实现其实用价值。同样,没有软件支持的计算机硬件,也只是毫无使用价值的机器。软件与硬件的密切相关的程度是一般工程所没有的。
3)对软件产品的要求比一般有形产品要复杂。其一,软件产品要完成的多种多样功能,用户难以清晰、准确地表达。仅此一项,软件系统的复杂性可以比得上任何一个工程项目。其二,对软件产品的要求,如可靠性、易移植性和易使用性等是隐含的,也是难以表达的,而且也缺少度量的具体标准,与有形产品的质量检验的精度相距甚远。其三,软件设计不仅涉及技术复杂性,还涉及管理复杂性。即使在今天软件工程已有很大进展的情况下,领导一个庞大的项目组,能像其他工程项目那样进行规模化生产也绝非易事。
4)软件工程是智力密集型产业,因此,它的知识产权保护就显得极为重要。