架構(gòu)師是整個(gè)軟件工程和軟件生命周期里面相當(dāng)重要的一個(gè)角色,介于軟件需求和開發(fā)之間的一個(gè)承上啟下的關(guān)鍵角色,即能夠?qū)崿F(xiàn)業(yè)務(wù)需求和場(chǎng)景到最終軟件實(shí)現(xiàn)的第一次高度抽象建模。在更早的階段一般會(huì)談系統(tǒng)分析員角色,那么這個(gè)角色往往會(huì)同時(shí)兼顧軟件需求和軟件架構(gòu)的工作。
軟件架構(gòu)簡單來說就是將業(yè)務(wù)或軟件需求進(jìn)行高度抽象,形成靜態(tài)和動(dòng)態(tài)的模型,通過形式化的模型來表達(dá)和闡述真實(shí)的業(yè)務(wù)需求。同時(shí)這個(gè)抽象化的模型又能夠很好的指導(dǎo)后續(xù)的開發(fā)實(shí)現(xiàn)。
軟件架構(gòu)要做三個(gè)方面的工作:
第一:針對(duì)軟件需求中的業(yè)務(wù)場(chǎng)景和流程,功能性需求進(jìn)行功能性架構(gòu)設(shè)計(jì),其中包括了核心的功能架構(gòu)設(shè)計(jì),子系統(tǒng)和模塊的劃分,接口和集成模式的設(shè)計(jì),數(shù)據(jù)架構(gòu)和數(shù)據(jù)模型的設(shè)計(jì)等。即通過概念模型,類圖或數(shù)據(jù)庫設(shè)計(jì)等靜態(tài)模型+用例,序列圖等動(dòng)態(tài)模型共同來抽象表達(dá)出完整的業(yè)務(wù)需求。
第二:通過軟件需求中的非功能性需求,來考慮整個(gè)系統(tǒng)的技術(shù)架構(gòu)設(shè)計(jì),技術(shù)架構(gòu)本身又包括了類似消息,緩存,安全,日志等關(guān)鍵技術(shù)的實(shí)現(xiàn),也包括了IT基礎(chǔ)設(shè)施和部署架構(gòu)的設(shè)計(jì),同時(shí)還包括了類似高可用,高可靠,高性能,高擴(kuò)展等非功能性需求滿足的架構(gòu)設(shè)計(jì)。
第三:對(duì)于軟件生命周期和軟件工程域標(biāo)準(zhǔn)內(nèi)容的設(shè)計(jì),其中包括了開發(fā)框架,技術(shù)選型,軟件生命周期,持續(xù)集成模式,架構(gòu)標(biāo)準(zhǔn)規(guī)范,開發(fā)規(guī)范,測(cè)試規(guī)范,以及各種架構(gòu)規(guī)約和約束等方面的內(nèi)容設(shè)計(jì)。同時(shí)還需要基于上面內(nèi)容進(jìn)行相應(yīng)的架構(gòu)原型搭建和驗(yàn)證工作,確保架構(gòu)設(shè)計(jì)內(nèi)容能夠真正落地。
要能夠做好上面三方面的內(nèi)容,一個(gè)真正架構(gòu)師必須既懂技術(shù)又懂業(yè)務(wù),而對(duì)于當(dāng)前很多互聯(lián)網(wǎng)應(yīng)用,由于本身工作相對(duì)細(xì)分,可以看到很多架構(gòu)師往往僅僅只需要專研深核心技術(shù)領(lǐng)域的技術(shù)和某一垂直業(yè)務(wù)場(chǎng)景即可。在這點(diǎn)上企業(yè)內(nèi)部信息化架構(gòu)師和互聯(lián)網(wǎng)本身還是存在區(qū)別,企業(yè)內(nèi)部架構(gòu)師更加強(qiáng)調(diào)業(yè)務(wù)+技術(shù)綜合能力。
架構(gòu)設(shè)計(jì)的核心目的是全面的理解業(yè)務(wù)需求后給出整體的技術(shù)方案,避免后續(xù)在開發(fā)實(shí)現(xiàn)中遺漏。架構(gòu)設(shè)計(jì)內(nèi)容不僅僅是指導(dǎo)后續(xù)的詳細(xì)設(shè)計(jì)和開發(fā),同時(shí)更加重要的是通過組件和劃分和接口的設(shè)計(jì),讓后續(xù)的開發(fā)工作真正能夠并行起來,最終再進(jìn)行集成,以降低軟件研發(fā)的復(fù)雜度,同時(shí)又縮短軟件開發(fā)周期提升效率。
能夠把一個(gè)復(fù)雜的大系統(tǒng)真正想清楚和透徹,同時(shí)還能夠把大系統(tǒng)拆散為松耦合的多個(gè)模塊,最終又在各個(gè)模塊獨(dú)立并行完成開發(fā)后,能夠通過預(yù)先定義的接口將這些模塊又組裝和集成起來,這就是一個(gè)真正架構(gòu)師應(yīng)該做的事情。我們也可以看到,一個(gè)好的建筑工程師往往就具備如上能力。
技術(shù)最終是解決業(yè)務(wù)問題和為業(yè)務(wù)服務(wù),也正是整個(gè)原因,一個(gè)好的架構(gòu)師不應(yīng)該陷入到技術(shù)驅(qū)動(dòng),而是業(yè)務(wù)驅(qū)動(dòng);不是選擇最新,最熱的技術(shù)或框架,而是應(yīng)該選擇當(dāng)前最合適的技術(shù)和框架。架構(gòu)師應(yīng)該避免過度設(shè)計(jì)和技術(shù)狂熱,而是真正做好業(yè)務(wù)和技術(shù)的適配,成本和收益的分析工作。
胸有成竹,那么一定是自己已經(jīng)畫過無數(shù)次的竹子,也正是這個(gè)原因架構(gòu)師往往都是從一線技術(shù)開發(fā)多年的實(shí)踐積累后組建鍛煉出來的,好的架構(gòu)師一定來源于實(shí)踐而非理論,只有這樣既保證了架構(gòu)設(shè)計(jì)的高屋建瓴,又確保了最終的架構(gòu)設(shè)計(jì)能夠真正落地。長期脫離實(shí)踐的架構(gòu)師往往很容易犯經(jīng)驗(yàn)主義錯(cuò)誤,設(shè)計(jì)出空中樓閣式的架構(gòu),看起來完美,實(shí)質(zhì)上卻虛于表面。
架構(gòu)師應(yīng)該具備的架構(gòu)思維
對(duì)于架構(gòu)思維本身仍然是類似系統(tǒng)思維,結(jié)構(gòu)化思維,編程思維等諸多思維模式的一個(gè)合集。由于架構(gòu)的核心作用是在業(yè)務(wù)現(xiàn)實(shí)世界和抽象的IT實(shí)現(xiàn)之間建立起一道橋梁,因此架構(gòu)思維最核心的就是要理解到業(yè)務(wù)驅(qū)動(dòng)技術(shù),技術(shù)為最終的業(yè)務(wù)服務(wù)。
因此要真正通過架構(gòu)設(shè)計(jì)來完成業(yè)務(wù)和技術(shù),需求和實(shí)現(xiàn),軟件和硬件,靜態(tài)和動(dòng)態(tài),成本和收益等多方面的平衡。
分解是最基礎(chǔ)的,架構(gòu)的重點(diǎn)就是要對(duì)復(fù)雜問題進(jìn)行分而治之,同時(shí)保證分解后的各個(gè)部分還能夠高內(nèi)聚,松耦合,最終又集成為一個(gè)完整的整體。分解核心是定義問題,因此架構(gòu)首先仍然需要理解清楚需求。
集成是配合分解完成的動(dòng)作,最終分解完成的各個(gè)組件或子系統(tǒng),通過合適的接口設(shè)計(jì),最終還能夠集成為一個(gè)完整的整體,分解僅僅是加速開發(fā)和降低問題復(fù)雜度,如果分解后的內(nèi)容無法集成在一起,那么分解就沒有任何意義。分解+集成可以理解為架構(gòu)最核心的思考方式和方法。
動(dòng)態(tài)+靜態(tài):一直是我強(qiáng)調(diào)的重要思維模式,架構(gòu)思考里面一定要注意這兩者的結(jié)合,即涉及到流程,用例等動(dòng)態(tài)分析內(nèi)容,又涉及到數(shù)據(jù),類等靜態(tài)建模內(nèi)容,而是兩者要高度協(xié)作起來完成整個(gè)架構(gòu)思考。
復(fù)用是另外一個(gè)重要的思維,也可以理解為SOA參考架構(gòu)的核心思考模式,包括最近談的最多的業(yè)務(wù)能力組件化,組件能力服務(wù)化,平臺(tái)+應(yīng)用,共享中心建設(shè),共性能力下沉等都是談的復(fù)用的概念。及時(shí)你架構(gòu)設(shè)計(jì)一個(gè)小系統(tǒng),你也需要將各個(gè)模塊需要用的共性功能抽取為可復(fù)用的共性組件。
分層相對(duì)重要,架構(gòu)在設(shè)計(jì)中要考慮分層,而核心仍然是資源+服務(wù)+應(yīng)用的三大層,分為這三層仍然是SOA參考架構(gòu)的核心思想。對(duì)于平臺(tái)+應(yīng)用更多只是上面分層模式的一個(gè)變形。分層的目的是通過分層既理清了整個(gè)應(yīng)用的構(gòu)建過程,又保證了各層之間的獨(dú)立設(shè)計(jì)和松耦合。
模式匹配:可以講是所有思維模式里面的一個(gè)重點(diǎn),而架構(gòu)設(shè)計(jì)中的模式匹配就是要將最終的業(yè)務(wù)域問題匹配到對(duì)應(yīng)的技術(shù)實(shí)現(xiàn)上面。即根據(jù)業(yè)務(wù)需求來挑選最適合的技術(shù),而不是用主流和最先進(jìn)的技術(shù)去反推業(yè)務(wù)。
抽象是架構(gòu)思維里面的一個(gè)重點(diǎn),這里面包括了兩個(gè)層面的內(nèi)容,一個(gè)是常說的歸納方法,即各種類似場(chǎng)景的實(shí)現(xiàn)見的太多了,自然就歸納了一個(gè)規(guī)則或方法出來供以后的設(shè)計(jì)用。但是抽象更加重要,即將非類似場(chǎng)景中的共性內(nèi)容也總結(jié)出來,進(jìn)一步抽象為類似的東西,以更加方便的適應(yīng)變更和各種變化。
結(jié)構(gòu)化思維是架構(gòu)思維必須具備的,最常用的兩種結(jié)構(gòu)就是二維的表格和樹模型,通過結(jié)構(gòu)化思維引入了維度和XY概念后,可以幫助我們更好的分析和比對(duì),結(jié)構(gòu)化決策等。對(duì)于多維模型,我們也要有意識(shí)的將其轉(zhuǎn)換為多個(gè)平面二維模型,方便我們進(jìn)行分析。
迭代思維是架構(gòu)思考中需要考慮的另外一個(gè)內(nèi)容,沒有最優(yōu)的架構(gòu),只有不斷進(jìn)化的架構(gòu),只有最適合的架構(gòu)。因此架構(gòu)本身也在隨著業(yè)務(wù)需求的變化不算的迭代和演化,而不是追求用最新的技術(shù)一步到位。
最后即我們常說的系統(tǒng)思維,系統(tǒng)思維是架構(gòu)思維中最重要的思維模式,一個(gè)架構(gòu)師必須要有充分的全局思考的能力,做好前面談到各種平衡,追求整體的最優(yōu)化而不是單個(gè)目標(biāo)的最優(yōu)。