【系统架构设计师(第2版)】五、软件工程基础知识

5.1 软件工程

20世纪60年代,为了解决软件危机,提出了软件工程的概念。
软件危机的具体表现:

  • 软件开发进度难以预测;
  • 软件开发成本难以控制;
  • 软件功能难以满足用户期望;
  • 软件质量无法保证;
  • 软件难以维护;
  • 软件缺少适当的文档资料。

5.1.1 软件工程定义

软件工程师应用计算机科学、数学、逻辑学及管理科学等原理,开发软件的工程。软件工程借鉴传统工程的原则和方法,以提高质量、降低成本和改进算法。其中,计算机科学、数学用于构建模型与算法;工程科学用于制定规范、设计范式、评估成本及确定权衡;管理科学用于计划、资源、质量、成本等管理。

软件工程过程是指获得软件产品,在软件工具的支持下由软件工程师完成的一系列软件工程活动,包括4个方面:

  • Plan:软件规格说明
  • Do:软件开发
  • Check:软件确认
  • Action:软件演进

5.1.2 软件过程模型

软件经历需求设计软件设计软件开发运行维护,直至被淘汰的全过程称为软件的生命周期。
为了使软件生命周期种的各项任务能够有序地按照规程进行,对各项任务给予规程约束的工作模型称为软件过程模型(软件生命周期模型)。

1、瀑布模型

瀑布模型

2、原型化模型

原型化模型

3、螺旋模型

螺旋化模型

5.1.3 敏捷模型

20世纪90年代,软件开发受到两个因素影响:面向对象编程开始取代面向过程编程;互联网泡沫刀纸快速投向市场以及公司的快速发展成为关键商业因素。
快速变化的需求需要短的产品交付周期,从而诞生了敏捷方法的概念。

1、敏捷方法的特点
  • 敏捷型方法是“适应性(adaptive)”而非“预设性(predictive)”的;
  • 敏捷型方法是“面向人的(People-oriented)”而非“面向过程的(Process-oriented)”。
2、敏捷方法的核心思想
  • 敏捷方法是适应型,而非可预测性;
  • 敏捷方法是以人为本,而非以过程为本;
  • 迭代增量式的开发过程。
3、主要敏捷方法简介
  • 极限编程(Extreme Programming,XP)
  • 水晶系列方法
  • Scrum,迭代式增量软件开发过程,侧重于项目管理
  • 特征驱动开发方法(Feature Driven Development,FDD)
    • 6种关键项目角色:项目经理、首席架构设计师、开发经理、主程序员、程序员和领域专家;
    • 5个核心过程:开发整体对象模型、构造特征列表、计划特征开发、特征设计和特征构建。

5.1.4 统一过程模型(RUP)

统一过程模型(Rational Unified Process,RUP)描述了如何利用商业的、可靠的方法开发和部署软件,是一个重量级过程。

1、RUP的生命周期

9个核心工作流:

  • 业务建模
  • 需求
  • 分析与设计
  • 实现
  • 测试
  • 部署
  • 配置与变更管理
  • 项目管理
  • 环境
    多个循环软件开发生命周期中的4个阶段:
  • 初始阶段
  • 细化阶段
  • 构造阶段
  • 移交阶段
2、RUP中的核心概念
  • 角色(Role)
  • 活动(Activity)
  • 制品(Artifact)
  • 工作流(Workflow)
3、RUP的特点
  • 用例驱动
  • 以体系结构为中心
  • 迭代和增量

5.1.5 软件能力成熟度模型

软件能力成熟度模型(Capability Maturity Model for Software, CMM)是一个概念模型,模型框架和表示是刚性的,不能随意改变的,但是模型的解释和实现具有一定弹性。
软件能力成熟度模型集成(Capability Maturity Model Integration for Software, CMMI)是在CMM的基础上发展而来的。
CMMI提供了一个软件能力成熟度的框架,将软件过程改进的步骤组织成了5个成熟度等级,共包括18个关键过程域,52个过程目标,3168种关键时间,它为软件过程不断改进奠定了一个循序渐进的基础。

  • Level 1 初始级
  • Level 2 已管理级
  • Level 3 已定义级
  • Level 4 量化管理级
  • Level 5 优化级
    注:有关软件能力成熟度模型的详细介绍,需参考CMM相关专业书籍。

