架构设计是分与合的艺术
通读并总结了温昱老师的《软件架构设计》,并有幸听过李哲珠博士对架构设计的讲解。对其读后的自我领悟并提炼出核心内容分享出来,希望从思想高度上能提升你对软件架构设计的认知。
架构设计
架构设计不等于框架设计,框架也可能有架构,所有的原子组件(被拆分的模块)都需要架构设计,所有组件可以组合成复合组件,组合而成的组件也有自己的架构。最简单的架构模式就是适配器模式,因为原子组件随时可能被替换,或接口不统一。
两视图法
- 逻辑架构中关于职责划分的决策,体现为层、功能子系统和模块等的划分决定,从静态视角为详细设计和编程实现提供切实的指导;有了分解就必然产生协作,逻辑架构还规定了不同逻辑单元之间的交互接口和交互机制,而编程工作必须实现这些接口和机制。
- 所谓交互机制,是指不同软件单元之间交互的手段。交互机制的例子有:方法调用、基于RMI的远程方法调用、发送消息等。
- 至于物理架构,她关注的是软件系统在计算机中运行期间的情况。物理架构设计视图中规定了软件系统如何使用进程和线程完成期望的并发处理,进程线程这些主动单元(Active Unit)会调用哪些被动单元(Passive Unit)参与处理,交互机制(如消息)为何等问题,从而为详细设计和编程实现提供切实指导。
- 设计视图时要迭代式设计、一个视图进行不下去的时候,可以转换设计另一个视图,相互迭代。
三个原则
- 最先,要看透需求,这是基础。架构师可能不是“需求”和“领域模型”的负责人,但也必须深入了解。
- 中间,确定正确的概念架构。“关键需求”决定“概念架构”。(大方向正确)
架构新手和有经验的架构师的区别之一,在于是否懂得、并能有效地进行概念架构的设计。作为架构新手,尤其害怕碰上自己没做过的系统;系统较大时,一旦祭出“架构 = 模块 + 接口”的法宝却不太奏效,架构新手就往往乱了阵脚。相反,有经验的架构师不会一上来就关注如何定义“接口”,他们在大型系统架构设计的早期比较注重识别1)重大需求、2)特色需求、3)高风险需求,据此来决定如何划分顶级子系统、采用什么架构风格和开发技术、集成是否要支持、二次开发是否要支持。
- 最后,充分设计系架构的各个方面。通过多视图方法“细化架构”,通过“架构原型”验证架构。
六个成果
三大阶段,分别遵守三个原则,六大步骤可以得到六个成果(每一阶段两个步骤)。
- 需求分析(产出需求用例)
一定要全,必须涵盖功能、质量、约束这三个方面
两纵:第一,沟通功能需求。第二,确定非功能需求(性能需求、便利性需求、友好性需求)
三横:第一,上下文图(待开发系统作为黑盒在中心,周边都关联了哪些系统、环境和活动)
- 领域建模(产出领域模型)
业务决定功能,功能决定模型
领域建模的目的:透过问题领域的重重现象,捕捉其背后最为稳固的领域概 念,以及这些概念之间的关系。在项目前期,所建立的领域模型将为所有团 队成员之间、团队成员和客户之间的交流提供共同认可的语言核心。
领域建模的形式:可以用类图或者状态图也可以用文字
- 类图:描述静态的关系(一对一、一对多、多对多。继承,关联等)
- 状态图:描述动态的变化(从某一个状态变为另一个状态,能做哪些功能,在静态完成后着重考虑)。此项分析能够挖掘更多的需求,避免后期的变更(例如:公司-雇佣-雇员,因为雇员会有状态的变化,所以产生雇佣)
- 文字:直接描述一个具体的模型(位数、格式等规则)
领域建模将对界面设计、持久化数据模型、类设计、可扩展性等方面提供帮助
- 确定对架构关键的需求(产出关键需求子集)
关键需求决定架构,其余需求验证架构
对功能需求和非功能需求进行筛选,最终确定对软件架构起关键做用的需求子集(占总需求的20%左右)
- 确定关键质量:确定关键质量时考虑质量数型之间的矛盾关系:性能-安全性
- 确定关键功能:关键功能涉及(或串起)的模块最多、协作方式最有代表性
关键需求受项目级别影响(部门级应用、企业级应用、集团级应用),同一个项目关键需求可能不同
- 概念架构设计(产出概念架构)
是直指系统设计目标的设计思想合重大选择
是关乎任何复杂系统成败的最关键的、指向性的设计
需明确给出以下一个决定和四个选型:
- 如何划分顶级子系统(面向集成的集成模块、为性能把访问资源隔离的各个子系统)
- 架构风格选型(B/S、C/S、B/S+C/S。。。是最简单的风格)
- 开发技术选型
- 集成技术选型
- 二次开发技术选型
- 细化架构设计(产出细化架构)
利用五视图法进行设计
- 架构验证(产出概念原型)
一个真正可以运行的应用程序
五视图法
复杂的项目,两视图法就不够用了
- 逻辑视图 => 逻辑架构:职责单元 + 协作关系
- 模块划分
- 水平分层
- 通用模块、通用机制
- 来自需求
- 接口定义:模块或子系统之间的通信接口
- 领域模型
- 开发视图 => 开发架构:程序单元 + 编译依赖关系
- 技术选型
- 开发语言
- 开发工具
- 技术框架、第三封类库
- 文件划分
- 编译关系
- 物理视图 => 物理架构:物理节点 + 拓扑链接关系
- 硬件分布
- 单板机
- 单片机
- 专用机
- PC
- 服务器
- 拓扑结构
- 网络类型
- 总线规范
- 软件部署
- 桌面软件安装
- 烧写嵌入式系统
- 部署web应用
- 方案优化
- 高性能(付出)
- 可用性【持续可用性/高可用性】(付出)
- 伸缩性(付出)
- 经济性(节约)
- 可行性(节约)
- 易维护性(节约)
- 运行视图 => 运行架构:控制流 + 同步关系
- 技术选型
- 进程
- 线程
- 中断服务程序(嵌入式应用的并发机制)
- 控制流划分
- 同步关系:资源争抢时需要加锁
- 数据视图 => 数据架构:数据单元 + 数据关系
- 技术选型
- 关系数据库
- 非关系数据库
- Flash
- (分布式)文件
- 存储格式
- 数据分布
《软件架构设计》是2007年电子工业出版社出版,温昱编著的书籍。本书可作为计算机软件专业本科生、研究生和软件工程硕士的软件架构设计教材,也可作为软件开发高级培训、软件开发管理培训的培训教材,更是第一线高级开发人员和开发管理人员的必备参考书。学习架构知识首先要提升看问题的高度,而且不能天马行空或者拿来主义,一定要学习方法论。思想和方法都已经告诉给大家了,附赠常用架构风格表: