系统架构主题之七:基于架构的软件设计方法及应用

2023-11-17

1 基于架构的软件设计方法概念

关键词:ABSD、自顶向下、递归迭代、与需求同步、设计元素、视角与视图、用例和质量场景、预期和非预期等。

总的来讲,ABSD方法分为如下六个大的阶段:

1)体系结构需求阶段

相比传统软件系统设计,架构设计在需求获取、分析之后展开不同,基于体系结构的软件架构设计,将架构设计工作提前到与需求同步,在需求阶段即开始展开体系架构设计,可以更好的完成设计工作,更好的支持软件复用。

ABSD方法在需求阶段的工作包括需求获取、标识构件、架构需求评审。需求获取用于提取系统相关的功能、质量属性,目标为服务商业和用户及开发人员目标。之后需要对需求进行分析,生成类图,对类进行分组,将类打包为构件,从而完成标识构件的工作。这个过程是不断迭代的过程。完成标识后,还需要组织相关人员(分析、用户、设计、测试等)对体系结构需求和构件进行评审,确定类是否合理,划分是否合理,构件合并是否合理等。

2)体系结构设计阶段

设计阶段的工作包括选择体系结构风格、映射构件、分析构件作用、产生体系结构、设计评审等步骤。选择合理的架构风格是首要工作。这可以统一大家对系统的基础理解。注意,这个步骤的结果并不一定是完美的,可能在后续完善迭代过程中完善。有了组织结构风格的理解后,就需要将标识的构建映射到体系结构中,产生一个中间结构。因为构件并不是独立的,之间有交互,有联系,所以还要分析他们的作用关系,在理清作用关系的基础上就可以精化体系结构,产生一个初步的体系结构,用于评审。这个评审需要邀请独立于系统开发人员的外部人员进行。

3)体系结构文档化

因为体系结构是抽象的,概念上的,所以要与开发人员、实现人员达成一致理解,还需要进行文档化工作。这个阶段输出体系结构规格说明文档和测试体系结构需求的质量设计说明书。文档需要从使用者的角度出发进行编写,需要是形式化的,有比较严格约束的。

4)体系结构复审

在开始编码实现之前,还需要对体系结构文档进行复审,用于识别缺陷和风险。这主要由外部专家和领域专家甚至用户代表来参加。设计人员可以大家一个最小化可运行系统来评估和测试体系架构,最终确定是否满足功能、质量需求,层次是否清晰,构建是否合理,表达是否明确等。

5)体系结构实现

实现阶段的工作主要包括构件分析和设计、构件实现、构件组装、系统测试等。构件的设计和实现要满足体系结构文档中有关构件的约束要求。测试不仅要进行功能测试,还需要进行性能测试,以满足整体要求。

6)体系结构演化

需求可能发生变化,体系结构要进行演化。演化过程包括需求归类、制定演化计划、构件变动、更新构件的相互作用、构件组装与测试、技术评审。整个过程还是比较容易理解的。评审后如果修改测试不符合需求,还需要迭代优化。

对上述过程主要是理解。在理解的基础上应用于实际系统开发中。从上面的介绍中我们可以看到,整个过程还是比较严谨细致的,关键问题是实际中执行的情况如何。

2 实际系统构建过程中的应用

仍然以前述某电力系统项目为例。

体系结构需求分析阶段的工作包括获取需求,生成类图,对类进行分组,打包成构件,对需求进行评审,产生领域模型。针对上述项目,从业务角度来看,包括了会议管理(包括传统网络会议和电话会议),通信管理(包括异构网络互联互通、多通信手段的无缝衔接,以打破信息孤岛),数据管理(各类数据的融合,共同服务业务流程,包括线路数据、定位数据、设备数据等),设备管理(各类设备的接入支持,采样支持)等。从技术上看,综合了多媒体音视频技术,网络技术,通信技术,大数据技术、云计算技术等。这些主要服务功能性需求。在需求阶段,需要对各种技术需求进行梳理,并根据耦合内聚的情况,对设计的相关类进行分组。除了功能性需求外,非功能性需求更是需要投入精力仔细研究,对本项目来讲,可靠性、安全性都是重要的特性要求,而且还涉及一定的性能要求,这些在需求阶段都需要进行边界约束,从而为后续设计和测试阶段提供依据。

