當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]在軟件研發(fā)這個(gè)領(lǐng)域,程序員的終極目標(biāo)都是想成為一名合格的架構(gòu)師。


-     前言     -

在軟件研發(fā)這個(gè)領(lǐng)域,程序員的終極目標(biāo)都是想成為一名合格的架構(gòu)師。然而夢(mèng)想很美好,但現(xiàn)實(shí)卻很曲折。

在實(shí)際工作中,程序員會(huì)分很多種,有的擅長(zhǎng)編碼實(shí)現(xiàn),有的擅長(zhǎng)底層原理,有的擅長(zhǎng)邏輯實(shí)現(xiàn)等等,在各自的領(lǐng)域都表現(xiàn)不俗、擔(dān)當(dāng)核心,然而,面臨更高層架構(gòu)設(shè)計(jì)時(shí),很多優(yōu)秀的程序員卻折戟沙場(chǎng),未能完成華麗轉(zhuǎn)身。

架構(gòu)的真諦是什么呢?架構(gòu)真的如此難把控嗎?難道真的只有天資聰慧、天賦異能的程序員才能駕馭架構(gòu)嗎?

不要?dú)怵H,平常心,其實(shí)人人都是架構(gòu)師,可能你做的任一一件事已無(wú)形中用到了架構(gòu)。

本篇文章將帶您慢慢走進(jìn)架構(gòu),揭秘架構(gòu)的真諦。正如,架構(gòu)不是神秘物,吸取真諦即了然。

-     架構(gòu)的背景     -

如果想要深入理解某一事物的本質(zhì),最好的方式就是去追尋這個(gè)事物出現(xiàn)的歷史背景和推動(dòng)因素。所以我們先來(lái)梳理一下軟件開(kāi)發(fā)的進(jìn)化史,探索一下軟件架構(gòu)出現(xiàn)的歷史背景。

1、機(jī)器語(yǔ)言

最早的軟件開(kāi)發(fā)使用的是“機(jī)器語(yǔ)言”,其直接使用二進(jìn)制碼0和1來(lái)表示機(jī)器可以識(shí)別的指令和數(shù)據(jù)。

比如:為了完成“將寄存器 BX 的內(nèi)容送到 AX 中”,機(jī)器語(yǔ)言如下:

1000100111011000

面對(duì)上面的1&0的字符串,不用多說(shuō),程序員心里肯定會(huì)萬(wàn)馬奔騰吧,更別說(shuō)輸入錯(cuò)誤要去定位問(wèn)題,求程序員的心里陰影面積?

歸納一下,機(jī)器語(yǔ)言的主要問(wèn)題是三難:

太難寫(xiě)、太難讀、太難改!

2、匯編語(yǔ)言

為了解決機(jī)器語(yǔ)言編寫(xiě)、閱讀、修改復(fù)雜的問(wèn)題,匯編語(yǔ)言應(yīng)運(yùn)而生。匯編語(yǔ)言又叫“符號(hào)語(yǔ)言”,用助記符代替機(jī)器指令的操作碼,用地址符號(hào)(Symbol)或標(biāo)號(hào)(Label),代替指令或操作數(shù)的地址。

比如:為了完成“將寄存器 BX 的內(nèi)容送到 AX 中”,匯編語(yǔ)言如下:

mov ax,bx 

相比機(jī)器語(yǔ)言來(lái)說(shuō),匯編語(yǔ)言就清晰得多了。匯編語(yǔ)言雖然解決了機(jī)器語(yǔ)言讀寫(xiě)復(fù)雜的問(wèn)題,但本質(zhì)上還是面向機(jī)器的,因?yàn)閷?xiě)匯編語(yǔ)言需要我們精確了解計(jì)算機(jī)底層的知識(shí)。

面向機(jī)器的語(yǔ)言,帶來(lái)的問(wèn)題就是:

匯編語(yǔ)言需要針對(duì)不同 CPU 的匯編指令和結(jié)構(gòu),代碼編寫(xiě)多份。

3、高級(jí)語(yǔ)言

為了解決匯編語(yǔ)言的問(wèn)題,前輩們又設(shè)計(jì)出了一個(gè)“高級(jí)語(yǔ)言”。為什么會(huì)叫“高級(jí)語(yǔ)言”呢?原因在于這些語(yǔ)言讓程序員不需要關(guān)注機(jī)器底層的低級(jí)結(jié)構(gòu)和指令,只需要關(guān)注具體的問(wèn)題和業(yè)務(wù)即可。

