仓库源文

.. Kenneth Lee 版权所有 2017-2020

:Authors: Kenneth Lee :Version: 1.0

解耦和不解耦


设计框架,在解耦和不解耦上是个两难。解耦呢,你面对巨大的竞争,因为别人随时可以 取代你,不解耦呢,别人觉得你在绑定,从一开始就考虑不用你。

想明白这一点,我们就知道,是否解耦,在构架设计上不是关键判断条件(就是说,“架构 思考”这个“程序”的if不是写在这个条件上的)。

丢开很脑残的人为增加的无必要的接口,解耦的方法是减少交互,减少交互的方法是减少 功能。比如说一个内存分配算法,我们需要的接口可能主要是两个:::

    malloc()

    free()

这是使用者需要的唯一功能,但像某些库那样,如果我们加上::

    remalloc()

这个功能可以为我们的竞争力取得一定的优势,特别是对于那些动态包长的协议,它给了 内存分配算法一个hint:如果你反正都预留了空间,不妨把那个空间一起给我。这个特定 的内存算法就会变得“更加”不可替换了。

这上面的考虑,就像用一条不怎么坚固的绳子拉一辆沉重的车,太用力绳子会断,不用力 车不会走,走起来了就越不容易断。所以我们一路都要小心翼翼,并没有一定的方法。

我经常谈这些“并没有一定的方法”的方法,因为理解一个问题的解决并没有一定的方法, 本身就是解决问题的一种方法。

对于战略来说,对结论只有两种判断:

有明确的方法:这在操作上应该摒弃所有其他表相,什么都不想,一根筋向这个方向冲。 好比短跑比赛,你已经肯定路上不会有行人过马路,你就不要再左右看了,向一个方向跑 就对了。而所谓明确方法,有时可以是很有风险的,比如你被人追砍,被追上立马砍死, 在路上被车撞到了,也是必死,这时也不要纠缠那么多,一根筋跑就对了。这就是战略判 断的价值,可以大幅降低你执行层面的成本。

没有明确的方法:这在操作上应该小心翼翼,因为并没有一定的方法,我们在操作上必须 采用“节省”成本并能实现眼前目标的策略。

所以,战略判断某件事情没有明确的方法,也是重要的战略判断之一。它的必要性毫不逊 色于有明确方法的战略判断。

回到解耦还是不解耦这个问题。从设计思路上说,必须解耦,或者说基本功能保持最小, 是肯定的。不断增加功能实现绑定,这种增加必须基于竞争力,否则只会限制竞争力,给 竞争对手可乘之机。 这是在过程中的“小心翼翼”,一个软件框架的成长,就是在环境的不 断变化中,能否度过这个小心翼翼,最后,把大部分人都绑到战车上,成为一个越滚越大 的雪球。这种情况下,除非环境产生巨大变化,否则它就已经无懈可击了。

所以,对于一个框架来说,构架,接口如何发展,完全被具体细节控制着,并不是你想不 想解耦,是不是和对手对着干,是否开源等问题可以左右的。那些细节之外的每个独立考 量,都会影响框架的竞争力,而不是无足轻重。

但我这个散文想讨论的不是怎么做解耦设计这个问题,而是从竞争的角度讨论如何击败一 个已经成熟的框架的。

我们很多时候对对手做战略判断(特别是对于一些不直接做技术的管理者来说),我们看 到的是特性。但当我们讨论“特性”的时候,我们已经忽略了细节了。没有经过时间打磨的“ 特性”,和经过时间打磨的“特性”差距是很大的,这就是我前面谈到那个不断增加“细节”的 过程。过去我们简单用一个总线Lock,就可以实现spinlock;现在我们用exclusive的load 和store来让有互锁关系的两个CPU核自己进行Cache同步; 很快呢我们又会用……——好吧, 这个技术未发布,我们晚点谈——所以,我们谈对手有什么,而我们必须有什么,这是必死 的路线。

当我们谈竞争的时候,我们总是着眼于竞争对象有什么功能,然后想着提供一样的功能, 希望可以追赶它。但从战略的角度考虑这个问题,这显然是最差的路线,这为自己战略上 营造了一个吃亏的竞争的条件。

更合理的方式是,使用和对方一模一样的解决方案,然后抛弃掉在对方成长过程中在试探 过程中明显走错的路线,从而形成一个没有包袱的解决方案。这样双方才在相同的起跑线 上。然后再去比谁对新环境的敏感性更好。

当我们用这样的方法来建立平台后,剩下的就是如何选择目标市场的问题了。如果这个问 题没有解决,无论是继续学习对手,还是选定目标市场,都显得毫无意义。