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