设计阶段,需要选择风格,映射构件,分析构件的相互作用,对设计评审,产生体系结构。在需求工作做的足够充分的基础上,才能合理的设计架构。风格的选择是至关重要的第一步,影响后续工作的大方向。在本系统中,考虑到业务涉及的面比较广,底层支撑技术较为全面,有一定深度要求,因此总体采用分层风格,以便更好的对系统进行抽象建模。而且,层次结构兼具灵活性和统筹性,既能方便大家都系统达成一致的理解,也能方便扩展和变通具体的实现方案,在领域内被广泛的使用,所以这一选择得到了团队的一致认可。

具体来讲,将系统划分为硬件、操作系统(驱动)、平台、网络+数据、业务、展示等几个层次,每一层依赖下层,对上层提供需要的支撑能力。比如,操作系统层面提供硬件资源管理,提供对容器和虚拟化的支持。平台层,可以构建对业务层其关键支撑的技术框架,包括多媒体的采集渲染,数据的编解码支持,网络通信的支持,异步事件的支持,开发框架的支持等。总的来讲,这部分既是独立技术的排列,扩展系统的支撑能力,也是技术模型的聚合,关注点分离,方向的约束,是在对需求进行全面分析基础上做出的。而数据和网络层则更加聚焦面向业务,等到业务层面,其需要的各类技术支撑,在底层都能够得到确认,也基本证明了底层构建的正确性。

体系结构的设计,不仅仅要考虑功能需求,还要考虑非功能需求,要体现对非功能需求的支持。划分网络层就是为了满足异构网络下对可靠性的高要求,通过支持通道绑定和切换,配合数据冗余技术,来满足对高可靠性的要求。而且安全性的需求也要求网络的安全性,因此将这些需求的支持融合到网络层,可以更好的便利业务层的开发。

软件系统的复杂性,涉及技术点的多样性,使得只采用一种风格并不合理也不现实。在层内构件之间和层间的构件之间也有其他风格的应用。比如展示层和业务逻辑层为了更好的实现隔离和内聚,采用了进程通信体系结构风格。还有其他一些风格,在软件架构风格文章中已经进行了详细的描述,这里就不再展开了。

确定风格、确定风格对应的构件,设计出体系结构后,邀请多方代表参与评审,最终明确了体系结构设计。有了高层抽象的概念化的体系结构后,就需要将其文档化,使用语言具体的便于开发和实现人员理解的方式进行形式化约束描述。比如对于前述可靠性要求,在网络构件中就有多环路的设计要求,自动切换的要求,对于前述安全的要求,就有加密的设计,分组分级的设计,业务层构件就有安全规范操作手册相关内容的设计,明确业务流程的合规要求。

在完成文档化工作后,还需要组织一次复审,以检查描述是否全面、完整,表述是否准确严谨,结构层次是否分明清晰。这次复审也是一次查缺补漏的机会,因为关系到后面的实现,也因为邀请了外部领域专家,因此也是一次非常严肃的评审。在评审前,一方面将技术验证的原型进行了汇总展示,另一方面将相关内容分发到参会人员进行准备,收集意见,包括对自己所属领域进行严格审查,对其他模块的依赖和接口要求进行仔细核对,并最终给出初步的意见。这大大提高了会议的效率和深度,取得了很好的效果。起初,专家对多客户端抽象的性能满足与否持有怀疑态度,对数据带宽问题的实现复杂度过于悲观,安全性方面接入限制也持有保留的态度,但在看到原型的展示后,还是高度仍可了大家的分析设计工作。

