软件架构设计 ADMEMS方法体系
ADMEMS是Architecture Design Method has been Extended to Method System的简称,是由CSAI顾问团架构设计专家组于2009年11月在第六届中国软件大会上公开发布的一个软件架构设计方法。作为方法体系,ADMEMS通过3个阶段和1个贯穿环节,来覆盖“需求进,架构出”的架构设计完整工作内容。其中“3个阶段”是指预备架构阶段(PA阶段:把握需求特点,确定架构驱动力)、概念架构阶段(CA阶段:根据重大需求,确定概念架构)、细化架构阶段(RA阶段:细化架构设计,关注不同视图),“1个贯穿环节”是指对非功能目标的考虑。
《一线架构师实践》一书详细的介绍了ADMEMS体系。它将软件架构的过程分为三个阶段和一个贯穿环节,进而覆盖“需求进,架构出”的架构设计的完整工作内容。基中Pre-Architecture阶段,意在全面理解需求,从而把握需求特点,进而确定架构设计驱动力。而Conceptual Architecture阶段所关注的是如何通过关键功能、关键质量及业务需求和约束来塑造概念架构。Refined Architecture阶段,则主要通过5视图方法进行细化架构的设计。而非功能需求不可能“速战速决”,因此,对于非功能需求的关注会贯穿架构设计的整个过程。
Pre-Architecture,是架构设计的最前期阶段,其工作目标包括:理解需求、建议需求大局观、确认架构设计方向等。其对于整个架构设计的意义在于,着眼于全局把握需求、降低架构失败的风险、尽早地开始架构设计、明确架构设计的驱动力。需要注意的是,不同需求影响架构的不同原理,关键需求决定架构,而其他需求用来来验证架构。ADMEMS将Pre-Architecture阶段分为四个步骤,即需求结构化、分析约束影响、确定关键质量、确定关键功能。
“ADMEMS矩阵”是Pre-Architecture阶段的核心方法。 “ADMEMS矩阵”又称为“需求层次-需求方面矩阵”,帮助架构师告别需求列表的陈旧方式,顺利过渡到二维需求观,借此避免遗漏需求、并进一步理清需求间关系和发现衍生需求。
Conceptual Architecture,即概念架构。概念架构不是理想架构,同样概念架构也不是概念视图,概念架构作为架构设计的一个阶段,必须在细化架构设计阶段之前,针对重大需求、特色需求、高风险需求的要求,给出高层的解决方案,形成稳定的高层架构设计成果。ADMEMS将Conceptual Architecture阶段分为三个步骤,即:
初步设计:基于关键功能,借助鲁棒图进行以发现职责为目的的初步设计;
高层分割:对系统这个黑盒进行高层切分,如切分复杂系统为多个二级系统,或者直接切分系统为具体子系统;实践中最常用的系统切分方式为分层,有Layer(逻辑层)、Tier(物理层)、按通用性分层生技术堆叠等流派。
考虑非功能需求:概念架构并非理想化架构,因此不仅要考虑功能,也必须考虑非功能,通常采用的方法为,目标-场景-决策表。
Refined Architecture是相对于Conceptual Architecture而言的,即细化架构。ADMEMS主要通过5视图法对细化架构阶段进行实践。5视图法的主要思想为:错落有致地将众多技术关注点划分“群落”,“群落”内高聚合,“群落”间松耦合。应用5视图方法,便于架构师设计思维的“有序”展开。不同视图源于不同的思维角度及不同的技术关注点,即:
逻辑架构:关注如何划分子系统、如何定义接口、如何运用质疑驱动的思维套路等;
物理架构:关注硬件选择与物理拓扑、软件到硬件的映射关系、方案优化;
运行架构:关注确定引入哪些控制流、确定每条控制流的任务、处理相关问题、进一步考虑控制流之间的同步关系等;
开发架构:关注将“逻辑职责”映射为“程序单元”、开发技术选型、“程序单元”间的关系等;
数据架构:关键是确定数据分布方案。数据分布的6种策略:独立、集中、分区、复制、子集、重组;
非功能目标的设计环节。非功能目标的设计是以场景技术为核心手段、以目标-场景-决策表为思维工具致力于支撑非功能目标的理性设计过程。经过非功能目标的设计,将使得架构设计更有针对性、可操作性更强、避免过度设计,同时便于系统升级时参考。
目标-场景-决策表方法,可以帮助架构师快速建议非功能目标的设计思维,更理性地应对架构师普遍感到棘手的非功能支持问题,提升自己的核心竞争力。
软件架构设计 ADMEMS方法体系的更多相关文章
- SoC嵌入式软件架构设计II:没有MMU的CPU虚拟内存管理的设计和实现方法
大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其它代码. 我们PC然在同一时间大量的应用,地址空间差点儿能够整个线性地址空间(除了部分留给操作系统或者预留它用).能够觉 ...
- SoC嵌入式软件架构设计II:否MMU的CPU虚拟内存管理的设计与实现方法
大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其他代码.我们PC然在同一时间大量的应用,能够整个线性地址空间(除了部分留给操作系统或者预留它用),能够觉得每一个应用程序 ...
- SoC嵌入式软件架构设计之六:API设计方法
在嵌入式系统中,驱动都是以API的方式提供给应用进行调用.这里介绍嵌入式系统的API设计和管理方法. 驱动在系统中会按模块进行分类,比如按键驱动.LCD驱动.文件系统.card驱动.I2C驱动等等:每 ...
- SoC嵌入式软件架构设计
内存是SoC(System on Chip,片上系统)集成设计的重要模块,是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必须要在成本和效率中取得平衡,做到 ...
- SoC嵌入式软件架构设计之三:代码分块(Bank)设计原则
上一节讲述了在没有MMU的CPU(如80251.MIPS M控制器系列.ARM cortex m系列)上实现虚拟内存管理的集成硬件设计方法.新设计的内存管理管理单元要实现虚拟内存管理还须要操作系统.代 ...
- 大型Java进阶专题(三) 软件架构设计原则(下)
前言 今天开始我们专题的第二课了,本章节继续分享软件架构设计原则的下篇,将介绍:接口隔离原则.迪米特原则.里氏替换原则和合成复用原则.本章节参考资料书籍<Spring 5核心原理>中的 ...
- PowerDotNet平台化软件架构设计与实现系列(03):系统应用平台
为了复用和解耦,快速开发更多的系统和应用,我们对自己经常说的"系统"和"应用"进行更高级的提取和抽象. 十多年前入行,辗转至今,写过很多很多应用,个人喜欢分门别 ...
- [开发笔记usbTOcan]软件需求分析和软件架构设计
前面文章进行了系统分析和系统架构设计,手工焊接了一个板子,集合EK-TMC123GXL开发板(请忽略焊接技术) SWE.1 | 软件需求分析 软件需求分析过程的目的是将系统需求的软件相关部分转化为一组 ...
- 使用java泛型设计通用方法
泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 因此我们可以利用泛型和反射来设计一些通用方法. 现在有2张表, 一张user表和一张stu ...
随机推荐
- 【Topcoder】SRM157 DIV2总结
250分题:简单的二分,就是平常玩的猜数字游戏 代码:GitHub 500分题:给出一个员工一天的打卡时间段,要求求出员工这一天的工资.其中正常上班时间是6:00:00到18:00:00,薪水是wag ...
- Android系统源代码的下载与编译
http://www.jianshu.com/p/aeaceda41798 目录 1.简介 2.官方同步源代码 3.镜像同步源代码 4.已有源代码更新 5.编译源代码 5.1编译Android 4.1 ...
- bowtie2用法
bowtie2的功能:短序列的比对 用法:bowtie2 [options]* -x <bt2-idx> {-1 <m1> -2 <m2> | -U <r&g ...
- Vue.js学习笔记 第六篇 内置属性
computed属性 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...
- 淘宝分类常见---部分显示和全部显示的js效果
需求就是,点击“更多按钮”,显示全部的分类详情,再次点击,显示部分分类. 展开: 收起: 结构: <div class="SubBox" id="SubBox&qu ...
- Linux 修改DNS解决 Could not retrieve mirrorlist" 报错
CentOS yum有时出现“Could not retrieve mirrorlist ”的解决办法——resolv.conf的配置 或者IP配置文件上写入 缺少DNS引起的问题1. 无法识别域名 ...
- struts2实现文件的上传和下载实例[转]
实现原理 Struts 2是通过Commons FileUpload文件上传. Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器 ...
- 【P2964】硬币的游戏(DP+前缀和)
一道DP,思维难度真是不小. 首先对于这个题的数据,我们可以发现差不多可以支持n^2logn,但是貌似也不会有这种复杂度的线性DP(至少这个题看上去不是这样).所以我们考虑N^2做法.因为求得是价值和 ...
- request.getPathInfo();
request.getPathInfo(); 这个方法返回请求的实际URL相对于请求的serlvet的url的路径.(个人理解.)比如,有一个Servlet的映射是这样配置的: <servlet ...
- 初探MyBatis之HelloWorld(三)
三.用SQL映射语句用注解,dataSource用xml(不推荐). 综合上面两节(一个用xml,一个用annotation),发现一个好玩儿的,SQL映射用注解方式,然后还是得有两个xml配置文件. ...