Skip to content
🗂️ 文章分类: 软考  
🏷️ 文章标签: 软考  
📅 文章创建时间: 2026-08-25
🕘️ 文章最后更新时间:2026-08-25

[toc]

系统分析师笔记07_软件工程 ​

该笔记内容来自《系统分析师教程》第2版。

软件工程由方法、工具和过程三个部分组成。

  • 软件工程方法是完成软件工程项目的技术手段,它支持整个软件生命周期;
  • 软件工程使用的工具是人们在开发软件的活动中智力和体力的扩展与延伸,它自动或半自动地支持软件的开发和管理,支持各种软件文档的生成;
  • 软件工程中的过程贯穿软件开发的各个环节,管理人员在软件工程过程中,要对软件开发的质量、进度、成本进行评估、管理和控制,包括人员组织、计划跟踪与控制、成本估算、质量保证和配置管理等。

软件生命周期 ​

根据国家标准GB/T8566一2022,软件生命周期可以划分为可行性研究、需求分析、概要设计、详细设计、实现、组装测试、确认测试、使用、维护、退役10个阶段,各自分别对应于软件生存周期的基本过程,如图所示。

ruankao_2026-08-25_164942_488.png

软件开发方法和模型 ​

软件开发方法是指软件开发过程所遵循的办法和步骤,从不同的角度可以对软件开发方法进行不同的分类。

软件开发模型则给出了软件开发活动各阶段之间的关系,它是软件开发过程的概括,是软件工程的重要内容。软件开发模型为软件工程管理提供了里程碑和进度表,为软件开发过程提供了原则和方法。

传统软件开发模型 ​

瀑布模型 ​

瀑布模型是一种严格定义方法,它将软件开发的过程分为软件计划、需求分析、软件设计、程序编码、软件测试和运行维护6个阶段,形如瀑布流水,最终得到软件产品,如图所示。 ruankao_2026-08-25_170155_935.png

瀑布模型是一个线性顺序模型,支持线性开发。它假设当线性序列完成之后就能交付一个完善的系统,并没有考虑软件的演化特征。其优点是强调开发的阶段性、早期计划和需求调查以及产品测试,以这样严格的方式构造软件,开发人员很清楚每一步应该做什么,有利于项目管理。

然而,在瀑布模型中,不能适应需求的变化;在瀑布模型中,需求或设计中的错误往往只有到了项目后期才能够被发现,对于项目风险的控制能力较弱,从而导致项目常常延期完成,开发费用超出预算。

演化模型 ​

演化模型主要针对事先不能完整定义需求的软件开发,是在快速开发一个原型的基础上,根据用户在调用原型的过程中提出的反馈意见和建议,对原型进行改进,获得原型的新版本,重复这一过程,直到演化成最终的软件产品。

演化模型的主要优点是,任何功能一经开发就能进入测试,以便验证是否符合产品需求,可以帮助引导出高质量的产品要求。

其主要缺点是,如果不加控制地让用户接触开发中尚未稳定的功能,可能对开发人员及用户都会产生负面的影响。

螺旋模型 ​

螺旋模型是瀑布模型与演化模型相结合,并加入两者所忽略的风险分析所建立的一种软件开发模型。它将原型实现的迭代特征与线性顺序模型中的控制和系统化的方面结合起来,使软件的增量版本的快速开发成为可能。

在螺旋模型中,软件开发是一系列的增量发布。螺旋模型沿着螺旋线进行若干次迭代,每次迭代都包括制订计划、风险分析、实施工程和客户评估4个方面的工作。

螺旋模型强调风险分析,使得开发人员和用户对每个演化层出现的风险有所了解,继而做出应有的反应。因此,它特别适用于庞大、复杂并具有高风险的系统。

与瀑布模型相比,螺旋模型支持用户需求的动态变化,为用户参与软件开发的所有关键决策提供了方便,有助于提高软件的适应能力,并且为项目管理人员及时调整管理决策提供了便利,从而降低了软件开发的风险。

喷泉模型 ​

