由于文章内容较长,所以我把它分成两篇小文章,在第一篇《优秀架构师必须掌握的架构思维》中,我会先介绍抽象、分层、分治和演化这四种应对复杂性的基本思维 。在第二篇《四个架构设计案例及其思维方式》中,我会通过四个案例,讲解如何综合运用这些思维,分别对小型系统,中型系统,基础架构,甚至是组织技术体系进行架构和设计 。
一、抽象思维如果要问软件研发/系统架构中最重要的能力是什么,我会毫不犹豫回答是抽象能力 。抽象(abstraction)这个词大家经常听到,但是真正理解和能讲清楚什么是抽象的人少之又少 。抽象其实是这样定义的:
对某种事物进行简化表示或描述的过程,抽象让我们关注要素,隐藏额外细节 。
举一个例子,见下图:
文章插图
你看到什么?你看到的是一扇门,对不对?你看到的不是木头,也不是碳原子,这个门就是抽象,而木头或者碳原子是细节 。另外你可以看到门上有个门把手,你看到的不是铁,也不是铁原子,门把手就是抽象,铁和铁原子是细节 。
在系统架构和设计中,抽象帮助我们从大处着眼(get our mind about big picture),隐藏细节(temporarily hide details) 。抽象能力的强弱,直接决定我们所能解决问题的复杂性和规模大小 。
下图是我们小时候玩的积木,我发现小时候喜欢玩搭积木的,并且搭得快和好的小朋友,一般抽象能力都比较强 。
文章插图
上图右边的积木城堡就是抽象,这个城堡如果你细看的话,它其实还是由若干个子模块组成,这些模块是子抽象单元,左边的各种形状的积木是细节 。搭积木的时候,小朋友脑袋里头先有一个城堡的大图(抽象),然后他/她大脑里头会有一个初步的子模块分解(潜意识中完成),然用利用积木搭建每一个子模块,最终拼装出最后的城堡 。这里头有一个自顶向下的分治设计,然后自底向上的组合过程,这个分治思维非常重要,我们后面会讲 。
我认为软件系统架构设计和小朋友搭积木无本质差异,只是解决的问题域和规模不同罢了 。架构师先要在大脑中形成抽象概念,然后是子模块分解,然后是依次实现子模块,最后将子模块拼装组合起来,形成最后系统 。所以我常说编程和架构设计就是搭积木,优秀的架构师受职业习惯影响,眼睛里看到的世界都是模块化拼装组合式的 。
【优秀架构师修成之路】抽象能力不仅对软件系统架构设计重要,对建筑、商业、管理等人类其它领域活动同样非常重要 。其实可以这样认为,我们生存的世界都是在抽象的基础上构建起来的,离开抽象人类将寸步难行 。
这里顺便提一下抽象层次跳跃问题,这个在开发中是蛮普遍的 。有经验的程序员写代码会保持抽象层次的一致性,代码读起来像讲故事,比较清晰易于理解;而没有经验的程序员会有明显的抽象层次跳跃问题,代码读起来就比较累,这个是抽象能力不足造成 。举个例子:
文章插图
一个电商网站在处理订单时,一般会走这样一个流程:
- 更新库存(InventoryUpdate)
- 打折计算(Discounting)
- 支付卡校验(PaycardVerification)
- 支付(Pay)
- 送货(Shipping)
二、分层思维除了抽象,分层也是我们应对和管理复杂性的基本思维武器,如下图,为了构建一套复杂系统,我们把整个系统划分成若干个层次,每一层专注解决某个领域的问题,并向上提供服务 。有些层次是纵向的,它贯穿所有其它层次,称为共享层 。分层也可以认为是抽象的一种方式,将系统抽象分解成若干层次化的模块 。
文章插图
分层架构的案例很多,一个中小型的Spring Web应用程序,我们一般会设计成三层架构:
文章插图
推荐阅读
- 阿里资深架构师:同样是数据中台,为什么差距那么大?
- 每个架构师都知道的康威定律,你确定不来看看?
- 制茶大师博物馆开讲
- 茶老师的自我修养
- 茶老师吴语大梅禅茶桃然云水
- 茶老师吴瑜如元朱
- 听诊器的发明者雷奈克医生是哪国人 听诊器是法国医师什么于什么年发明的
- 茶艺师 绝不是简单的端茶送水
- 师父|“中国钓王”的疯狂人生
- 茶文化GAI大师还是帮派大师