当前位置: 首页 > 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. 打包自己的包 九、标准库十、多…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...