喷泉模型是一种以用户需求为动力,以对象为驱动的模型,主要用于描述面向对象的软件开发过程。该模型认为软件开发过程自下而上的各阶段是相互重叠和多次反复的,就像水喷上去又可以落下来,类似一个喷泉。各个开发阶段没有特定的次序要求,并且可以交互进行,可以在某个开发阶段随时补充其他任何开发阶段中的遗漏。

在喷泉模型中,各活动之间无明显边界,例如,分析和设计之间没有明显的边界。这种特性称为无间隙性。由于对象概念的引入,只用类和关系来表达分析、设计和实现等活动,从而可以较容易地实现活动的迭代和无间隙,提高软件项目开发效率,节省开发时间。

变换模型 ​

变换模型是基于形式化规格说明语言和程序变换的软件开发模型,它对形式化的软件规格说明进行一系列自动或半自动的程序变换,最后映射为计算机能够接受的软件系统。

为了确认形式化规格说明与软件需求的一致性,往往以形式化规格说明为基础开发一个软件原型,用户可以从人机界面、系统主要功能和性能等方面对原型进行评审。必要时,可以修改软件需求、形式化规格说明和原型,直至原型被确认为止。

变换模型的优点是解决了代码结构经多次修改而变坏的问题,减少了许多中间步骤(例如,设计、编码和测试等)。但是,变换模型仍有较大的局限性,以形式化开发方法为基础的变换模型需要严格的数学理论和一整套开发环境的支持。

智能模型 ​

智能模型也称为基于知识的软件开发模型,它综合了上述若干模型,并把专家系统结合在一起。该模型应用基于规则的系统,采用规约和推理机制,帮助开发人员完成开发工作,并使维护在系统规格说明一级进行。

为此,需要建立知识库,将模型本身、软件工程知识与特定领域的知识分别存入知识库。

V模型 ​

V模型是在快速应用开发模型的基础上演变而来的,由于将整个开发过程构造成一个V字形而得名。V模型和瀑布模型有一些共同的特征。

V模型的过程从左到右,描述了基本的开发过程和测试行为,其价值在于它非常明确地标明了测试过程中存在的不同级别,并且清楚地描述了这些测试阶段和开发过程各阶段的对应关系,如图所示。

ruankao_2026-08-25_170859_384.png

V模型强调软件开发的协作和速度,将软件实现和验证有机地结合起来,在保证较高的软件质量的情况下缩短开发周期。

V模型适合企业级的软件开发,它更清楚地揭示了软件开发过程的特性及其本质。

快速应用开发(RAD) ​

快速应用开发(Rapid Application Development,RAD)是一种比传统生命周期法快得多的开发方法,它强调极短的开发周期。

RAD模型是瀑布模型的一个高速变种,通过使用基于构件的开发方法获得快速开发。如果需求理解得很好,且约束了项目范围,利用这种模型可以很快开发出功能完善的信息系统。

统一过程模型(UP) ​

统一过程(Unified Process,UP)是一个通用过程框架,可以用于种类广泛的软件系统、不同的应用领域、不同的组织类型、不同的性能水平和不同的项目规模。UP是基于构件的,在为软件系统建模时,UP使用的是UML。

与其他软件过程相比,UP具有三个显著的特点,即用例驱动、以架构为中心、迭代和增量。

敏捷方法 ​

敏捷方法是从20世纪90年代开始引起广泛关注的一些新型软件开发方法,以应对快速变化的需求。虽然它们的具体名称、理念、过程、术语都不尽相同,但相对于“非敏捷”而言,它们更强调开发团队与用户之间的紧密协作、面对面的沟通、频繁交付新的软件版本、紧凑而自我组织型的团队等,也更注重人的作用。

敏捷方法强调:让客户满意和软件尽早增量发布;小而高度自主的项目团队;非正式的方法;最小化软件工程工作产品以及整体精简开发。

目前,主要的敏捷方法有极限编程(eXtreme Programming,XP)、自适应软件开发(Adaptive Software Development, ASD)、水晶方法 (Crystal)、特性驱动开发 (Feature-DrivenDevelopment, FDD)、 动态系统开发方法 (Dynamic Systems Development Method, DSDM)、测试驱动开发(Test-Driven Development, TDD)、Scrum、敏捷数据库技术(Agile DatabaseTechniques,AD)和精益软件开发(Lean Software Development)等。

