<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          架構(gòu)設(shè)計本質(zhì):系統(tǒng)與子系統(tǒng)、模塊與組件、框架與架構(gòu)

          共 4087字,需瀏覽 9分鐘

           ·

          2022-05-30 17:03




          ??前言? ?


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


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


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


          不要氣餒,平常心,其實人人都是架構(gòu)師,可能你做的任一一件事已無形中用到了架構(gòu)。


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



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


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


          1、機(jī)器語言

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


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


          1000100111011000


          面對上面的1&0的字符串,不用多說,程序員心里肯定會萬馬奔騰吧,更別說輸入錯誤要去定位問題,求程序員的心里陰影面積?


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


          太難寫、太難讀、太難改!


          2、匯編語言

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


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


          mov?ax,bx


          相比機(jī)器語言來說,匯編語言就清晰得多了。匯編語言雖然解決了機(jī)器語言讀寫復(fù)雜的問題,但本質(zhì)上還是面向機(jī)器的,因為寫匯編語言需要我們精確了解計算機(jī)底層的知識。


          面向機(jī)器的語言,帶來的問題就是:

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


          3、高級語言


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


          比如:以4+6=?這個加法為例,如果用Lisp語言,只需要簡單一行代碼:


          (+ 4 6)


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


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


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

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

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

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


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


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

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


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


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

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


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


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


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


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


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

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

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

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


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


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



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


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


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


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


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

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


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

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

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

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


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

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


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


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

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

          2. 朋友圈這個系統(tǒng)又包括動態(tài)、評論、點贊等子系統(tǒng);

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

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


          2、模塊與組件


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


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


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


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

          同時,如果是以不同的角度來說明結(jié)構(gòu),會得出不同的架構(gòu)描述,比如:


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


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

          從物理部署的角度分解,“學(xué)生管理系統(tǒng)”的架構(gòu):


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

          從開發(fā)結(jié)構(gòu)的角度分解,“學(xué)生管理系統(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)個體組成”,這些“個體”可以是“子系統(tǒng)”、“模塊”、“組件”等;架構(gòu)需要明確系統(tǒng)包含哪些“個體”。


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



          ? ? ?總結(jié)? ? ?


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


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

          作者:猿碼架構(gòu)

          來源:

          https://www.jianshu.com/p/312af3e8b94a


          推薦閱讀:

          世界的真實格局分析,地球人類社會底層運行原理

          不是你需要中臺,而是一名合格的架構(gòu)師(附各大廠中臺建設(shè)PPT)

          億級(無限級)并發(fā),沒那么難

          論數(shù)字化轉(zhuǎn)型——轉(zhuǎn)什么,如何轉(zhuǎn)?

          華為干部與人才發(fā)展手冊(附PPT)

          企業(yè)10大管理流程圖,數(shù)字化轉(zhuǎn)型從業(yè)者必備!

          【中臺實踐】華為大數(shù)據(jù)中臺架構(gòu)分享.pdf

          華為的數(shù)字化轉(zhuǎn)型方法論

          華為如何實施數(shù)字化轉(zhuǎn)型(附PPT)

          超詳細(xì)280頁Docker實戰(zhàn)文檔!開放下載

          華為大數(shù)據(jù)解決方案(PPT)

          瀏覽 11
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲午夜福利电影 | 国产视频一区在线播放 | 豆花视频黄网站在线观看 | 日日操夜夜撸 | 国产日产精品一区二区三区 |