You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
16 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 18 | 架构设计,专业分工和协作精神的体现
你好,我是乔新亮。今天,我想和你聊聊,关于架构设计的一些认知和体会。
作为技术人,最常接触的概念,恐怕就是架构设计了。即便是初出茅庐的新手程序员,可能也听说过 6 大设计原则与 23 种设计模式。因为,要成为管理者或技术专家,架构设计绝对是你绕不开的槛。
因此,关于架构设计的书和课程非常多,多到简直学不完。如果用我们专栏文章的形式来讲,写出一百篇文章都不为过。
但在今天,我们只聊一点认知,我认为,也是架构设计最核心的认知:**好的架构设计,就像优秀的组织协作一样,既能帮助 IT 系统做好各模块的专业分工,又能体现模块间的协作精神**。
认知讲完了,是不是感觉有些熟悉?
没错,其实在很多架构设计思想里,我们都能找到这句话的影子,比如“高内聚、松耦合”、“单一职责原则”、“接口隔离原则”,太多了。
你可能会想,老乔坑人呢,作为一个 CTO ,在架构设计这一讲,就交付了一个这么基础的概念。
没错,这个概念确实很基础,但我想告诉你,其实架构设计,尤其是业务/应用架构的设计,原本就没有那么复杂。
工作了近 20 年后,我发现,如果一名架构师存在职业发展瓶颈,那么他的问题大概率是简单的设计方法没有执行好,而不是复杂的设计方法没学会。
复杂的学会了,简单的却没做好,听起来很奇怪吧?下面,我们详细聊聊,这究竟是怎么一回事。
## 从程序员到架构师,什么能力在提升?
2020年刚到彩食鲜的时候我去审查团队技术需求的分配和实现发现了一些不合常理的情况对于部分业务流程改造工作我认为很容易实现团队却需要花费大量的时间才能落地。几天就能改好的代码花掉一个月的时间都是有可能的。
有时,团队甚至会觉得,单是为了实现需求,就已经很吃力了,从整体的逻辑上看就很不合理。
仔细一查,我才发现问题的根源所在:表面上看,是逻辑不合理,实际上是架构设计不合理。
生鲜/电商类业务的架构一般会包括 OMS订单管理系统、WMS仓库管理系统、TMS运输管理系统等系统。其中 OMS 处理用户订单负责调度WMS 负责仓储管理TMS 负责安排物流运输。可以看到,其实功能的划分很明确。
但很多业务在研发迭代时,并没有做过架构方面的考量,比如将与订单相关的逻辑直接放在 WMS 处理了WMS 接到 1000 斤蔬菜的订单,检测仓库内只有 500 斤于是发送请求到采购系统要求再采购500 斤回来,然后将订单交付。
这样的逻辑能保证功能实现吗?当然可以,但长远看来,就会出现架构层面的设计问题 —— WMS 越来越臃肿,最终导致新需求的处理速度严重下降,影响业务的增长,这就是很多企业正在为之头疼的现实。
你可能会想,这个例子里的架构师真傻,连 OMS 都不知道。
真的是这样吗?事实上,类似的错误,很多企业每天都在犯,尤其是 IT 服务于自身生态的甲方企业。大家习惯于基于业务需求写代码,而不是基于架构设计写代码,反正来了需求先实现了再说,尤其是在业务刚刚起步时。
比如,在业界,你会发现一个很普遍的现象:许多企业投入大量的资金和人力进行 IT 建设,但每隔几年就要进行一次架构上的大调整,甚至直接推翻重写。
大部分人甚至已经习惯了这种行为,觉得重建很正常,而且是一名架构师能力的证明。
事实上,如果架构师严格按照“专业分工、充分协作”的思想去迭代需求,这样的重建根本就不应该出现。**一名优秀的架构师应该像个“隐形人”,似乎什么都没干,但其负责的架构就是能快速响应业务的需求。**
什么叫做“快速响应业务的需求”?就是说,在同样的业务复杂度下,在系统建设的不同阶段,可以使用相近的工作量完成需求。
那么,所谓的“专业分工、充分协作”,到底是做了什么呢?回到架构设计实践里,无非是一个先拆分再合并的 “V” 字型设计过程。
拆分是指将一个负责的功能按角色、按职责拆分,核心特征是单一模块的功能既单纯又简单。比如,要从零实现一个淘宝网,是相当复杂的事。但我们可以将其拆分成订单中心、用户中心、商品中心、库存中心等许多模块;订单中心还可以再拆分,比如拆分成订单创建、订单查询、订单履约等功能;如果实现仍然复杂,我们还可以继续拆分,直到能够用简洁优雅的代码去实现。
合并是指将类似的职责放在一个模块完成,抽象出可重用、复用的部分,提升业务响应效率。比如订单创建、订单查询都需要对数据库进行操作,那么与数据库的交互就应该统一封装。
**抽象地看架构是由元素element和关系relationship组成的。在架构设计中那些稳定、可复用的部分应该变成组件或应用模块对应着架构中的「元素」而面向不确定性的设计则需要变成协作方式为可能的扩展作准备对应着架构中的「关系」。**
这就像一个足球队,有人司职前锋、有人司职中场、有人司职中后卫,分工明确才能组成一个有战斗力的队伍;中场可能回撤参与防守,后卫也可能前插参与进攻,这样才能对可能的变化作出响应。
如果什么设计都没有,就只能变成一群追着球玩的小孩。
那么「元素」是拆分得越细越好吗当然也不是5 个模块能搞定的功能,你非要写 100 个模块,只能是给自己徒增烦恼。
所以,从初级架构师到高级架构师,什么能力是一直存在并持续提升的?其实就是对复杂业务的拆分能力、对可复用部分的抽象能力、对拆分过程的颗粒度把握,以及对未来变化的考量和设计。如何让架构有足够的“应变能力”,则与架构师对业务的理解程度息息相关。
如果用一句话总结,那就是:**对架构层面的「专业分工」和「协作精神」的理解,是一名架构师的基础与核心能力。**
## 认知延伸:如何看待微服务和中台架构
你可能会想,老乔讲的对是对,可有什么用呢?
别急,我们通过前面讲的架构设计思想,反过来看看近几年大火的微服务和中台架构。
关于微服务,首先我们要知道,它的功能和数据处理是封装在一起的,这和 SOA 架构非常类似;其次,服务交互、服务治理、服务监控、服务隔离等很多基础性能力已经封装在框架中,可以让开发团队聚焦在功能实现上;再者,通过和 Kubernetes 集成,微服务的功能、数据、基础设施被再次封装,技术架构也再次进行了升级。
看得出来,在微服务框架下,技术架构部分的很多职责已经被抽象出来,并对框架进行了处理,隐含着相关理念的最佳实践。
同时,微服务也有一个很基本的原则:**让系统的分工更明确、责任更清晰**。所以你看,还是我们上面讲的那些内容。
对于业务侧架构师来说,即便是使用了微服务架构,工作还是会集中在架构设计方面,比如:业务功能如何进行归类。具体到微服务改造的过程中,就会碰见一个典型问题:微服务拆分的颗粒度怎么把控?微服务,英文 MicroService划分粒度一定要很细吧
其实这个问题压根没有统一答案,为什么?因为我们前面讲过了,即便没有微服务,架构师也要做功能的拆分,至于对颗粒度的把握,既受业务本身的特性影响,也受架构师的能力影响。
换句话说,一名对架构的“分工”和“协作”理解得足够好的架构师,很少会困惑于微服务拆分的颗粒度问题。因为从本质上来讲,这些都是一码事。从单体应用到各功能独立服务,其实是处于功能拆分的两个极端,但**架构设计本质上是一种“中庸思想”,如果单纯考虑功能设计,我们的目标只有一个:让架构响应业务调整的速度更快。**
那么架构如何才能实现更快的响应速度呢?就是在**保证各「元素」职责清晰的情况下,抽象出稳定的功能或组件,用业务流程去串联起来**。在一定时期内,一家企业的技术架构的功能或者组件基本是稳定的,而业务如何运转,却是动态变化的,甚至每周都在变。可以说,以不变应万变是架构设计的精髓。
这个设计思想又和中台架构如出一辙。企业搭建中台,最重要的目标之一,就是实现企业营收层面的“开源”,承担企业架构快速响应市场需求的任务。其关键词包括:消除烟囱、架构解耦、统一中台、服务重用……
没错,和我们前面谈的架构设计核心思想又是基本一致的。
关于中台,业界很多技术人都踩了不少坑。刚开始听说中台概念的时候,大家一拥而上,做得多了才发现,中台到处都是坑。以至于在当下,许多人对中台是嗤之以鼻的。
为什么呢?我认为很重要的一个原因,是大家忘了架构设计的“初心”,错认为中台是个全新的设计理念。
其实从架构的视角看,中台这个概念并不新鲜,它只是突出了“可重用部分的抽象”这部分工作。那么, 如果你的 IT 系统可复用部分不多、业务量不高,建设中台的意义何在呢?如果你的中台对业务没有帮助,建设中台的价值如何体现呢?
**你看,时刻牢记架构设计的核心原则,能帮助我们更清晰、更透彻地看待当下的许多“时髦理念”**。
当然,这里可不是说,中台的兴起,就是一群不专业人士的狂欢,绝对不是这样的。苏宁在 2012 年就开始中台建设2013 年上半年完成。后来在利用中台接入天猫业务时,团队仅花了七天七夜的时间就完成了融合,速度非常之快。
关于企业数字化转型、中台建设,我在公众号里,曾经分享过一个系列,共 9 篇文章,用大概 4 万字左右的篇幅,描述了一个关于中台的“[指挥官体系](https://mp.weixin.qq.com/mp/homepage?__biz=Mzg2NjI1MDk0NQ==&hid=8&sn=5098693d64a4e0ebbffc79829e375ce9&scene=1&devicetype=Windows+10+x64&version=6300002f&lang=zh_CN&nettype=WIFI&ascene=1&session_us=gh_29a69e00e273&pass_ticket=%2FTbRTIlXcJMcB%2B3ejcKbOJV9JSakqAQOodTiZPotxt0lh0RHK1FjS7uTtMyRns2s&wx_header=1&uin=MjI1OTA5NDUwMQ%3D%3D&key=07730a946a3186fb96024f450086917d0fb6060e575afb1a958a5395b9a2fdf7dd49ffb49246e3292e44f5c4d6df32c8404254b20c20916f1492a07d04383b033e00f7070c2accc32a69a32f86fddb41ef0731742508878a645f3cb54793b67182c0fc6a77a3ca2045cd5d28ff70e8a4bba24d2c636684a8dc17de141f895405)”,大家可以读一读,理解下中台和微服务设计的具体内容。
**所以,无论是微服务还是中台,都有其巨大的实践价值,但二者只是架构设计核心原则的一种成熟的实践模式和承载方式,不是解决架构问题的“灵丹妙药”。**
简单来说,如果你能按照架构设计的核心原则,做好模块拆分,那么微服务架构可以非常好地承载这种设计思想,为你提供服务治理、监控等一系列工具。但如果你在架构设计层面就做不好拆分,微服务也不能直接帮你解决颗粒度问题。
如果你问我,老乔,我没有“专业分工”的设计意识,也做不好功能的拆分,是不是用了微服务就搞定了?我只能回答,怎么可能呢?天底下没有这样的美事。
## 复杂架构设计如何落地执行
下面我们再来聊聊,复杂的架构设计究竟是如何落地的。
在 IBM 工作的那段时间,我曾经内部分享过一门专业架构师培训课程,包括为期 5 天的 Enterprise Architecture企业架构培训课程、为期 3 天的 Architecture Thinking (架构思维)培训课程、为期 3 天的 Component Modeling组件建模培训课程以及为期 3 天的Operation Modeling (运营建模)培训课程。
我尽量用最简单的方式,将功能性架构设计中,最简单直接的方法和步骤抽象总结出来,分享给你,其中也包含了少数我们上面提到的内容。
1. 关键认知:在个人视角里,整个世界都可以按照确定性内容和不确定性内容做简单区分;
2. 架构将其抽象为元素和关系,元素对应着确定性内容的处理,是看待这个世界的稳定视角;关系对应着不确定性内容的处理,是看待这个世界的响应视角;
3. 人类的理解能力有限。包含内容过多的元素,会导致理解困难,需要将其拆分;
4. 同理,将元素归类的时候,也不能贪多,不然会导致理解困难。优秀的架构师,会将合理数量的元素进行归类,归类后的整体一般被称作 component 或 module也可以直译为“组件”。比如我们永远以“元素数量为 10 ”作为一个衡量点,只要一个组件包含的元素/职责超过10个就要进行拆分
5. 元素归类一般采用 “V” 字型分析法,即流程分解为功能,功能聚合为组件;
6. 如果组件明确了意味着职责就建设好了架构的元素element建设问题就解决了。组件对外暴露的能力我们统一称之为服务
7. 那么架构的关系relationship建设问题该如何解决呢稳定的关系用来表达确定性的交互使用 SOA 架构,做好服务调用就可以;不稳定的关系,用来表达不确定性的交互,使用 EDA 架构;
8. 在每一个新需求到来时,尤其是大版本的更迭,架构师需要介入产品经理和程序员的沟通中,判断新需求是否大幅增加了某些组件的复杂度,并决定是否调整组件职责,或对现有组件进行拆分。所以,从实际的业务发展来看,组件的数量是逐步增长的,如果一开始就很多,基本属于过度设计;如果业务复杂度已经翻倍了,组件数量却没变,基本属于缺乏设计。
那么以上就是落地复杂架构设计时的一些关键认知,要结合前文的阐述,多多体会。如果有疑惑,欢迎留言提问。
## 结语
今天我们聊了聊架构设计的核心理念:专业分工和协作精神,具体来讲,就是做好功能的拆分,抽象其中可复用的部分,并保留面向未来的扩展空间。
这里我们聊的仅限于功能型架构的设计,关于高性能、高可用、高并发、风险控制等非功能型架构设计,我们将在后续内容里逐渐展开。
我猜,即便看到这里 —— 这一讲的结尾,你可能仍然会想:这个理念是不是太简单了。
其实很多知识恰恰是这样:说简单也简单 —— 容易理解,也容易操作;说难也难 —— 即便是首席架构师、技术总监,可能也还是会被类似的问题困扰,重复犯类似的设计错误。
究其本质,在于我们要用发展的眼光,看待个人成长、架构设计这类相对宏伟的命题。就像我常常说的,要做时间的朋友。
做架构设计的同学都知道,罗马不是一天建成的。同样,对架构设计核心原则的理解,也不可能在一年、两年内达到满分,这种理解往往会随着技术人的成长而持续加深。
其实,人类在解决很多复杂问题时,都会采用类似的思维流程:**将复杂问题拆解为简单问题,逐一解决再合并,并将可复用的知识抽象,以实现举一反三**。我们今天所聊的架构设计,其实就是这种思想在软件设计层面的复现。
希望你也能将这个看似简单、实则复杂的知识点吃透、嚼烂,最终做到返璞归真,成为一个优秀的架构师或技术管理者。
我们下一讲再见。