虽然这些过程模型在实践上有差异,但都遵循敏捷宣言或者敏捷联盟所定义的基本原则。这些原则包括客户参与、增量式移交、简单性、接受变更、强调开发人员的作用和及时反馈等。

软件开发环境和工具 ​

软件开发环境 ​

暂无

软件开发工具 ​

暂无

软件过程管理 ​

软件能力成熟度模型(CMM) ​

软件能力成熟度模型(Capability Maturity Model,CMM)是一个概念模型,模型框架和表示是刚性的,不能随意改变,但模型的解释和实现有一定弹性。

CMM提供了一个软件能力成熟度的框架,它将软件过程改进的步骤组织成5个成熟度等级,为软件过程不断改进奠定了一个 循序渐进的基础。

CMM的等级

CMM的5个成熟度等级分别为初始级、可重复级、已定义级、可管理级和优化级。

  • (1)初始级。初始级是未加定义的随意过程,软件过程的特点是无秩序的,有时甚至是混乱的。软件过程定义几乎处于无章法、无步骤可循的状态,软件产品所取得的成功往往依赖于极个别人的努力和机遇。
  • (2)可重复级。可重复级是规则化和纪律化的过程,软件过程已建立了基本的项目管理流程,可用于对成本、进度和功能特性进行跟踪。对类似的应用项目有章可循,并能重复以往所取得的成功。
  • (3)已定义级。已定义级是标准化和一致化的过程,用于管理和工程活动的软件过程均已文档化、标准化,并形成了整个软件组织的标准软件过程。全部项目均采用与实际情况相吻合的、适当修改后的标准软件过程来进行操作。
  • (4)可管理级。已管理级是可预测的过程,软件过程和产品质量有详细的度量标准。软件过程和产品质量得到了定量的认识和控制。
  • (5)优化级。优化级是持续改进的过程,通过对来自过程、新概念和新技术等方面的各种有用信息的定量分析,能够不断地、持续性地对过程进行改进。

软件过程评估 ​

软件过程评估是根据过程模型或其他模型对组织的软件过程所进行的规范的评估。

软件重用和再工程 ​

可重用的软件构件 ​

软件重用是在软件开发过程中重复使用相同或相似的软件元素的过程。这些软件元素包括应用领域知识、开发经验、设计经验、体系结构、需求分析文档、设计文档、程序代码及测试用例等。

对于新的软件开发项目而言,它们是构成整个软件系统的部件,或者在软件开发过程中可发挥某种作用。通常把这些软件元素称为软件构件。一般情况下,在软件开发中采用重用软件构件,较从头开发这个软件更加容易。

软件重用的目的是能更快、更好、成本更低地生产软件产品。

软件的重用可划分为三个层次,即知识重用,方法和标准的重用以及软件成分的重用。

软件重用过程 ​

软件重用过程模型

软件重用过程有三种模型,分别为组装模型、类重用模型和软件重用过程模型。

软件逆向工程 ​

逆向工程(Reverse Engineering)是一种产品设计技术的再现过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能特性及技术规格等设计要素,进而制作出功能相近,但又不完全一样的产品。

简单地说,逆向工程就是根据已有的产品,反向推出产品设计数据(包括各类设计图或数据模型)的过程。因此,逆向工程可以被认为是一个从产品到设计的过程。

逆向工程实现方法

软件逆向工程有多种实现方法,主要包括以下三种:

  • (1)分析信息交换过程。最常用于协议逆向工程,涉及使用总线分析器和数据包嗅探器。在接入计算机总线或网络连接,并成功截取通信数据后,可以对总线或网络行为进行分析,以制造出拥有相同行为的通信实现。此法特别适用于设备驱动程序的逆向工程。
  • (2)反汇编。使用反汇编器,把程序的原始机器码翻译成较便于阅读理解的汇编代码。这适用于任何计算机程序,对不熟悉机器码的人特别有用,流行的相关工具有OllyDebug和IDA。
  • (3)反编译。使用反编译器,尝试从程序的机器码或字节码重现高级语言形式的源代码。随着计算机技术在各个领域的广泛应用,特别是软件开发技术的迅猛发展,基于某个软件,以反汇编阅读源码的方式去推断其数据结构、体系结构和程序设计信息,已成为软件逆向工程技术关注的主要方向。