5.2 需求工程

需求工程是指应用已证实有效的原理、方法,通过合适的工具和记号,系统地描述待开发系统及其行为特征和相关约束。
需求工程的目标简单命令:确定客户需求,定义设想中系统的所有外部特征。
需求工程的活动主要被划分为以下几个阶段:

  • 需求获取
  • 需求分析
  • 形成需求规格(需求文档化)
  • 需求确认与验证
  • 需求管理

5.2.1 需求获取

1、需求获取的基本步骤
  • 开发高层的业务模型
  • 定义项目范围和高层需求
  • 识别用户角色和用户代表
  • 获取具体的需求
  • 确定目标系统的业务工作流
  • 需求整理与总结
2、需求获取方法
  • 用户面谈
  • 需求专题讨论会
  • 问卷调查
  • 现场观察
  • 原型化方法
  • 头脑风暴

5.2.2 需求变更

1、变更控制过程

需求变更管理过程

2、变更控制委员会

变更控制委员会(Change Control Board,CCB)是项目所有者权益代表,负责裁定接受哪些变更。CCB是决策机构,通常通过评审手段来决定项目是否能变更,但是不提出变更方案。

5.2.3 需求追踪

需求追踪提供了由需求到产品实现整个过程范围的明确查阅能力。需求跟踪可以建立与维护“需求-设计-编程-测试”之间的一致性,确保所有的工作成果符合用户需求。需求跟踪有两种方式:

  • 正向跟踪:检查每个需求能否在后续工作成功中找到对应点;
  • 反向跟踪:检查设计文档、代码、测试用例等工作能否在需求中找到出处。

5.3 系统分析和设计

系统分析阶段是应用系统思想和方法,把复杂的对象分解为简单的组成部分,找出这些部分的基本属性和彼此之间的关系的过程。其基本任务是系统分析师和用户在充分了解用户需求的基础上,把双方对新系统的理解表达为系统需求规格说明书。
系统设计的目标是根据系统分析的结果,完成系统的构建过程。其主要目的是绘制系统的蓝图,权衡和比较各种技术和实施方法的利弊,合理分配各种资源,构建新系统的详细设计方案和相关模型,指导系统实施工作的顺利开展。系统设计的主要内容包括概要设计和详细设计。

5.3.1 结构化方法

结构化(Structured Analysis and Structured Design,SASD)方法,也可称为面向功能的软件开发方法或面向数据流的软件开发方法。
结构化开发方法提出了一组提高软件结构合理性的准则,如分解和抽象、模块独立性、信息隐蔽等。针对软件生存周期各个不同阶段,它有结构化分析(Structured Analysis,SA)、结构化设计(Structred Design,SD)和结构化编程(Structured Programing,SP)等方法。

1、结构化分析

一般利用图形表达用户需求,使用的手段主要有:

  • 数据流图(Data Flow Diagram,DFD):从应用系统的数据流着手以图形方式刻画和表示一个具体业务系统中的数据处理过程和数据流;
  • 数据字典(Data Dictionary):数据字典是描述数据的信息集合,是对系统中使用的所有数据元素定义的集合。数据字典的作用是给数据流图上每个元素加以定义和说明;
  • 结构化语言
  • 判定表
  • 判定树
2、结构化设计

以结构化分析阶段所产生的数据流图和数据字典等文档为基础,是一个自顶向下、逐步求精和模块化的过程。结构化设计的基本思想是将软件设计成由相对独立且具有单一功能的模块组成的结构,分为概要设计和详细设计两个阶段。

  • 模块结构:信息隐藏和抽象、模块化、松耦合、高内聚
  • 系统结构图(模块结构图):模块的实现算法、所需的局部数据结构
