[软件工程] 软件工程概念

软件工程概念

一、软件工程的介绍

(一)软件工程的两个定义

  • 1968年在第一届NATO(北大西洋公约组织)会议上曾经给出了软件工程的一个早期定义:“软件工程就是为了经济地获得可靠的且能在实际机器上有效地运行的软件,而建立和使用完善的工程原理。”这个定义不仅指出了软件工程的目标是经济地开发出高质量的软件,而且强调了软件工程是一门工程学科,它应该建立并使用完善的工程原理。
  • 1993年IEEE进一步给出了一个更全面更具体的定义:“软件工程是:
    ①把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件; ②研究①中提到的途径

(二)软件工程的发展已经历了四个重要阶段:

1、第一代软件工程 — 传统的软件工程

60年代末到70年代为了克服“软件危机” (Software crisis)提出“软件工程”的名词, 将软件开发纳入工程化的轨道,基本形成软件工程的概念、框架、技术和方法。称为传统的软件工程。

2、第二代软件工程 — 对象工程

80年代中到90年代,面向对象的方法与技术得到发展,研究的重点转移到面向对象的分析与设计,演化为一种完整的软件开发方法和系统的技术体系,称为对象工程。

3、第三代软件工程 — 过程工程

80年代中开始,人们在软件开发的实践过程中认识到:提高软件生产率,保证软件质量的关键是“软件过程”,是软件开发和维护中的管理和支持能力,逐步形成软件过程工程

4、第四代软件工程 — 构件工程

90起年代,基于构件(Component)的开发方法取得重要进展,软件系统的开发可通过使用现成的可复用构件组装完成,而无需从头开始构造,以此达到提高效率和质量,降低成本的目的。称为构件工程。

二、软件工程的本质特征:

  • 软件工程关注于大型程序的构造;
  • 软件工程的中心课题是控制复杂性;
  • 软件经常变化;
  • 开发软件的效率非常重要;
  • 和谐地合作是开发软件的关键;
  • 软件必须有效地支持它的用户;
  • 在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人创造产品;

三、软件工程的7条基本原理:

——
 1.用分阶段的生命周期计划严格管理
  实践证明,一半以上的不成功的软件是由于计划不周造成的。应按软件的不同周期,划分阶段有计划进行开发,不受干扰地按计划进行。
  2. 坚持进行阶段评审
  大部分错误是在编码之前;
  错误发现越晚,改正错误付出的代价越多;
 3. 实行严格的产品控制
  不得已修改需求时,为了保持软件各个配置成分的一致性,要实行严格产品控制——实施基准配置管理。
   基准配置管理(变动控制):一切有关修改软件的建议,特别是涉及到对基准配置的修改建议,都必须按照严格的规程进行评审,获得批准以后才能实施修改。
 4. 采用现代程序设计技术
   实践表明,采用先进的技术不仅可以提高软件开发和维护的效率,而且可以提高软件产品的质量。
 5. 结果应能清楚地审查
  软件产品的开发过程比一般产品的开发过程更难于评价和管理。为提高软件开发过程的可见性,更好地进行管理,应该根据软件开发项目的总目标及完成期限,规定开发组织的责任和产品标准,从而使得所得到的结果能够清楚地审查。
  6. 开发小组的人员应该少而精
  素质高的人员的开发效率比素质低的人员的开发效率可能高几倍至几十倍,而且素质高的人员所开发的软件中的错误明显少于素质低的人员所开发的软件中的错误。此外,因为交流情况讨论问题而造成的通信开销也急剧增加。当开发小组人员数为N时,可能的通信路径有N(N-1)/2条,可见随着人数N的增大,通信开销将急剧增加。
 7. 承认不断改进软件工程实践的必要性

四、软件工程方法学

软件工程包括是技术管理紧密结合所形成的工程学科。

  • 管理:通过计划、组织和控制等一系列活动,合理地配置和使用各种资源,以达到既定目标的过程。
  • 技术:在软件生命周期全过程中使用的一整套技术,称谓方法学方法学(methodology),也称为范型(paradigm)。

软件工程方法学:包括内容( 3个要素):方法工具过程

  • 方法:技术方法
  • 工具:软件工程支撑环境
  • 过程:一系列任务框架,以保证质量。

(一)软件工程方法学