比如:以4+6=?這個(gè)加法為例,如果用Lisp語(yǔ)言,只需要簡(jiǎn)單一行代碼:

(+ 4 6) 

除此以外,通過(guò)編譯程序的處理,高級(jí)語(yǔ)言可以被編譯為適合不同CPU指令的機(jī)器語(yǔ)言。程序員只要寫(xiě)一次程序,就可以在不同的機(jī)器上編譯運(yùn)行,無(wú)須根據(jù)不同的機(jī)器指令重寫(xiě)整個(gè)程序。

4、兩次軟件危機(jī)

第一次軟件危機(jī)與結(jié)構(gòu)化程序設(shè)計(jì)

高級(jí)語(yǔ)言的出現(xiàn),解放了程序員,但好景不長(zhǎng),隨著軟件的規(guī)模和復(fù)雜度的大大增加,軟件質(zhì)量低下,質(zhì)量把控難度高,項(xiàng)目無(wú)法如期完成,嚴(yán)重超支等現(xiàn)象。例如,1963 年美國(guó)的 水手一號(hào)火箭發(fā)射失敗事故,就是因?yàn)橐恍?FORTRAN 代碼錯(cuò)誤導(dǎo)致的。

所以,為了解決上面的問(wèn)題,針對(duì)性的提出了解決方法“軟件工程”,雖然“軟件工程”提出之后也曾被視為軟件領(lǐng)域的銀彈,但后來(lái)事實(shí)證明,軟件工程同樣無(wú)法根除軟件危機(jī),只能在一定程度上緩解軟件危機(jī)。

差不多同一時(shí)間,“結(jié)構(gòu)化程序設(shè)計(jì)” 作為另外一種解決軟件危機(jī)的方案被提了出來(lái)。結(jié)構(gòu)化程序設(shè)計(jì)的主要特點(diǎn)是拋棄 goto 語(yǔ)句,采取“自頂向下、逐步細(xì)化、模塊化”的指導(dǎo)思想。

結(jié)構(gòu)化程序設(shè)計(jì)本質(zhì)上還是一種面向過(guò)程的設(shè)計(jì)思想,但通過(guò)“自頂向下、逐步細(xì)化、模塊化”的方法,將軟件的復(fù)雜度控制在一定范圍內(nèi),從而從整體上降低了軟件開(kāi)發(fā)的復(fù)雜度。

第二次軟件危機(jī)與面向?qū)ο?/span>

結(jié)構(gòu)化編程的風(fēng)靡在一定程度上緩解了軟件危機(jī),然而隨著硬件的快速發(fā)展,業(yè)務(wù)需求越來(lái)越復(fù)雜,以及編程應(yīng)用領(lǐng)域越來(lái)越廣泛,第二次軟件危機(jī)很快就到來(lái)了。

第二次軟件危機(jī)的根本原因還是 在于軟件生產(chǎn)力遠(yuǎn)遠(yuǎn)跟不上硬件和業(yè)務(wù)的發(fā)展。

第一次軟件危機(jī)的根源在于 軟件的“邏輯”變得非常復(fù)雜;

第二次軟件危機(jī)主要體現(xiàn)在 軟件的“擴(kuò)展”變的非常復(fù)雜。

結(jié)構(gòu)化程序設(shè)計(jì)雖然能夠緩解軟件邏輯的復(fù)雜性,但是對(duì)于業(yè)務(wù)變化帶來(lái)的軟件擴(kuò)展卻無(wú)能為力。軟件領(lǐng)域迫切希望找到新的銀彈來(lái)解決軟件危機(jī),在這種背景下,面向?qū)ο蟮乃枷腴_(kāi)始流行起來(lái)。

雖然面向?qū)ο箝_(kāi)始也被當(dāng)做解決軟件危機(jī)的銀彈,在一定程度上解決了軟件“擴(kuò)展”帶來(lái)的復(fù)雜性。但事實(shí)證明,和軟件工程、結(jié)構(gòu)化程度設(shè)計(jì)一樣,面向?qū)ο笠膊皇倾y彈,而只是一種新的軟件方法而已。

5、軟件架構(gòu)的產(chǎn)生

與之前的各種新方法或者新理念不同的是,“軟件架構(gòu)”出現(xiàn)的背景并不是整個(gè)行業(yè)都面臨類(lèi)似相同的問(wèn)題,“軟件架構(gòu)”也不是為了解決新的軟件危機(jī)而產(chǎn)生的,這是怎么回事呢?

