4、软件工程原理
(1)什么是软件工程?
软件工程是指导计算机软件开发和维护的一门学科。
采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。
以下是NATO和IEEE给出的软件工程定义:
- NATO(1968): 为了经济地获得可靠的且能在实际机器上运行的软件,而建立和使用完善的工程原理。
- **IEEE(1993):**1)把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,即把工程应用于软件;2)研究1)中的途径。软件工程是开发、运行、维护和修复软件的系统方法。
(2)软件工程的本质特性
从前面的定义可以看出,软件工程从本质上就是为了解决软件危机。具体可总结为如下几条:
-
**软件工程关注于大中型程序的构造。**大中型程序相对比较复杂,因此有必要采用系统的工程理论与方法,规范软件的开发和维护过程,以保障软件的质量。
-
**软件工程的中心课题是控制复杂性。**软件所解决的问题十分复杂,以致于不能把问题作为一个整体通盘考虑,只能采用模块化分解的方法解决。模块化方法并不能降低问题的整体复杂性,但是却使它变成可以管理的。许多软件的复杂性主要不是由问题的内在复杂性造成的,而是由必须处理的大量细节造成的。
-
**提高****开发软件的效率。**现实世界在不断的变化,软件为了不被很快的淘汰,必须随着所模拟的现实世界一起变化。如何更快的适应需求的变化,是软件工程面临的重要挑战。
-
**注重团队合作。**软件处理的问题十分庞大,必须许多人协同工作才能解决这类问题。纪律是成功地完成软件开发项目的一个关键,良好的团队合作有利于项目的成功。软件开发人员必须学会合作与沟通,才能保证软件的质量和开发效率。
-
**充分了解用户需求。**在软件工程领域中是由具有一种文化背景的人为另一种文化背景的人创造产品。缺乏应用领域的相关知识,是软件开发项目出现问题的常见原因。软件工程师不仅缺乏应用领域的实际专业知识,还缺乏该领域的文化知识。因此有必要通过访谈、阅读书面文件等方法了解用户组织的工作流程,然后用软件实现。
(3)Boem软件工程原理
著名的软件工程专家巴利.玻姆(Barray W. Boehm)总结了七条软件工程基本原理并指出这七条原理是保证软件产品质量和开发效率的原理的最小集合。
|----------------------------------------------------------------------------------------------|----------------------------------------------------------------------------|
| * 用分阶段的生命周期计划严格管理 * 坚持进行阶段评审 * 实行严格的产品控制 * 采用现代程序设计技术 * 结果应能清楚地审查 * 开发小组的人员应少而精 * 不断改进软件工程实践 | |
**注:**巴利.玻姆(1935-2022)是一位美国计算机科学家和软件工程师,曾在多家知名机构工作,包括IBM、美国国家航空航天局和南加州大学(USC)。他对软件工程领域做出了重大贡献(开发软件工程经济学模型、螺旋模型等),并因其工作获得了许多奖项,包括软件工程研究所的史蒂文斯奖和IEEE哈兰·D·米尔斯奖。详细介绍可参阅百度百科。
(4)二八定律(帕雷托法则)
二八定律是一种经济学原理,也被称为帕累托定律。该定律认为,在一个系统中,大约80%的结果是由20%的原因所决定。这个原则也可以应用于软件工程领域,即:
- 对软件项目进度和工作量的估计:一般主观上认为已经完成了80%的,往往实际上只完成了20%;
- 对程序中存在的问题的估计:80%的问题往往存在于20%的程序之中;
- 对模块功能的估计:20%的模块实现了80%的功能;
- 对人力资源的估计:20%的人解决了软件中80%的问题;
- 对投入资金的估计:企业信息系统中80%的问题,可以用20%的资金来解决。
注: 帕累托定律又称帕累托分析法或巴雷托分析法、柏拉图分析、主次因分析法 、ABC分析法、分类管理法、物资重点管理法、ABC管理法、abc管理、巴雷特分析法,平常我们也称之为"80对20"规则是由意大利经济学家维尔弗雷多·帕累托首创的。帕雷托通过长期的观察发现:美国80%的人只掌握了20%的财产,而另外20%的人却掌握了全国80%的财产,而且很多事情都符合该规律。于是他应用此规律到生产上。详细介绍可参阅百度百科。
(5)软件工程三要素
过程、方法和工具是软件工程的三个要素。
- 过程 :软件工程过程是一系列有序的步骤和活动,用于支持软件开发各个环节的控制和管理。过程包括需求分析、设计、编码、测试、部署和维护等阶段。
- 方法:软件工程方法是指用于解决软件开发过程中各个阶段的问题和挑战的技术和工具。常见的软件工程方法包括结构化分析和设计(SSAD)、面向对象分析和设计(OOAD)、敏捷开发等。
- 工具 :软件工程工具是指为软件开发方法提供自动的或半自动的软件支撑环境。常见的软件工程工具包括集成开发环境(IDE)、代码版本控制系统、自动化测试工具等。
无论是过程、方法,还是工具,其最终目标都是提高软件的质量。
(6)软件生存期模型
为了更好的理解软件工程过程,软件工程领域的专家们把软件比作生物体,就像其他生物体一样,软件也有一个孕育、诞生、成长、成熟、衰亡的生存过程,我们称其为软件的生命周期(或生存期)。
通常我们把软件生存期的活动划分为以下6个阶段:
-
问题定义与可行性研究:弄清楚"要解决的问题是什么?该问题有行得通的解决办法吗?"。
-
需求分析:弄清楚"目标系统必须做什么?",确定系统必须具备的功能、性能要求及其他需求。
-
软件设计:"应该如何解决这个问题?"。软件设计包括概要设计和详细设计。
-
软件实现:如何把软件设计转换成计算机可以接受的程序代码,即写成以某一种特定程序设计语言表示的"源程序清单"。程序应正确、容易理解、容易维护。
-
软件测试**:**目的就是通过各种测试使软件达到预定要求。
-
软件运行与维护:通过各种维护使系统持久地满足用户需要。通常包括改正性、适应性、完善性和预防性维护。
对这六个阶段的工作可以采用不同的组织过程,这便是软件生存期模型,也称作软件生命周期模型或软件过程模型。典型的软件生存期模型包括:
- 瀑布模型**:**是1970年 由W.Royce提出的生命周期模型。20世纪80年代之前,瀑布模型一直是唯一被广泛采用的生命周期模型。现在它仍然是软件工程中应用得最广泛的过程模型。传统软件工程方法学的软件过程,基本上可用瀑布模型来描述。
瀑布模型是传统的开发策略,软件过程分为若干个阶段,阶段间具有顺序性、依赖性,它的目的是为了推迟实现。随着瀑布模型的应用推广,人们发现为了解决软件维护过程中发现的问题,还需要对前面的工作进行改进,同时每一个阶段都会为前一阶段反馈问题。于是就有了下图所示的改进后的瀑布模型。
瀑布模型的优点是结构清晰、易于理解和管理,适用于较小规模的项目。它适合需求明确、不易变动的项目,且开发人员能够准确预估项目进度和资源需求。
然而,瀑布模型也存在一些缺点。由于各个阶段的边界严格,一旦某个阶段出现问题或变动,可能会导致整个项目延期或失败。另外,瀑布模型对于客户需求变化较为敏感,难以应对快速变化的市场需求和技术变革。
因此,在实际项目中,瀑布模型通常会与其他模型相结合,如迭代模型或敏捷开发模型,以弥补其局限性,并提高软件开发的灵活性和适应性。
- **原型模型:**原型模型是基于这样一个假设,即"在项目开发的初始阶段,对软件的需求认识常常不够清晰,往往需要做多次修正才能使得项目取得成功。第一次只是试验开发,其目标只是在于探索可行性,弄清软件需求。下一次则是在此基础上获得较为满意的软件产品。"。
原型模型属于演化模型。每一次演化都会完成一个原型系统,它是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品的一个子集。原型模型的工作流程如下图所示:
- 增量模型 :把软件产品作为一系列的增量构件来设计、编码、集成和测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能。其工作流程如下图所示:
在增量模型中,软件开发按照一系列的增量进行,每个增量代表软件系统的一个部分。每个增量开发完成后,都可以独立运行,并且可以在此基础上进行下一轮的增量开发。
增量模型的优点是可以快速地开发出可用的软件功能,并且可以及时获取用户的反馈。同时,增量模型也可以降低开发过程中的风险,因为每个增量都经过了测试和验证,可以及时发现和解决问题。
然而,增量模型也存在一些局限性。首先,由于每个增量都需要进行独立的开发和测试,因此可能增加开发成本和时间。其次,增量模型可能不适用于一些需要一次性交付完整功能的项目。
总的来说,增量模型是一种逐步递增地开发软件的方法,可以快速地获取软件功能和用户反馈,但也需要权衡开发成本和时间的局限性。
- **螺旋模型:**1988年,巴利.玻姆(Barray W. Boehm)正式发表了软件系统开发的"螺旋模型",它将瀑布模型和快速原型模型结合起来,强调了风险分析,使用原型及其他方法来尽量降低风险。其工作流程如下图所示:
如图所示,螺旋模型是一种迭代的增量模型,它将软件开发过程划分为多个循环,每个循环包含四个主要阶段:计划、风险分析、工程构建和评审。每个循环都是前一个循环的增量,并且每个循环的目标是针对风险进行评估和缓解,以及开发软件的一部分功能。
螺旋模型的主要特点是强调风险管理和迭代开发。在每个循环中,团队会对风险进行评估,并根据评估结果制定相应的风险缓解计划。这种风险驱动的方法可以在项目早期就识别和解决潜在的问题,从而降低了项目失败的风险。
螺旋模型的优点 包括能够灵活应对需求变化、提高软件质量、降低开发成本和缩短开发时间。然而,螺旋模型也有一些缺点,比如较高的复杂性和管理难度。
总的来说,螺旋模型适合于大型和复杂的软件项目 ,特别是在风险较高的情况下。它可以帮助项目团队更好地管理和控制项目风险,并以迭代的方式逐步开发和交付软件功能。