可以落地的软件架构
搞Java的開(kāi)發(fā)人員交談中經(jīng)常提及框架和架構(gòu)兩個(gè)詞匯。Java開(kāi)源社區(qū)活躍,大量?jī)?yōu)秀的開(kāi)源項(xiàng)目可以學(xué)習(xí)借鑒這,本來(lái)是件好事。但同時(shí)又難免會(huì)讓人好高騖遠(yuǎn),被空中樓閣所迷惑。
搞Linux下C開(kāi)發(fā),.Net開(kāi)發(fā)的同行們就很少言必稱(chēng)框架與架構(gòu),默默地編碼實(shí)實(shí)在在地做項(xiàng)目。想起剛剛參加工作時(shí)候,公司的CTO告誡年輕同事說(shuō),“別跟我扯框架,你先寫(xiě)了10萬(wàn)行代碼再和我說(shuō)”。
為什么公司的資深工程師不愿意和年輕的開(kāi)發(fā)工程師談這些內(nèi)容呢?因?yàn)閷?duì)架構(gòu)的理解是有一定的經(jīng)驗(yàn)門(mén)檻的,看不見(jiàn)摸不著的抽象概念,說(shuō)者難以描述清楚,聽(tīng)著更加難以理解產(chǎn)生共鳴。更何況軟件行業(yè)鐵打的營(yíng)盤(pán)流水的兵,因?yàn)閲?guó)內(nèi)生存壓力大,愿意沉下心去研究技術(shù)的人就更少了。
一般來(lái)講,5年的編程實(shí)踐經(jīng)驗(yàn),可以對(duì)框架有很好的理解;再加上3年的系統(tǒng)設(shè)計(jì)實(shí)踐經(jīng)驗(yàn),完全可以獨(dú)立進(jìn)行架構(gòu)設(shè)計(jì)。可以看到很多架構(gòu)師招聘廣告中,都要求有8~10年的研發(fā)經(jīng)驗(yàn),是有一定道理的。那種天資聰穎悟性高,一入行就有高人指點(diǎn),同時(shí)又從事大型項(xiàng)目研發(fā)的當(dāng)屬少數(shù)例外了。
我一直苦于無(wú)從著手學(xué)起,雖然獨(dú)立設(shè)計(jì)做了好幾個(gè)項(xiàng)目,對(duì)于如何進(jìn)行架構(gòu)設(shè)計(jì)心里還是沒(méi)底,缺少理論方法指導(dǎo)。國(guó)外這方面的著作大都洋洋灑灑,高來(lái)高去,翻譯成中文的就更加晦澀難懂。一直到讀了溫昱先生寫(xiě)的那本《一線架構(gòu)師實(shí)踐指南》 ,受到啟蒙有茅塞頓開(kāi)的感覺(jué)。強(qiáng)烈推薦有志于成為架構(gòu)師的同行,去讀下這本實(shí)踐中總結(jié)出來(lái)的經(jīng)驗(yàn)之談,內(nèi)容描述深入淺出通俗易懂。
市面上能看到的大都是產(chǎn)品最終的架構(gòu)圖,很少有完整的架構(gòu)設(shè)計(jì)文檔公開(kāi),包括Apache上的開(kāi)源項(xiàng)目都很少有介紹架構(gòu)的文檔。更不要說(shuō)在架構(gòu)設(shè)計(jì)的過(guò)程中,是如何從草圖開(kāi)始一步步演進(jìn),成為最終成品的。這種單個(gè)案例的深度分析,對(duì)我來(lái)說(shuō)是最有學(xué)習(xí)價(jià)值的。
在軟件架構(gòu)設(shè)計(jì)方面,我本人才剛剛?cè)腴T(mén),功力太淺,唯有寫(xiě)些自己在實(shí)踐中的思考瑣碎。
1架構(gòu)到底是什么
Software Architecture,翻譯過(guò)來(lái)叫軟件架構(gòu),還有的叫軟件體系結(jié)構(gòu),系統(tǒng)架構(gòu)。軟件架構(gòu)用來(lái)描述系統(tǒng)中的一些重大決策,好比一幢大廈的骨干結(jié)構(gòu)。
你說(shuō),這不扯淡嗎,說(shuō)了和沒(méi)說(shuō)一個(gè)樣。什么叫重大決策?領(lǐng)導(dǎo)每次都是發(fā)表了重要講話,到底哪一次是不重要的?
好吧,既然講不清楚這個(gè)抽象的概念,我再細(xì)化描述下我理解中的架構(gòu)應(yīng)該包含的東西:
1) 從邏輯功能劃分上描述清楚系統(tǒng)中的各個(gè)組件(子系統(tǒng)、功能模塊)的作用職責(zé),組件與組件之間的依賴(lài)關(guān)系,接口方式及參數(shù)。
2) 從物理部署上描述清楚每個(gè)物理服務(wù)器節(jié)點(diǎn)上應(yīng)該部署哪些組件,組件與組件之間的通訊方式,服務(wù)器、存儲(chǔ)設(shè)備與網(wǎng)絡(luò)環(huán)境的參數(shù)指標(biāo)。
3) 開(kāi)發(fā)子工程的劃分,子工程的依賴(lài)關(guān)系。有時(shí)還包括具體的技術(shù)選型。工作任務(wù)的粒度劃分應(yīng)該與團(tuán)隊(duì)中的人員素質(zhì)相匹配,讓專(zhuān)業(yè)的人做專(zhuān)業(yè)的事。
4) 系統(tǒng)中數(shù)據(jù)的存儲(chǔ)方式,寫(xiě)文件還是寫(xiě)數(shù)據(jù)庫(kù),數(shù)據(jù)的格式定義。是關(guān)系型數(shù)據(jù)庫(kù)還是其它存儲(chǔ),集中式還是分布式。數(shù)據(jù)的冗余備份機(jī)制。
5) 系統(tǒng)中的運(yùn)行進(jìn)程與線程,啟動(dòng)與停止的先后順序,進(jìn)程間的通信機(jī)制,線程間互斥資源的加鎖與同步。
6) 系統(tǒng)在安全性、可用性、伸縮性、可擴(kuò)展性、高性能方面的考量。
綜上,軟件架構(gòu)涵蓋的范圍很廣,難以用一兩句話表達(dá)清楚。最終就造成給大家的感覺(jué)是,架構(gòu)是很玄妙的東西,好像只可意會(huì)不可言傳一樣。
本文的基本觀念是,架構(gòu)設(shè)計(jì)是可以清晰表達(dá)出來(lái),有效指導(dǎo)開(kāi)發(fā)人員開(kāi)展設(shè)計(jì)和編碼工作的。好的架構(gòu)設(shè)計(jì)應(yīng)該是可以落地的,是一個(gè)不斷演進(jìn)改良的過(guò)程。
2可以落地的架構(gòu)設(shè)計(jì)
我見(jiàn)過(guò)很多項(xiàng)目做完都沒(méi)有架構(gòu)設(shè)計(jì)的過(guò)程。一上來(lái)就是經(jīng)典的三層/四層分層架構(gòu),數(shù)據(jù)庫(kù)模型設(shè)計(jì)完,然后就直接SSH開(kāi)發(fā)工程原型搭建好,開(kāi)工編碼了,系統(tǒng)所有功能在一個(gè)Web里面搞定。
領(lǐng)導(dǎo):“小王,我們的系統(tǒng)架構(gòu)設(shè)計(jì)已經(jīng)做好了。你著手開(kāi)始開(kāi)發(fā)吧,確保高質(zhì)量完成項(xiàng)目,一個(gè)月結(jié)項(xiàng)。年輕人只要好好干,升職加薪不在話下,當(dāng)上CEO迎娶白富美指日可待。”
其邏輯架構(gòu)圖大致是這樣的:
開(kāi)發(fā)工程師小王拿過(guò)這個(gè)圖一看,這尼瑪就是天書(shū)啊,還要求一個(gè)月完工,心中頓時(shí)一萬(wàn)匹草泥馬奔騰而過(guò)。
你能說(shuō)這不是架構(gòu)圖嗎?是,確實(shí)是分層的邏輯架構(gòu),還列出了技術(shù)框架選型。
問(wèn)題是,它是放之四海而皆準(zhǔn)的一個(gè)通用的設(shè)計(jì)。對(duì)小王來(lái)說(shuō),這個(gè)架構(gòu)設(shè)計(jì)就是沒(méi)有落地的設(shè)計(jì),迷茫啊迷茫。
再看一個(gè)基于HTTP進(jìn)行消息通信的系統(tǒng),其邏輯架構(gòu)圖如下:
小王如果拿到這張圖,起碼可以獲得以下信息:
1) 系統(tǒng)整體上分為消息中介、管理控制臺(tái)和后臺(tái)服務(wù)三個(gè)組件。
2) 消息中介服務(wù)接收應(yīng)用系統(tǒng)發(fā)來(lái)的HTTP請(qǐng)求消息,存儲(chǔ)到數(shù)據(jù)庫(kù)和消息隊(duì)列中間件中,并根據(jù)業(yè)務(wù)需要負(fù)責(zé)對(duì)消息進(jìn)行轉(zhuǎn)發(fā)。
3) 管理控制臺(tái)用于對(duì)通信子系統(tǒng)進(jìn)行配置管理,查詢(xún)分析。
4) 后臺(tái)服務(wù)用于實(shí)現(xiàn)消息重發(fā)服務(wù),歷史數(shù)據(jù)清理服務(wù)。
小王拿到這個(gè)圖至少可以做到心中有數(shù),系統(tǒng)的功能模塊有哪些,應(yīng)該劃分成幾個(gè)開(kāi)發(fā)工程,哪些是可以應(yīng)用開(kāi)源項(xiàng)目,哪些通用功能可以進(jìn)行抽取。
如果小王是一個(gè)有經(jīng)驗(yàn)的高級(jí)工程師,看了這個(gè)圖,結(jié)合需求文檔,直接就可以開(kāi)始進(jìn)行領(lǐng)域模型設(shè)計(jì),建表,搭建工程開(kāi)發(fā)功能了。每個(gè)組件開(kāi)發(fā)完后,做下代碼Review確保功能模塊都有實(shí)現(xiàn)即可。(對(duì)高級(jí)工程師來(lái)說(shuō),代碼就是最好的設(shè)計(jì)了)
如果小王是一個(gè)中級(jí)工程師,則還需要對(duì)開(kāi)發(fā)包進(jìn)行劃分,領(lǐng)域模型類(lèi)設(shè)計(jì),包與包之間的接口參數(shù)定義,數(shù)據(jù)格式以及一些關(guān)鍵的類(lèi)圖設(shè)計(jì)提供。有疑問(wèn)的地方進(jìn)行面對(duì)面澄清即可。(對(duì)中級(jí)工程師來(lái)說(shuō),要先確認(rèn)關(guān)鍵類(lèi)圖設(shè)計(jì)了才能開(kāi)始開(kāi)發(fā))
如果小王是一個(gè)初級(jí)開(kāi)發(fā)工程師,則需要開(kāi)發(fā)工程的原型代碼,重要的接口類(lèi)與核心功能類(lèi)開(kāi)發(fā)完后才能交給他。配合詳細(xì)的類(lèi)圖設(shè)計(jì),時(shí)序圖以及狀態(tài)圖設(shè)計(jì)進(jìn)行輔助指導(dǎo),開(kāi)發(fā)過(guò)程中進(jìn)行檢查與幫助。(對(duì)初級(jí)工程師來(lái)說(shuō),要有代碼范例可參照,詳細(xì)的類(lèi)名方法參數(shù)定義,并且提供協(xié)助才能開(kāi)發(fā))
也就是說(shuō),架構(gòu)設(shè)計(jì)的成果是不是足以指導(dǎo)開(kāi)發(fā)人員進(jìn)行設(shè)計(jì)編碼,是看項(xiàng)目團(tuán)隊(duì)的人員素質(zhì)的。一般來(lái)說(shuō),架構(gòu)設(shè)計(jì)的粒度比系統(tǒng)概要設(shè)計(jì)要粗,但有時(shí)候也會(huì)細(xì)化到概要設(shè)計(jì)和詳細(xì)設(shè)計(jì)之間。架構(gòu)設(shè)計(jì)應(yīng)該一直細(xì)化到能指導(dǎo)團(tuán)隊(duì)開(kāi)展實(shí)際設(shè)計(jì)開(kāi)發(fā)為止,也就是我上面講述的觀念,架構(gòu)設(shè)計(jì)是可以落地的。
甚至有架構(gòu)師說(shuō),代碼可以表述出來(lái)的架構(gòu),才是好架構(gòu)。水中月夢(mèng)中花,再唯美也是虛幻的。
3架構(gòu)師的關(guān)鍵作用
那架構(gòu)師對(duì)項(xiàng)目組有很大的作用嗎?
搞管理信息系統(tǒng)的人說(shuō),沒(méi)有用,整天搞一堆看不懂的設(shè)計(jì),還浪費(fèi)我們時(shí)間。沒(méi)有他,我們照樣做項(xiàng)目。
搞互聯(lián)網(wǎng)應(yīng)用的人說(shuō),作用非常大。沒(méi)有他,我們的項(xiàng)目分分鐘歇菜,那些復(fù)雜的技術(shù)問(wèn)題只有他能解決。
顯然,隨著項(xiàng)目的規(guī)模變大,復(fù)雜性加大,越凸顯出架構(gòu)師的作用。
實(shí)際上,即使是一個(gè)最簡(jiǎn)單的管理信息系統(tǒng),也是包含有架構(gòu)設(shè)計(jì)在里面的。麻雀雖小五臟俱全。用戶(hù)角色權(quán)限管理,審計(jì)日志記錄,MVC框架,ORM框架,緩存設(shè)計(jì)這些地方都包含有架構(gòu)設(shè)計(jì)在里面。
架構(gòu)師的作用在于銜接業(yè)務(wù)需求與系統(tǒng)設(shè)計(jì),根據(jù)現(xiàn)實(shí)條件,設(shè)計(jì)出一個(gè)最合適的解決方案。將業(yè)務(wù)需求轉(zhuǎn)彎為可落地的架構(gòu)設(shè)計(jì),是最大的價(jià)值所在。
而如何從業(yè)務(wù)需求中抽象出功能模塊的劃分,通用功能的抽取,組件的粒度如何適中,還要考慮現(xiàn)實(shí)環(huán)境的約束,預(yù)留業(yè)務(wù)發(fā)展的空間,如何深入淺出說(shuō)服對(duì)開(kāi)發(fā)人員理解并接納自己的架構(gòu),這些都是很難的。
最困難的不是去學(xué)習(xí)技術(shù)產(chǎn)品,解決高并發(fā)海量數(shù)據(jù)的挑戰(zhàn);而是思維方式的養(yǎng)成。前者有現(xiàn)成的方案可借鑒模仿,后者只能靠經(jīng)驗(yàn)去感悟。
對(duì)我來(lái)說(shuō),最難的地方是如何高屋建瓴地,站在系統(tǒng)外,以全局的高度看待多個(gè)系統(tǒng)生態(tài)圈,抽象出一個(gè)個(gè)業(yè)務(wù)組件。開(kāi)發(fā)人員如果只能盯著眼前的一畝三分地(模塊設(shè)計(jì),OOD),就難以養(yǎng)成架構(gòu)思維。
反過(guò)來(lái)看,模塊設(shè)計(jì)又是架構(gòu)設(shè)計(jì)的基礎(chǔ),沒(méi)有前期的抽象思維的訓(xùn)練,沒(méi)有足夠的經(jīng)驗(yàn),就無(wú)法抽象出粒度適中的組件。抽象出的組件不能落地實(shí)現(xiàn),就會(huì)被開(kāi)發(fā)人員認(rèn)為不切實(shí)際,沒(méi)有作用。
成為架構(gòu)師的前提條件,必須是一個(gè)有足夠經(jīng)驗(yàn)基礎(chǔ)扎實(shí)的程序員。知識(shí)面要廣泛,見(jiàn)多識(shí)廣,還要有一定的技術(shù)深度,能理解各種技術(shù)的原理,適用業(yè)務(wù)場(chǎng)景,優(yōu)劣點(diǎn)。同時(shí),架構(gòu)師往往還肩負(fù)著一個(gè)項(xiàng)目的技術(shù)攻關(guān),客觀上要求在承受壓力的同時(shí)保持足夠的韌性。如果沒(méi)有機(jī)會(huì)去獨(dú)立負(fù)責(zé)一個(gè)個(gè)項(xiàng)目,是很難從主觀上養(yǎng)成架構(gòu)思維的,動(dòng)力不足。
也就是說(shuō),是實(shí)現(xiàn)業(yè)務(wù)需求的過(guò)程中,實(shí)踐提升了開(kāi)發(fā)人員的抽象能力,最終培養(yǎng)成合格的架構(gòu)師。從這個(gè)角度說(shuō),我認(rèn)為架構(gòu)師和高級(jí)開(kāi)發(fā)工程師只是職務(wù)上的叫法不同,做的工作很有可能是相同的。通俗點(diǎn)講,一個(gè)項(xiàng)目里概要設(shè)計(jì)是由誰(shuí)主導(dǎo)的,那這個(gè)人無(wú)形中已經(jīng)進(jìn)行了架構(gòu)設(shè)計(jì)的思維訓(xùn)練。
4架構(gòu)思維的培養(yǎng)
那架構(gòu)設(shè)計(jì)的抽象思維可不可以培養(yǎng)呢?
我認(rèn)為是可以通過(guò)訓(xùn)練培養(yǎng)出來(lái)的。通過(guò)對(duì)代碼重構(gòu)可以促進(jìn)對(duì)OOD思維的培養(yǎng)。但是架構(gòu)設(shè)計(jì)往往不能頻繁改動(dòng),牽涉面廣(如開(kāi)篇所說(shuō)架構(gòu)設(shè)計(jì)描述的是系統(tǒng)的重大決策),無(wú)法像重構(gòu)的方式進(jìn)行修改,只能溫和地進(jìn)行改良。
架構(gòu)設(shè)計(jì)的過(guò)程,應(yīng)該是不斷地演進(jìn)完成的。經(jīng)驗(yàn)需要積累,沒(méi)有經(jīng)驗(yàn)時(shí)只能一個(gè)個(gè)項(xiàng)目實(shí)踐來(lái)培養(yǎng)經(jīng)驗(yàn),同時(shí)借鑒其他人的架構(gòu)設(shè)計(jì)(很難拿到素材)。如果能有機(jī)會(huì)和一些資深架構(gòu)師一起工作交流,相信能事半功倍,早點(diǎn)領(lǐng)悟。
我在做架構(gòu)設(shè)計(jì)的初期,喜歡拿個(gè)筆在本子上畫(huà)草圖,幫助自己思考,往往涂掉三十頁(yè)紙才確定出第一個(gè)可行的版本(用電腦畫(huà)圖工具會(huì)使思維停頓,思考效率降低,手工畫(huà)圖最快捷)。架構(gòu)圖出來(lái)后,寫(xiě)文檔只是描述細(xì)化的過(guò)程,有工作量沒(méi)有難度。當(dāng)然,以后再遇到類(lèi)似的業(yè)務(wù)需求的項(xiàng)目,就可以借鑒之前項(xiàng)目的經(jīng)驗(yàn)了。
以上就是我在架構(gòu)設(shè)計(jì)過(guò)程中的一點(diǎn)所思所想,還非常淺薄。
from:?http://blog.csdn.net/joeyon1985/article/details/42121187
總結(jié)
- 上一篇: Quartz 入门详解
- 下一篇: 关于JavaScript语句后面的分号