阿里技术专家:如何画好一张架构图?
架构图是什么?为什么要画架构图?如何画?有哪些方法?本文从架构的定义说起,分享阿里文娱高级技术专家箫逸关于画架构图多年的经验总结,并对抽象这一概念进行了深入地讨论。

图片来自 Pexels
什么是架构图?
如何画好一张架构图,要做好这件事情首先要回答的就是什么是架构图。我们日常工作中经常能看到各种各样的架构图,而且经常会发现大家对架构图的理解各有侧重。
架构图 = 架构 + 图
按照这个等式,我们可以把问题转换:
架构是什么?
图是什么?
也即:
架构图 = 架构的表达 = 表达架构的图
什么是架构?要表达的到底是什么?
如何画好一张架构图?
什么是架构?要表达的到底是什么?
I claim that you want to start communicating between independent modules no sooner than you absolutely HAVE to, and that you should avoid splitting things up until you really need to, because that communication complexity often swamps the complexity of the actual pieces involved in it.(让我们认识到一种现象,把复杂系统拆分成模块,似乎并没有降低整个系统的复杂度。它降低的只是子系统的复杂度。而整个系统的复杂度,反而会由于拆分后的模块之间,不得不进行交互,变得更加复杂。)
在百度百科上的定义:
架构,又名软件架构,是有关软件整体结构与组件的抽象描述,⽤于指导⼤型软件系统各个方面的设计。
在 Wikipedia 上的定义:
Architecture is both the process and the product of planning, designing, and constructing buildings or any other structures.
The fundamental organization of a system, embodied in its components, their relationships to each other and the environment, and the principles governing its design and evolution.

架构的本质
架构的本质是为了管理复杂性。
架构的本质就是对系统进行有序化重构,不断减少系统的“熵”,使系统不断进化。
架构的本质就是对系统进行有序化重构,以符合当前业务的发展,并可以快速扩展。
一个是以改善软件质量为目的的内在结构性变化。
另外一个是以满足客户需求为目的的外在功能性变化。
无论是何种变化,在我看来架构都是在不断的判断和取舍,在业务需求和系统实现之间做权衡,从而来应对未来变化的不确定性,如下图可以比较粗浅直观的表达这种理解。

从个人的角度,我自己觉得 TOGAF 的分类方式更加广泛使用(如下右图)。

结合日常的业务开发,其实我们更多的是关注业务架构和应用架构,所以把上边的表达式进一步的拆解,在回答如何画好一张架构图之前,我们需要关注业务架构和系统架构,讨论清楚如何进行业务架构和系统架构。

架构的过程其实就是建模的过程
百度百科定义:
建模就是建立模型,就是为了理解事物而对事物做出的一种抽象,是对事物的一种无歧义的书面描述。
建模(Modeling),是指通过对客观事物建立一种抽象的方法用以表征事物并获得对事物本身的理解,同时把这种理解概念化,将这些逻辑概念组织起来,构成一种对所观察的对象的内部结构和工作原理的便于理解的表达。
模是什么?如何建?

业务建模

“把书读厚”:大量的信息输入,同时探求可能性。
“把书读薄”:归类汇总,形成大图。
逻辑对照,确保理解和分析的正确性。
重点关注一些业务概念被界定的地方、一些与自己逻辑推理有出入的地方。
不断的调整自己阅读过程中记录的维度,矫正自己的分析方向。
老老实实用文档中的原话来记录和呈现(这点很重要,特别是阅读英文材料,最好原汁原味的记录,有助于提升自己的专业性)。

之所以强调这个细节,是因为尝试通过“一张图”去描述一个非常大的业务本身就是件很有挑战的事情,如果不这么做容易让自己变得焦虑和急躁,这是一个慢功夫,需要耐心,需要在关键阻塞的地方慢下来,甚至一遍一遍的反复才能最终完成。

