你是整体思维还是分析思维? - kentbeck


这是著名软件工程大师 kentbeck的文章:
我去年花了一些时间重构Excalidraw。一位朋友克里斯托弗·切多(Christopher Chedeau)加了手绘外观,另一个朋友Pete Hunt添加了对分布式图形的支持。其他人加入并添加了自己喜欢的功能。
功能令人印象深刻,代码却不符合我的口味。他们能使它运行起来也是奇迹,我准备重构它,对我来说,以小而安全的步骤进行重大更改的好方法。
我细读了一下代码,一次改一点点,我想使事情变得更具凝聚力。
原来的App.tsx同时执行多项操作:应用程序生命周期,与远程工程图交换更改,处理用户界面事件。我决定将所有分布式编辑逻辑都放在一个地方。我称该对象为Portal:首先,我将与发布相关的状态移至Portal;然后,我开始将仅使用这个Portal状态的所以逻辑也转移到Portal中。
有一天,我Pull到了一个新版本,发现有人将所有逻辑从Portal又移回了App,只留下了状态。
 
我明白了,我是一个分割派splitters,而我遇到了一个统合派Lumpers 。

 
统合派与分割派是指在事物分类上的两种不同原则。此问题经常发生在生物学上对生物类群的归类,或是语言学上对语系、语言或方言的分类等领域。
统合者倾向对事物作整体定义,并对这些事物的相似之处进行概括性的归类;
而分割者则倾向对事物作精细定义,并对这些事物的差异之处建立新的小分类。

 
其实设计之间需要权衡:

  • 统合派:具有更多、更简单的子元素以及这些子元素之间的关系更简单的元素。应用程序具有许多子元素。它们很简单的功能和状态,其实许多元素之间根本没有互相关系。但是,如果您想找到任何东西,一切都集中在一个地方。(这是统合派)
  • 分割派:很少但更丰富的子元素和更丰富关系的元素。我添加了3-4个状态,这些状态与App的关系很紧密。

统合派喜欢在一个地方找到一切。他们会扩大化凝聚性,凝聚一切包含所有这些内容,这样不必在各个元素之间进行推理。
分割派喜欢许多具有丰富关系的小元素。他们会时不时地考虑耦合问题,这样就不必一次考虑太多。
我是分割派。我从来不能够一次处理很多复杂性,所以我开发了思维工具来划分复杂性。
 
banq注:统合派类似中国人的天人合一的整体,中国人文化上喜欢概括性总结思维,大道至简,直至天人合一,语文课里学习的古代诗词都是形象比喻,中医批判西医是“头痛医头,脚痛医脚”,这是一种从整体思维出发的结论;而古希腊开始的哲学则是以分析思维分割派为主,事物可以细分到由一种原子组成,西医和科学以及软件分析设计都是一种分析思维。
 
补充:有人认为整体思维=归纳法,是一种归纳综合方法,我查了一下Wiki维基百科的归纳法定义:
归纳法=溯因推理,归纳结论被认为具有不确定性或疑问的残余,用诸如“最佳可用”或“最可能”之类的退缩术语来表达。

但是中国人用整体思维对归纳法定义进行了篡改,见百度百科知乎定义:

归纳法,指的是从许多个别事例中获得一个概括性的规则;归纳方法包括传统归纳,类比和统计,他们都是从自然现象和社会现象客观存在出来,从不同角度由特殊到一般的过程,同时归纳推理是我们认识世界的基础。

个人认为这是试图将整体思维带上科学帽子的误导性定义。归纳法是一种综合思维,综合思维是把各个部分、各个属性联合成一个统一的整体。
但是如何认识复杂系统的整体呢?不是依靠简单归纳和综合思维,整体不只是简单的部分累计综合,而应使用”涌现emgence“方式:
康威定律的作者:什么是"涌现"分析建模方法?
 
补充:SpringBoot属于一种微服务框架,微服务关键定义是一个微服务操作自己辖区的数据库,如果在一个微服务中需要访问其他微服务辖区的数据库,最好通过那个辖区微服务提供的API,但是整体Monolith思维的人会试图通过当前微服务下的多数据库驱动访问其他辖区的数据库:https://github.com/baomidou/dynamic-datasource-spring-boot-starter,号称“快速集成多数据源的SpringBoot启动器”,将所有的数据库放在一个SpringBoot中确实起步很快,但这又回到了微服务反对的整体/单体/monolith架构,使用多数据源驱动的SpringBoot应用程序变成一种整体Monolith应用,这也属于一种统合派Lumpers思维方式。思维方式决定技术架构。
 
补充:有了分析思维以后,在编程中很容易做到单一职责:
单一责任SRP设计举例 - macerub