1.2 软件架构的思维方式
前面对软件架构进行了一个深入的解释,对什么是软件架构、为什么需要软件架构、怎样才算是优秀的软件架构进行了详细的分析。
本节我们介绍在构建软件架构的过程中需要使用的几种思维方式。我们在生活和学习中常常有思维方式的转换,构建软件架构也同样需要不同的思维方式。
对于软件架构设计来说,我们应从思维方式入手,先学习如何建立抽象构建架构的思维方式。
架构既承载了我们对这个项目的抽象思维,也帮助我们厘清了业务体系的方向。如果要问软件研发、架构设计中最重要的能力是什么,我会毫不犹豫回答是抽象能力。
抽象能力是一个比较重要的能力,它不仅在生活中很重要,在进行软件架构设计时尤其重要。一个项目在最初的设计中是没有可见实体的,需要我们凭空创造出一个能看到或想象的目标实体,这个目标实体大概率会指向软件形成的最终形态,不会偏离很多。抽象能力在这个特殊时期发挥了重要作用,它可以帮助我们在没有形成任何可见、可幻想的实际目标之前,为目标描绘出一个大致的轮廓,这样我们在实现架构的途中就有了一个可见的标准和目标。因此,实际工作中抽象能力的强弱,直接决定我们所能解决问题的复杂度和规模大小。
软件架构设计和小朋友搭积木无本质差异,只是解决的问题域和规模不同罢了。架构师先要在大脑中形成抽象概念,然后以模块的形式进行拆分,设计子模块之间的沟通方式,再依次实现子模块,最后将子模块组合起来,形成最终的系统。我们常说编程和架构设计就是搭积木,优秀的架构师受职业习惯的影响,眼睛里看到的世界都是模块化组合方式。
可以这样认为,我们生存的世界都是在抽象的基础上构建起来的,离开抽象,人类在对事物进行构建时寸步难行。
一篇名为《优秀架构师必须掌握的架构思维》[1]的文章就很好地对抽象能力进行了分析,以下三种抽象能力源自这篇文章。
第一种:分层思维
分层是我们应对和管理复杂性的基本思维武器。
面对一个复杂的系统,我们一开始总是无从下手,就好比一下子在我们面前摆了很多的问题,杂乱无章。这很大程度上会导致我们慌张、焦急、惶恐。分层思维,能很好地帮助我们抽象一个复杂系统的架构层次,从而清晰地描述有多少层面的事务需要我们解决,以及解决层级的先后次序。
构建一套复杂系统时,我们把整个系统划分成若干个层次,每一层专注解决某个领域的问题,并向上提供服务。这样的抽象做法,让复杂的事务变得更加清晰、有序。有些层次并不一定是横向的,也可以是纵向的,纵向的层次贯穿其他横向层次,称为共享层,如图1-1所示。
图1-1 分层抽象设计
下面介绍几个用分层思维作为抽象方法的架构案例。
对于一个中小型的Spring Web应用程序,我们一般会设计成三层架构,如图1-2所示。
图1-2 Spring Web设计
Linux操作系统是经典的分层架构,如图1-3所示。TCP/IP协议栈也是经典的分层架构,如图1-4所示。
图1-3 Linux操作系统分层架构
图1-4 TCP/IP分层架构
如果你关注人类文明进化史,你会发现,今天的人类世界也是以分层方式一层一层搭建和演化出来的。今天的互联网系统可以认为是现代文明的一个层次,其上是基于互联网的现代商业,其下是现代电子工业基础设施,诸如此类。
第二种:分治思维
分而治之也是应对和管理复杂性的一般性方法,图1-5展示的是一个分治的思维流程。
2015年我在思考Unity3D手游项目发布流程时,用分治法对发布流程进行抽象分解,首先把code(编码)作为主中心,再把除了code以外的事项拆分成打包发布、资源部署到外网、检测、版本控制、设置项目管理平台等部分。最后将拆分出来的大块问题进行细化,分解成具体的某个小问题,如图1-6所示。
图1-5 分治抽象设计
对于一个无法一次解决的大问题,我们先把大问题分解成若干个子问题,如果子问题还无法解决,则继续分解成子子问题,直到可以直接解决为止,这就是分解(divide)的过程;然后将子子问题的解组合成子问题的解,再将子问题的解组合成原问题的解,这就是组合(combine)的过程。
在生活中分治思维可解决大问题、复杂问题。特别是当你遇到那些从未处理过的问题,或者特别复杂以至于超出你能力范围的问题时,把它进行分解、拆分、解剖、撕裂。把大问题先分成几大块的问题,再从这几大块问题入手,对每个大块问题再分解,拆分成小块问题。倘若小块问题仍然无法解决,或者还是没有思路,则再拆分,再解剖,再分解,直到分解到你能开始着手解决为止。这样一步步、一点点,把小问题解决了,就是把大问题解决了。随着时间的推移,不断解决细分的小问题,大问题便可迎刃而解。
图1-6 发布流程设计
第三种:演化思维
经常有人讨论:架构是设计出来的还是演化出来的?基于多年的经验,我认为架构既是设计出来的,同时也是演化出来的。对于互联网系统,基本上可以说是三分设计,七分演化,既在设计中演化,又在演化中设计,是一个不断迭代的过程。
在互联网软件系统的整个生命周期中,前期的设计和开发大致占三分,在后面的七分时间里,架构师需要根据用户的反馈对架构进行不断的调整。我认为,架构师除了要利用自身的架构设计能力外,也要学会借助用户的反馈和进化的力量,推动架构的持续演进,这就是演化式架构思维。
当然,一开始的架构设计非常重要,架构确定,系统基本就成型了。同时,优秀的架构师深知,能够不断应对环境变化的系统才是有生命力的系统,架构的好坏很大部分取决于它应对变化的灵活性。所以具有演化式思维的架构师,能够在一开始设计时就考虑到后续架构的演化特性,并且将灵活应对变化的能力作为架构设计的主要考量。
从单块架构开始,随着架构师对业务域理解的不断深入,也随着业务和团队规模的不断扩大,渐进式地把单块架构拆分成微服务架构的思路,就是演化式架构的思维。如果你观察现实世界中一些互联网公司(如eBay、阿里、Netflix等)的系统架构,就知道它们大部分走的是演化式架构的路线。
图1-7所示的是建筑的演化史,在每个阶段,你可以看到设计的影子,但如果时间线拉得足够长,演化的特性就出来了。
图1-7 建筑的演化史
综上所述,我们强调了抽象思维在架构设计中的重要性,以及抽象思维的几种用法,包括分层思维、分治思维及演化思维,它们在抽象的架构设计中起到了很好的作用。
[1] 见https://www.infoq.cn/article/architecture-thought。