一文讲透系统架构设计之大衣橱理论

    最近一段时间一直在思考如何解决大型业务系统复杂度问题。也总结了分层、业务模型化分解、标准化接口等关键点,然而这些总结还是不够体系化;之后了解了一下领域驱动设计的理论,还是不太满意。冥思苦想,我决定推出我的大衣橱理论,并渴望的得到大家的讨论、质疑和指正。

一、八九十年代的大衣橱

    回想我小时候,我家的衣橱是长这样的,非常优雅且具有年代感:


八九十年代的衣橱

    那个时候最痛苦的事儿,莫过于找衣服了,简直是地狱级别的难度。首先不是自己洗的也不是自己放的,所以不知道大体在哪儿,其次受限于身高视野等因素,慢慢的,轻柔的翻找,非常耗时间;你还得祈祷千万别弄乱了,不然挨一顿熊之后,还得把弄乱了的重新叠一遍。

    我一直是个急脾气,找一遍没找到就烦躁了,干脆全部拿出来,不计代价的找,然后再花费大量的时间叠好放回去。

    你看,这不就是你接手一个老系统(相对)遇到的困境么,不就是新产品几年之后的通病么。这跟人的关系大么,并不大。因为水平再高,遇到这种老系统那也白搭。而且你不能是个急脾气,哪怕你是个暴脾气,有从头理一遍的想法,也不会有人敢让你这么干,何况是,你重新理一遍,过一段时间还是会重蹈覆辙。

    那么造成这种困境的原因是什么呢?是架构。

    架构是什么呢?架构来源于对大衣橱的设计,设计又来源于使用需求。然而这跟具体是哪个架构师没关系,因为那个时代,家家户户都是这种橱子,每个工厂都是这种产品。甚至因为畅销,很多工厂都是拿来半成品然后做再加工。这也是为什么很多人对架构、框架、工具、规范等分不清楚的原因,比如半成品你怎么界定呢,架构固定了,但又不是设计出来的,而且是偏技术的,并不因为业务而有所改变。而真正的架构是业务驱动的,并不跟技术绑定。

    那么这种橱子就一无是处么?并不是。这是一种设计,设计的落地就是一种架构。首先一高一低的设计,为摆件预留了空间;其次,内部其实也有简单的分层。在衣服量少,且一人一橱的前提下,满足了当时大部分的需求。但是它承担不了更高的复杂度,也就是说,如果一个橱子放很多人的衣服,男女老少都放,那必然就是开头说的噩梦。

二、毕业之初的可组装简易衣橱。

可组装简易衣橱

这种衣橱加强了可移动性和轻量性,成本也不高,内部也有功能分区和分层。它的轻量性也带来了一些问题。

1、层与层之间的隔板一般是软材质的,有硬的大框架,但是用布料来隔开空间的。这造成的后果就是一定程度上的破坏隔离性。上层衣服太重的话,可能话挤压下层空间。左边塞的太满右边空间受挤压。这个在软件系统里的体现就是接口不够标准化;业务从接口蔓延到其他模块;还有一个例子是数据库设计驱动业务设计。

2、过度的使用晾衣架。晾衣架的优缺点都非常明显;优点是,衣服不褶皱,且互不影响,一定程度上解决了耦合性的问题。但缺点是,几乎没有复用,短衣服下面空间浪费;如果不做软性分区,那找衣服还是很麻烦。


三、非定制大衣橱。

那么现在被普遍使用的大衣橱长啥样呢?大概是这个样:


现代大衣橱

    优点明显,进步显著:

    1、有分层。上层、中层、下层。而且也并不拘泥于三层。可能的分层原则可以是按头部、上半身、下半身等原则;当然可以是其他原则。

    2、有功能分区。帽子、袜子、内衣、大衣、裤子等等分别在不同的区域存放,找的时候去对应的区去找。某一个区乱了,全部拿出来整理,也不影响其他区。

    3、有不同的使用方式。有叠放、有衣架、有抽屉。

    4、间隔材质是硬化的互不影响。无论衣服多重、某个区域塞多满,都不会蔓延到相邻的区域。

    那么问题在哪儿呢?问题在,如果这个大衣橱给你,你一定会用的舒服么?

    大概率不会。因为人与人的使用习惯,家庭组成、使用场景等都不一样,所以无论再合理的架构,都不能一味的固化。


四、大衣橱即是系统架构

盘点完各类大衣橱,咱们回归到系统架构设计上来。回顾一下耳熟能详的软件架构:

1、MVC架构


MVC架构(网上找的 ,不是重点懒得画,见谅)

2、SOA架构


SOA( 网上找的 ,不是重点懒得画,见谅)

3、微服务架构


微服务架构( 网上找的 ,不是重点懒得画,见谅) 

    我发现,哪怕是最流行的微服务架构,也不过是非定制的大衣橱而已。简单的说,这跟八九十年代用半成品制造成品,并被当时的时代所限制是一样的。

里面有几个问题:

1、核心的业务模型化拆解在哪儿?或者换句话说,我的业务需要多少个格子?多少块隔板?他们怎么分布的?

2、如果我家没有孩子,以后也不会有孩子,那有些格子是不是就不用规划了?

3、我家房间小,做不了这么大橱子怎么办?

4、按你这样做橱子,我就一定好找衣服、好整理衣服么?

五、无招胜有招

    讲了这么多,感觉没有干货,然而我就是不讲干货。难道就不能提供一个可以无脑使用,开箱即用的方法论么?不能,因为架构设计就必需有脑。我只讲原则。而手段就是面向对象(封装、继承、多态、反射)、设计模式、依赖注入和查找、面向切面、面向接口。

    倚天屠龙记里面有个大家耳熟能详的片段,张三丰教张无忌太极拳。张三丰演示了一遍,问张无忌,记住多少了?张无忌说:忘了一半了。然后张三丰又演示一遍,张无忌说:差不多全忘了。无独有偶,独孤求败的传人风清扬在教令狐冲剑法的时候也是这样讲的:


网上找的,凑活看

    何也?重意不重招。何为重意呢?

    不忘初心(降低大型业务系统复杂度)、抓住本质(应对变化)

    从应对变化的角度上有两个基本原则:

   第 一个是以不变应万变。业务模型一旦确立,那么尽量就不要变了,这需要合适的抽象层次和维度。大衣橱不能老是重新打。这就要求设计大衣橱的时候一定要深刻理解用户当下及未来很长一段时间的需求。

    第二个是确定边界,控制变化的影响范围。大衣橱放袜子的抽屉再乱,再怎么整理也不会影响到其他部分,只要它稳定的提供放袜子和取袜子的功能就行了。这需要针对业务做好功能分区和硬化隔板。

   最后的最后,大衣橱理论的核心又回到了分层、业务模型化分解和标准化接口。

你可能感兴趣的:(一文讲透系统架构设计之大衣橱理论)