什么是系統(tǒng)架構(gòu)?
從字面上理解,系統(tǒng)架構(gòu)是系統(tǒng)的框架結(jié)構(gòu),是系統(tǒng)進(jìn)行抽象之后的一個草圖。它包含了系統(tǒng)中各個抽象組件的協(xié)作方式。
為什么需要架構(gòu)?
好的架構(gòu)能夠降低系統(tǒng)的創(chuàng)造和維護(hù)成本,特別是維護(hù)成本。一個系統(tǒng)的創(chuàng)造成本低,而維護(hù)的成本大,特別是互聯(lián)網(wǎng)應(yīng)用,一般情況下把一個系統(tǒng)搞上線只需要一個月,但是有的系統(tǒng)搞下線缺需要幾個月,而維護(hù)則需要數(shù)年。好的設(shè)計師不會在系統(tǒng)上線后對系統(tǒng)進(jìn)行大的修改,從而減少系統(tǒng)的維護(hù)成本。
如果區(qū)分創(chuàng)造和維護(hù)兩個階段的話,架構(gòu)師分為系統(tǒng)架構(gòu)師和維護(hù)架構(gòu)師,架構(gòu)新的系統(tǒng)的是系統(tǒng)架構(gòu)師,而維護(hù)老系統(tǒng)的則是維護(hù)架構(gòu)師,程序員大多數(shù)愿意做新系統(tǒng)不愿意維護(hù)老系統(tǒng),因為感覺沒什么技術(shù)含量,但是維護(hù)老的系統(tǒng)反而更難,因為老系統(tǒng)的重構(gòu)和改進(jìn)更加復(fù)雜,維護(hù)架構(gòu)師不僅需要讀懂老系統(tǒng)架構(gòu)設(shè)計,還要在不影響老系統(tǒng)功能的情況下,進(jìn)行功能新增和重構(gòu)。我的一位同事在對一個舊的系統(tǒng)進(jìn)行重構(gòu)之前,讀了幾個星期的代碼,然后才開始設(shè)計改進(jìn)方案。
架構(gòu)設(shè)計的目標(biāo)
設(shè)計的目標(biāo)圍繞著降低成本這個需求進(jìn)行。設(shè)計的目標(biāo)非常多,不同的系統(tǒng)架構(gòu)目標(biāo)也不一致,但是我覺得比較重要的架構(gòu)目標(biāo)有以下幾個,可擴(kuò)展性,靈活性和可插入性。
可擴(kuò)展性,新的功能容易加入到系統(tǒng)里,降低創(chuàng)造成本。
靈活性,一處修改不會波及其他的地方,降低維護(hù)成本。
可插入性,同樣的功能可方便的替換,降低創(chuàng)造和維護(hù)成本。
那么如何實現(xiàn)這三個目標(biāo)
提高可擴(kuò)展性:把不易變的抽象出來。抽象層要比實現(xiàn)層要更穩(wěn)定,抽象層的變化要少。把變化的集中起來,比如把容易變化的功能放在單獨一個系統(tǒng)或者一個模塊里。
靈活性:模塊化,每個模塊相互獨立,減少模塊之間的藕合度,修改不會互相傳遞。
提高可插入性:模塊化,服務(wù)化。
如何開始架構(gòu)
當(dāng)一塊新業(yè)務(wù)放在你面前時,如何進(jìn)行系統(tǒng)架構(gòu)?我覺得需要進(jìn)行以下幾個步驟的思考:
業(yè)務(wù)分析:輸出業(yè)務(wù)架構(gòu)圖,這個系統(tǒng)里有多少個業(yè)務(wù)模塊,從前臺用戶到底層一共有多少層。
系統(tǒng)劃分:根據(jù)業(yè)務(wù)架構(gòu)圖輸出系統(tǒng)架構(gòu)圖,需要思考的是這塊業(yè)務(wù)劃分成多少個系統(tǒng),可能一個系統(tǒng)能支持多個業(yè)務(wù)。基于什么原則將一個系統(tǒng)拆分成多個系統(tǒng)?又基于什么原則將兩個系統(tǒng)合并成一個系統(tǒng)?
系統(tǒng)分層:系統(tǒng)是幾層架構(gòu),基于什么原則將一個系統(tǒng)進(jìn)行分層,分成多少層?
模塊化:系統(tǒng)里有多少個模塊,哪些需要模塊化?基于什么原則將一類代碼變成一個模塊。