软件再工程 ​

暂无

软件产品线 ​

产品线的过程模型 ​

产品线的建立方式 ​

软件统一建模语言(UML) ​

统一建模语言(Unified Modeling Language,UML)是一种定义良好、易于表达、功能强大且普遍适用的建模语言,它融入了软件工程领域的新思想、新方法和新技术,它的作用域不限于支持面向对象分析和面向对象设计,还支持从需求分析开始的软件开发的全过程。

UML的结构 ​

从总体上来看,UML的结构包括构造块、公共机制和规则三个部分。

  • (1)构造块。UML有三种基本的构造块,分别是事物(thing)、关系(relationship)和图(diagram)。事物是UML的重要组成部分,关系把事物紧密联系在一起,图是多个相互关联的事物的集合。
  • (2)公共机制。公共机制是指达到特定目标的公共UML方法,主要包括规格说明(详细说明)、修饰、公共分类(通用划分)和扩展机制4种。
  • (3)规则。规则是构造块如何放在一起的规定,具体包括:为构造块命名;赋予这些名称特定含义的上下文,即范围;怎样使用或看见名字,即可见性;事物如何正确、一致地相互联系,即完整性;运行或模拟动态模型的含义是什么,即执行。

事物 ​

UML中的事物也称为建模元素,包括结构事物(Structural Things)、行为事物(BehavioralThings,动作事物)、分组事物(Grouping Things)和注释事物(Annotational Things,注解事物)。这些事物是UML模型中最基本的构造块。

关系 ​

UML用关系把事物结合在一起,主要有下列4种关系:

  • (1)依赖(dependency)。依赖是两个事物之间的语义关系,其中一个事物发生变化会影响另一个事物的语义。
  • (2)关联(association)。关联描述一组对象之间连接的结构关系。
  • (3)泛化(generalization)。泛化是一般化和特殊化的关系,描述特殊元素的对象可替换一般元素的对象。
  • (4)实现(realization)。实现是类之间的语义关系,其中的一个类指定了由另一个类保证执行的契约。

图 ​

暂无

软件形式化方法 ​

提高软件可靠性的一种重要技术是使用形式化方法。形式化方法是建立在严格数学基础上、具有精确数学语义的开发方法。

广义的形式化方法是指软件开发过程中分析、设计和实现的系统工程方法,狭义的形式化方法是指软件规格和验证的方法。

形式化方法基本概念 ​

净室软件工程(CSE) ​

净室软件工程(Cleanroom Software Engineering,CSE)是软件开发的一种形式化方法,可以开发较高质量的软件。

它使用盒结构归约进行分析和建模,并且将正确性验证作为发现和排除错误的主要机制,使用统计测试来获取认证软件可靠性所需要的信息。

程序验证 ​

在软件工程领域,用于确保程序正确性的手段有很多,大体可分为两类:动态方法(Dynamic)和静态方法(Static)。

动态方法

动态方法需要将软件源码编译为可执行文件,再运行软件,通过特定的输入考察软件的运行结果。

动态方法中使用得比较广泛的是软件测试,有手动测试、自动化测试等。动态方法效率高,错误定位准确,但应用场合受限,它要求必须具有程序能运行起来的环境。

而且,其最大的问题在于,动态方法不能覆盖程序的所有输入和全部的执行路径,故只能证明在已有的输入下,被测试所覆盖的部分程序没有问题,而不能证明整个程序不存在错误。

静态方法

静态方法则是基于程序源代码进行分析,无须编译运行,所以应用场景更加广泛。

常用的静态方法有静态分析、符号执行、定理证明、模型检测等。不同的静态方法各有优劣,其应用门槛也比较高,一般用于对程序正确性要求较高的场景。