当前使用得最广泛的软件工程方法学,分别是传统方法学面向对象方法学

1.传统方法学

也称为生命周期方法学结构化范型
  它采用结构化技术(结构化分析、结构化设计和结构化实现)来完成软件开发的各项任务,并使用适当的软件工具或软件工程环境来支持结构化技术的运用。
  这种方法学把软件生命周期的全过程依次划分为若干个阶段,然后顺序地完成每个阶段的任务。问题简单化、便于阶段性审查、有一定应用、便于区别面相对象方法学。

2.面向对象方法学

当软件规模庞大,或者对软件的需求是模糊的或会随时间而变化的时候,使用传统方法学开发软件往往不成功,此外,使用传统方法学开发出的软件,维护起来仍然很困难,原因是这种技术要么面向行为(即对数据的操作),要么面向数据,还没有既面向数据又面向行为的结构化技术。
面向对象方法把数据和行为看成同等重要,它是一种以数据为主线,把数据和对数据的操作紧密地结合起来的方法。

(1)面向对象方法学4个要点:
  • a.把对象(object)作为融合了数据及在数据上的操作行为的统一的软件构件。
  • b.把所有对象都划分成类(class)。
  • c,按照父类(或称为基类)与子类(或称为派生类)的关系,把若干个相关类组成一个层次结构的系统(也称为类等级)。
  • d.对象彼此间仅能通过发送消息互相联系。
(2)面向对象方法学的出发点和基本原则

面向对象方法学:
模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,从而使描述问题的问题空间(也称为问题域)与实现解法的解空间(也称为求解域)在结构上尽可能一致。

五、软件生命周期

生命周期

软件生命周期包括:软件定义软件开发软件维护期

  • 软件定义期~问题定义可行性研究需求分析(定义期也成为系统分析)。
  • 软件开发期~总体设计详细设计编码和单元测试,其中前两个阶段又称为系统设计,后两个阶段又称为系统实现。
  • 软件维护期~使软件持久地满足用户的需要。

1. 问题定义

问题定义阶段必须回答的关键问题是:“要解决的问题是什么?”

2. 可行性研究

这个阶段要回答的关键问题是:“对于上一个阶段所确定的问题有行得通的解决办法吗?”

3. 需求分析

这个阶段的任务不是解决问题,而是确定“为了解决这个问题,目标系统必须做什么?”
主要是确定目标系统必须具备哪些功能。

4. 总体设计(概要设计)

这个阶段必须回答的关键问题是:“概括地说,应该怎样实现目标系统?”

软件设计的一条基本原理就是,程序应该模块化,即一个程序应该由若干个规模适中的模块按合理的层次结构组织而成。因此,总体设计的另一项主要任务就是设计程序的体系结构,也就是确定程序由哪些模块组成以及模块间的关系

5. 详细设计(模块设计)

这个阶段必须回答的关键问题是:“应该怎样具体地实现这个系统呢?”
主要任务是设计出程序的详细规格说明设计每个模块,确定实现模块功能所需要的算法和数据结构。
类似于其他工程领域中工程师经常使用的工程蓝图,它们应该包含必要的细节,程序员可以根据它们写出实际的程序代码。

6. 编码和单元测试

关键任务是写出正确的容易理解、容易维护的程序模块。

7. 综合测试

这个阶段的关键任务是通过各种类型的测试(及相应的调试)使软件达到预定的要求。
最基本的测试是集成测试验收测试

8. 软件维护

维护阶段的关键任务是,通过各种必要的维护活动使系统持久地满足用户的需要。
  有4类维护活动::
   改正性维护,也就是诊断和改正在使用过程中发现的软件错误;
   适应性维护,即修改软件以适应环境的变化;
   完善性维护,即根据用户的要求改进或扩充软件使它更完善;
   预防性维护,即修改软件为将来的维护活动预先做准备。

六、软件工程过程

软件工程过程(Software engineering process):是指在软件工具的支持下,所进行的一系列软件工程活动。

(一)四类基本过程:

1、软件规格说明:规定软件的功能及其运行环境
2、软件开发:产生满足规格说明的软件
3、软件确认:确认软件能够完成客户提出的要求
4、软件演进:为满足客户的变更要求,软件必须在使用的过程中演进。

(二)软件工程过程的特性:

1、可理解性 2、可见性(过程的进展和结果可见)
3、可靠性 4、可支持性(易于使用CASE工具支持)
5、可维护性 6、可接受性(为软件工程师接受)
7、开发效率 8、健壮性(抵御外部意外错误的能力)

(三)生命周期模型(过程模型):

通常使用生命周期模型简洁地描述软件过程。

1.常见的模型:

瀑布模型、快速开发模型、增量模型、螺旋模型、喷泉模型等。

(1)瀑布模型

瀑布模型分析与设计阶段的基本任务主要考虑目标系统的逻辑模型,不涉及软件的物理实现。
清楚地区分逻辑设计与物理设计,尽可能推迟程序的物理实现,是按照瀑布模型开发软件的一条重要的指导思想。

传统的瀑布模型
传统的瀑布模型

a. 阶段间具有顺序性和依赖性

这个特点有两重含义: ①必须等前一阶段的工作完成之后,才能开始后一阶段的工作; ②前一阶段的输出文档就是后一阶段的输入文档,因此,只有前一阶段的输出文档正确,后一阶段的工作才能获得正确的结果。

b. 推迟实现的观点

对于规模较大的软件项目来说,往往编码开始得越早最终完成开发工作所需要的时间反而越长。这是因为,前面阶段的工作没做或做得不扎实,过早地考虑进行程序实现,往往导致大量返工,有时甚至发生无法弥补的问题,带来灾难性后果。

c. 质量保证的观点

软件工程的基本目标是优质、高产。为了保证所开发的软件的质量,在瀑布模型的每个阶段都应坚持两个重要做法:
(a) 每个阶段都必须完成规定的文档
完整、准确的合格文档不仅是软件开发时期各类人员之间相互通信的媒介,也是运行时期对软件进行维护的重要依据。
(b) 每个阶段结束前都要对文档进行评审
尽早发现问题,改正错误。
实际的瀑布模型是带“反馈环”的,如图所示:
在这里插入图片描述

d. 瀑布模型有许多优点:

可强迫开发人员采用规范的方法(结构化技术);
严格地规定了每个阶段必须提交的文档;
要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证。

e.瀑布模型缺点:

“强调文档驱动”,导致用户在使用软件之前只能通过文档认识软件,而真正使用软件时可能出现与想象之间有差异

(2)快速开发模型

所谓快速原型是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集。

  • 快速原型没有反馈环,同用户已经充分交流、开发人员对系统也充分了解。广泛地使用第四代语言(4GL)构建快速原型。
  • 快速模型:
    -在这里插入图片描述
(3)增量模型

增量模型也称为渐增模型如图所示:

在这里插入图片描述
  增量模型和瀑布模型之间的本质区别是:
   瀑布模型属于整体开发模型,它规定在开始下一个阶段的工作之前,必须完成前一阶段的所有细节。而增量模型属于非整体开发模型,它推迟某些阶段或所有阶段中的细节,从而较早地产生工作软件。
   采用瀑布模型或快速原型模型开发软件时,目标都是一次就把一个满足所有需求的产品提交给用户。增量模型则分批地逐步向用户提交产品,开发人员一个构件接一个构件地向用户提交产品。从第一个构件交付之日起,用户就能做一些有用的工作。能在较短时间内向用户提交可完成部分工作的产品

(4)螺旋模型

对于大型软件,只开发一个原型往往达不到要求。螺旋模型将瀑布模型和增量模型结合起来,并加入了风险分析。
  如图所示:
在这里插入图片描述

螺旋模型将开发过程分为几个螺旋周期,每个螺旋周期可分为
4个工作步骤:
  1.确定目标、方案和限制条件;
  2.评估方案、标识风险和解决风险;
  3.开发确认产品;
  4.计划下一周期工作。

(5)喷泉模型

该模型是由B.H.Sollers和J.M.Edwards于1990年提出的一种新的开发模型。主要用于采用对象技术的软件开发项目。
在这里插入图片描述
它克服了瀑布模型不支持软件重用和多项开发活动集成的局限性,喷泉模型使开发过程具有迭代性无间隙性

其特点如下:
1、开发过程有分析、系统设计、软件设计和实现4个阶段。
2、各阶段相互重叠,它反映了软件过程并行性的特点。
3、以分析为基础,资源消耗成塔型。
4、反映了软件过程迭代性的自然特性,从高层返回低层无资源消耗。
5、强调增量开发,整个过程是一个迭代的逐步提炼的过程。

