解耦是技术中常用的一个词,普通人听到这两个词,会有一种压力且无形中透露出一个更优的方案。
什么是解耦?本质是什么,为什么要这样做,我们日常生活中是不是随处可见。
耦,如同耦这种植物,藕断丝连,丝和耦相互联系,但丝是和折断行为意图相反的遗留物。只要联系对你的意图产生了额外的阻力,我们可以认为这种联系是耦合的。
在一定尺度内,万事万物都存在耦合。你衣食住行等行为意图,都离不开其他人联系,你想去公司,必定要和司机、加油站、马路等联系,理论上解开上班和马路的耦合最好的结果是:我说我要去公司,于是一种超能力瞬间把我转移至公司。现实中,没有这样的超能力,所以,马路和我去公司是一个无法断绝的关系,这种耦和无法规避。因为法律法规,逻辑道德,物理法则等限制,生活中还有各种各样的耦和都不能规避,我们能做到的是在现实条件下,解决那些能够规避的关联,降低耦和程度。
耦和的本质是和意图相违背的多余联系,技术中为什么要降低这种联系呢?一个软件系统由多个内部模块组成,这里的模块可以细利度到一个函数,一个语句,也可以是一个类,或者一个包等。怎么拆分这些模块,模块之间建立怎么样的联系,理论会有无数种内部组合。无论怎么组合,这些模块最终共同对外形成可用的功能,且一定时间内是不变的。
通常而言,不加思考的系统,其模块的排列组合会是按业务流程和步骤过程式的表现出来。这是人类最直接的思维方式,过程接近业务流程,就像下象棋,先下这里,再下那里,最后下那里等几个步骤组成。
过程式的组合好处是足够简单且和局部业务高度绑定。
但在更复杂的系统中,这些过程和步骤非常之多,可能包含成千上万的业务流程。人类的大脑对这种超过个位数的步骤过程追踪显得非常费力,象棋高手,也难以推断 10 步之后的走势。在软件系统中,我们任意一个小功能变更,如果都要在成千上万的过程中追踪,那成本非常之高。前一个过程和后一个过程之间相互直接影响,这样从前到后形成一个高度紧密联系的软件体系。只要中间一个过程坍塌了,前后就会像多骨诺米牌倒下。这就是高度耦。
降低这个系统的耦和程度就是为了降低人参与系统的大脑运作成本,同时降低系统脆弱性(更健壮)。 怎么拆分组合,怎么建立低耦合,在软件技术中有各种各样的理论和实践,这是一门专业学问。
同样的在生活和非技术日常工作中,这类问题也是司空见惯,只是我们没有用耦和这个词语而已。
比如工作例会,如果没有组织,每个人彼此交叉沟通,会议上人和人的耦和程度变大了,导致成本上升。通过一个会议组织者,把每个人对每个人的表达,变成每个人对组织者的表达,最终组织者从中提炼出结果,这是一种降低耦合的方式。
又比如工作流程,最好的工作流程是每个人知道的知识越少,需要做的事情越少。把那些个人紧密联系的东西踢出去,直接变成人——结果。这是低耦合的表现。比如,团队成员需要操作某系统,最终达到某结果。这个系统改怎么操作呢,最直接的方式是由一个熟练着告诉第一次操作者,然后第一次操作者告诉后面需要操作者,口口相传,生生不息。随着人数增加,几十,几百到更多,最终其丢失的信息越多,且每次消费的时间更多。这是操作方式和人高度耦合。
典型的优化方案是把这些操作的规范,放到文档中去,人和人的耦和变成了,人和一个文档的耦和。那随着工作中系统越来越多,文档也会越来越多,最终又沦为的大量人和大量文档的耦和,进一步降低效率。
有什么办法进一步解耦吗?当然有,我们的目的是让人知道信息越少越好,做的事情越少越好。这是工作流程优化的方向,中间可以有很多尝试。比如,找文档是必须的吗,任意系统操作过程,能不能自动显示操作步骤,既然能自动显示操作步骤,能不能操作自动化呢等等。
上面两个只是简单用工作举例,解耦的理想程度是“心想事成”,既你想到什么,马上完成,中间无需任何人、事、知识联系,无需任何动作。这显然不可能,我们尽可能往这样的方向走而已。
耦合是一种一定要降低的东西吗?并不一定。高度耦合意味着内部联系非常紧密,我们有时候需要这种联系,比如一个经济组织,成员之间高度耦合,那每一个人面对风险,必定关联其他人,这样就会无形中促进彼此守护。高耦合还是自组织系统诞生的必要条件,蚂蚁群、免疫系统及人类社会均如此。
耦合的高与低的选择,取决于场景,在大部分效率场景,不管是软件开发,生活高效、工作优化等,低耦合是方向。