隨著軟件系統(tǒng)規(guī)模的增加,計(jì)算相關(guān)的算法和數(shù)據(jù)結(jié)構(gòu)不再構(gòu)成主要的設(shè)計(jì)問(wèn)題。當(dāng)系統(tǒng)由許多部分組成時(shí),整個(gè)系統(tǒng)的組織,也就是所說(shuō)的“軟件架構(gòu)”,產(chǎn)生了一系列新的設(shè)計(jì)問(wèn)題。比如:

  1. 系統(tǒng)規(guī)模龐大,內(nèi)部耦合嚴(yán)重,開(kāi)發(fā)效率低;

  2. 系統(tǒng)耦合嚴(yán)重,牽一發(fā)動(dòng)全身,后續(xù)修改和擴(kuò)展困難;

  3. 系統(tǒng)邏輯復(fù)雜,容易出問(wèn)題,出問(wèn)題后很難排查和修復(fù);

“軟件架構(gòu)”的出現(xiàn)有其歷史必然性。第一次軟件危機(jī)引出了“結(jié)構(gòu)化編程”,創(chuàng)造了“模塊”概念;第二次軟件危機(jī)引出了“面向?qū)ο缶幊獭?,?chuàng)造了“對(duì)象”概念;直到“軟件架構(gòu)”的產(chǎn)生,創(chuàng)造了“組件”概念。

“模塊”、“對(duì)象”和“組件”本質(zhì)上都是對(duì)達(dá)到一定規(guī)模的軟件進(jìn)行拆分,差別只是在于隨著軟件的復(fù)雜度不斷增加,拆分的粒度越來(lái)越粗,拆分的層次越來(lái)越高。

-     架構(gòu)指什么     -

對(duì)于技術(shù)人員來(lái)說(shuō),“架構(gòu)”是一個(gè)再常見(jiàn)不過(guò)的詞了。當(dāng)提起“架構(gòu)”這個(gè)詞時(shí),如果去深究一下:“架構(gòu)”到底指什么?大部分人也許并不一定能夠準(zhǔn)確地回答。1000個(gè)人心中可能有1001種架構(gòu)的含義。

那么如何才能準(zhǔn)確的理解架構(gòu)呢?理解架構(gòu)首先理解三個(gè)有關(guān)系而又相似的概念,包括:系統(tǒng)與子系統(tǒng)、模塊與組件、框架與架構(gòu)。

1、系統(tǒng)與子系統(tǒng)

關(guān)于“系統(tǒng)”的定義,我們先來(lái)看維基百科的定義:

系統(tǒng)泛指由一群 有關(guān)聯(lián) 的個(gè)體組成,根據(jù)某種 規(guī)則運(yùn)作,能完成 個(gè)別元件不能單獨(dú)完成的工作的群體。它的意思是“總體”、“整體”或“聯(lián)盟”。

來(lái)提煉下里面的關(guān)鍵信息:

  1. 關(guān)聯(lián):系統(tǒng)是由一群有關(guān)聯(lián)的個(gè)體組成的,沒(méi)有關(guān)聯(lián)的個(gè)體堆在一起不能成為一個(gè)系統(tǒng),例如:把一個(gè)發(fā)動(dòng)機(jī)和一臺(tái)PC放在一起不能稱(chēng)之為一個(gè)系統(tǒng),把發(fā)動(dòng)機(jī)、底盤(pán)、輪胎、車(chē)架組合起來(lái)才能成為一臺(tái)汽車(chē)。

  2. 規(guī)則:系統(tǒng)內(nèi)的個(gè)體需要按照指定的規(guī)則運(yùn)作,而不是單個(gè)個(gè)體各自為政。規(guī)則規(guī)定了系統(tǒng)內(nèi)個(gè)體分工和協(xié)作的方式。例如:汽車(chē)發(fā)動(dòng)機(jī)負(fù)責(zé)產(chǎn)生動(dòng)力,然后通過(guò)變速器和傳動(dòng)軸,將動(dòng)力輸出到輪胎上,從而驅(qū)動(dòng)汽車(chē)前進(jìn)。

  3. 能力:系統(tǒng)能力和個(gè)體能力有本質(zhì)的差別,系統(tǒng)能力也不是個(gè)體能力之和,而是產(chǎn)生了新的能力。例如:汽車(chē)能夠載重前進(jìn),而發(fā)動(dòng)機(jī)、變速器、傳動(dòng)軸、車(chē)輪本身都不具備這樣的能力。

再來(lái)看下子系統(tǒng)的定義:

子系統(tǒng)也是由一群有關(guān)聯(lián)的個(gè)體所組成的系統(tǒng),多半會(huì)是更大系統(tǒng)中的一部分。

其實(shí)子系統(tǒng)和系統(tǒng)的定義是一樣的,只是觀察的角度有差異,一個(gè)系統(tǒng)可能是另外一個(gè)更大系統(tǒng)的子系統(tǒng)。

按照這個(gè)定義,系統(tǒng)和子系統(tǒng)比較容易理解。以微信為例來(lái)做一個(gè)分析:

  1. 微信本身是一個(gè)系統(tǒng),包含聊天、登錄、支付、朋友圈等子系統(tǒng);

  2. 朋友圈這個(gè)系統(tǒng)又包括動(dòng)態(tài)、評(píng)論、點(diǎn)贊等子系統(tǒng);

  3. 評(píng)論這個(gè)系統(tǒng)可能又包括防刷子系統(tǒng)、審核子系統(tǒng)、發(fā)布子系統(tǒng)、存儲(chǔ)子系統(tǒng)等;

  4. 評(píng)論審核子系統(tǒng)不再包含業(yè)務(wù)意義上的子系統(tǒng),而是包括各個(gè)模塊或者組件,這些模塊或者組件本身也是另外一個(gè)維度上的系統(tǒng),例如:MySQL、Redis等存儲(chǔ)系統(tǒng),但不是業(yè)務(wù)子系統(tǒng)。

2、模塊與組件

從邏輯的角度來(lái)拆分系統(tǒng),得到的單元就是“模塊”;從物理的角度來(lái)拆分系統(tǒng),得到的單元就是“組件”。劃分模塊的主要目的是職責(zé)分離;劃分組件的主要目的是單元復(fù)用。其實(shí),“組件”的英文“component”也可以翻譯成中文的“零件”一詞,“零件”更容易理解一些,“零件”是一個(gè)物理的概念,并且具備“獨(dú)立且可替換”的特點(diǎn)。

3、框架與架構(gòu)

單純從定義的角度來(lái)看,框架關(guān)注的是“規(guī)范”,架構(gòu)關(guān)注的是“結(jié)構(gòu)”??蚣艿挠⑽氖恰癋ramework”,架構(gòu)的英文是“Architecture”。

我們經(jīng)常會(huì)說(shuō),比如:“工程采用的是MVC架構(gòu)”、“工程使用的是SSH框架”等。所以,第一句話(huà)是站在結(jié)構(gòu)的層面來(lái)說(shuō)明,第二句話(huà)是站在規(guī)范的層面來(lái)說(shuō)明。

同時(shí),如果是以不同的角度來(lái)說(shuō)明結(jié)構(gòu),會(huì)得出不同的架構(gòu)描述,比如:

從業(yè)務(wù)邏輯的角度分解,“學(xué)生管理系統(tǒng)”的架構(gòu):

架構(gòu)設(shè)計(jì)的真諦:系統(tǒng)與子系統(tǒng)、模塊與組件、框架與架構(gòu)

“學(xué)生管理系統(tǒng)”的架構(gòu)

4、重新定義架構(gòu)

軟件架構(gòu)指軟件系統(tǒng)的頂層結(jié)構(gòu)。

首先,“系統(tǒng)是一群關(guān)聯(lián)個(gè)體組成”,這些“個(gè)體”可以是“子系統(tǒng)”、“模塊”、“組件”等;架構(gòu)需要明確系統(tǒng)包含哪些“個(gè)體”。

其次,系統(tǒng)中的個(gè)體需要“根據(jù)某種規(guī)則”運(yùn)作,架構(gòu)需要明確個(gè)體運(yùn)作和協(xié)作的規(guī)則。

-     總結(jié)     -

架構(gòu)其實(shí)就是為了應(yīng)對(duì)軟件系統(tǒng)復(fù)雜度而提出的解決方案。架構(gòu)關(guān)鍵思維即為判斷與取舍。

正如,在一個(gè)有約束的盒子里去求解或接近最合適的解。這個(gè)約束的盒子可能會(huì)包含團(tuán)隊(duì)經(jīng)驗(yàn)、成本、資源、時(shí)間、業(yè)務(wù)階段等因素?fù)诫s在一起的綜合體,針對(duì)這個(gè)綜合體,分析出系統(tǒng)架構(gòu)的復(fù)雜度,進(jìn)行合適的判斷與取舍,從而設(shè)計(jì)出恰當(dāng)?shù)募軜?gòu)用在合適的軟件系統(tǒng)中。





		
				
	
	
	

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話(huà)語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