計算機科學參與了復雜性學科的創立,并把復雜性引申為計算機科學的內涵。個人認為復雜性在軟件架構領域引起重視有兩個原因,其一是單體架構的承諾已經無效;其二是軟件的使用者,即用戶,開始深度參與到軟件的架構設計中來。
隨著單體架構的日漸式微,分布式架構的興盛,微服務運動如火如荼,復雜性因此受到關注:目前,幾乎所有的微服務文章開宗明義都會指出微服務架構是為了應對軟件架構復雜性的挑戰。
隨著互聯網的發展,特別是互聯網+和移動互聯網的發展,行業和用戶開始深刻影響軟件的架構和設計:軟件架構設計再也不是架構師獨立思考的產物,而是在和用戶的互動中完成的。
復雜系統一般具有以下屬性:具有大量組成成分的系統,成分互動關系的重要性大于成分本身;組成成分構成自我相似的多層級結構,高層級向下的因果關系,低層級向上的因果關系以及組成成分間的多重因果關系;系統是動態的,不停止的,具有突現,不可預測、不可化約、非線性;系統具有適應性,無中央控制,自我組織,正回饋或報酬遞增等。
《Think Complexity》給出的定義是:復雜性科學是物理,數學和計算機科學交叉的跨學科領域,專注于具有許多組件相互作用的系統。如果想從更廣泛意義上了解復雜性與進化、人工智能、計算、遺傳、信息處理等領域的關系,可以參考梅拉妮·米歇爾(Melanie Mitchell) 的《復雜》一書。
在軟件架構的領域研究復雜性,并不是要推翻還原論(比如模塊化),而是探討還原論在軟件工業廣泛應用之后,始終無法解決軟件工程的組織效能問題,比如人月神話提出的挑戰。復雜性更強調組件或者服務之間的關系,以及軟件和用戶之間的關系,用整體性思維觀察軟件開發的全過程。在企業中,架構的復雜屬性往往對標系統架構師——那些在組織中缺位的一批人(很多國內架構師剛達到這個層級,就轉向管理了)。系統架構師需要找到那些能夠實現1+1>2的解決方案,實現整體最優。以飛機運輸為例,乘客想要的是最快到達目的地,直接的方案是提高飛機的速度,但不能超過音速,以避免超過音速后引發的各種問題。從系統架構師的角度來看,這里要解決的問題并不是怎樣飛的更快,而是如何縮短乘客從家中到機場,辦理登機手續,過安檢,上飛機,飛行,落地后取行李并達到最終目的地所需的總時間。
復雜性思考的本質就是從已知的未知向未知的未知延伸。這里的復雜(complex)并不是難懂的(complicated),難懂是已知的未知,復雜是未知的未知。傳統軟件開發是以實體為交付目標,逐層breakdown,整體等于部分之和。要做到這一點,軟件各個實體從架構到實現都是需要提前study(已知的),需要探索的只是實現細節。所以傳統軟件開發特別強調需求的澄清,因為需求是可以澄清并且不會改變的。客戶和開發者關注的都是成果本身,而不是成果的涌現物。而對于互聯網軟件來說,用整體性思維來看,需求變更本來就是常態。
涌現是系統運行過程中所表現,呈現和浮現的東西。涌現是我們構建系統的目標,是系統價值所在,也是系統思維的意義所在。功能是系統的第一層涌現,這里的功能包含基本功能和新的功能。性能是系統的第二層涌現,它是系統功能的對應。系統的第三層涌現是質量屬性,包括可靠性,可維護性,可操作性,安全性,健壯性等。第三層涌現并不是立刻創造出價值,而是要通過系統在整個生命周期中的運作情況來體現。我覺得還存在系統的第四層涌現,就是軟件設計者和開發者不能單獨決定軟件的功能和形態,而是和用戶協同進化。
復雜性在軟件架構領域的應用,首推《系統架構:復雜系統的產品設計與開發》一書。該書給出了一套具體的系統思考框架,供參考如下:
1,確定系統及其形式和功能
2,確定系統中的實體及其形式與功能,以及系統的邊界及所處的環境
3,確定系統中各個實體之間的關系以及位于邊界的關系,并確定這些關系的形式與功能
4,根據實體的功能及功能性的互動來確定系統的涌現屬性
系統是由一組實體和這些實體之間的關系所構成的集合,其功能要大于這些實體各自的功能之和。在軟件開發中,系統不能直接和產品簡單對應。以微信為例,用戶安裝的產品是微信APP,但是在微信構建的系統中,包含了用戶,數據,電商,公眾號,小程序等實體。這些實體的功能要遠大于各自功能之和,其架構也不能簡單用APP+Cloud來描述。系統的架構原則就是對系統中的實體以及實體之間的關系進行抽象描述。
復雜性如何度量?復雜性守恒還是復雜性必然增長?在軟件設計與開發的過程中如何去做?請關注我的后續文章。