軟件架構(gòu)的概念最早出現(xiàn)于1968年的計(jì)算機(jī)文獻(xiàn)中。上個(gè)世紀(jì)九十年代,軟件架構(gòu)的概念開始流行。軟件架構(gòu)概念的出現(xiàn),是為了解決復(fù)雜的軟件結(jié)構(gòu)問(wèn)題。早期的軟件開發(fā)人員通過(guò)設(shè)計(jì)良好的數(shù)據(jù)結(jié)構(gòu)和算法來(lái)應(yīng)對(duì)這種復(fù)雜性,但隨著軟件的發(fā)展,人們不得不去尋找一些新的概念和思想來(lái)指導(dǎo)日益復(fù)雜的軟件開發(fā)活動(dòng)。
在過(guò)去的幾十年中,軟件架構(gòu)的思想得到了極大的豐富。和軟件架構(gòu)相關(guān)的方法論、建模語(yǔ)言、建模工具、架構(gòu)模式等,都已經(jīng)非常成熟了。此外,關(guān)于軟件架構(gòu)的書籍也層出不窮。盡管如此,軟件架構(gòu)仿佛一直披著一層神秘的面紗。人們常常認(rèn)為軟件架構(gòu)很復(fù)雜,既看不清它的全貌,也無(wú)法隨心所欲地駕馭。出現(xiàn)這種現(xiàn)象是有一定道理的。相比于軟件領(lǐng)域中其他的一些人工制品,例如,編程語(yǔ)言和算法,軟件架構(gòu)有其特殊性。
編程語(yǔ)言是一套編寫程序的符號(hào)系統(tǒng)。所有的編程語(yǔ)言都有精確的語(yǔ)法規(guī)范,以及相應(yīng)的語(yǔ)義。編程語(yǔ)言要解決的問(wèn)題是,針對(duì)特定的計(jì)算任務(wù),如何使人們更方便地讓計(jì)算機(jī)完成計(jì)算指令。例如,針對(duì)統(tǒng)計(jì)工作,使用R語(yǔ)言是一個(gè)不錯(cuò)的選擇。從精確度的角度來(lái)看,算法也是如此。算法是一種更古老的概念,甚至可以追溯到公元9世紀(jì)的數(shù)學(xué)文獻(xiàn)。在軟件領(lǐng)域,算法是實(shí)現(xiàn)從一些給定輸入,通過(guò)一段程序邏輯,產(chǎn)生精確輸出的計(jì)算方法。無(wú)論編程語(yǔ)言還是算法,所要解決的問(wèn)題都非常單純。
而在軟件架構(gòu)師眼中,世界卻是另一番景象。例如,盡管R語(yǔ)言是完成統(tǒng)計(jì)工作的最佳選擇之一,但你還必須考慮商務(wù)上的約束,項(xiàng)目的資源,現(xiàn)有軟件資產(chǎn)的改造,替代方案的可行性,項(xiàng)目實(shí)施后的維護(hù),采用一門新語(yǔ)言的學(xué)習(xí)曲線,用R語(yǔ)言實(shí)現(xiàn)的功能與軟件系統(tǒng)其他組件的交互,軟件系統(tǒng)的長(zhǎng)期規(guī)劃,你得權(quán)衡R語(yǔ)言給你帶來(lái)的回報(bào)與使用它所帶來(lái)的成本。對(duì)于算法,你或許還要考慮項(xiàng)目的硬件資源。在軟件架構(gòu)領(lǐng)域中,決策是軟件架構(gòu)師最重要的工作之一。
軟件架構(gòu)工作是一項(xiàng)系統(tǒng)工程,這不僅是由于設(shè)計(jì)軟件架構(gòu)涉及繁雜的輸入項(xiàng),還和軟件架構(gòu)師是否有足夠的經(jīng)驗(yàn)支撐來(lái)應(yīng)對(duì)有關(guān)。很多軟件架構(gòu)設(shè)計(jì)的知識(shí)無(wú)法在課堂上完成,因?yàn)槟銦o(wú)法枚舉實(shí)際項(xiàng)目中的所有關(guān)鍵因素,并總是能做出適合特定場(chǎng)景的最佳方案。軟件架構(gòu)工作的這種不確定性,或許是讓人們感到難以駕馭它的原因之一。
要嘗試解決軟件架構(gòu)工作中的復(fù)雜性,對(duì)于領(lǐng)域的認(rèn)識(shí)至關(guān)重要。人們的學(xué)習(xí)和認(rèn)知能力是有限的,我們每一個(gè)人幾乎不可能掌握軟件領(lǐng)域的所有知識(shí)。例如,一個(gè)計(jì)算機(jī)安全領(lǐng)域的專家,不一定會(huì)是計(jì)算機(jī)游戲設(shè)計(jì)的高手。因此,領(lǐng)域的劃分非常重要。專注于領(lǐng)域會(huì)使領(lǐng)域內(nèi)的工作變得更加專業(yè)和有深度。
軟件架構(gòu)是軟件行業(yè)中的一個(gè)領(lǐng)域。這個(gè)領(lǐng)域和其他領(lǐng)域有一些交集。當(dāng)我們討論軟件架構(gòu)的時(shí)候,不應(yīng)該無(wú)限延伸到其他領(lǐng)域,例如,執(zhí)著于算法的內(nèi)部結(jié)構(gòu),或者極力探究規(guī)則引擎的內(nèi)部機(jī)制。事實(shí)上,專注地在軟件架構(gòu)領(lǐng)域內(nèi)進(jìn)行工作有助于簡(jiǎn)化軟件架構(gòu)工作的復(fù)雜性。本書將基于這個(gè)思想致力于軟件架構(gòu)領(lǐng)域的深入探討。
軟件架構(gòu)的重要性是顯而易見的,與此同時(shí),一個(gè)有趣的事實(shí)是,即便沒有刻意設(shè)計(jì)或合理設(shè)計(jì),軟件架構(gòu)也總是存在于軟件系統(tǒng)中。雖然這種近乎自然形成的架構(gòu)常常搖搖欲墜,后期維護(hù)代價(jià)高昂,但基于這種架構(gòu)上的軟件系統(tǒng)并非完全無(wú)法工作。這種現(xiàn)象給人們?cè)诶斫廛浖軜?gòu)重要性方面帶來(lái)了極大的困擾。
正如前文提到的,軟件架構(gòu)概念的出現(xiàn)是為了解決軟件結(jié)構(gòu)的復(fù)雜性問(wèn)題,歸根到底,是為了降低軟件開發(fā)的成本。當(dāng)一個(gè)軟件系統(tǒng)可以工作,并在市場(chǎng)上贏得客戶時(shí),人們很難下決心深入地審視架構(gòu)的優(yōu)劣并做出改變。
站在項(xiàng)目投資者的立場(chǎng)上看,或許可以部分理解這種現(xiàn)象。首先,軟件架構(gòu)對(duì)軟件開發(fā)的影響是一個(gè)長(zhǎng)期的過(guò)程,其次,這種影響難以量化,最后,人不能兩次踏進(jìn)同一條河流,沒有參照,無(wú)所謂優(yōu)劣。這些不確定性使人們不愿意貿(mào)然投入。面對(duì)這樣的現(xiàn)實(shí),很多軟件架構(gòu)師會(huì)有一種失落感。
為了化解這種困局,使軟件架構(gòu)改進(jìn)成為常態(tài),本書將嘗試深入探討軟件架構(gòu)對(duì)軟件開發(fā)帶來(lái)的具體影響。這種嘗試可以幫助我們從一個(gè)全新的視角觀察軟件架構(gòu)。對(duì)于項(xiàng)目投資者來(lái)說(shuō),也可以根據(jù)這種觀察,做出最佳的商業(yè)決策。
本書由四個(gè)部分組成:
什么是軟件架構(gòu)。當(dāng)我們進(jìn)入一個(gè)領(lǐng)域時(shí),首先必須了解這個(gè)領(lǐng)域內(nèi)的術(shù)語(yǔ)和常識(shí)。這些術(shù)語(yǔ)和常識(shí)是在這個(gè)領(lǐng)域內(nèi)進(jìn)行工作的基礎(chǔ)。它就像人們?cè)谌粘I钪兴褂玫淖匀徽Z(yǔ)言一樣,表達(dá)意圖,溝通想法,達(dá)成目標(biāo)。軟件架構(gòu)領(lǐng)域也是如此。除了術(shù)語(yǔ)和常識(shí),我們還需要了解該領(lǐng)域的工作包含了那些內(nèi)容,有什么特點(diǎn),以及基本的工作方法。此外,我們還會(huì)適度討論一些與軟件架構(gòu)密切相關(guān)的概念,例如,什么是軟件框架等。
軟件架構(gòu)的演化。軟件架構(gòu)從來(lái)沒有停下它演化的步伐,客戶端服務(wù)器架構(gòu)(Client Server Architecture),多層架構(gòu)(Multitier Architecture),面向服務(wù)架構(gòu)(Service Oriented Architecture,SOA),微服務(wù)架構(gòu)(Microservice Architecture),無(wú)服務(wù)架構(gòu)(Serverless Architecture),每一種演化都是在解決軟件領(lǐng)域特定問(wèn)題的過(guò)程中產(chǎn)生,并以架構(gòu)模式的形式保存了下來(lái)。而那些特定問(wèn)題的出現(xiàn),則是由于軟件技術(shù)的發(fā)展和業(yè)務(wù)的需要而引起的。事實(shí)上,每一種架構(gòu)模式都有其生存的土壤。我們將在這一部分的章節(jié)中對(duì)各種架構(gòu)模式展開討論,特別是微服務(wù)架構(gòu)和無(wú)服務(wù)架構(gòu),分析它們產(chǎn)生的背景,適用的場(chǎng)景,解決的問(wèn)題,以及面臨的挑戰(zhàn)。
軟件架構(gòu)的設(shè)計(jì)。設(shè)計(jì)軟件架構(gòu)是一項(xiàng)系統(tǒng)工程。當(dāng)面對(duì)一個(gè)項(xiàng)目,該如何開始架構(gòu)設(shè)計(jì)的第一步?如何對(duì)紛繁復(fù)雜的信息進(jìn)行抽絲剝繭?如何井井有條緩急有序地進(jìn)行設(shè)計(jì)和開發(fā)?如何合理地做出各種決策?如果你的心中對(duì)這些問(wèn)題沒有答案,應(yīng)該仔細(xì)地閱讀這部分的內(nèi)容。我們將在這部分的章節(jié)中,全面深入地討論架構(gòu)設(shè)計(jì)工程,并引入一種新的設(shè)計(jì)方法。這種設(shè)計(jì)既非自上而下,也非自下而上,而是由淺入深,類似于雕刻藝術(shù)。
軟件平臺(tái)架構(gòu)論。近年來(lái),互聯(lián)網(wǎng)應(yīng)用發(fā)展迅猛,很多傳統(tǒng)行業(yè),例如金融保險(xiǎn)行業(yè)的信息系統(tǒng)都開始逐漸推向互聯(lián)網(wǎng)。眾所周知,電子商務(wù)平臺(tái)已經(jīng)在互聯(lián)網(wǎng)上取得了巨大的成功,而金融平臺(tái)仍在努力嘗試。從軟件架構(gòu)的角度看,金融平臺(tái)存在一個(gè)新的挑戰(zhàn),即金融產(chǎn)品比普通電子商務(wù)產(chǎn)品要復(fù)雜得多,無(wú)論用戶界面、規(guī)則、流程,還是計(jì)算,都難以找到普遍適用的規(guī)律。使用傳統(tǒng)設(shè)計(jì)將導(dǎo)致平臺(tái)膨脹的后果。軟件平臺(tái)是互聯(lián)網(wǎng)時(shí)代出現(xiàn)的新事物,我們將在這一部分的章節(jié)中討論平臺(tái)架構(gòu)設(shè)計(jì)中的新思路和新方法。
為什么寫這本書
我已經(jīng)經(jīng)歷了一段漫長(zhǎng)的職業(yè)生涯,在過(guò)去的二十五年中,參與了很多軟件項(xiàng)目,從基于單片機(jī)的匯編程序,到網(wǎng)絡(luò)辦公自動(dòng)化軟件,從圖像處理的鏈接庫(kù),到大型的金融信息系統(tǒng)。時(shí)至今日,我仍然工作在軟件開發(fā)的第一線。這么多年來(lái),軟件架構(gòu)這個(gè)領(lǐng)域在我眼中從沒有像今天這樣變得如此清晰,這使我產(chǎn)生了對(duì)自己多年軟件架構(gòu)經(jīng)驗(yàn)進(jìn)行歸納總結(jié)的想法。
我讀過(guò)軟件架構(gòu)領(lǐng)域的一些經(jīng)典書籍,2013年,還有幸參與了JUST ENOUGH SOFTWARE ARCHITECTURE中譯本的翻譯工作。這些閱讀和翻譯活動(dòng),幫助我比較全面地了解了軟件架構(gòu)領(lǐng)域的知識(shí)。最近這幾年,我又做了一些有趣的架構(gòu)設(shè)計(jì)工作。更多的工程實(shí)踐,總是會(huì)產(chǎn)生更多的經(jīng)驗(yàn)和想法——前面的內(nèi)容中提到了一些,而那些只是眾多收獲中的一部分。這也是我認(rèn)為值得再寫一本書的原因。