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