架构师修炼之路
软件架构导论
架构师
@startmindmap
+ 架构师
-- 技术
-- 用户
-- 业务
++ 从工程角度定义问题
++ 分解系统,分配职责
++ 关注大局
++ 在质量属性之间进行取舍
++ 管理技术债务
++ 提升团队架构能力
@endmindmap
架构
@startmindmap
+ 架构
++ 元素
+++ 模块 module
+++ 组件连接器 component & connector
+++ 分配 allocation
++ 关系:比如调用、订阅、管理、发布、返回、使用、依赖以及存储等等
@endmindmap
项目回顾
- 利益相关方是谁,主要业务目标是什么
- 项目的整体解决方案是什么样的
- 涉及到哪些技术
- 最大风险是什么,你是如何克服的
- 如果有机会重新做一遍,你会如何改进
设计思维 HART原则
1. 以人为本 human
设计的本质是社交
利益相关方关系图
2. 推迟决策 ambiguity
推迟不确定的决策
3. 善于借鉴 redesign
所有设计都是在已有设计基础上重新设计和调整创新
4. 化虚为实 tangibility
让想法具体化、有形化,以便于沟通交流
思维模式
@startmindmap
+ 思维模式
++ 理解问题
++ 探索想法
++ 展示想法
++ 评估适用性
@endmindmap
TDC循环
@startuml
node "思考 Think" as t
node "动手 Do" as d
node "检查 Check" as c
t -up-> d
d -> c
c -left-> t
@enduml
- 思考
Think
:工程风险、业务目标、质量属性、权衡取舍 - 动手
Do
:模型、原型、计划、备选方案 - 检查
Check
:场景演练、方案比较、直接检验、理解核查
架构设计原理
架构设计时间的最佳平衡点
项目总工期 = 开发 + 架构设计 + 返工(弥补缺陷、重写代码、改正错误)
其中,随着架构设计时间的增加,返工量会逐步减少;存在一个最佳平衡点,使得项目总工期最小
- 千万行代码的大型软件系统,最佳平衡点取
37%
- 一万行代码的小型软件系统,最佳平衡点取
5%
关键架构需求 Architecturally Significant Requirement
约束:给定或选定的不可更改的设计决策,分为技术约束
和业务约束
质量属性:外部可见特性,表征系统在特定环境下的运行情况
分为设计属性(可维护、可复用等)、运行属性(可用、性能、安全等)和感知属性(简单、指导等)
质量属性场景的六个元素:刺激
、来源
、软件部件
、响应
、响应度量
和环境背景
@startuml
:来源: as source
note top of source : 刺激的来源\n可以是人或系统.
(软件部件) as software
(响应) as response
source -right-> software: 刺激\n(需要系统以某种方式做出响应的事件)
software -> response
note top of response : 响应度量\n\
定义响应成功的标准和条件\n必须是具体、明确和可衡量的.
@enduml
影响较大的功能需求:需要特别注意的特性和功能
其他影响因素:时间、知识、经验、技术、办公司政治等影响决策的东西
架构选择
决策矩阵 decision matrix
选项A | 选项B | |
---|---|---|
特性1 | 0(中等,即不提升也不降低) | |
特性2 | -(降低,设计选项能给实现系统带来麻烦) | |
特性3 | –(严重降低,设计选项能给实现系统造成极大困难) | |
特性4 | +(设计选项能正常实现系统特性) | |
特性5 | ++(设计选项能高效实现系统特性) |
架构模式
针对特定问题的可复用解决方案。相比于设计模式,架构模式常涉及软件系统的多个组件,关注更宽泛的质量属性与抽象粒度
分层模式 Layers
层间低耦合,层内高内聚,提升可维护性。依赖上只有上层允许使用下层
端口适配器模式 Port and Adapters
使用输入源的可插拔适配器,以提供对事件和数据的访问,方便切换输入设备
管道过滤器 Pipe-and-Filter
松耦合的过滤器通过各种方式进行组合和复用,从而创建出新管道
面向服务架构模式 Service-Oriented Architecture
用独立的组件提供特定功能的服务,各种服务在运行时整合在一起,决定了系统的行为
发布订阅模式 Publish-Subscribe
生产者和消费者通过消息总线间接通信
共享数据模式 Shared-Data
多个组件通过共用的数据库访问数据
多层模式 Multi-Tier
系统运行时的结构被组织成逻辑组,逻辑组分配到特定的物理组件。Tier是组件连接器结构或分配结构,处理运行时元素,layer是模块结构,处理设计时元素
CSC迭代
创建 Create
提出设计想法(画图或建模),5-7min
分享 Share
组内游说(pitch),解释自己的设计如何满足目标,3-5min
评判 Critique
评判设计与目标的关系,指出好的方面和可以改进的方面
优秀的软件架构师
- 与团队一起选择架构模式和技术
- 设计文档模板,与团队一起起草和评审文档
- 共同决策,及时评审,提供反馈
- 帮组团队组织工作,划分任务
- 接受变化,让架构易于调整
- 让大家就技术决策达成共识
结对设计
设计下放
- 告知:由你做设计决策,然后告知团队结果
- 贯彻:由你做设计决策,然后向团队说明设计理由
- 咨询:在做设计决策前咨询团队的意见,最终仍由你决策
- 商定:与团队就设计决策达成共识,平等话语权
- 建议:通过观点、见解影响团队,但是由其他团队成员做设计决策
- 审查:由团队做决策,并且由他们说明设计理由
- 委托:委托另外一位成员做决策,由他负全责。你作为辅助,帮助团队收集信息
经验不足的团队,建议采用前三级权限
架构师工具
二选一 Choose One Thing
难以取舍时做决策(功能性需求应当进行公平评估)
移情图 Empathy Map
描绘利益相关方(比如客户,用户,维护人员)的任务,想法,感受,理解对方的目标
GQM研讨会 Goal-Question-Metric Workshop
目标-问题-指标讨论,用于确定质量属性的响应度量
架构决策记录 Architecture Decision Records
架构决策记录(ADR)
决策矩阵 Decision Matrix
最后修改 2023-03-11: split into more parts (54b443e)