当前位置: 首页 > news >正文

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

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

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

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

1)体系结构需求阶段

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

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

2)体系结构设计阶段

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

3)体系结构文档化

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

4)体系结构复审

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

5)体系结构实现

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

6)体系结构演化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相关文章:

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

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

Python-if __name__ == ‘__main__‘和collections.Mapping的用法

1.if __name__ __main__ 1.1解释 if __name__ __main__: 是 Python 中的一个常见惯用法,用于确定一个 Python 脚本是被直接运行还是被导入为模块使用。 在 Python 中,每个模块都有一个特殊的内置变量 __name__,该变量的值决定了模块的运…...

Linux 基金会宣布正式进驻中国

在 LinuxCon 2017 (北京)即将召开前夕,我们Linux 中国会同 51CTO、开源中国对 Linux 基金会执行董事 Jim Zemlin 进行了一场远跨大洋的视频专访。 在这次专访中,Jim 先生回答了几个开源界和互联网领域关注的问题,并披…...

Pyecharts教程(二):使用pyecharts绘制3D散点图——以营养元素为例

Pyecharts教程(二):使用pyecharts绘制3D散点图——以营养元素为例 作者:安静到无声 个人主页 目录 Pyecharts教程(二):使用pyecharts绘制3D散点图——以营养元素为例1. 准备工作2. 读取JSON数据3. 配置图形选项4. 构造数据5. 实验结果推荐专栏在本文中,我们将学习如何使用…...

软考高级系统架构设计师系列论文第100篇:论软件的可维护性设计

软考高级系统架构设计师系列论文第100篇:论软件的可维护性设计 一、摘要二、正文三、总结一、摘要 2020年3月1日至12月20日,我参加了“数据安全访问平台”项目的开发,担任系统分析员的工作。该项目是某行业用户“数据中心二期”建设的主要内容,目标是:建立数据统一访问接口…...

curl 使用发送POST GET请求 HEADER设置

curl 使用发送POST GET请求 HEADER设置 文章目录 Get请求POST请求1. application/x-www-form-urlencoded2. Multipart/form-data3. application/json4. text/xml 文件内容作为提交的数据 curl 设置自定义HEADER 头注意事项:shell批处理外传 Get请求 get请求偏简单&…...

使用 Transformer 和 Amazon OpenSearch Service 构建基于列的语义搜索引擎

在数据湖中,对于数据清理和注释、架构匹配、数据发现和跨多个数据来源进行分析等许多操作,查找相似的列有着重要的应用。如果不能从多个不同的来源准确查找和分析数据,就会严重拉低效率,不论是数据科学家、医学研究人员、学者&…...

算法通关村第九关——透彻理解二分查找

1.前言 常见的查找算法有顺序查找、二分查找、插值查找、斐波那契查找、树表查找、分块查找、哈希查找等。如果进行归类,那么二分查找、插值查找(一种查找算法)以及斐波那契查找都可以归为插值查找(大类)。而插值查找…...

【字节跳动青训营】后端笔记整理-4 | Go框架三件套之GORM的使用

**本人是第六届字节跳动青训营(后端组)的成员。本文由博主本人整理自该营的日常学习实践,首发于稀土掘金。 我的go开发环境: *本地IDE:GoLand 2023.1.2 *go:1.20.6 *MySQL:8.0 本文介绍Go框架三…...

【TI毫米波雷达笔记】UART串口外设配置及驱动(以IWR6843AOP为例)