这就是建立对话能力和对话语境,特别是有大量外部客户的时候,一方面体现我们自己专业性很重要,另外一方面这种与客户对话的能力更重要,这也是上文中提到为什么要尽可能用原汁原味的文字去呈现一张图的目的。

系统建模
抛开具体的时序图、状态图不谈,简单看一下如下几个维度的架构图:

“剥洋葱式”的由大到小,由粗到细,覆盖所有已知和未来可能业务场景;善于利用各种模型表述:自然语言、关系模型、时序图、状态图、流程图、各种层次架构图等等进行模型表述,充分表达各种业务场景并不断验证。
核心实体抽取:抓住核心概念,核心关系完成核心模型建立。
终极武器:所有的设计/逻辑模糊的点,将所有已知场景分别套入,自己讲给自己。
对象的分析方法:实体(Entity):客观存在并可相互区别的事物称之为实体。实体可以是具体的人、事、物,也可以是抽象的概念或联系。
如下图是《Thinking in UML》中关于对象的分析方法:

用例分析的方法:通过从业务用例中,去提取其中的关键词,不同的关键词可能表达了实体、关系、属性等等内容,从而完成模型分析与建立。
一句完整的用例描述中,首先找名词,以「主语」和「宾语」为主,这些名词基本可以确定我们的实体;其次找形容词,存在于「定语」和「状语」中,找到形容词基本可以确定对应属性的值;然后通过对用例的补充,细化,对名词进行定义,慢慢的,我们会得到我们的领域模型和对应的属性。最后通过动词&形容词(存在于【谓语】,【状语】,【定语】)来确定他们之间的关联关系。
问题分析的方法:这是《聊聊架构》中提的方式,具体讲就是通过寻找问题的主体,然后分析主体的生命周期,进而通过区分生命周期里的关键活动来聚焦主体的关键属性和关键关系。
一个笑话:一位女士对老公说:把袋子里的土豆削一半下锅;结果所有土豆都下锅了,而且每个土豆被削了一半。
业务建模中“把书读薄”归类汇总,建立「大局观」,形成大图,这里按什么维度去归类?如何判断归类是正确的?
系统建模中“剥洋葱”怎么拆?按什么拆?上述架构图中的层次、领域如何划分层次?边界在哪里?
说回抽象
Haskell 语言的设计者之一 Paul Hudak 曾说过一句略带夸张的话:编程中最重要的三件事是:抽象,抽象,抽象。
“abstraction, abstraction, abstraction”are the three most important things in programming。
百度百科定义:
从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃,这种思维过程,称为抽象。
抽象的角度
以生活中的常见的实物来说(如下图),我们是否能快速的说出其中的相同点和不同点。

抽象角度其实也是分类的角度,角度不同,会导致完全不同建模方向和结果。
抽象的角度就是建模的方向和目的(“屁股决定脑袋”)。
同时,上文中我们提到,模是业务的映射,基于对抽象的理解,我们可以进一步展开:模是在确定抽象角度下的业务映射。

抽象的层次
我的 5 月 18 日的《旧金山纪事报》
5 月 18 日的《旧金山纪事报》
《旧金山纪事报》
一份报纸
一个出版品
从系统设计实现上来说,抽象层次越高,越接近设计,越远离实现,同时抽象的模型越不受细节的羁绊,稳定性越高,普适性越强,可重用性就越高。

以抽象角度分层(可能一层是多角度的聚合)
面对变化分层(用层次隔离变化)
公用的往下走
个性的往上走
下层可以独立于上层存在
控制下层的变化
抽象的边界
以现场娱乐行业为例,如下这张图包含了最高抽象层次下业务的全生命周期,这个抽象层次下的主体是什么,我的理解是票,项目生产的结果是票,分销或电商服务是对票的销售,现场是对票的核验,至此以票为核心实体的生命周期结束。

