这个问题让我想起了我原来所在org的一个大问题;org很大很多组好几个VP,几千个开发,大概上百个operational research scientist,经济学家,数据科学家,目标是优化供应链,设计当然是高聚合低耦合,然而随着优化的不断进步,越来越多的因素越来越底层的细节需要考虑,才能进行更进一步准确和进一步的优化,而这时系统抽象反而成了沟通和更改的累赘;大多时候需要打破原来粗粒度的service api,用更细更精准粒度的api来代替,从而使得各个组的系统更好的了解其他系统的决策细节或者可能的未来决策,来优化自己的决策;甚至把原来的一个service切开来,把一些内部的东西抽象成新的多个service来暴露更多的数据和信息提供给别的组使用,这样当然就可以推进优化的总体进程,告捷连连;但是这样的趋势是把各个部门耦合的更紧了,增加了整个系统的复杂度… 这个进程更像是一个反“高聚合低耦合”的“开倒车”, 如此迭代好多年,这个部门从一个director级的项目发展到了如今几个VP带的超级大部门,可以看到,“开倒车”反而给amazon的供应链增加了竞争力。
一点个人看法:系统设计是无法消除业务本质复杂度的,但是业务复杂度也不是铁板一块,很多时候我们可以降低业务的精度准确度,来交换复杂度。这个业务一天能挣10w,但是开发需要2年才能做出来,换个容易的需求,2个月开发出来但是一天只能挣5w那当然先开发出来再说啊!
但是之后呢?在竞争的市场,谁先能够进一步优化就可以进一步降低成本来击败对手,优化是没有尽头的,直到被复杂度撑爆,或者停止不前等待被超越…
“高聚合低耦合”是有代价的,我们需要正视它而不是默认这就应该是常识了;
回想起来,而这个代价对我可以说是历历在目的… 世界的本质的极限优化未必是“高聚合低耦合”的,这是人无法处理爆炸复杂度的原因,而并非像很多答主说的那样,好像“高聚合低耦合”就总是唯一目标。
“低耦合高聚合”真的好,但是它也并非完美,它是人对自然的无奈妥协。
这个问题提的很好, 虽然它是对系统设计“常识”的发问, 大家也没必要嘲讽题主; “常识”之所以是“常识”,也是有原因的,深入去想, 这可以是一个相当有趣的问题;
跳出"人"这个限制来回答这个问题, 我想: "低耦合, 高内聚"是由于人脑自身的限制所决定的。
人的记忆是短暂而非永久的
在同一时间, 人能考虑到的因素是有限的
由于以上2个限制, 所以人必须把复杂的东西分割成不同的组件:其中组件内的概念尽量贴近以至于思考一个因素很容易能联想或者推断另外一个, 或者说这些东西在一起很容易记忆, 分析, 推理... 等, 这就是高聚合; 而在这个思考过程中,如果可以尽量把"不相干"的东西排出在外, 那么人脑的负担就会小很多, 这就是低耦合。
大概思路就是这样,以下详细讨论和给出思考的来源与引用:
“低耦合,高内聚”这个目标, 可以说是系统设计的“常识”, 而这个问题可以说是对“人的”常识的一个提问, 就好比“为什么1+1=2”, "为什么头没了人会死"... 等问题,所以第一反应是:“这还用问”也很合理
从"这是常识"的角度, 或者分析这样怎么怎么好, 不这样怎么怎么坏, 或者给出2个例子让题主自己感觉"你觉得那个好, 那个坏", 都是很好的答案; 但是我感觉题主可能会意犹未尽, 因为题主可能发现“低耦合高聚合”并非完美, 而这点上我认为题主是对的:
跳出人这个范畴之后, “低耦合,高内聚”未必是最好的
我们的自然界更像是万物互联的, 牵一发而动全身, 由各种人无法分析的蝴蝶效应所构成的
In a noncompositional system, the component graph does not have this structure. The graph tends to be bushy and nonlocal. “Bushy” means that each component is connected to many others.“Nonlocal” means that each component is connected to widely different parts of the graph.Decomposing the system into parts is more arbitrary.The interfaces between the parts tend to be larger.This makes it harder to understand the components without taking into account their relation to the rest of the system.One example of a noncompositional graph is a small world graph, which has the property that the graph’s diameter is small (each component is within a few hops of any other component).
而为什么我们“人”会觉得符合"低耦合,高内聚"是很自然很舒服的呢?作者也给出了自己的思考:
Let us see why hierarchical composition is suitable for system design by humans. The main constraint for humans is the limited size of human short-term memory. A human being can only keep a small number of concepts in his or her mind simultaneously [141].A large design must therefore be chopped up into parts that are each small enough to be kept in a single individual’s mind.Without external aid, this leads humans to build compositional systems.On the other hand, design by nature has no such limitation.It works through the principle of natural selection. New systems are built by combining and modifying existing systems.Each system is judged as a whole by how well it performs in the natural environment.The most successful systems are those with the most offspring.Therefore natural systems tend to be noncompositional.
"hierarchical composition"几乎是构造复杂系统的唯一手段,我个人也是相当认同与这段话的, 因为去耦合的缘故, 我们就要做抽象和信息隐藏, 系统设计往往是根据要解决的问题来对混乱的世界做一个与问题直接相关的剪裁,我们不应model不相关的东西, 比如一个"客户"的概念,在付款系统里, 客户的家庭关系,血型,个人爱好等细节就应该去除, 但是这些东西是"客户"作为一个人在这个世界里真实存在的东西, 纠到细节的极限,它们也可以和“客户”的付款行为有着千丝万缕的直接或间接的联系。
我们的系统设计不应model这个世界, 然而这就造成我们对问题的建模必定是和"世界事实"相比而"失真"的, 而这个"世界" 并不需要把"客户"的其他信息砍掉才能工作;
万物相关, 自然的本质更像是一个紧紧耦合的整体; 然而, 人脑是无法承受"整个自然", 甚至哪怕它的一小部分的复杂度. 所以,砍去很多"对人来讲"不必要的细节, 来简化问题, 只把绝对相关的"对人来讲"重要的东西放在一起思考, 是人对自然的妥协;
人能跳出自己的限制来解决问题么?CTM的作者没有给出答案
Human design is goal-oriented and reductionistic.Natural design is exploratory and holistic.Is it a meaningful quest to try to get the best of both worlds? We can imagine building tools to let human beings use a more “natural” approach to system design. In this book, we do not consider this direction further.We focus on the compositional approach.
(下边这段话是我极度肤浅的思考, 只是个人感觉,勿喷)
人能跳出自己的限制来解决问题么?我觉得很多"人无法分析理解"的东西开始涌现, 比如神经网络,相比于传统手段来分析数据的相关性, 找出feature, 分析出"人觉的合理的"前因后果, 然后设计出"低耦合,高内聚"的系统来, 神经网络甚至自动调参自动选模型的方法, 更像是高耦合的一块铁板, 比如最简单的CV分辨猫狗问题, 并不是人设计出了"哪个feature最相关, 哪个层应该控制算出那个feature, 那个部分是来辨别backgroud, 等等"; 而更像是自然的优胜略汰, 不合适的模型和参数会在训练中渐渐被淘汰, 我们最终得到了一个模型,而我们无法很好的分析它为什么和到底怎么工作的,使得出了问题之后我们可以精准的找到造成问题的"组件"改一下它的weight,或者手动加个层加个feature就能解决问题; 而是要重新训练一次, 重新“优胜略汰”一次;
如果有一天人可以记住这个世界的所有东西,也可以把这个世界的所有东西放在一起极快的分析模拟,把所有的因素所有的数据的一切一切全部一起考虑, 完美的模拟世界的每一个细节, 当复杂度再不是系统设计需要关心的因素之一, 我们可以无限追求准确度的时候,那我们必然是可以做出比"低耦合,高内聚"更准确更强的系统的吧?
答主这样想着。