【系统架构设计师(第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 软件风险管理

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习——多层感知机MLP(一、多层感知机介绍)

目录标题 一、多层感知机1.1 隐藏层1.1.1 为什么需要隐藏层1.1.2 在网络中加入隐藏层1.1.3 从线性到非线性 1.2 激活函数1.2.1 ReLU函数1.2.2 sigmoid函数1.2.3 tanh函数 最简单的深度神经网络成为多层感知机。多层感知机由多层神经元组成,每一层与它的上一层相连&a…

多个NVR同时管理EasyNVR多品牌NVR管理工具/设备:IP常见问题解决方案

随着视频监控技术的不断发展,NVR(网络视频录像机)已经成为现代安防系统的重要组成部分。而为了更高效地管理多个品牌的NVR设备,EasyNVR这一多品牌NVR管理工具应运而生。然而,在实际使用过程中,尤其是在多个…

CocoaPods安装步骤详解 - 2024

引言 CocoaPods的安装,如果有VPN就一直开启,会让整个流程非常顺畅。 在现代 iOS 开发中,依赖管理变得越来越重要,CocoaPods 成为开发者们首选的依赖管理工具。它不仅可以简化库的安装与更新,还能帮助开发者更高效地管…

基于RMD算法模型的信号传输统计特性的matlab模拟仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于RMD算法模型的信号传输统计特性的matlab模拟仿真。参考的文献如下: 即通过RMD随机中点位置模型算法,实现上述文献的几个仿真图。 2.…

Axure设计之三级联动选择器教程(中继器)

使用Axure设计三级联动选择器(如省市区选择器)时,可以利用中继器的数据存储和动态交互功能来实现。下面介绍中继器三级联动选择器设计的教程: 一、效果展示: 1、在三级联动选择器中,首先选择省份&#xff…

清华大学提出Mini-Omni2:开源多模态模型,功能与GPT-4o媲美!

🌐 在人工智能领域,多模态模型的发展正如火如荼。今天,我们要介绍的是由清华大学提出的Mini-Omni2,这是一个开源的多模态语言模型,它在功能上与GPT-4o相媲美,能够理解和生成视觉、听觉和文本内容&#xff0…

Diffusion Policy——斯坦福刷盘机器人UMI所用的扩散策略(含Diff-Control、ControlNet详解)

前言 本文一开始是属于此文《UMI——斯坦福刷盘机器人:从手持夹持器到动作预测Diffusion Policy(含代码解读)》的第三部分,考虑后Diffusion Policy的重要性很高,加之后续还有一系列基于其的改进工作 故独立成本文,且把原属于另一…

AI 写作(五)核心技术之文本摘要:分类与应用(5/10)

一、文本摘要:AI 写作的关键技术 文本摘要在 AI 写作中扮演着至关重要的角色。在当今信息爆炸的时代,人们每天都被大量的文本信息所包围,如何快速有效地获取关键信息成为了一个迫切的需求。文本摘要技术正是为了解决这个问题而诞生的&#x…

一个怀旧,俺的第一个共享软件

今天网友说起了 福彩双色球的程序。俺就想起这个来了,这是俺的第一个共享软件,收入大约15000。在当时来说,速度算是最快的。有些地方用了汇编优化(题外话,最近俺看到新闻,FFmpeg的作者也用汇编优化 性能提升…

【Agent综述】Agent在多模态交互的应用

note 这个工作收集了多模态游戏、机器人和医疗等领域的数据集,包括Minecraft视频数据、虚拟家庭环境数据和医疗图像数据。利用LLMs和VLMs作为智能体,特别是在游戏、机器人技术和医疗保健等领域这篇论文提出了一种新的Agent AI框架,通过结合大…

Kafka - 启用安全通信和认证机制_SSL + SASL

文章目录 官方资料概述制作kakfa证书1.1 openssl 生成CA1.2 生成server端秘钥对以及证书仓库1.3 CA 签名证书1.4 服务端秘钥库导入签名证书以及CA根证书1.5 生成服务端信任库并导入CA根数据1.6 生成客户端信任库并导入CA根证书 2 配置zookeeper SASL认证2.1 编写zk_server_jass…

STM32H503开发(1)----开发板测试

STM32H503开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载产品特性参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32H503 & SENSOR是一款基于STM32H5系列微控制器的评估套件。该微控制器采用了40nm工艺制造,具有更…

3.1 > Shell

本节概览 在 上一节 中我们了解了 Linux 的桌面环境,包括 GUI 、 TTY 和 VNC 等的介绍和使用。在本节中将介绍 Shell 是个什么东西,我们到底是如何通过 Shell 来操作计算机的,以及一些常见的 Shell 版本有哪些和它们有什么特点。 目录 本节…

C++ -- 多态与虚函数

多态 概念 多态(polymorphishm):通常来说,就是指事物的多种形态。在C中,多态可分为编译时多态(静态多态)和运行时多态(动态多态),这里我们重点讲的是运行时多…

利用游戏引擎的优势

大家好,我是小蜗牛。 在当今快速发展的游戏产业中,选择合适的游戏引擎对开发者来说至关重要。Cocos Creator作为一款功能强大且灵活的游戏引擎,为开发者提供了丰富的工具和资源,使他们能够高效地开发出优秀的游戏。本文将探讨如何…

uniapp配置h5路由模式为history时404

为了不让URL中出现#,让uniapp项目配置h5路由模式为hisory 然而本地好好的,放到服务器上却404了。 解决方法是给nginx配置一个伪静态: location /xxx-html/ {alias /home/nginx_web/xxx_new_html/;try_files $uri $uri/ /xxx-html/index.ht…

架构师备考-概念背诵(软件工程)

软件工程 软件开发生命周期: 软件定义时期:包括可行性研究和详细需求分析过程,任务是确定软件开发工程必须完成的总目标,具体可分成问题定义、可行性研究、需求分析等。软件开发时期:就是软件的设计与实现,可分成概要设计、详细设计、编码、测试等。软件运行和维护:就是…

小白docker入门简介

Dockerfile入门使用分享 一、docker是啥二、镜像仓库三、自定义镜像四、动手做机甲玩偶五、帮我做数学题六、计算功能的写法七、咒语翻译器八、放屁九、解决问题 一、docker是啥 最开始我和你一样,围着镜像、容器、docker的名词团团转,其实没那么复杂。…

一文学习Android中的Property

在 Android 系统中,Property 是一种全局的键值对存储系统,允许不同组件和进程间以轻量级的方式进行数据传递。它主要用于系统配置、状态标识等场景,使得不同进程能够通过属性的设置或获取来通信。property 的核心特性是快速、高效&#xff0…

node.js安装配置(Windows)

1、下载 CNPM Binaries Mirror 2、安装 3、验证 win R 进入cmd 4、配置环境变量 4.1、创建两个文件夹 4.2、安装目录进入cmd(配置全局属性) 配置两个命令: npm config set prefix "D:\liyunqing\nodejs\node_global"npm config set cache "D:\l…