"架構"是程序員很是熟悉的一個概念,作一個架構師也是不少程序員的職業發展目標,但若是正兒八經地問程序員"什麼是架構",估計大部分都回答不上來,這是爲何呢?程序員
首先,由於太熟悉了,因此反而沒有深刻地去思考和理解,反正一說架構,好像每一個人都知道是什麼意思,也沒有必要花費太多的精力去深刻理解了。架構
其次,由於同級別的概念容易混淆,包括系統、結構、架構、子系統這幾個詞,看起來你們都理解,但仔細一看又有點迷糊。例如:架構是結構嗎?多個子系統結合在一塊兒好像就是架構吧?ui
看來"什麼是架構"這個問題並不簡單,咱們須要有打破沙鍋問到底的精神去探索一下。如下是百度百科的解釋(http://baike.baidu.com/subview/1950551/12477396.htm)以下:架構設計
架構是對存儲在Active Directory中的對象類別和屬性,對於每個對象類別 來講,該架構定義了對象類必須具備的屬性,它也能夠有附加的屬性,而且該對象能夠是它的父對象。翻譯
對於這個解釋,相信大部分人都和我同樣的感受:沒看懂,這是在說面向對象嗎?設計
Architecture is both the process and the product of planning,designing,and constructing buildings and other physical structures.對象
這裏架構描述爲」既是過程又是產品「,相信大部分人也和我同樣的感受:怎麼感受和咱們理解的徹底不是一回事?繼續探索,終於在詞典上找到一個很好的解釋:圖片
(computer science) the structure and organization of a computer's hardware or system software.ip
翻譯過來的意思就是:**計算機硬件或者軟件系統的結構和組織。雖然這裏強調的是在計算機領域,可是其實去掉這個限定,架構的定義在其它領域也同樣適用,即:架構是系統的結構和組織。 ** 這個解釋很是容易理解,且同時回答了咱們以前提到的問題」架構、系統、結構是什麼關係「架構就是結構,可是指的是系統級結構,也就是說:」架構是系統的頂層結構「。
除了」頂層「外,」系統「這個詞也須要特別注意,由於咱們常常說」系統「、」子系統「之類的術語,那麼架構是否就只能指」系統「的頂層結構,不能指」子系統「的頂層結構呢?
相信大部人憑感受都認爲這是不對的,由於我常常聽到」新浪微博架構「、」新浪微博消息系統架構「、」QQ架構「、」QQ圖片系統架構「等,這裏的」新浪微博消息系統「是」新浪微博「的一個子系統;」QQ圖片系統「是」QQ「的一個子系統,但並不能說」新浪微博消息系統「和」QQ圖片系統「就沒有架構了。因此這裏說的」系統「和」子系統「實際上是一個相對的概念,」子系統「也是」系統「,也有自已的架構。
明確了架構定義以後,」架構設計「的定義也就水到渠成了----架構設計就是設計 系統的頂層結構。不過,這句話實際上是一句正確的廢話,要想真正作好架構設計,咱們必須更深刻的去探索一番。最典型的問題就是:咱們爲何要作架構設計?
估計這個問題和」什麼是架構設計「同樣,由於你們都熟悉了,根本沒怎麼去思考,因此一旦問題起來反而一會兒矇住了。要回答這個問題,咱們採用」逆向思惟「的方式來思考,即:若是不作架構設計會怎麼樣?這個問題相信不少人很容易就答出來了。
首先,若是不作架構設計,系統就處於一種混沌狀態,很是複雜,有幾十上百甚至上千個技術點。當咱們構思系統要實現某個功能或者業務時,須要同時關注幾十上百個技術點。可是人類的思惟是有侷限性的,根據科學研究,人類最多可以關注7+2或7-2個點,這就是著名的72法則,超出這個範圍,人類的思惟就跟不上了,因此咱們必須將系統劃分爲幾個大的模塊(或者叫子系統也能夠,可是爲了和」系統「區分,本文將統一稱」模塊「),每次關注 的點7+2或7-2個,這樣人類的思惟才能更好的思考、分析、解決問題。
概括起來第一條就是:架構設計的目的是爲了隔離關注點,下降複雜度。
其次,若是不作架構設計,系統就是一個大一統的的總體,當咱們有幾百個開發團隊時,這些團隊沒法分工合做,要麼蜂擁而上,要麼無從下手,整個系統的實現過程就會變成一團亂麻。因此,咱們必須將系統劃分爲幾個大的模塊,不一樣的團隊負責不一樣的模塊,從而達到分工工做的目的,提高總體工做效率。
概括起來第二條就是:架構設計是爲了更好的分工合做。
理解了「爲何要作架構設計」後,架構設計的任務也就天然得出來了:架構設計的任務就是將系統劃分爲不一樣的模塊。固然,咱們也不能簡單地一拆了事,拆完模塊後還要考慮讓這些模塊可以互相聯繫、互相溝通、互相配合,這樣纔可以完成系統的功能 。
咱們以一個簡單的公式來表達架構設計:架構=模塊+交互!模塊就是「模塊1」、「模塊2」等,交互就是模塊之間的鏈接線。
若是你還記得咱們最開對面向對象的定義的話,你必定會發現一個驚人的事實:架構設計和麪向對象程序設計很是類似,面向對象的的公式:程序=對象+交互。
看起來多是巧合,其實否則,緣由在於架構設計就是「面向對象」思想的一個具體的應用而已。也就是說,「面向對象」的思想能夠指導程序設計,也能夠指導架構設計;並且在架構設計領域,能夠說只有「面向對象」這一種指導思想,由於架構設計必須劃分出模塊並設計好模塊的交互方式。
更進一步分析:
面向對象程序設計經過封裝爲「類」來下降複雜度,面向對象架構設計經過封裝「模塊」來下降複雜度;
面向對象程序設計經過「類交互」來完成分工合做,面向對象架構設計經過「模塊交互」來完成分工合做。