多人都想知道架構(gòu)師是做什么?我們看看下面的一段對(duì)話。
菜鳥 —— 剛?cè)腴T的程序員
老鳥 —— 資深架構(gòu)師
老鳥:菜鳥,你的目標(biāo)是什么?
菜鳥:我要成為一個(gè)軟件架構(gòu)師。
老鳥:對(duì)一個(gè)年輕的工程師來說,這是一個(gè)很好的目標(biāo)。那你為什么要成為架構(gòu)師呢?
菜鳥:我要領(lǐng)導(dǎo)一個(gè)團(tuán)隊(duì),還要做所有關(guān)于數(shù)據(jù)庫、框架和Web服務(wù)器的重要決定。
老鳥:好吧,如果是這樣,你就沒必要成為一個(gè)軟件架構(gòu)師了。
菜鳥:當(dāng)然有必要了!我要成為一個(gè)能夠做所有重要決定的人。
老鳥:這樣很好,只是你沒有列出哪些才是重要的決定。你剛才說的那些跟重要的決定沒有什么關(guān)系。
菜鳥:你說什么?難道數(shù)據(jù)庫不重要?你知道我們?cè)跀?shù)據(jù)庫上面花了多少錢嗎?
老鳥:可能很多。不過數(shù)據(jù)庫仍然不是最重要的。
菜鳥:你怎么能這么說呢?數(shù)據(jù)庫可是整個(gè)系統(tǒng)的心臟啊!所有的數(shù)據(jù)都保存在這里,它們?cè)谶@里被排序,被索引,被訪問。如果沒有數(shù)據(jù)庫,整個(gè)系統(tǒng)就無法運(yùn)作!
老鳥:數(shù)據(jù)庫只不過是一個(gè)IO設(shè)備,它提供了一些有用的工具對(duì)數(shù)據(jù)進(jìn)行排序、查詢,并生成報(bào)表,但這些工具都只是整個(gè)系統(tǒng)的附屬品。
菜鳥:附屬品?真是不可思議。
老鳥:是的,附屬品。你的系統(tǒng)業(yè)務(wù)邏輯或許會(huì)用到這些工具,但這些工具并非業(yè)務(wù)邏輯固有的組成部分。如果有必要,你可以隨時(shí)替換掉這些工具,但業(yè)務(wù)邏輯還是那些業(yè)務(wù)邏輯。
菜鳥:好吧,不過如果把這些工具替換掉,我們就要重新實(shí)現(xiàn)業(yè)務(wù)邏輯了。
老鳥:那是你的問題。
菜鳥:為什么這么說?
老鳥:你認(rèn)為業(yè)務(wù)邏輯依賴數(shù)據(jù)庫,但實(shí)際上不是這樣的。如果你的架構(gòu)足夠好,最起碼業(yè)務(wù)邏輯不應(yīng)該依賴數(shù)據(jù)庫。
菜鳥:這太瘋狂了。我怎么可能創(chuàng)建出不使用這些工具的業(yè)務(wù)邏輯?
老鳥:我并沒有說業(yè)務(wù)邏輯不要使用數(shù)據(jù)庫工具,我的意思是它們不應(yīng)該依賴這些工具。業(yè)務(wù)邏輯不應(yīng)該知道使用的是哪一種數(shù)據(jù)庫。
菜鳥:如果業(yè)務(wù)邏輯對(duì)數(shù)據(jù)庫一無所知,它怎么使用這些工具呢?
老鳥:依賴反轉(zhuǎn)。你要讓數(shù)據(jù)庫依賴業(yè)務(wù)邏輯,而不是讓業(yè)務(wù)邏輯依賴數(shù)據(jù)庫。
菜鳥:你的話讓人費(fèi)解。
老鳥:費(fèi)解嗎?我講的可是軟件架構(gòu)。這個(gè)就是依賴反轉(zhuǎn)原則,讓下層策略來依賴上層策略。
菜鳥:那就更加費(fèi)解了!既然上層策略(假設(shè)你指的是業(yè)務(wù)邏輯)要調(diào)用下層策略(假設(shè)你指的是數(shù)據(jù)庫),那么就應(yīng)該是上層策略依賴依賴下層策略,就像調(diào)用者依賴被調(diào)用者一樣。這是眾所周知的!
老鳥:在運(yùn)行時(shí)確實(shí)是這樣的,但在編譯時(shí)我們要把依賴反轉(zhuǎn)過來。上層策略的代碼里不要引用任何下層策略的代碼。
菜鳥:拜托!不引用代碼就無法調(diào)用它們。
老鳥:當(dāng)然可以調(diào)用了。面向?qū)ο缶涂梢宰龅健?/p>
菜鳥:面向?qū)ο髮?duì)真實(shí)世界進(jìn)行建模,把數(shù)據(jù)和函數(shù)組合到對(duì)象里,把代碼組織成直觀的結(jié)構(gòu)。
老鳥:這是他們告訴你的嗎?
菜鳥:所有人都知道的,這不是很明顯的事情嗎?
老鳥:確實(shí)如此。不過,面向?qū)ο笫强梢宰龅讲灰靡材苷{(diào)用的。
菜鳥:好吧,那它是怎么做到的?
老鳥:你應(yīng)該知道,在面向?qū)ο笙到y(tǒng)里對(duì)象會(huì)給其它對(duì)象發(fā)送消息的,對(duì)吧?
菜鳥:是的,當(dāng)然。
老鳥:那么你就該知道,消息發(fā)送者是不知道消息接收者是什么類型的。
菜鳥:這要看使用的是哪一種語言了。在JAVA里,發(fā)送者最起碼要知道接收者的基本類型。在Ruby里,發(fā)送者知道接收者一定會(huì)處理它所發(fā)送的消息。
老鳥:是的。不過不管是哪一種情況,發(fā)送者都不知道接收者具體的類型。
菜鳥:嗯,是的。
老鳥:所以發(fā)送者可以給接收者傳遞一個(gè)函數(shù),讓接收者執(zhí)行這個(gè)函數(shù),這樣發(fā)送者就不需要知道接收者是什么類型了。
菜鳥:沒錯(cuò)。我了解你的意思。不過發(fā)送者仍然依賴接收者。
老鳥:在運(yùn)行時(shí)確實(shí)是的,但在編譯時(shí)不是這樣的。發(fā)送者的代碼里并沒有引用接收者的代碼。實(shí)際上,是接收者的代碼依賴了發(fā)送者的代碼。
菜鳥:啊!但發(fā)送者仍然會(huì)依賴接收者的類。
老鳥:看來需要用代碼來說明了,我用Java來寫些代碼。首先是發(fā)送者代碼:

老鳥:下面是接收者代碼:

老鳥:可以看到,接收者代碼依賴了發(fā)送者代碼,也就是說SpecificReceiver依賴了Sender。同時(shí)可以看到,發(fā)送者代碼對(duì)接收者代碼一無所知。
菜鳥:哈,你作弊了。你把接收者的接口放到了發(fā)送者的類里了。
老鳥:你開始明白了。
菜鳥:明白什么?
老鳥:當(dāng)然是架構(gòu)原則啊。發(fā)送者持有接收者必須實(shí)現(xiàn)的接口。
菜鳥:如果這意味著我要使用內(nèi)部類,那么……
老鳥:使用內(nèi)部類只是方法之一,還有其它的方法。
菜鳥:請(qǐng)等一下。最開始我們討論的是數(shù)據(jù)庫,那這些跟數(shù)據(jù)庫又有什么關(guān)系呢?

老鳥:讓我們來看一下其它代碼吧。首先是一個(gè)簡單的業(yè)務(wù)邏輯

菜鳥:這個(gè)業(yè)務(wù)邏輯沒有做什么事情啊。
老鳥:這只是個(gè)例子。在實(shí)際實(shí)現(xiàn)業(yè)務(wù)邏輯的時(shí)候,不會(huì)有很多類似這樣的類的。
菜鳥:好吧。那么Gateway是用來做什么的呢?
老鳥:它為業(yè)務(wù)邏輯提供了所有訪問數(shù)據(jù)的方法。下面是它的代碼:

老鳥:要注意,這個(gè)接口是在businessRules包里面的。
菜鳥:好吧。那Something這個(gè)類又是用來做什么的呢?
老鳥:它代表一個(gè)簡單的業(yè)務(wù)對(duì)象。我把它放在另一個(gè)叫entities的包里。

老鳥:最后需要實(shí)現(xiàn)BusinessRuleGateway接口,這個(gè)實(shí)現(xiàn)類會(huì)知道相關(guān)的數(shù)據(jù)庫細(xì)節(jié):