3、结构化编程

程序 = 算法 + 数据结构,自顶向下,逐步细化;清晰第一,效率第二;书写规范,缩进格式;基本结构,组合而成。

4、数据库设计

数据库设计的内容包括:

  • 概念结构设计:通常采用实体-联系图(Entity Relationship Diagram,E-R图)来表示。
  • 逻辑结构设计
  • 物理结构设计
  • 数据库的实施
  • 数据库的运行和维护

5.3.2 面向对象的方法

面向对象开发方法将面向对象的思想应用于软件开发过程中,指导开发活动,是建立在“对象”概念基础上的方法学。
面向对象开发方法是以用例驱动的、以体系结构为中心的、迭代的和渐增式的开发过程,主要包括:需求分析、系统分析、系统设计、系统实现。

1、面向对象分析(OOA)
  • 面向对象分析的基本原则:抽象、封装、继承、分类、聚合、关联、消息通信、粒度控制、行为分析;
  • 面向对象分析的基本步骤:确认对象和类、确定结构、确定主题、确定属性、确定方法。
2、面向对象设计(OOD)

类封装了信息和行为,是面向对象的重要组成部分,它是具有相同属性、方法和关系的对象集合的总称。在面向对象设计中,类可以分为3种类型:实体类、控制类和边界类。

  • 实体类:映射需要中的每个实体,在系统的整个生存期中通常都是永久性的,一般类名以名词命名;
  • 控制类:用于控制用例工作的类,将用例的特有行为进行封装,一般由动宾结构的短语(“动词+名词”或“名词+动词”)转化来的名词;
  • 边界类:用于封装在用例内、外流动的信息和数据流。边界类用于系统接口与系统外部进行交互,将系统与外部环境的变更分隔开,通常情况下边界类可以既有属性也有方法。
3、面向对象编程(OOP)

面向对象编程达到了软件工程的3个主要目标:重用性、灵活性和扩展性。
面向对象编程 = 对象 + 类 + 继承 + 多态 + 消息,其中核心概念是类和对象
面向对象编程的基本特点:封装、继承和多态。

4、数据持久化和数据库

在面向对象开发方法中,对象只能存在于内存中,如果要永久保存对象的状态,需要进行对象的持久化(Persistence):将内存中的对象保存到数据库或可永久保存的存储设备中。

5.4 软件测试

软件测试是使用人工或自动的手段来运行和测定某个软件系统的过程,其主要目的就是确保软件的质量、确保软件以正确的方式做了用户所期望的事情;同时还要给开发人员提供信息,以方便其为风险评估做相应的准备。

5.4.1 测试方法

以测试过程中程序执行状态可依据分为:

  • 静态测试(Static Testing,ST)
  • 动态测试(Dynamic Testing,DT)
    以具体实现算法细节和系统内部结构的相关情况可分为:
  • 黑盒测试
  • 白盒测试
  • 灰盒测试
    从程序执行方式可分为:
  • 人工测试(Manual Testing)
  • 自动化测试(Automatic Testing)

5.4.2 测试阶段

从阶段上划分,软件测试可以分为:

  • 单元测试(Unit Testing,UT)
  • 集成测试(Integration Testing,IT)
  • 系统测试(System Testing,ST)
    系统测试中又细分为多种不用的测试种类,如:
  • 功能测试
  • 性能测试
  • 验收测试
  • 压力测试

5.5 净室软件工程

净室软件工程(Cleanroom Software Engineering,CSE)是一种应用数据与统计学理论以经济的方式生产高质量软件的工程技术,力图通过严格的工程化的软件过程达到开发中的零缺陷或接近零缺陷。
净室软件工程师一种在软件开发过程中强调在软件中建立正确性的需要的方法,针对高质量软件的生产,降低风险及成本,满足用户需求,提供竞争优势。
净室软件工程是软件开发的一种形式化方法,它可以生成质量非常高的软件,强调将正确性验证(而不是测试)作为发现和消除错误的主要机制。