因为设计阶段的充分工作,评审的严谨,实现阶段大家的积极性很高,没有明显的抵触情绪,彼此的低效沟通减少了很多,很多小节点都得到了保证。许多构件的设计实现工作是比较顺利的。因为完整的单元和集成测试准备工作,系统整体开发进展较为顺利。

软件系统开发的复杂性很多来自需求的变化,这在本项目中更是深刻的体现了出来。在ABSD方法中,体系结构演化就是用来应对需求变化的,整个过程包括提出演化计划,确定更新构件部分,对构件进行变动,包括增删改等更新操作,最后更新构件相互作用并组装进行系统测试。这个过程说起来简单,做起来难上加难。本项目中,一个重大的需求导入就是对卫星通信的支持。由于前期卫星数据通路未开通,采用的是移动网络模拟,但是等到数据开通后,发现之前的设计可行性几乎为零。链路的不可靠带来大量的丢包,协议设计的重传又加重了这一过程,在实际测试中,过低的成功率严重降低了业务的使用信心。这种需求变更最怕的就是产生多米诺骨牌效应,一处修改,被传导蔓延扩散到整个系统,污染了整个设计,这是最不能接受的。为了应对该需求,团队开始时修改了业务的部分流程,并对网络库进行了适应性的修改,在一定程度上缓解了业务失败概率过大的问题,但是并没有彻底解决技术上的限制,业务体验还是难以达到要求。为此,团队对需求的变动进行了二次系统梳理,对相关变更的必要性进行了仔细的校对,对技术实现的约束限制进行了全面仔细的验证测试,在这些信息的基础上,反推到需求层,对需求进行调整,改变了最初过于苛刻的性能要求和体验目标,在大家达成共识的基础上,进行了二次演进处理,并增加了更为全面的测试,收集了系统化的测试数据,为业务的调整提供了更为合理的边界。

在目标修改后,团队的士气得到了明显提升,改进过程得到了快速收敛,最后在增加部分投入时间的情况下,完成了演进过程。通过这次演进,大家都收获很多,也在推动大家主动挑出技术圈子,全局把握系统和业务本质需求上,上了生动一课。

虽然系统设计和实现的整个过程中团队做了大量工作,自认为还是比较充分的,但是实际开发过程中仍然遇到了不少计划外的障碍,包括安全方面的内外网合规要求,开发语言和工具的改变,部署的特殊要求等,这些在内部工作中都没有被很好的预警,额外增加了很多的市场、技术支持和开发工作,这是后续需要改进的。总的来讲,卫星通路的引进属于技术上的重大变更,而这里所述的很多是对业务理解的不够深,对客户环境的理解和掌握不够导致的,因此整体上看,一个项目的成功,不仅仅技术上要做全面的风险设计,非技术方面也要做足风险分析与预案工作,知己知彼百战百胜,在现代竞争激烈的商业环境中,这一道理仍然是十分正确、十分有用的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

