架构设计方法论(更新中)

1. 概述

1.1. 架构设计

软件系统规模越来越大,将会面临的问题也在增加,可靠性、安全性、可伸缩性、可移植性、可用性等。在开发前,从宏观上对复杂的软件系统进行中长期的规划是必要的,同时开发过程中,也需要持续地关注各部分细节、预测规避风险
软件系统的祖传与特性:
  • 软件系统可以提供的功能,即逻辑架构
  • 软件系统的代码层次结构,即开发架构
  • 软件系统的部署与网络结构,即物理架构
  • 软件系统数据结构,即数据架构
  • 软件系统的性能特征,即运行架构

1. 边缘界定

对架构系统的边界进行界定,在预测扩展性的同时避免全能系统,消耗大量资源

2. 风险识别

识别到开发过程中,现在、未来遇到的风险来源、风险产生节点、风险产生条件,是一件从始至终的任务

3. 模块切分

对不同功能的代码模块分开,类似于微服架构,使得各个模块之间耦合度降低,提高效率,减少互相的影响

4. 建立联系

在模块拆分后,需要建立起各个模块的联系沟通,使软件最终依然为一体,并且各个小组之间也需要建立起协作的工作方式

5. 细化问题

大问题切割成小问题,能够根据问题细化工作切分、沟通的粒度

 

 

 

 

1.2. 架构师

架构师是一个需要带领团队协作,承接产品和开发,统筹各小组的岗位。需要在技术和业务方面都有较高的理解与经验。在掌控全局的同时,也需要洞悉局部。作为软件的设计者,在初期有一个好的架构设计,对开发过程至关重要,减少不必要的重复成本,保持开发效率。

1. 确认需求

在和产品、需求方、用户反复沟通,不断调整后,确认需求,保证其准确性

2. 系统规划

拆分整体系统,形成不同的层级和功能模块(横向纵向),并建立起之间的联系。在开发过程中,制定每一个阶段的任务,控制迭代方向,处理需求优先级

3. 技术选型

了解很多技术栈,有充足的经验,提出针对当前软件系统的一套合适的技术选型,并且和产品、开发团队进行权衡,确认方案

4. 规格说明

作为项目的技术权威和指导,制定一套项目的规格说明,能够为各个小组了解其他人员的分工、工作内容,及小组间的责任与联系,并且为开发提供技术参考

 

 

 

 

1.3. 如何成为优秀的架构师

优秀的架构师需要的能力:
  • 系统分析能力:抽象思维和分析能力,抽象出事务的共性,将业务转换为技术实现
  • 架构设计能力:设计系统时能够在实现功能的基础上,降低其他风险并解决问题
  • 研究攻关能力:有高超的技术算法能力,和开发能够精确的沟通,提供指导
  • 技术管理能力:持续关注前沿技术,能够权衡不同技术栈的利弊,找到合适的选型
  • 带人识人能力:在招聘和知识传递上有见解,能够找到适合的人选,更好的传递

所以成为一个架构师,需要有以下方面的工作:
  • 加深业务理解
  • 重视理论基础
  • 系统性的学习
  • 站在技术前沿

优秀的架构师需要做到的:
1. 对业务及其痛点有深刻的理解与思考。理解业务、充分挖掘用户痛点,同时满足显性隐性需求,做出完善专业的产品
2. 能够将技术落地产生业务价值。制定短期计划尽快满足用户需求并上线,同时也制定长期计划控制迭代方向

 

 

 

 

2. 五视图法架构设计

软件架构不是一次性劳动,不是一蹴而就的,是一个长期的重复工作
架构设计包括:需求澄清、功能梳理、领域建模、系统选型、模块划分等
迭代过程中,依据开发情况和部门沟通情况,对架构设计进行持续调整

1. 逻辑架构

随着迭代架构师需要和需求方一起,制定一套产品需求说明,给出一个结构化表达的用例模型——逻辑架构

2. 领域模型

以用例模型(逻辑架构)为出发点,架构师与需求方、业务人员沟通,构建领域模型,作为业务系统和软件系统的连接点

3. 数据架构、开发架构、运行架构

建立领域模型之后,架构设计活动逐渐过渡到纯粹的软件工程层面,架构师与开发人员讨论得出:
  • 数据架构:确定合适的数据架构
  • 开发架构:确定软件模块划分、接口定义、代码组织方式、集成方式等开发架构
  • 运行架构:确定响应时间等性能指标,可靠性、安全性等质量指标,这些也称为运行架构

4. 上线部署

五视图完成之后,上线部署、完成产品的发布,并提供给用户使用
==接口的定义与实现==
普通类:只有具体实现
抽象类:具体实现和规范(抽象方法)都有
接口:只有规范
接口就是规范,定义的是一组规则,体现了现实世界中”如果你是……则必须能……“的思想,例如:如果你是天使,必须有一双翅膀。
接口的本质是契约,就像我们的法律一样,制定好后大家都遵守。
OO的精髓,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++、Java、c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。
声明类的关键字是class,声明接口的关键字是interface。

 

 

 

 