5.5.1 理论基础

  • 函数理论:一个函数定义了定义域到值域的映射,一个好程序的规范就是一个函数的规范,应具有:完备性,一致性和正确性;
  • 抽样理论:把软件的所有可能的使用情况看作总体,通过统计学手段对其进行抽样,并对样本进行测试,根据测试结果分析软件的性能和可靠性。

5.5.2 技术手段

  • 统计过程控制下的增量式开发:控制迭代
  • 基于函数的规范与设计
  • 正确性验证
  • 统计测试和软件认证

5.6 基于构件的软件工程

基于构件的软件工程(Compoment-Based Software Engineering,CBSE)是一种基于分布对象技术、强调通过可复用构建设计与构造软件系统的软件复用途径。
基于构件的软件工程(CBSE)体现了“购买而不是重新构造”的哲学,将软件开发的重点从程序编写转移到了基于已有构件的组装,以更快地构造系统,减轻用来支持和升级大型系统所需要的维护负担,从而降低软件开发费用。

5.6.1 构件和构件模型

基于构件的软件工程(CBSE)构件的特征:

  • 可组装性
  • 可部署性
  • 文档化
  • 独立性
  • 标准化
    构件模型定义了构件实现、文档化以及开发的标准,构件模型包含了一些模型要是,这些要素信息定义了构件接口、在程序中使用构件需要知道的消息,以及构件应该如何部署。

5.6.2 CBSE过程

CBSE过程中的主要活动包括:

  • 系统需求概述
  • 识别候选构件
  • 根据发现的构件修改需求
  • 体系结构设计
  • 构件定制与适配
  • 组装构件,创建系统

5.6.3 构架组装

  • 顺序组装:上一个构件的输出,与下一个构件的输入相兼容;
  • 层次组装:被调用构件为调用构件提供所需的服务;
  • 叠加组装:两个或两个以上构架放在一起创建一个新构件。

5.7 软件项目管理

5.7.1 项目管理概述

软件项目管理的对象是软件工程项目,它所涉及的范围覆盖了整个软件工程过程。
软件项目管理是为了使软件项目能够按照预定的成本、进度、质量顺利完成,而对人员(People)、产品(Product)、过程(Process)和项目(Project)进行分析和管理的活动。

5.7.2 软件进度管理

所谓进度,指的是对执行活动和里程碑所制定的工作计算,而进度管理指的是为了确保项目按期完成所需要的管理过程。在软件进度管理过程中,一般包括:活动定义、活动排序、活动资源估计、活动历时估计、制定进度计划和进度控制。

1、工作分解结构(Work Breakdown Structure,WPS)

当软件项目比较大而复杂时,往往需要进行层层分解,将大的任务分解成一个个的单一小任务进行处理。

2、任务活动图

活动定义时指确定完成项目的各个交付成果所必须进行的各项活动,需要明确每个活动的前驱、持续时间、必须完成日期、里程碑或交付成果。
在项目管理中,任务活动图是项目进度管理、项目成本管理等一系列项目管理活动的基础,通常采用甘特图的方式来展示和管理项目活动。

5.7.3 软件配置管理

软件配置管理(Software Configuration Manaagement,SCM)是一种标识、组织和控制修改的技术。
软件配置管理的核心内容包括版本控制和变更配置:

  • 版本控制(Version Control):对软件开发过程中的各种程序代码、配置文件及说明文档等文件变更管理;
  • 变更控制(Change Control):对变更进行管理,确保变更更有序进行。

5.7.4 软件质量管理

软件质量就是软件与明确地和隐含地定义的需求相一致的程度。(软件质量是软件符合明确地叙述的功能和性能需求、文档中明确地描述的开发标准以及所有专业开发的软件都应具有的隐含特征的程序。)
从管理角度出发,可以将影响软件质量的因素划分为3组:产品运行、产品修改、产品转移。
影响软件质量的三个主要因素关系图

1、软件质量保证

