<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)設計的本質(zhì):系統(tǒng)與子系統(tǒng)、模塊與組件、框架與架構(gòu)

          共 5219字,需瀏覽 11分鐘

           ·

          2021-04-04 08:00



          -     前言     -


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


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


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


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


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



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


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


          1、機器語言

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


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


          1000100111011000


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


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


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


          2、匯編語言

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


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


          mov ax,bx


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


          面向機器的語言,帶來的問題就是:

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


          3、高級語言


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


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


          (+ 4 6)


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


          4、兩次軟件危機


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

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

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

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


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


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

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


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


          第一次軟件危機的根源在于 軟件的“邏輯”變得非常復雜;

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


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


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


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


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


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

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

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

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


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


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



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


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


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


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


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

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


          來提煉下里面的關鍵信息:

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

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

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


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

          子系統(tǒng)也是由一群有關聯(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è)務意義上的子系統(tǒng),而是包括各個模塊或者組件,這些模塊或者組件本身也是另外一個維度上的系統(tǒng),例如:MySQL、Redis等存儲系統(tǒng),但不是業(yè)務子系統(tǒng)。


          2、模塊與組件


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


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


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


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

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


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


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

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


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

          從開發(fā)結(jié)構(gòu)的角度分解,“學生管理系統(tǒng)”的架構(gòu):


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


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

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


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


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



          -     總結(jié)     -


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


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


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

          來源:

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


          相關閱讀:


          開放指令集與開源芯片發(fā)展報告(RISC-V和MIPS)

          中國云計算產(chǎn)業(yè)發(fā)展白皮書(深度)

          NVMe over RoCEv2網(wǎng)絡技術要求和測試規(guī)范

          2021年AI在工業(yè)領域研究報告(附下載)

          企業(yè)數(shù)字化轉(zhuǎn)型之道(深度報告)

          全閃NVMe存儲利用SPDK改善I/O性能

          NVIDIA GPU技術和架構(gòu)演進(干貨)

          深度報告:GPU研究框架(附PPT)




          轉(zhuǎn)載申明:轉(zhuǎn)載本號文章請注明作者來源,本號發(fā)布文章若存在版權(quán)等問題,請留言聯(lián)系處理,謝謝。


          推薦閱讀

          更多架構(gòu)相關技術知識總結(jié)請參考“架構(gòu)師全店鋪技術資料打包”相關電子書(35本技術資料打包匯總詳情可通過“閱讀原文”獲取)。

          全店內(nèi)容持續(xù)更新,現(xiàn)下單“全店鋪技術資料打包(全)”,后續(xù)可享全店內(nèi)容更新“免費”贈閱,價格僅收188元(原總價290元)。



          溫馨提示:

          掃描二維碼關注公眾號,點擊閱讀原文鏈接獲取架構(gòu)師技術全店資料打包匯總(全)電子書資料詳情


          瀏覽 29
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  五月天成人网址 | 大香蕉黄色伊人 | www操逼com | AV影院啪啪啪 | 东京热一区二区三区精品无码 |