如果我们往下 Down 一层,从项目生产这一个业务活动去看,整个业务流程是这样:
项目管理→场馆座位分销→票房预测→场次管理→配额管理→绘座→票房规划
抽象的评估
每次从一个角度来切分,然后换多个角度来审视
通过组合、拆分来精化、优化模型与设计(抽象的结果)
关键的审视点:
耦合性:减少模块间通信量
内聚性:功能单一化
变化的隔离性:减少信息依赖,建隔离层、虚拟层
抽象的方法论(套路)
业务建模中“把书读薄”归类汇总,建立“大局观”,形成大图,这里按什么维度去归类?如何判断归类是正确的?
系统建模中“剥洋葱”怎么拆?按什么拆?上述架构图中的层次、领域如何划分层次?边界在哪里?
抽象有两种方法,一种是自顶向下,另一种是自底向上。
业务建模,是从小到大,从局部到整体,自底向上的归纳、演绎的抽象过程。
系统建模,是从大到小,从整体到局部,自顶向下的拆解、切分的抽象过程。
但不绝对,自上而下和自下而上,往往在过程中是随意切换的。
下面这张图来自于《Thinking in UML》,我觉得这个循环的过程可以表达上面这四个点,供大家参考。

如何画好一张架构图?
画架构图是为了什么?
解决沟通障碍:达成共识、减少歧义。
提升协作效率:团队内部和团队之间的协作、沟通、愿景和指导。
参与项目的各团队各角色(业务、产品、开发、测试、安全、GOC)
项目之外的客户(外部客户,外部评审专家)
各层次 TL(汇报,跨 BU,跨团队协作沟通)
怎么画?
从业务应用开发的维度,一般的抽象层次可以分为:
业务全域—>子域—>模块—>子模块—>包—>类—>方法
较低层次的抽象:应用内部包图、类图;某个领域:实体图、时序图、状态图、用例图等等。
较高层次的抽象:具有一定的复杂性,比如微服务架构,系统间的交互图,领域/子领域架构图,整个系统架构图等等。
方框、各种形状、虚实线、箭头、颜色(不同颜色代表什么意思)和文字内容
虚实线表达什么?组件类型,模块类型,层,服务,需要考虑是否已经实现等?不同状态的标识怎么传递?
箭头表达什么?数据流或关联关系?
交互类型可以是同步或异步的;关联类型可以是指依赖、继承、实现。
内容术语一致、信息粒度大小一致,图例清晰,颜色类型统一,美观。
图中的信息与相应的抽象级别相关,且满足利益相关者(合作方)的需求。
一张好的架构图不需要多余的文字解释!受众有没有准确接收到想传递的信息;如果它所导致的疑问比它能解释的问题还要多,那么它就不是一张好的架构图。
架构图应该帮助每个人看到大局,了解周围的环境,适当的上下文信息。
架构图应该避免“只见树木,不见森林”。
最后也聊聊架构师
其中提到了好的架构师的画像和不好的画像,如下图,与大家共勉:

逻辑的复杂性
需求的变化性
最后的最后
希望这篇文章对大家有帮助,附上最初在考虑这个主题时的构思过程及思考路径,供大家参考。

作者:箫逸
编辑:陶家龙
出处:转载自微信公众号阿里技术(ID:ali_tech)

精彩文章推荐:
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
- 1 习近平同马克龙交流互动的经典瞬间 7904887
- 2 公考枪手替考89次敛财千万 7808673
- 3 15岁高中生捐赠南京大屠杀日军罪证 7712799
- 4 2025你的消费习惯“更新”了吗 7618361
- 5 危险信号!俄数百辆保时捷突然被锁死 7521015
- 6 李幼斌20年后重现《亮剑》名场面 7424668
- 7 连霍高速发生交通事故 造成9死7伤 7329121
- 8 今日大雪 要做这些事 7232894
- 9 解放军潜艇罕见集群机动 7137197
- 10 中疾控流感防治七问七答 7039764







51CTO技术栈