软件质量保证(Software Quality Assurance,SQA)是建立一套有计划,有系统的方法,来向管理层保证拟定出来的标准、步骤、实践和方法能够正确地被所有项目所采用。
软件质量保证的主要任务有三个方面:

  • SQA审计和评审
  • SQA报告
  • 处理不符合问题
2、软件质量认证

质量认证用来检验整个企业的质量水平,注重软件企业的整体资质,全面考察软件企业的整体质量体系,检验该企业是否具有设计、开发和生产符合质量要求的软件的能力。
目前国内软件企业主要采用的是ISO 9000和能力成熟度模型(Capability Maturity Model,CMM)。

5.7.5 软件风险管理

软件项目风险管理是软件项目管理的重要内容,风险管理的主要目标是预防风险。
软件项目风险是指软件开发过程中遇到的预算和进度等方面的问题,以及这些问题对软件项目交付的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机内卷下一站,AI Agent

作者 | 辰纹 来源 | 洞见新研社 2024年除夕夜,OPPO在央视春晚即将开始前举办了一场“史上最短发布会”,OPPO首席产品官刘作虎宣布,“OPPO正式进入AI手机时代”。 春节假期刚过,魅族又公开表示,将停止“传统智能手机…

科研绘图系列:R语言组合堆积图(stacked plot)

文章目录 介绍加载R包数据数据预处理画图1画图2组合图形系统信息介绍 堆积图(Stacked Chart),也称为堆叠图,是一种常用的数据可视化图表,主要用于展示不同类别的数据量在总体中的分布情况。堆积图可以是柱状图、条形图或面积图的形式,其中各个类别的数据量被叠加在一起,…

Node.js 完全教程:从入门到精通

Node.js 完全教程:从入门到精通 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,允许开发者在服务器端使用 JavaScript。它的非阻塞 I/O 和事件驱动架构使得 Node.js 非常适合于构建高性能的网络应用。本文将详细介绍 Node.js 的安装、基本语…

微服务day03

导入黑马商城项目 创建Mysql服务 由于已有相关项目则要关闭DockerComponent中的已开启的项目 [rootserver02 ~]# docker compose down WARN[0000] /root/docker-compose.yml: version is obsolete [] Running 4/4✔ Container nginx Removed …

每日一题之二叉树

已知结点元素值为正整数且值不相同的一棵二叉树。 该二叉树通过给出其先序遍历序列和中序遍历序列构造而成。 输入一个整数x,针对此二叉树编写程序求出x的右子树中所有结点值的和(若x不在树上,输出-1)。 输入说明:第一…

win10系统使用Visual Studio 2019或cmake编译SDL2为32位库时出现error C2118: 负下标winnt.h的解决方法