【TI毫米波雷达笔记】UART串口外设初始化配置及驱动(以IWR6843AOP为例) 最基本的工程建立好以后 需要给SOC进行初始化配置 int main (void) {//刷一下内存memset ((void *)L3_RAM_Buf, 0, sizeof(L3_RAM_Buf));int32_t errCode; //存放SOC初…...

C#---第十九课:不同类型方法的执行顺序(new / virtual / common / override)

本文介绍不同类型的方法,在代码中的执行顺序问题: 构造方法普通方法(暂用common代替)、虚方法(Virtual修饰)、New方法(new修饰)三个优先级相同overide方法(会替换virtual…...

[pytorch]torch.cuda用法以及判断显卡是不是存在问题

常见用法: torch.cuda.is_available() # 查看是否有可用GPU torch.cuda.device_count() # 查看GPU数量 torch.cuda.get_device_capability(device) # 查看指定GPU容量 torch.cuda.get_device_name(device) # 查看指定GPU名称 torch.cuda.empty_cache() # 清空程序占…...

JUC——多线程补充

前置可看 Java——多线程和锁_java多线程锁_北岭山脚鼠鼠的博客-CSDN博客 线程创建的三种方式 Thread、Runnable、Callable Thread类 Runable接口 Callable接口 Lamda表达式 Lamda表达式_北岭山脚鼠鼠的博客-CSDN博客 静态代理模式(Thread类的原理) 如下代码中 真实对象…...

代码随想录第32天|122.买卖股票的最佳时机 II,55. 跳跃游戏 ,45. 跳跃游戏 II

122.买卖股票的最佳时机 II 122. 买卖股票的最佳时机 II 思路比较简单 class Solution {public int maxProfit(int[] prices) {int res0,sum0;for(int i0;i<prices.length-1;i){if(prices[i1]-prices[i]>0){sumprices[i1]-prices[i];}ressum>res?sum:res;}return …...

Linux:Nginx服务与搭建

目录 一、Nginx概述 二、Nginx三大作用&#xff1a;反向代理、负载均衡、动静分离 三、Nginx和Apache 3.1Nginx和Apache的差异 3.2Nginx和Apache的优缺点比较 四、编译安装niginx 五、创建Nginx 自启动文件 六、Nginx的信号使用 6.1信号 七、升级 nginx1.18 nginx1.2…...

4、什么是NoSQL

4、什么是NoSQL NoSQL NoSQL Not Only SQL&#xff0c;就是不仅仅是SQL的意思 泛指非关系型数据库&#xff0c;随着web2.0的诞生&#xff01;传统的关系型数据库很难对付web2.0时代&#xff0c;因为web2.0时代又很多数据大爆炸新生的产物比如视频、音乐、大数据产生的其他的数…...

如何自己实现一个丝滑的流程图绘制工具(一)vue如何使用

背景 项目需求突然叫我实现一个类似processOn一样的在线流程图绘制工具。 这可难倒我了&#xff0c;立马去做调研&#xff0c;在github上找了很多个开源的流程图绘制工具&#xff0c; 对比下来我还是选择了 bpmn-js 原因&#xff1a; 1、他的流程图是涉及到业务的&#xff0c…...

ReoGrid.NET集成到winfrom

ReoGrid一个支持excel操作的控件,支持集成到任何winfrom项目内。 先看效果图: 如何使用&#xff1a; 使用ReoGrid自带excel模版设计工具先设计一个模版,设计器如下&#xff1a; 具体例子看官方文档 代码示例如下&#xff1a; var sheet reoGridControl1.CurrentWorksheet; …...

Elasticsearch实现增删改查

调用elasticsearch通常使用restful风格请求&#xff0c;这里记录一些常用的Java API和Postman Url Java API调用Es 1. 查询总文档数 Testvoid getAllCount() { // RestHighLevelClient clientnew RestHighLevelClient(RestClient.builder(new HttpHost("192.168…...

Rust 学习笔记(卷二)

文章目录 Rust 学习笔记&#xff08;卷二&#xff09;八、工程1. package 和 cratepackage 总览包根&#xff08;crate root&#xff09; 2. 模块初识模块单个源文件中的嵌套模块使用具有层级结构的源文件构造嵌套模块 3. 文档4. 使用第三方包5. 打包自己的包 九、标准库十、多…...

android amazon 支付接入

流程&#xff1a; 申请 Amazon 开发者帐号 ---> 在 amazon 控制台添加应用 ---> 添加应用内商品&#xff08;消费类商品&#xff0c;授权类商品&#xff0c;订阅类商品&#xff09;---> 导出 JSON 文件 --->集成 Amazon 支付 ---> 将导出的 JSON 文件 copy 到 …...

Vue2-快速搭建pc端后台管理系统

一.推荐二次开发框架 vue-element-admin Star(84k)vue-antd-admin Star(3.5k) 二.vue-element-admin 官网链接:https://panjiachen.github.io/vue-element-admin-site/zh/ 我这里搭建的是基础模版vue-admin-template(推荐) # 克隆项目 git clone https://github.com/PanJi…...

【产品文档】团队介绍PPT模板

今天和大家免费分享团队介绍的PPT模板。团队介绍是向他人展示团队的实力、专业性和能力的重要方式。通过一个有力的团队介绍&#xff0c;您可以突出团队的成员、经验、技能和取得的成就&#xff0c;从而增加信任、吸引合作伙伴、客户或投资者的兴趣 【模板预览】 动态演示效果…...

组件库的使用和自定义组件

目录 一、组件库介绍 1、什么是组件 2、组件库介绍 3、arco.design 二、组件库的使用 1、快速上手 2、主题定制 3、暗黑模式 4、语言国际化 5、业务常见问题 三、自定义组件 2、组件开发规范 3、示例实践guide-tip 4、业务组件快速托管 一、组件库介绍 1、什么是…...

网站和API支持HTTPS,最好在Nginx上配置

随着我们网站用户的增多&#xff0c;我们会逐渐意识到HTTPS加密的重要性。在不修改现有代码的情况下&#xff0c;要从HTTP升级到HTTPS&#xff0c;让Nginx支持HTTPS是个很好的选择。今天我们来讲下如何从Nginx入手&#xff0c;从HTTP升级到HTTPS&#xff0c;同时支持静态网站和…...

UnitTest笔记: 拓展库DDT的使用

DDT (Data-Drivers- Tests) 允许使用不同的测试数据运行同一个测试用例&#xff0c;展示为不同的测试用例。 第一步&#xff1a; pip安装 ddt 第二步&#xff1a; 创建test_baidu_ddt.py 1. 测试类要使用ddt 修饰 2. 不同形式的参数化&#xff1a; 列表&#xff0c;字典&a…...

裂缝检测,只依赖OPENCV,基于YOLO8S

裂缝检测&#xff0c;只依赖OPENCV&#xff0c;YOLOV8S 现在YOLOV8S训练目标非常方便&#xff0c;可以直接转换成ONNX让OPENCV调用&#xff0c;支持C/PYTHON&#xff0c;原理很简单&#xff0c;自己找博客&#xff0c;有兴趣相互交流...

python编程环境使用技巧3-程序打包pyinstaller

前言 在Python中&#xff0c;打包指的是将Python代码和相关资源&#xff08;如配置文件、图像等&#xff09;整合到一个可执行的文件或安装包中&#xff0c;以便于在其他环境中使用。 下面是使用pyinstaller进行打包的简要步骤&#xff1a; 1-安装pyinstaller&#xff1a;在命…...

Go 自学:defer关键字

我们可以使用defer关键字延迟代码的执行&#xff0c;相当于我们把代码放入一个stack中&#xff0c;遵循last in first out的原则输出代码。 package mainimport ("fmt" )func myDefer() {for i : 0; i < 5; i {defer fmt.Print(i)} }func main() {defer fmt.Prin…...

【云计算】Docker特别版——前端一篇学会

docker学习 文章目录 一、下载安装docker&#xff08;一&#xff09;Windows桌面应用安装&#xff08;二&#xff09;Linux命令安装 二、windows注册登录docker三、Docker的常规操作(一)、基本的 Docker 命令(二)、镜像操作(三)、容器的配置(四)、登录远程仓库 四、镜像管理(一…...

江苏连云港做网站/在线代理浏览网址

系统盘里带着那个啊具体步骤。。1运行GHOST,进入GHOST主页面 2在主页面单击OK按钮后依次执行Local\Partition\To lmage,命令 3接下来选择硬盘.用户装了几个硬盘,则此处就会出现几个选项. 4接下来,选择硬盘中的分区.选择需要的分区后,单击OK进入下一个步骤 5选择存放的地址和文件…...

建设网站学习/sem公司

什么是SeabornSeaborn是基于matplotlib的图形可视化python包。它提供了一种高度交互式界面&#xff0c;便于用户能够做出各种有吸引力的统计图表。Seaborn是在matplotlib的基础上进行了更高级的API封装&#xff0c;从而使得作图更加容易&#xff0c;在大多数情况下使用seaborn能…...

佛山哪里有做网站的/基本营销策略有哪些

当快船手握16分领先进入易地再战时&#xff0c;老李充满了欢欣与愉悦&#xff0c;甚至还想哼个小曲儿。毕竟赫拉克利特曾说过&#xff1a;一个人不可能两次踏进同一条河流。G5已经被掘金翻了一回&#xff0c;难不成还想再玩逆转&#xff1f;得亏老李不是五五开&#xff0c;否则…...

跨境电商东莞网站建设/什么是网站推广

English Learning - L1-6 从此口语变得简约&#xff08;下&#xff09;2022.12.22 周四引言6.2.2 分词非谓语动词作后置定语的三种被动结构1. to be done 将来的动作2. being done 正在进行的3. done 已经完成的6.2.3 分词形容词挑错其它1. 形容词 名词 ed2. 数词 名词 ed答…...

宝塔建站详细教程/今日竞彩足球最新比赛结果查询

大家好&#xff0c;今天我们学习【马上学tensorflow 2.0】之 神经网络的“齿轮”&#xff1a;张量运算。我们 马上学三点 &#xff0c;张量运算介绍张量点积和几何意义深度学习几何意义大家可以点击下面的“ 了解更多 ”&#xff0c;或搜索“ 马上学123 ”&#xff0c;在线观看…...

服装网站源码php/去除痘痘怎么有效果

转自: http://foreveryan.blog.51cto.com/3508502/760696 感谢铁道部的政策&#xff0c;和所有春运时刻在铁路干线工作的人们&#xff01; 你们辛苦了&#xff01; 一&#xff1a;网络订票分析&#xff1a; 一年一度的春运又到了&#xff0c;今年的铁道部表现的非常霸气&#…...