软件设计上,低耦合是什么意思? 为什么要松散耦合?
2023年6月2日
在软件设计上常听人说「低耦合」,是什么意思? 甚至 Netflix 把这个概念带到组织管理,在 Netflix 企业文化中有一条「认同一致,松散耦合(highly aligned, loosely coupled)」,为什么要这样? 让我们逐一说明。
什么是耦合?
要懂解耦前,要先知道什么是耦合。耦合的英文是 coupling (动词是 couple)。很多程序员很爱晶晶体,所以听到他们在讲 couple 时,不要以为是在讲谁跟谁是伴侣或夫妻,因为工程师在讲 couple,多半是在讲耦合。
虽然上面这样讲,但事实上,耦合跟伴侣是很类似的意思。所谓的耦合是指两段代码 (或两个模组) 相互有关系,就像伴侣一样,耦合性越高就黏得越紧。但是黏得紧,就会让程式模组比较难被重复使用。
就像以前很多人会抱怨 iPhone 的充电线必须用 Lightning 插头,所以假如出去忘了但充电线,身边的人又只有 Type C 的插头,那就没办法用。反之,安卓手机都用 Type C 充电线,所以假如你用三星手机,出门忘了带充电线,身旁有个用 Sony 手机的人有带 Type C 充电线,你可以直接用。
上面这个对比可以看到,苹果手机跟充电线的耦合性高,导致要用只能搭配用,没办法被重复用别家的充电线;安卓手机耦合性低,所以不管你用哪牌的手机,充电线都可以重复用。除此之外,耦合性太高的问题在于,会牵一发动全身。可能改一个地方,结果发现其他地方受影响,也必须跟着改,这样成本就会比较大。
在软件设计上,我们会希望模组能被重复使用,不要有牵一发动全身的状况,这样能让代码比较好维护,也比较容易扩张。这也是为什么大原则是会追求低耦合 (当然还是很看情况,有些情况耦合性高一点也有好处,但这边先不细谈)。
什么是解耦? 为什么 Netflix 要松散耦合?
了解耦合后,接着说解耦。解耦的英文是 decoupling,顾名思义就是把耦合在一起的东西拆开。你可能很常会听到工程师说,把某块模组「抽出来」,这其实就是解耦的体现。当你把模组抽成可以重复用的,就能避免上述提到耦合性导致的问题。
上面提到,Netflix 的组织文化中有「松散耦合」这个概念。大概因为 Netflix 的共同创办人 Reed Hastings 是史丹佛电脑科学硕士这种硬底子,所以才把软件设计的概念,搬到组织管理上。而事实证明,这概念搬到组织管理也一样很有帮助。
在大型组织中,很常也会有牵一发动全身的状况。以我自己的经验来说,之前做过专案是人在亚洲的我,要跟美国、欧洲区的其他两个组合作,这种情况真的很崩溃,不仅是因为要配合时区开会,而且在实作上遇到问题,问美国同事,他们已经下班了,所以要等对方隔天上班,而他们隔天上班后,可能要再问他们那边相关的人,然后才能回覆我们这。
就变成我们问 A 组,A 组要去跟 B 组确认,B 组可能要再跟 C 组讨论,有了结论后再回给 B 组,然后 B 组回覆 A 组后,A 组才能回覆我们。大公司之所以动得很慢不是没原因的,讨论个东西这么多关卡,怎么快的起来? 这些不同组在决策上要依赖彼此,就是耦合性太高的表征。这是为什么 Netflix 提出松散耦合,正是为了避免这种状况。
假如是在松散耦合的组织下,就不会有这种问题。在亚洲区的我们,做的决定不需要等其他区的组回覆后才能定夺。那你可能会问,不跟其他组确认,那要是做的东西合不在一起怎么办? 这就是为什么 Netflix 不只讲松散耦合,还讲「认同一致」。假如有一致的方向,就能够避免不同组的决策彼此冲突。