你是整體思維還是分析思維? - kentbeck

banq發表於2021-03-01

這是著名軟體工程大師 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

相關文章