提示: 下图蓝体字中的VS2008是错误的,其实SDL.sln是用VS2010版本的软件开发的(对于SDL-release-2.0.5.zip源码而言至少是这样,而2024-11-6为止SDL是2.30.9版本了,2.30.9版本则无需自己编译,只需下载带后缀…

推荐一款管道数据检索工具:Pipedata-Pro

Pipedata-Pro是一款专为设计石油、天然气、水和蒸汽管道及管道系统的工程师开发的应用程序。该应用程序提供了设计管道系统所需的工程数据,拥有一个全面的管道类型、配件和材料数据库。 软件特点: 1. 技术参数查询:Pipedata-Pro 提供关于管道…

算法竞赛(Python)-数组

文章目录 一 、排序算法二 、二分查找1 二分查找讲解2 二分查找题目(1)二分查找(2)在排序数组中查找元素的第一个和最后一个位置(3)两数之和 II - 输入有序数组 三、数组双指针1对撞指针对撞指针题目1&…

基于STM32的LCD1602显示Proteus仿真设计(仿真+程序+设计报告+讲解视频)

这里写目录标题 1.主要功能0. 资料清单&下载链接资料下载链接:2.仿真设计3. 程序设计4. 设计报告5. 框图 基于STM32的LCD1602显示Proteus仿真设计(仿真程序设计报告讲解视频) 仿真图proteus 8.9 程序编译器:keil 5 编程语言&#xff1a…

SpringBoot项目编译报错 类文件具有错误的版本 61.0, 应为 52.0

springboot项目在编译时报错: /Users/Apple/Developer/art/caicai/cai-api/dubbo-samples/1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-provider/src/main/java/org/apache/dubbo/springboot/demo/provider/ProviderApplication.java:22:32 java…

PVE纵览-备份与快照指南

PVE纵览-备份与快照指南 文章目录 PVE纵览-备份与快照指南摘要1 备份与快照概述定义与区别备份与快照在PVE中的应用场景 2 PVE 备份功能详解备份类型与策略配置备份任务自动化备份管理 3 PVE 快照功能详解快照的工作原理快照的创建与恢复机制快照对系统性能的影响快照的使用场景…

Mac如何实现最简单的随时监测实时运行状态的方法

Mac book有着不同于Windows的设计逻辑与交互设计,使得Mac book有着非常棒的使用体验,但是在Mac电脑的使用时间过长时,电脑也会出现响应速度变慢或应用程序崩溃的情况,当发生的时候却不知道什么原因导致的,想要查询电脑…

JavaWeb合集23-文件上传

二十三 、 文件上传 实现效果&#xff1a;用户点击上传按钮、选择上传的头像&#xff0c;确定自动上传&#xff0c;将上传的文件保存到指定的目录中&#xff0c;并重新命名&#xff0c;生成访问链接&#xff0c;返回给前端进行回显。 1、前端实现 vue3AntDesignVue实现 <tem…

WPF之iconfont(字体图标)使用

1&#xff0c;前文&#xff1a; WPF的Xaml是与前端的Html有着高度相似性的标记语言&#xff0c;所以Xaml也可同Html一般轻松使用阿里提供的海量字体图标&#xff0c;从而有效的减少开发工作度。 2&#xff0c;下载字体图标&#xff1a; 登录阿里图标库网iconfont-阿里巴巴矢量…

leetcode92:反转链表||

给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a;[1,4,3,2…

Python-安装与PyCharm的安装配置(1)

目录 安装 打开运行 PyCharm的安装 新建项目 安装 找到官网下载对应的电脑对应的版本 Welcome to Python.org -- 官网 下载稳定版的 安装记得勾选配置环境&#xff0c;这样自己就不需要再配置环境了 安装成功 至此python的运行环境就安装好了 打开运行 在开始菜单中可以…

python的编程基础分支,循环与函数的应用知识

编程基础是学习任何编程语言的必备知识之一。在Python中&#xff0c;分支、循环和函数是常用的编程概念&#xff0c;它们可以让我们编写出更复杂、更灵活的程序。 分支 分支是根据条件来决定程序执行的不同路径。在Python中&#xff0c;我们使用if语句来实现分支。 if 条件:# …

qt QLocale详解

1、概述 QLocale是Qt框架中的一个类&#xff0c;用于处理与本地化相关的操作。它能够方便地实现日期、时间、数字和货币的格式化和解析&#xff0c;支持不同的语言、区域设置和字符集。QLocale提供了一种跨平台的方式来获取当前系统的语言设置&#xff0c;并返回该语言的本地化…

缓存、注解、分页

一.缓存 作用&#xff1a;应用查询上&#xff0c;内存中的块区域。 缓存查询结果&#xff0c;减少与数据库的交互&#xff0c;从而提高运行效率。 1.SqlSession 缓存 1. 又称为一级缓存&#xff0c;mybatis自动开启。 2. 作用范围&#xff1a;同一…

uniapp vue3 使用echarts-gl 绘画3d图表

我自己翻遍了网上&#xff0c;以及插件市场&#xff0c;其实并没有uniapp 上使用echarts-gl的样例&#xff0c;大多数都是使用插件市场的echarts的插件 开始自己尝试直接用echartsgl 没有成功&#xff0c;后来尝试使用threejs 但是也遇到一些问题&#xff0c;最后我看官网的时…