版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
./架構師的邏輯技術思維分析目錄一、抽象思維3二、分層思維8三、分治思維11四、演化思維16五、如何培養(yǎng)架構設計思維19結論21一、抽象思維如果要問軟件研發(fā)/系統(tǒng)架構中最重要的能力是什么,我會毫不猶豫回答是抽象能力。抽象<abstraction>這個詞大家經常聽到,但是真正理解和能講清楚什么是抽象的人少之又少。抽象其實是這樣定義的:對某種事物進行簡化表示或描述的過程,抽象讓我們關注要素,隱藏額外細節(jié)。舉一個例子,見下圖:你看到什么?你看到的是一扇門,對不對?你看到的不是木頭,也不是碳原子,這個門就是抽象,而木頭或者碳原子是細節(jié)。另外你可以看到門上有個門把手,你看到的不是鐵,也不是鐵原子,門把手就是抽象,鐵和鐵原子是細節(jié)。在系統(tǒng)架構和設計中,抽象幫助我們從大處著眼〔getourmindaboutbigpicture,隱藏細節(jié)〔temporarilyhidedetails。抽象能力的強弱,直接決定我們所能解決問題的復雜性和規(guī)模大小。下圖是我們小時候玩的積木,我發(fā)現(xiàn)小時候喜歡玩搭積木的,并且搭得快和好的小朋友,一般抽象能力都比較強。上圖右邊的積木城堡就是抽象,這個城堡如果你細看的話,它其實還是由若干個子模塊組成,這些模塊是子抽象單元,左邊的各種形狀的積木是細節(jié)。搭積木的時候,小朋友腦袋里頭先有一個城堡的大圖〔抽象,然后他/她大腦里頭會有一個初步的子模塊分解〔潛意識中完成,然用利用積木搭建每一個子模塊,最終拼裝出最后的城堡。這里頭有一個自頂向下的分治設計,然后自底向上的組合過程,這個分治思維非常重要,我們后面會講。我認為軟件系統(tǒng)架構設計和小朋友搭積木無本質差異,只是解決的問題域和規(guī)模不同罷了。架構師先要在大腦中形成抽象概念,然后是子模塊分解,然后是依次實現(xiàn)子模塊,最后將子模塊拼裝組合起來,形成最后系統(tǒng)。所以我常說編程和架構設計就是搭積木,優(yōu)秀的架構師受職業(yè)習慣影響,眼睛里看到的世界都是模塊化拼裝組合式的。抽象能力不僅對軟件系統(tǒng)架構設計重要,對建筑、商業(yè)、管理等人類其它領域活動同樣非常重要。其實可以這樣認為,我們生存的世界都是在抽象的基礎上構建起來的,離開抽象人類將寸步難行。這里順便提一下抽象層次跳躍問題,這個在開發(fā)中是蠻普遍的。有經驗的程序員寫代碼會保持抽象層次的一致性,代碼讀起來像講故事,比較清晰易于理解;而沒有經驗的程序員會有明顯的抽象層次跳躍問題,代碼讀起來就比較累,這個是抽象能力不足造成。舉個例子:一個電商網站在處理訂單時,一般會走這樣一個流程:1.更新庫存<InventoryUpdate>2.打折計算<Discounting>3.支付卡校驗<PaycardVerification>4.支付<Pay>5.送貨<Shipping>上述流程中的抽象是在同一個層次上的,比較清晰易于理解,但是沒有經驗的程序員在實現(xiàn)這個流程的時候,代碼層次會跳,比方說主流程到支付卡校驗一塊,他的代碼會突然跳出一行某銀行API遠程調用,這個就是抽象跳躍,銀行API調用是細節(jié),應該封裝在PaycardVerification這個抽象里頭。二、分層思維除了抽象,分層也是我們應對和管理復雜性的基本思維武器,如下圖,為了構建一套復雜系統(tǒng),我們把整個系統(tǒng)劃分成若干個層次,每一層專注解決某個領域的問題,并向上提供服務。有些層次是縱向的,它貫穿所有其它層次,稱為共享層。分層也可以認為是抽象的一種方式,將系統(tǒng)抽象分解成若干層次化的模塊。分層架構的案例很多,一個中小型的SpringWeb應用程序,我們一般會設計成三層架構:操作系統(tǒng)是經典的分層架構,如下圖:TCP/IP協(xié)議棧也是經典的分層架構,如下圖:如果你關注人類文明演化史,你會發(fā)現(xiàn)今天的人類世界也是以分層方式一層層搭建和演化出來的。今天的互聯(lián)網系統(tǒng)可以認為是現(xiàn)代文明的一個層次,其上是基于互聯(lián)網的現(xiàn)代商業(yè),其下是現(xiàn)代電子工業(yè)基礎設施,諸如此類。三、分治思維分而治之<divideandcombine或者splitandmerge>也是應對和管理復雜性的一般性方法,下圖展示一個分治的思維流程:對于一個無法一次解決的大問題,我們會先把大問題分解成若干個子問題,如果子問題還無法直接解決,則繼續(xù)分解成子子問題,直到可以直接解決的程度,這個是分解<divide>的過程;然后將子子問題的解組合拼裝成子問題的解,再將子問題的解組合拼裝成原問題的解,這個是組合<combine>的過程。面試時為了考察候選人的分治思維,我經常會面一個分治題:給你一臺8G內存/500G磁盤空間的普通電腦,如何對一個100G的大文件進行排序?假定文件中都是字符串記錄,一行約100個字符。這是一個典型的分治問題,100G的大文件肯定無法一次加載到內存直接排序,所以需要先切分成若干小問題來解決。那么8G內存的計算機一次大概能排多大的數據量,可以在有限的時間內排完呢?也就是100G的大文件要怎么切法,切成多少份比較合適?這個是考察候選人的時間空間復雜度估算能力,需要一定的計算機組織和算法功底,也需要一定實戰(zhàn)經驗和sense。實際上8G內存的話,操作系統(tǒng)要用掉一部分,如果用Java開發(fā)排序程序,大致JVM可用2~4G內存,基于一般的經驗值,一次排1G左右的數據應該沒有問題〔我實際在計算機上干過1G數據的排序,是OK的。所以100G的文件需要先切分成100份,每份1G,這樣每個子文件可以直接加載到內存進行排序。對于1G數據量的字符串排序,采用Java里頭提供的快速排序算法是比較合適的。好,經過有限時間的排序〔取決于計算機性能,快的一天內能排完,假定100個1G的文件都已經排好了,相當于現(xiàn)在硬盤上有100個已經排好序的文件,但是我們最終需要的是一個排好序的文件,下面該怎么做?這個時候我們需要把已經解決的子問題組合起來,合并成我們需要的最終結果文件。這個時候該采用什么算法呢?這里考察候選人對外排序和歸并排序算法的掌握程度,我們可以將100個排好序的文件進行兩兩歸并排序,這樣不斷重復,我們就會得到50個排好序的文件,每個大小是2G。然后再兩兩歸并,不斷重復,直到最后兩個文件歸并成目標文件,這個文件就是100G并且是排好序的。因為是外排序+歸并排序,每次只需要讀取當前索引指向的文件記錄到內存,進行比較,小的那個輸出到目標文件,內存占用極少。另外,上面的算法是兩路歸并,也可以采用多路歸并,甚至是采用堆排序進行優(yōu)化,但是總體分治思路沒有變化。總體上這是一個非常好的面試題,除了考察候選人的分治思維之外,還考察對各種排序算法〔快排,外排序,歸并排序,堆排序的理解,計算的時間空間復雜度估算,計算機的內外存特性和組織,文件操作等等。實際上能完全回答清楚這個問題的候選人極少,如果有幸被我面到一個,我會如獲至寶,因為這個人有成長為優(yōu)秀架構師的潛質。另外,遞歸也是一種特殊的分治技術,掌握遞歸技術的開發(fā)人員,相當于掌握了一種強大的編程武器,可以解決一些一般開發(fā)人員無法解決的問題。比方說最近我的團隊在研發(fā)一款新的服務框架,其中包括契約解析器<parser>,代碼生產器<codegenerator>,序列化器<serializer>等組件,里頭大量需要用到遞歸的思維和技術,沒有這個思維的開發(fā)人員就干不了這個事情。所以我在面試候選人的時候,一般都會出遞歸相關的編程題,考察候選人的遞歸思維。大自然中遞歸結構比比皆是,如下圖,大家有興趣不妨思考,大自然通過遞歸給我們人類何種啟示?四、演化思維社區(qū)里頭經常有人在討論:架構是設計出來的?還是演化出來的?我個人基于十多年的經驗認為,架構既是設計出來的,同時也是演化出來的,對于互聯(lián)網系統(tǒng),基本上可以說是三分設計,七分演化,而且是在設計中演化,在演化中設計,一個不斷迭代的過程。在互聯(lián)網軟件系統(tǒng)的整個生命周期過程中,前期的設計和開發(fā)大致只占三分,在后面的七分時間里,架構師需要根據用戶的反饋對架構進行不斷的調整。我認為架構師除了要利用自身的架構設計能力,同時也要學會借助用戶反饋和進化的力量,推動架構的持續(xù)演進,這個就是演化式架構思維。當然一開始的架構設計非常重要,架構定系統(tǒng)基本就成型了,不容馬虎。同時,優(yōu)秀的架構師深知,能夠不斷應對環(huán)境變化的系統(tǒng),才是有生命力的系統(tǒng),架構的好壞,很大部分取決于它應對變化的靈活性。所以具有演化式思維的架構師,能夠在一開始設計時就考慮到后續(xù)架構的演化特性,并且將靈活應對變化的能力作為架構設計的主要考量。當前,社區(qū)正在興起一種新的架構方法學~演化式架構,微服務架構就是一種典型的演化式架構,它能夠快速響應市場用戶需求的變化,而單塊架構就缺乏這種靈活性。馬丁·福樂曾經在其博客上給出過一張微服務架構的演化路線圖[附錄8.2],可以用來解釋設計式思維和演化式思維的差異,如下圖所示:上面的路線是一開始就直奔微服務架構,其實背后體現(xiàn)的是設計式架構的思維,認為架構師可以完全設計整個系統(tǒng)和它的演化方向。馬丁認為這種做法風險非常高,一個是成本高昂,另外一個是剛開始架構師對業(yè)務域理解不深,無法清晰劃分領域邊界,開發(fā)出來的系統(tǒng)很可能無法滿足用戶需求。下面的路線是從單塊架構開始,隨著架構師對業(yè)務域理解的不斷深入,也隨著業(yè)務和團隊規(guī)模的不斷擴大,漸進式地把單塊架構拆分成微服務架構的思路,這就是演化式架構的思維。如果你觀察現(xiàn)實世界中一些互聯(lián)網公司〔例如eBay,阿里,Netflix等等的系統(tǒng)架構,大部分走得都是演化式架構的路線。下圖是建筑的演化史,在每個階段,你可以看到設計的影子,但如果時間線拉得足夠長,演化的特性就出來了。五、如何培養(yǎng)架構設計思維良好的架構設計思維的培養(yǎng),離不開工作中大量高質量項目的實戰(zhàn)鍛煉,然后是平時的學習、思考和提煉總結。另外,基本的架構設計思維,其實在我們大學計算機課程〔比如數據結構和算法中可以找到影子,只不過當時以學習為主,問題域比較小和理想化。所以大學教育其實非常重要,基本的架構設計思維在那個時候就已經埋下種子,后面工程實踐中進一步消化和應用,隨著經驗的積累,我們能夠解決的問題域復雜性和規(guī)模逐漸變大,但基本的武器還是抽象、分層和分治等思維。我認為一個架構師的成長高度和他大學期間的思維習慣的養(yǎng)成關系密切。我所知道世界一流的互聯(lián)網公司,例如谷歌等,招聘工程師新人時,對數據結構和算法的要求可以用苛刻來形容,這個可以理解,谷歌級別公司要解決的問題都是超級復雜的,基本思維功底薄弱根本無法應對。對于工作經驗<5年的工程師新手,如果你大學時代是屬于荒廢型的,建議工作之余把相關課程再好好自學一把。個人推薦參考美國Berkeley大學的數據結構課程CS61B[附錄8.1]進行學習,對建立抽象編程思維非常有幫助,我本人在研究生階段自學過這門課程,現(xiàn)在回想起來確實受益匪淺,注意該課程中的所有Lab/Homework/Project都要實際動手做一遍,才有好的效果。我當年自學的是CS61B2006秋季版的課程,上圖是課程Logo對于演化設計思維,當前的大學教育其實培養(yǎng)很少,相反,當前大學教育大都采用脫離現(xiàn)實場景的簡化理想模型,有些還是固定答案的應試教學,這種方式會造成學生思維確定化,不利于培養(yǎng)演化式設計思維。我個人的體會,演化式設計思維更多在實際工作中通過實戰(zhàn)鍛煉和培養(yǎng)。結論1.架構的本質是管理復雜性,抽象、分層、分治和演化思維是架構師征服復雜性的四種根本性武器。2.掌握了抽象、分層、分治和演化這四種基本的武器,你可以設計小到一個類,一個模塊,一個子系統(tǒng),或者一個中型的系統(tǒng),也可以大到一個公司的基礎平臺架構,微服務架構,技術體系架構,甚至是組織架構,業(yè)務架構等等。3.架構設計不是靜態(tài)的,而是動態(tài)演化的。只有能夠不斷應對環(huán)境變化的系統(tǒng),才是有生命力的系統(tǒng)。所以即使你掌握了抽象、分層和分治這三種基本
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度大型運動會安防系統(tǒng)合同
- 2024年度大數據分析服務合同標的明細
- 2024年專用:租賃合同保證金條款匯編
- 2024年度居民住宅鋁合金門窗安裝工程合同
- 2024年廢舊物資回收協(xié)議
- 2024工程合規(guī)審查中的黑白合同問題探討
- 04版智能硬件研發(fā)與制造分包合同
- 2024年國際貨運代理及倉儲物流合作合同
- 2024年度5G基站建設與運營合作協(xié)議
- 2024年一年級數學老師家長會
- 小學數學計算專項訓練之乘法分配律(提公因數)
- 《食物在體內的旅行》說課稿
- 手機綜合癥小品臺詞
- 校園封閉安全管理制度培訓
- 職規(guī)大賽醫(yī)學影像成長賽道
- 市政工程道路施工主要管理人員及勞動力安排
- 2023年江蘇省事業(yè)單位公開招聘考試真題
- 建筑設計方法入門(建筑設計)
- 商貿公司培訓課件
- 營銷技巧與海外市場評估
- 糖尿病患者的藥物治療指導與管理要點與技巧培養(yǎng)
評論
0/150
提交評論