老鳥:可以看到,業(yè)務(wù)邏輯是在運(yùn)行時(shí)對(duì)數(shù)據(jù)庫進(jìn)行調(diào)用的。而在編譯時(shí),是database包引用了businessRules包。
菜鳥:好吧,我想我明白了。你用多態(tài)性隱藏了數(shù)據(jù)庫實(shí)現(xiàn)。不過在業(yè)務(wù)邏輯里,仍然引用了數(shù)據(jù)庫的工具接口。
老鳥:不,不是這樣的。我們并沒有打算為業(yè)務(wù)邏輯提供所有的數(shù)據(jù)庫工具接口,而是業(yè)務(wù)邏輯創(chuàng)建了它們所需要的接口。在實(shí)現(xiàn)這些接口的時(shí)候,可以調(diào)用相應(yīng)的工具。
菜鳥:嗯,這樣的話,如果業(yè)務(wù)邏輯需要所有的工具,那么你必須把所有工具都放到Gateway接口里。
老鳥:哈,我覺得你還是沒有明白。
菜鳥:不明白什么?我覺得已經(jīng)很清楚了。
老鳥:每個(gè)業(yè)務(wù)邏輯只定義它所需要的接口。
菜鳥:等等,什么意思?
老鳥:這個(gè)叫作接口分離原則。每個(gè)業(yè)務(wù)邏輯只使用一部分?jǐn)?shù)據(jù)庫工具,所以每個(gè)業(yè)務(wù)邏輯只定義能夠滿足需要的接口。
菜鳥:這樣的話,你就會(huì)有很多接口,而且有很多實(shí)現(xiàn)類。
老鳥:哈,是的。你開始明白了。
菜鳥:這樣子很浪費(fèi)時(shí)間!我為什么要這樣做呢?
老鳥:這樣做是為了讓代碼更干凈,并且節(jié)省時(shí)間。
菜鳥:算了吧,這樣只會(huì)增加更多的代碼。
老鳥:相反,這其實(shí)是很重要的架構(gòu)決定,這跟你之前所說的那些所謂的重要決定是不一樣的。
菜鳥:什么意思?
老鳥:還記得你剛開始說你要成為一個(gè)軟件架構(gòu)師嗎?你還想要做所有重要的決定?
菜鳥:是啊,我是這么想過。
老鳥:你想做所有關(guān)于數(shù)據(jù)庫、Web服務(wù)和框架的決定。
菜鳥:是啊,而你卻說它們都不重要,還說它們其實(shí)跟重要的決定不相干。
老鳥:沒錯(cuò),它們確實(shí)跟重要的決定不相干。一個(gè)軟件架構(gòu)師真正要做的重要決定都在數(shù)據(jù)庫、Web服務(wù)器和框架之外。
菜鳥:但首先要先決定用什么數(shù)據(jù)庫、Web服務(wù)器或框架啊!
老鳥:實(shí)際上應(yīng)該在開發(fā)后期才開始做這些事情——在你掌握了更多信息之后。
老鳥:當(dāng)架構(gòu)師草率地決定要使用一個(gè)數(shù)據(jù)庫,后來卻發(fā)現(xiàn)使用文件系統(tǒng)效率更高。
老鳥:當(dāng)架構(gòu)師草率的決定使用一個(gè)Web服務(wù)器,后來卻發(fā)現(xiàn)團(tuán)隊(duì)需要的不過是一個(gè)socket接口。
老鳥:當(dāng)架構(gòu)師草率地決定使用一個(gè)框架,后來卻發(fā)現(xiàn)框架提供的功能是團(tuán)隊(duì)不需要的,反而給團(tuán)隊(duì)帶來了諸多約束。
老鳥:當(dāng)架構(gòu)師在掌握了足夠多的信息后才決定該用什么數(shù)據(jù)庫、Web服務(wù)器或框架。
老鳥:當(dāng)架構(gòu)師為團(tuán)隊(duì)鑒別出運(yùn)行緩慢、耗費(fèi)資源的IO設(shè)備和框架,這樣他們就可以構(gòu)建飛速運(yùn)行的輕量級(jí)測試環(huán)境。
老鳥:當(dāng)架構(gòu)師把注意力放在那些真正重要的事情上,并把那些不重要的事情放在一邊。
菜鳥:我完全不知道你在說什么了。
老鳥:好吧,如果在若干年后你還沒有轉(zhuǎn)做管理,或許會(huì)明白這一切的……
對(duì)話來源網(wǎng)絡(luò),若有侵權(quán),請(qǐng)聯(lián)系刪除
通過上面的對(duì)話,讓我們對(duì)架構(gòu)師有了個(gè)簡單的了解,那么架構(gòu)師在一家公司有多重要呢?架構(gòu)師對(duì)一家公司、一個(gè)項(xiàng)目有多重要?
我們來看一看調(diào)查的數(shù)據(jù)

架構(gòu)師在公司中擔(dān)當(dāng)著「IT架構(gòu)靈魂人物」的角色,因?yàn)樗麄儾粌H做著架構(gòu)師的本職工作,還同時(shí)做程序開發(fā),寫核心代碼。另外,架構(gòu)師依舊是技術(shù)高手,編程能力依然是一流的。
從圖表結(jié)果來看,架構(gòu)師必須具備出色的設(shè)計(jì)能力、編程能力和溝通能力,在完成本職的架構(gòu)工作外,還要協(xié)調(diào)好項(xiàng)目中人員的關(guān)系,做出合理的分工,最終完成全部工作。
最后,看下企業(yè)對(duì)Java架構(gòu)師的職位描述與職位要求

從招聘信息來看,架構(gòu)師們必須是具有多年的從業(yè)經(jīng)驗(yàn),有過項(xiàng)目開發(fā)經(jīng)歷,精通多門編程語言且熟悉數(shù)據(jù)庫的大咖。所以,想以架構(gòu)師為目標(biāo)的讀者,就要加倍努力了!