




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、架構(gòu)師的邏輯技術(shù)思維分析學(xué)習(xí)參考一、抽象思維3二、分層思維6三、分治思維8四、演化思維12五、如何培養(yǎng)架構(gòu)設(shè)計(jì)思維14結(jié)論15、抽象思維如果要問(wèn)軟件研發(fā)/系統(tǒng)架構(gòu)中最重要的能力是什么,我會(huì)毫不猶豫回答是抽象能力。抽象(abstraction)這個(gè)詞大家經(jīng)常聽(tīng)到,但是真正理解和能講清楚什么是抽象的人少之又少。抽象其實(shí)是這樣定義的:對(duì)某種事物進(jìn)行簡(jiǎn)化表示或描述的過(guò)程,抽象讓我們關(guān)注要素,隱藏額外細(xì)節(jié)舉一個(gè)例子,見(jiàn)下圖:你看到什么?你看到的是一扇門,對(duì)不對(duì)?你看到的不是木頭,也不是碳原子,這個(gè)門就是抽象,而木頭或者碳原子是細(xì)節(jié)。另外你可以看到門上有個(gè)門把手,你看到的不是鐵,也不是鐵原子,門把手就是抽
2、象,鐵和鐵原子是細(xì)節(jié)。在系統(tǒng)架構(gòu)和設(shè)計(jì)中,抽象幫助我們從大處著眼(getourmindaboutbigpicture),隱藏細(xì)節(jié)(temporarilyhidedetails)。抽象能力的強(qiáng)弱,直接決定我們所能解決問(wèn)題的復(fù)雜性和規(guī)模大小。下圖是我們小時(shí)候玩的積木,我發(fā)現(xiàn)小時(shí)候喜歡玩搭積木的,并且搭得快和好的小朋友,一般抽象能力都比較強(qiáng)。上圖右邊的積木城堡就是抽象,這個(gè)城堡如果你細(xì)看的話,它其實(shí)還是由若干個(gè)子模塊組成,這些模塊是子抽象單元,左邊的各種形狀的積木是細(xì)節(jié)。搭積木的時(shí)候,小朋友腦袋里頭先有一個(gè)城堡的大圖(抽象),然后他/她大腦里頭會(huì)有一個(gè)初步的子模塊分解(潛意識(shí)中完成),然用利用積木搭
3、建每一個(gè)子模塊,最終拼裝出最后的城堡。這里頭有一個(gè)自頂向下的分治設(shè)計(jì),然后自底向上的組合過(guò)程,這個(gè)分治思維非常重要,我們后面會(huì)講。我認(rèn)為軟件系統(tǒng)架構(gòu)設(shè)計(jì)和小朋友搭積木無(wú)本質(zhì)差異,只是解決的問(wèn)題域和規(guī)模不同罷了。架構(gòu)師先要在大腦中形成抽象概念,然后是子模塊分解,然后是依次實(shí)現(xiàn)子模塊,最后將子模塊拼裝組合起來(lái),形成最后系統(tǒng)。所以我常說(shuō)編程和架構(gòu)設(shè)計(jì)就是搭積木,優(yōu)秀的架構(gòu)師受職業(yè)習(xí)慣影響,眼睛里看到的世界都是模塊化拼裝組合式的。抽象能力不僅對(duì)軟件系統(tǒng)架構(gòu)設(shè)計(jì)重要,對(duì)建筑、商業(yè)、管理等人類其它領(lǐng)域活動(dòng)同樣非常重要。其實(shí)可以這樣認(rèn)為,我們生存的世界都是在抽象的基礎(chǔ)上構(gòu)建起來(lái)的,離開(kāi)抽象人類將寸步難行。這
4、里順便提一下抽象層次跳躍問(wèn)題,這個(gè)在開(kāi)發(fā)中是蠻普遍的。有經(jīng)驗(yàn)的程序員寫代碼會(huì)保持抽象層次的一致性,代碼讀起來(lái)像講故事,比較清晰易于理解;而沒(méi)有經(jīng)驗(yàn)的程序員會(huì)有明顯的抽象層次跳躍問(wèn)題,代碼讀起來(lái)就比較累,這個(gè)是抽象能力不足造成。舉個(gè)例子:一個(gè)電商網(wǎng)站在處理訂單時(shí),一般會(huì)走這樣一個(gè)流程:1 .更新庫(kù)存(InventoryUpdate)2 .打折計(jì)算(Discounting)3 .支付卡校驗(yàn)(PaycardVerification)4 .支付(Pay)5 .送貨(Shipping)上述流程中的抽象是在同一個(gè)層次上的,比較清晰易于理解,但是沒(méi)有經(jīng)驗(yàn)的程序員在實(shí)現(xiàn)這個(gè)流程的時(shí)候,代碼層次會(huì)跳,比方說(shuō)主流
5、程到支付卡校驗(yàn)一塊,他的代碼會(huì)突然跳出一行某銀行API遠(yuǎn)程調(diào)用,這個(gè)就是抽象跳躍,銀行API調(diào)用是細(xì)節(jié),應(yīng)該封裝在PaycardVerification這個(gè)抽象里頭。、分層思維除了抽象,分層也是我們應(yīng)對(duì)和管理復(fù)雜性的基本思維武器,如下圖,為了構(gòu)建一套復(fù)雜系統(tǒng),我們把整個(gè)系統(tǒng)劃分成若干個(gè)層次,每一層專注解決某個(gè)領(lǐng)域的問(wèn)題,并向上提供服務(wù)。有些層次是縱向的,它貫穿所有其它層次,稱為共享層。分層也可以認(rèn)為是抽象的一種方式,將系統(tǒng)抽象分解成若干層次化的模塊。LAYERLAYER分層架構(gòu)的案例很多,一個(gè)中小型的SpringWeb應(yīng)用程序,我們一般會(huì)設(shè)計(jì)成三層架構(gòu):ClientContactCentroI
6、IerContactSerwiceContactServicelmpI*ContactDAQ-»ContactDAOImpI*VDatabaseJ操作系統(tǒng)是經(jīng)典的分層架構(gòu),如卜圖:iKerneljTCP/IP協(xié)議棧也是經(jīng)典的分層架構(gòu),如卜圖:SpringGoumll«rserviceLa/erData口cc”sLaytr1TCPIPProtocolLayers,如果你關(guān)注人類文明演化史,你會(huì)發(fā)現(xiàn)今天的人類世界也是以分層方式一層層搭建和演化出來(lái)的。今天的互聯(lián)網(wǎng)系統(tǒng)可以認(rèn)為是現(xiàn)代文明的一個(gè)層次,其上是基于互聯(lián)網(wǎng)的現(xiàn)代商業(yè),其下是現(xiàn)代電子工業(yè)基礎(chǔ)設(shè)施,諸如此類。三、分治思維分而治
7、之(divideandcombine或者splitandmerge)也是應(yīng)對(duì)和管理復(fù)雜性的一般性方法,下圖展示一個(gè)分治的思維流程:problemd承把尸>I subproUcmJzi MbprWIcmX葭雄*Mfiuiprctskm J田 bpgMem7Tsubproblenn/ iHviiir subpriiblcm J !冽 fcppmbLeiii&utoprubkm | iubproblejn tubpubkin i.ubpn>blem 生殖融1電1。的 ubptxibient ,、4小黛”lle,tubjHubl亡:tm 丫 ubprobltjri1 工 ok?加印
8、 nihlurnu*、Eibpm»bl;£riT京,Ne«lvehe“W”SO lill Lon 心翼lig滋】弋浦soiuLon u iihprihk'nisLlklhlEI 10%u 附 mb 2 m的 lul 縮ii t<? subphiblem * X 、glulx0nl toubprdikm月門州柑FITauhprdhkp】 )fiibprubWm “ ubprubleor , mjFpm3HmibOlUUL 心subpioblemeMrhrnf立:虱uli由EG>ubprubki出WuLun 3Mib?ft>blenisolu
9、lion loxubprxh 觸 m snlulion to mhpn出岸門sotmioji ioh由mhkrnJ/ioluiim k>ibpibblem門即用即/ / /f ,、wlMiM totibprhlenn門 JJifiJr8sokiljon k7 enh|ir ihlefli,仃"JJ即JTE><sdutmitoprobkm對(duì)于一個(gè)無(wú)法一次解決的大問(wèn)題,我們會(huì)先把大問(wèn)題分解成若干個(gè)子問(wèn)題,如果子問(wèn)題還無(wú)法直接解決,則繼續(xù)分解成子子問(wèn)題,直到可以直接解決的程度,這個(gè)是分解(divide)的過(guò)程;然后將子子問(wèn)題的解組合拼裝成子問(wèn)題的解,再將子問(wèn)題的解組合拼裝
10、成原問(wèn)題的解,這個(gè)是組合(combine)的過(guò)程。面試時(shí)為了考察候選人的分治思維,我經(jīng)常會(huì)面一個(gè)分治題:給你一臺(tái)8G內(nèi)存/500G磁盤空間的普通電腦,如何對(duì)一個(gè)100G的大文件進(jìn)行排序?假定文件中都是字符串記錄,一行約100個(gè)字符。這是一個(gè)典型的分治問(wèn)題,100G的大文件肯定無(wú)法一次加載到內(nèi)存直接排序,所以需要先切分成若干小問(wèn)題來(lái)解決。那么8G內(nèi)存的計(jì)算機(jī)一次大概能排多大的數(shù)據(jù)量,可以在有限的時(shí)間內(nèi)排完呢?也就是100G的大文件要怎么切法,切成多少份比較合適?這個(gè)是考察候選人的時(shí)間空間復(fù)雜度估算能力,需要一定的計(jì)算機(jī)組織和算法功底,也需要一定實(shí)戰(zhàn)經(jīng)驗(yàn)和sense。實(shí)際上8G內(nèi)存的話,操作系統(tǒng)要
11、用掉一部分,如果用Java開(kāi)發(fā)排序程序,大致JVM可用24G內(nèi)存,基于一般的經(jīng)驗(yàn)值,一次排1G左右的數(shù)據(jù)應(yīng)該沒(méi)有問(wèn)題(我實(shí)際在計(jì)算機(jī)上干過(guò)1G數(shù)據(jù)的排序,是OK的)。所以100G的文件需要先切分成100份,每份1G,這樣每個(gè)子文件可以直接加載到內(nèi)存進(jìn)行排序。對(duì)于1G數(shù)據(jù)量的字符串排序,采用Java里頭提供的快速排序算法是比較合適的。好,經(jīng)過(guò)有限時(shí)間的排序(取決于計(jì)算機(jī)性能,快的一天內(nèi)能排完),假定100個(gè)1G的文件都已經(jīng)排好了,相當(dāng)于現(xiàn)在硬盤上有100個(gè)已經(jīng)排好序的文件,但是我們最終需要的是一個(gè)排好序的文件,下面該怎么做?這個(gè)時(shí)候我們需要把已經(jīng)解決的子問(wèn)題組合起來(lái),合并成我們需要的最終結(jié)果文件
12、。這個(gè)時(shí)候該采用什么算法呢?這里考察候選人對(duì)外排序和歸并排序算法的掌握程度,我們可以將100個(gè)排好序的文件進(jìn)行兩兩歸并排序,這木¥不斷重復(fù),我們就會(huì)得到50個(gè)排好序的文件,每個(gè)大小是2G。然后再兩兩歸并,不斷重復(fù),直到最后兩個(gè)文件歸并成目標(biāo)文件,這個(gè)文件就是100G并且是排好序的。因?yàn)槭峭馀判?歸并排序,每次只需要讀取當(dāng)前索引指向的文件記錄到內(nèi)存,進(jìn)行比較,小的那個(gè)輸出到目標(biāo)文件,內(nèi)存占用極少。另外,上面的算法是兩路歸并,也可以采用多路歸并,甚至是采用堆排序進(jìn)行優(yōu)化,但是總體分治思路沒(méi)有變化??傮w上這是一個(gè)非常好的面試題,除了考察候選人的分治思維之外,還考察對(duì)各種排序算法(快排,外排
13、序,歸并排序,堆排序)的理解,計(jì)算的時(shí)間空間復(fù)雜度估算,計(jì)算機(jī)的內(nèi)外存特性和組織,文件操作等等。實(shí)際上能完全回答清楚這個(gè)問(wèn)題的候選人極少,如果有幸被我面到一個(gè),我會(huì)如獲至寶,因?yàn)檫@個(gè)人有成長(zhǎng)為優(yōu)秀架構(gòu)師的潛質(zhì)。另外,遞歸也是一種特殊的分治技術(shù),掌握遞歸技術(shù)的開(kāi)發(fā)人員,相當(dāng)于掌握了一種強(qiáng)大的編程武器,可以解決一些一般開(kāi)發(fā)人員無(wú)法解決的問(wèn)題。比方說(shuō)最近我的團(tuán)隊(duì)在研發(fā)一款新的服務(wù)框架,其中包括契約解析器(parser),代碼生產(chǎn)器(codegenerator),序列化器(serializer)等組件,里頭大量需要用到遞歸的思維和技術(shù),沒(méi)有這個(gè)思維的開(kāi)發(fā)人員就干不了這個(gè)事情。所以我在面試候選人的時(shí)候,
14、一般都會(huì)出遞歸相關(guān)的編程題,考察候選人的遞歸思維。大自然中遞歸結(jié)構(gòu)比比皆是,如下圖,大家有興趣不妨思考,大自然通過(guò)遞歸給我們?nèi)祟惡畏N啟不?四、演化思維社區(qū)里頭經(jīng)常有人在討論:架構(gòu)是設(shè)計(jì)出來(lái)的?還是演化出來(lái)的?我個(gè)人基于十多年的經(jīng)驗(yàn)認(rèn)為,架構(gòu)既是設(shè)計(jì)出來(lái)的,同時(shí)也是演化出來(lái)的,對(duì)于互聯(lián)網(wǎng)系統(tǒng),基本上可以說(shuō)是三分設(shè)計(jì),七分演化,而且是在設(shè)計(jì)中演化,在演化中設(shè)計(jì),一個(gè)不斷迭代的過(guò)程。在互聯(lián)網(wǎng)軟件系統(tǒng)的整個(gè)生命周期過(guò)程中,前期的設(shè)計(jì)和開(kāi)發(fā)大致只占三分,在后面的七分時(shí)間里,架構(gòu)師需要根據(jù)用戶的反饋對(duì)架構(gòu)進(jìn)行不斷的調(diào)整。我認(rèn)為架構(gòu)師除了要利用自身的架構(gòu)設(shè)計(jì)能力,同時(shí)也要學(xué)會(huì)借助用戶反饋和進(jìn)化的力量,推動(dòng)架
15、構(gòu)的持續(xù)演進(jìn),這個(gè)就是演化式架構(gòu)思維。當(dāng)然一開(kāi)始的架構(gòu)設(shè)計(jì)非常重要,架構(gòu)定系統(tǒng)基本就成型了,不容馬虎。同時(shí),優(yōu)秀的架構(gòu)師深知,能夠不斷應(yīng)對(duì)環(huán)境變化的系統(tǒng),才是有生命力的系統(tǒng),架構(gòu)的好壞,很大部分取決于它應(yīng)對(duì)變化的靈活性。所以具有演化式思維的架構(gòu)師,能夠在一開(kāi)始設(shè)計(jì)時(shí)就考慮到后續(xù)架構(gòu)的演化特性,并且將靈活應(yīng)對(duì)變化的能力作為架構(gòu)設(shè)計(jì)的主要考量。當(dāng)前,社區(qū)正在興起一種新的架構(gòu)方法學(xué)演化式架構(gòu),微服務(wù)架構(gòu)就是一種典型的演化式架構(gòu),它能夠快速響應(yīng)市場(chǎng)用戶需求的變化,而單塊架構(gòu)就缺乏這種靈活性。馬丁福樂(lè)曾經(jīng)在其博客上給出過(guò)一張微服務(wù)架構(gòu)的演化路線圖附錄8.2,可以用來(lái)解釋設(shè)計(jì)式思維和演化式思維Going
16、directly to t? microservsces archrtecture is nskyAs compfextty nses start breaking out 5口Continue breaking out serv/ce5 as your knowledge of boundaries and service man(jgement increases的差異,如下圖所示:Amonolith2explorebaththecompiertyofasystemandrtscomponentboundariesmxroservices上面的路線是一開(kāi)始就直奔微服務(wù)架構(gòu),其實(shí)背后體現(xiàn)的是
17、設(shè)計(jì)式架構(gòu)的思維,認(rèn)為架構(gòu)師可以完全設(shè)計(jì)整個(gè)系統(tǒng)和它的演化方向。馬丁認(rèn)為這種做法風(fēng)險(xiǎn)非常高,一個(gè)是成本高昂,另外一個(gè)是剛開(kāi)始架構(gòu)師對(duì)業(yè)務(wù)域理解不深,無(wú)法清晰劃分領(lǐng)域邊界,開(kāi)發(fā)出來(lái)的系統(tǒng)很可能無(wú)法滿足用戶需求。下面的路線是從單塊架構(gòu)開(kāi)始,隨著架構(gòu)師對(duì)業(yè)務(wù)域理解的不斷深入,也隨著業(yè)務(wù)和團(tuán)隊(duì)規(guī)模的不斷擴(kuò)大,漸進(jìn)式地把單塊架構(gòu)拆分成微服務(wù)架構(gòu)的思路,這就是演化式架構(gòu)的思維。如果你觀察現(xiàn)實(shí)世界中一些互聯(lián)網(wǎng)公司(例如eBay,阿里,Netflix等等)的系統(tǒng)架構(gòu),大部分走得都是演化式架構(gòu)的路線。下圖是建筑的演化史,在每個(gè)階段,你可以看到設(shè)計(jì)的影子,但如果時(shí)間線拉得足夠長(zhǎng),演化的特性就出來(lái)了。-二國(guó)二-!
18、FTE'二B“rivfaIPL-r . W組引雷=T=二一二W五、如何培養(yǎng)架構(gòu)設(shè)計(jì)思維良好的架構(gòu)設(shè)計(jì)思維的培養(yǎng),離不開(kāi)工作中大量高質(zhì)量項(xiàng)目的實(shí)戰(zhàn)鍛煉,然后是平時(shí)的學(xué)習(xí)、思考和提煉總結(jié)。另外,基本的架構(gòu)設(shè)計(jì)思維,其實(shí)在我們大學(xué)計(jì)算機(jī)課程(比如數(shù)據(jù)結(jié)構(gòu)和算法)中可以找到影子,只不過(guò)當(dāng)時(shí)以學(xué)習(xí)為主,問(wèn)題域比較小和理想化。所以大學(xué)教育其實(shí)非常重要,基本的架構(gòu)設(shè)計(jì)思維在那個(gè)時(shí)候就已經(jīng)埋下種子,后面工程實(shí)踐中進(jìn)一步消化和應(yīng)用,隨著經(jīng)驗(yàn)的積累,我們能夠解決的問(wèn)題域復(fù)雜性和規(guī)模逐漸變大,但基本的武器還是抽象、分層和分治等思維。我認(rèn)為一個(gè)架構(gòu)師的成長(zhǎng)高度和他大學(xué)期間的思維習(xí)慣的養(yǎng)成關(guān)系密切。我所知道世界一流的互聯(lián)網(wǎng)公司,例如谷歌等,招聘工程師新人時(shí),對(duì)數(shù)據(jù)結(jié)構(gòu)和算法的要求可以用苛刻來(lái)形容,這個(gè)可以理解,谷歌級(jí)別公司要解決的問(wèn)題都是超級(jí)復(fù)雜的,基本思維功底薄弱根本無(wú)法應(yīng)對(duì)。對(duì)于工作經(jīng)驗(yàn)5年的工程師新手,如果你大學(xué)時(shí)代是屬于荒廢型的,建議工作之余把相關(guān)課程再好好自學(xué)一把。個(gè)人推薦參考美國(guó)Berkeley大學(xué)的數(shù)據(jù)結(jié)構(gòu)課程CS61B附錄8.1進(jìn)行學(xué)習(xí),對(duì)建立抽象編程思維非常有幫助,我本人在研究生階段自學(xué)過(guò)這門課程,現(xiàn)在回想起來(lái)確實(shí)受益匪淺,注意該課程中的所有Lab/Homework/Project都要實(shí)際動(dòng)手做一遍,才有好的效果。我
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 家具包裝組管理制度
- 家庭打麻將管理制度
- 應(yīng)急值班點(diǎn)管理制度
- 弱電設(shè)備房管理制度
- 征收辦保密管理制度
- 微機(jī)室設(shè)備管理制度
- 心理放松室管理制度
- 快遞小袋子管理制度
- 急性肺栓塞管理制度
- 總工辦崗位管理制度
- 2025年希臘語(yǔ)A2等級(jí)考試官方試卷
- 地理-2025年中考終極押題猜想(全國(guó)卷)
- 2024年廣東省新會(huì)市事業(yè)單位公開(kāi)招聘輔警考試題帶答案分析
- 廣安2025年上半年廣安市岳池縣“小平故里英才”引進(jìn)急需緊缺專業(yè)人才筆試歷年參考題庫(kù)附帶答案詳解
- 派特靈用于女性下生殖道人乳頭瘤病毒感染及相關(guān)疾病專家共識(shí)(2025年版)解讀
- 數(shù)字化轉(zhuǎn)型背景下制造業(yè)產(chǎn)業(yè)鏈協(xié)同創(chuàng)新機(jī)制研究
- 貴州大學(xué)語(yǔ)文試題及答案
- 公司主體變更勞動(dòng)合同補(bǔ)充協(xié)議7篇
- 質(zhì)量月建筑工程質(zhì)量知識(shí)競(jìng)賽考試題庫(kù)500題(含答案)
- 早產(chǎn)兒經(jīng)口喂養(yǎng)臨床實(shí)踐專家共識(shí)(2025)解讀
- 汽車快修連鎖加盟商業(yè)計(jì)劃書(shū)
評(píng)論
0/150
提交評(píng)論