系统架构主题之七:基于架构的软件设计方法及应用 的相关文章

  • MVC三层架构

    1 什么是MVC Model View Controller 模型 视图 控制器 模型就是Java对应数据库的那些字段 实体类 视图 就是JSP页面 控制器 就是Servlet负责跳转页面 Controller作用 Controller其实
  • 为什么程序员招聘都要5年经验起?因为他们懂Java8底层优化!

    一 前情回顾 上篇文章给大家聊了一下volatile的原理 具体参见 入坑两个月自研非外包创业公司 居然让我搞懂了volatile 这篇文章给大家聊一下java并发包下的CAS相关的原子操作 以及Java 8如何改进和优化CAS操作的性能
  • 系统架构设计师之软件架构风格

    系统架构设计师之软件架构风格
  • Chromium多进程架构,你知道多少?

    一 前言 国内外主流的浏览器 大多采用的是谷歌的Chromium 浏览器内核 Chromium是一个多进程多线程架构的Web引擎 很多应用和底层开发者希望了解Chromium中的进程和线程的种类和用途 以便能利用相关信息提升应用的性能 为此
  • 每日一问:你想如何破坏单例模式?

    前言 1 单例是什么 单例模式 是一种创建型设计模式 目的是保证全局一个类只有一个实例对象 分为懒汉式和饿汉式 所谓懒汉式 类似于懒加载 需要的时候才会触发初始化实例对象 而饿汉式正好相反 项目启动 类加载的时候 就会创建初始化单例对象 1
  • 面试官让我讲讲分布式系统容错架构,结果。。。

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 TB级数据放在一台机器上 难啊 到底啥是分布式存储 啥又是分布式存储系统 某台机器宕机了咋办 Master节点如何感知到数据副本消失 如何复制副本保持足够副本数
  • 2022Java面试题大全(整理版)面试题附答案详解,最全面详细

    目录 JAVA八股文 Java基础 String 和StringBuffer和 StringBuilder的区别 sleep 区间wait 区间有什么区别 Object 中有哪些方法 其中clone 怎么实现一个对象的克隆 Java如何实现
  • FastJSON、Jackson、Gson性能测试

    起因是公司原先用的是阿里开源的FastJSON 大家用的也比较顺手 但是在出现了两次严重的漏洞后 公司决定放弃FastJSON 使用其他序列化 反序列化工具 考虑大家常用的无非就是FastJSON Jackson和Gson这三种 因此领导让
  • Keycloak概述

    这里写自定义目录标题 Keycloak概述 Single Sign On Kerberos 社交登录 用户合并 客户端适配 管理控制台 用户管理控制台 标准协议 授权服务 Getting Started Keycloak概述 keycloa
  • 5. 一线大厂高并发缓存架构实战与性能优化

    分布式缓存技术Redis 1 冷热数据分离 2 缓存设计 2 1 缓存击穿 失效 2 2 缓存穿透 2 3 缓存雪崩 3 大V直播带货导致线上商品系统崩溃原因分析 4 突发性热点缓存重建导致系统压力暴增问题 5 缓存数据库双写不一致问题 6
  • 项目实战之RabbitMQ冗余双写架构

    作者名称 DaenCode gt https blog csdn net 2302 79094329 作者简介 啥技术都喜欢捣鼓捣鼓 喜欢分享技术 经验 生活 人生感悟 尝尽人生百味 方知世间冷暖 所属专栏 项目所感所想 gt https
  • 计算机网络中的通信子网:架构、协议与技术简介

    在计算机网络中 通信子网是负责实现主机之间以及主机与终端之间数据传输的核心部分 它由一系列硬件设备和通信协议组成 为上层应用提供可靠 高效和透明的数据传输服务 本文将详细介绍通信子网的架构 协议与技术 一 通信子网的架构 星型拓扑 星型拓扑
  • GoLong的学习之路,进阶,微服务之序列化协议,Protocol Buffers V3

    这章是接上一章 使用 RPC包 序列化中没有详细去讲 因为这一块需要看的和学习的地方很多 并且这一块是RPC中可以说是最重要的一块 也是性能的重要影响因子 今天这篇主要会讲其使用方式 文章目录 Protocol Buffers V3 背景以
  • 从0开始,做一个后台项目的架构

    作为一名架构师 老板要求你把公司的后端技术栈搞一下 那你该如何去做呢 对我而言我 我的答案是综合考虑下面的这些内容然后进行决定 团队协助基础工具链的选型和培训 搭建微服务开发基础设施 选择合适的RPC框架 选择和搭建高可用的注册中心 选择和
  • 浅谈小程序开源业务架构建设之路

    一 业务介绍 1 1 小程序开源整体介绍 百度从做智能小程序的第一天开始就打造真正开源开放的生态 我们的愿景是 定义移动时代最佳体验 建设智能小程序行业标准 打破孤岛 共建开源 开放 繁荣的小程序行业生态 百度智能小程序的生态玩家有三类 分
  • 浅谈小程序开源业务架构建设之路

    一 业务介绍 1 1 小程序开源整体介绍 百度从做智能小程序的第一天开始就打造真正开源开放的生态 我们的愿景是 定义移动时代最佳体验 建设智能小程序行业标准 打破孤岛 共建开源 开放 繁荣的小程序行业生态 百度智能小程序的生态玩家有三类 分
  • 如何解读服务器的配置和架构?

    在当今数字化时代 服务器作为企业或组织的重要基础设施 其配置和架构对于保障业务的稳定运行至关重要 如何解读服务器的配置和架构 成为了一个备受关注的话题 本文将围绕服务器配置和架构的解读进行深入探讨 帮助读者更好地理解服务器的性能 扩展性和安
  • 阿里技术官亲笔力作:Kafka限量笔记,一本书助你掌握Kafka的精髓

    前言 分布式 堪称程序员江湖中的一把利器 无论面试还是职场 皆是不可或缺的技能 而Kafka 这款分布式发布订阅消息队列的璀璨明珠 其魅力之强大 无与伦比 对于Kafka的奥秘 我们仍需继续探索 要论对Kafka的熟悉程度 恐怕阿里的大佬们
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • [机缘参悟-131] :《洞见》:为什么佛学是真的 -2-从进化心理学了解佛家的三毒“贪嗔痴”的进化机制

    目录 一 佛家的三毒 贪嗔痴 二 进化心理学对贪嗔痴的解释 2 1 贪欲 2 1 1 贪欲的满足与快乐的本质 2 1 2 贪欲得不到满足与痛苦的本质 2 2 恶意和愤怒 2 3 愚痴和无知 2 3 1 大众对痴的解释 2 3 2 佛对痴的解