2.1. 逻辑架构设计

逻辑架构应该以用户使用与功能为出发点,主要关注行为或职责的划分
静态方面为抽象职责划分、动态方面是不同职责之间的交互与协作
逻辑架构着重考虑软件功能性需求:
  • 系统功能树:系统功能划分为几个子系统与功能模块?
  • 用例模型:向什么样的用户提供什么样的功能?
  • 用例描述:每个功能都是怎么样的操作流程与分支?
  • 界面原型:如何通过界面与用户交互
  • 领域模型:应当设计哪些业务实体?以及相互的关系?
  • 接口描述:与哪些外部系统接口?是怎么样接口?

逻辑架构设计过程分为下面三个步骤:
  1. 用例模型分析
  2. 界面原型设计
  3. 领域分析、

 

 

 

2.2. 数据架构设计

数据架构设计重点在于对数据结构的分析、处理,使用原文分析法、四色建模法、事件风暴法等方式建立领域模型设计和数据库设计文档
领域模型描述了领域中的数据与实体的关系图:实体、实体的方法、联系,为数据库提供指导
==三种领域模型设计方法==
1. 原文分析法
提取出原文(初始用例)中的名词、动词,逐个权衡考量是否适合成为实体,是否适合成为实体属性,实体的行为,其余的排除掉,最终绘制出领域模型
2. 四色建模法
1. 首先建立时标性对象,作为建模的起点,也是整个领域模型的骨干
2. 之后补充实体对象(人、地点、物),丰富模型,更好地描述业务概念
3. 在此基础上,增加角色到流程中,做进一步抽象
4. 最后再把一些需要描述的信息,放入描述对象
四色建模法的次序与重点:
1. 首先以满足管理和运营的需要为前提,寻找需要追溯的事件
2. 根据这些需要追溯,寻找足迹以及相应的时标性对象
3. 寻找时标对象周围的人、事、物
4. 从中抽象角色
5. 把一些信息用描述对象补足
3. 事件风暴法
一种快速探索复杂业务领域和对领域建模的实践。集合组织者、领域专家、项目成员,使用头脑风暴的形式,从领域中关注的业务事件出发,在此过程中团队经过充分讨论,统一语言,最后找到领域模型

 

 

 

 

2.3. 开发架构设计

开发架构主要关注的是系统规划,分层架构,技术选型,开发规范和接口定义

1. 系统规划

系统规划既要做好当前版本,也要对未来做好方向性设计,奠定产品建设的节奏和趋势
系统规划不一定非常细节,不一定绝对正确,但基于当前是一个支点,也是对未来发展的预判,需要在后续工作中不断修正

2. 分层架构

简而言之,基于“分而治之”思想,按照一定逻辑,把复杂的系统切分为多个子系统(板块)

3. 技术选型

技术选型是对产品非功能需求、架构设计中的各种要素及约束的综合评估以及体现。技术选型是各个方面各种因素的综合抉择的结果,需要对产品、架构的把握以及对各项技术框架的熟悉程度

4. 开发规范

开发规范用于知道整个团队在开发中要遵循的事项,为团队提供统一的参考,从而提高效率和质量,避免重复工作和不必要的沟通成本
开发架构的设计着重考虑开发期质量属性:
  • 可扩展型
  • 可重用性
  • 可移植性
  • 易理解性
  • 易测试性

 

 

 

2.4. 运行架构设计

运行架构重点考虑的是软件系统运行期间的非功能性需求,核心是运行的质量
关注系统的并发、同步、通信等,常见问题比如线程同步、死锁问题、生命周期管理
运行架构的设计关注的点在于局部的关键点和难点,常常需要技术攻关和预研

1. 运行

  • 同步 vs 异步
  • 并发 vs 串行

2. 交互

  • 对象间的交互
  • 状态转换

3. 质量

  • 安全性
  • 可靠性
  • 可伸缩性

4. 性能

  • 响应时间
  • 吞吐量

 

 

 

2.5. 物理架构设计

物理构架更关注物理上的基础设施,例如:系统、网络、服务器等,常见问题有HA、可伸缩
如何部署架构,选择不同的部署方式,从而达到可靠性、可伸缩性、持续可用性、性能、安全等要求

 

 

 

 

2.6. 五视图法架构设计步骤

总体上,五视图法做架构设计的步骤是逻辑架构->数据架构->开发架构->运行架构->物理架构
  1. 理清业务之后可以画出领域模型
  2. 根据领域模型进行数据架构设计
  3. 数据结构定好后,确定技术栈等开发架构
  4. 分析好功能性需求,把关运行架构
  5. 最终成型后落地计划,设计物理架构

架构设计往往是从逻辑架构开始
  • 分析和确认需求
逐步开始开展开发架构与数据架构的设计
  • 软件分层、分包、技术框架,以及部分质量属性
  • 数据库设计
对于一些关键性功能进行运行架构设计
  • 性能、可伸缩性、可靠性、安全性
往往后期逐步开始考虑物理架构设计
  • 服务器、网络、安装部署等等

发表回复