七、Rational统一过程

Rational统一过程(RUP, Rational Unified Process)是Rational公司推出的较完美、流行的软件过程。
它总结了6条最有效的开发经验——最佳实践。

(一)最佳实践

1.迭代式开发

通过反复迭代,使得用户得以参与、开发人员可不断提供可以使用的阶段性的软件产品(提高士气),适合大型复杂软件

2.管理需求

用户需求的不断变化,要求提供如何提取、组织系统的功能需求的有效办法。RUP提供了通过用例分析捕获需求的方法,使用性极强。

3.使用基于构件的体系结构

RUP提供了使用现有的或新开发的构件定义体系结构的系统化方法,降低了软件开发的复杂性,提高了软件重用率。

4.可视化建模

使用UML进行建模。

5.验证软件质量

软件质量的验证,贯穿于整个软件的开发过程,且所有开发成员参与。

6.控制软件变更

RUP给出了如何控制、跟踪和监控修改,以确保迭代开发的成功。

2、RUP软件开发生命周期

RUP软件开发周期是一个以时间代表横轴、核心工作流代表纵轴的二维生命周期模型。

(二)RUP软件开发生命周期

RUP软件开发周期是一个以时间代表横轴、核心工作流代表纵轴的二维生命周期模型。
在这里插入图片描述

1.核心工作流

6个核心过程工作流:

  • 业务建模:深入了解目标系统的用户,评估目标系统对用户的影响;
  • 需求:捕获用户需求,并达成共识;
  • 分析与设计:将需求分析的结果转化为分析模型和设计模型;
  • 实现:将设计模型转化为实现结果;
  • 测试:尽最大可能清除错误;
  • 部署:成功生成目标系统的可运行版本,提交软件给最终用户;
    3个核心支持工作流:
  • 配置与变更管理:跟踪并维护在软件开发过程中产生的所有制品的完整性和一致性;
  • 项目管理:提供管理框架及一系列管理手段;
  • 环境:向软件开发机构提供软件开发环境,包括过程管理和工具支持。

2.工作阶段

4个连续的阶段,每个阶段有明确目标并通过一次或多次迭代完成之,定义了用来评估是否完成目标的里程碑。

  • 初始阶段:建立业务模型,定义最终产品是图,并确定项目的范围;
  • 精化阶段:设计并确定系统的体系结构,制定项目计划,确定资源需求;
  • 构建阶段:开发出所有软件并集成为用户需求的产品,经测试确定所有功能;
  • 移交阶段:将开发的产品提交用户使用。

3.RUP迭代式开发

采用迭代和渐增的方式来开发软件,有多个迭代过程,每次迭代只考虑一部分需求;
每次迭代都是一个完整的软件生命周期,包括:分析、设计、实现、测试和部署等工作;
每个生命周期包括4个连续阶段:初始、精化、构建、移交阶段;
每个阶段有进一步细化为一次或多次迭代。

八、 敏捷过程与极限编程

(一)敏捷过程

敏捷过程目的是提高工作效率和快速相应变化能力,为此提出4个价值观:

1.个体和交互胜过过程和工具

优秀的团队是项目开发获得成功的关键,合作、沟通、交互的能力更重要;

2.可以工作的软件胜过面面俱到的文档

软件为主,不能偏废文档,但文档只是在极其需要时起作用,文档无法代替软件;

3.客户合作胜过合同谈判

合同重要,但能指导开发团队与客户协同工作的合同将更有意义;

4.相应变化胜过遵循计划

客观世界不断变化,软件开发要反映现实。

(二)极限编程

极限编程(eXtreme Programming, XP),是敏捷过程典型的开发方法,使合于需求模糊且经常改变的场景。

极限编程的有效实践

  • 客户作为开发团队的成员:至少一人
  • 使用用户素材:根据用户的情况,合理安排解决需求的时间
  • 短交付周期:每两周交付,短时间内与用户交流
  • 验收测试
  • 结对编程
  • 测试驱动开发
  • 集体所有
  • 持续集成
  • 可持续的开发速度
  • 开放的工作空间
  • 及时调整计划
  • 简单的设计
  • 重构
  • 使用隐喻
  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值