随机推荐

  • python实现主成分估计

    什么是PCA 主成分分析的主要目的是希望用较少的变量去解释原来资料中的大部分变异 将我们手中许多相关性很高的变量转化成彼此相互独立或不相关的变量 通常是选出比原始变量个数少 能解释大部分资料中的变异的几个新变量 即所谓主成分 并用以解释资料
  • python编程基础知识

    python 切片 可以对list对象 如 1 2 3 4 字符串对象 1234 进行切片 使用 str l r str截取索引范围为 l r 索引值可以为负 表示从倒数方向 如 1表示倒数第一项 例 str 123456 str 0 2
  • 微信小程序开发之数据存储 参数传递 数据缓存

    微信小程序开发内测一个月 数据传递的方式很少 经常遇到页面销毁后回传参数的问题 小程序中并没有类似Android的startActivityForResult的方法 也没有类似广播这样的通讯方式 更没有类似eventbus的轮子可用 现在已
  • sql_labs18

    刚拿到题目时一点头绪没有 虽然提示是user agent注入 但没登录之前是看不到有关信息的 之后经过查看知道了两个admin就可以登录上 并且可以查看到user agent信息 判断闭合符 在User Agent字段结束添加单引号 触发报
  • esp32开发板学习

    1 esp32简介 esp32说到底就是一个小型的linux 可以执行我们的代码 尺寸只有一个苹果watch se的大小 可以集成各个物理组件 好像是通过开发板上的引脚来操作的 2 开发板部署python环境 2 1 在pdd花10块钱买了
  • 关闭文件指针不对

    浏览代码时看到下面几行代码 大家看看有啥问题 其中隐含的问题是关闭空的文件指针 所以写了一个测试代码 运行一下 挂了
  • C++模板类重载"<<"未定义错误

    在使用C 的模板类进行编程的时候 重载 lt lt 运算符时 如果定义不当 会出现未定义的情况 错误为LNK2019 这个问题的原因是由于C 的模板编译机制造成的 解决问题的方式是在类中声明 lt lt 运算符时 需要在运算符和参数之间的位
  • 【Python-利用动态二维码传输文件(五)】动态二维码文件发送端开发,使用Tkinter filedialog实现任意格式文件选中,并显示发送状态

    之前四篇文章论证了利用二维码传输文件的可行性 本章使用tkinter开发 动态二维码文件发送端 发送端具备文件选择 开始发送文件 停止发送文件以及显示发送状态的功能 程序界面下 这里下载源码运行 使用tkinter开发动态二维码文件发送端
  • 【JVM】JVM 垃圾收集器与内存分配策略

    JVM 垃圾收集器与内存分配策略 由JVM内存区域可知Java运行时内存的各个区域 其中程序计数器 虚拟机栈 本地方法栈3个区域随线程而生 随线程而灭 当方法结束或者线程结束时 内存就会跟着被回收了 而只有处于运行期间 我们才能知道程序究竟
  • 在IMX8MM平台linux下开发rm67191屏驱动

    NXP IMX8M MINI rel imx 4 14 98 2 0 0 ga 屏芯片 rm67191 屏调试记录 1 不能挂设备 设备树删除ADV7535屏的配置adv bridge 不通编译通过 结果按 https community
  • 一起来看看一个体系完善的前端React组件库是如何搭建出来的!

    作者简介 剑桥 携程资深前端开发工程师 关注自动化工具开发 前端工程自动构建相关技术 随着前端工程的发展 组件化的思想早已深入人心 现代的前端框架React Vue等 都是围绕组件设计 组件化的开发模式 大大提高了开发效率 设计和开发高质量
  • 增长率用计算机怎么算,操作方法:Excel使用公式来计算增长率教程

    有关使用公式计算增长率的Excel教程 Excel经常需要使用公式来计算增长率 如何使用公式来计算增长率 以下是有关使用公式计算增长率的excel教程 希望阅读后能为您带来启发 Excel使用公式来计算增长率教程 计算增长率步骤1 在单元格
  • A Survey on Large Language Models for Recommendation

    本文是LLM系列的文章 针对 A Survey on Large Language Models for Recommendation 的翻译 大模型用于推荐的综述 摘要 1 引言 2 建模范式和分类 3 判别式LLM用于推荐 4 生成式L
  • 关于使用Mybatis时实体类字段切记要使用包装类型

    每周的博客从5月份有开始断更了 看来坚持每周写一篇博客缺失很难 不过从这周开始 除了一方面把之前的那几周没写的博客补回来 另一方面从这周开始要真正逼自己的写一篇博客 并争取在7月份前搭建起自己的个人博客网站 好 废话少说 接下来快速进入今天
  • 线性表的顺序表示--王道2024DS习题代码

    2024年王道数据结构考研复习指导第二章 线性表的顺序表示 课后综合应用题个人学习的相关运行代码 include
  • 详解Matplotlib中文字符显示问题

    文章目录 1 中文字体显示问题 2 几种解决方案 2 1 在绘图代码中设置全局字体 2 2 在绘图代码中设置局部字体 2 3 修改本机字符默认配置字体 2 4 自动区别系统然后选择字体 3 其他 3 1 platform模块 3 2 常见中
  • Latex 乘号 分号

    Latex 乘号 分号 frac 分号 times 乘号 举例
  • 在 QT Creator 上配置 opencv 环境的一些认识和注意点

    在 QT Creator 上配置 opencv 环境的一些认识和注意点 一 OpenCV4 QT Creator Cmake 我参考的视频是 https www bilibili com video BV163411b7mg spm id
  • Go redis操作

    Go redis的操作 五种数据结构的基本操作汇总 一 String 操作 命令 说明 Set key value 给数据库中名称为 key 的 string 赋予值 valueget key 返回数据库中名称为 key 的 string
  • 系统架构主题之七:基于架构的软件设计方法及应用

    1 基于架构的软件设计方法概念 关键词 ABSD 自顶向下 递归迭代 与需求同步 设计元素 视角与视图 用例和质量场景 预期和非预期等 总的来讲 ABSD方法分为如下六个大的阶段 1 体系结构需求阶段 相比传统软件系统设计 架构设计在需求获