新聞資訊  快訊  焦點  財經  政策  社會
互 聯 網   電商  金融  數據  計算  技巧
生活百科  科技  職場  健康  法律  汽車
手機百科  知識  軟件  修理  測評  微信
軟件技術  應用  系統  圖像  視頻  經驗
硬件技術  知識  技術  測評  選購  維修
網絡技術  硬件  軟件  設置  安全  技術
程序開發  語言  移動  數據  開源  百科
安全防護  資訊  黑客  木馬  病毒  移動
站長技術  搜索  SEO  推廣  媒體  移動
財經百科  股票  知識  理財  財務  金融
教育考試  育兒  小學  高考  考研  留學
您當前的位置:首頁 > IT百科 > 程序開發 > 語言 > JAVA

java架構到底是做什么的,一段對話讓你懂

時間:2019-06-18 10:27:24  來源:  作者:

多人都想知道架構師是做什么?我們看看下面的一段對話。

菜鳥 —— 剛入門的程序員

老鳥 —— 資深架構師

老鳥:菜鳥,你的目標是什么?

菜鳥:我要成為一個軟件架構師。

老鳥:對一個年輕的工程師來說,這是一個很好的目標。那你為什么要成為架構師呢?

菜鳥:我要領導一個團隊,還要做所有關于數據庫、框架和Web服務器的重要決定。

老鳥:好吧,如果是這樣,你就沒必要成為一個軟件架構師了。

菜鳥:當然有必要了!我要成為一個能夠做所有重要決定的人。

老鳥:這樣很好,只是你沒有列出哪些才是重要的決定。你剛才說的那些跟重要的決定沒有什么關系。

菜鳥:你說什么?難道數據庫不重要?你知道我們在數據庫上面花了多少錢嗎?

老鳥:可能很多。不過數據庫仍然不是最重要的。

菜鳥:你怎么能這么說呢?數據庫可是整個系統的心臟啊!所有的數據都保存在這里,它們在這里被排序,被索引,被訪問。如果沒有數據庫,整個系統就無法運作!

老鳥:數據庫只不過是一個IO設備,它提供了一些有用的工具對數據進行排序、查詢,并生成報表,但這些工具都只是整個系統的附屬品。

菜鳥:附屬品?真是不可思議。

老鳥:是的,附屬品。你的系統業務邏輯或許會用到這些工具,但這些工具并非業務邏輯固有的組成部分。如果有必要,你可以隨時替換掉這些工具,但業務邏輯還是那些業務邏輯。

菜鳥:好吧,不過如果把這些工具替換掉,我們就要重新實現業務邏輯了。

老鳥:那是你的問題。

菜鳥:為什么這么說?

老鳥:你認為業務邏輯依賴數據庫,但實際上不是這樣的。如果你的架構足夠好,最起碼業務邏輯不應該依賴數據庫。

菜鳥:這太瘋狂了。我怎么可能創建出不使用這些工具的業務邏輯?

老鳥:我并沒有說業務邏輯不要使用數據庫工具,我的意思是它們不應該依賴這些工具。業務邏輯不應該知道使用的是哪一種數據庫。

菜鳥:如果業務邏輯對數據庫一無所知,它怎么使用這些工具呢?

老鳥:依賴反轉。你要讓數據庫依賴業務邏輯,而不是讓業務邏輯依賴數據庫。

菜鳥:你的話讓人費解。

老鳥:費解嗎?我講的可是軟件架構。這個就是依賴反轉原則,讓下層策略來依賴上層策略。

菜鳥:那就更加費解了!既然上層策略(假設你指的是業務邏輯)要調用下層策略(假設你指的是數據庫),那么就應該是上層策略依賴依賴下層策略,就像調用者依賴被調用者一樣。這是眾所周知的!

老鳥:在運行時確實是這樣的,但在編譯時我們要把依賴反轉過來。上層策略的代碼里不要引用任何下層策略的代碼。

菜鳥:拜托!不引用代碼就無法調用它們。

老鳥:當然可以調用了。面向對象就可以做到。

菜鳥:面向對象對真實世界進行建模,把數據和函數組合到對象里,把代碼組織成直觀的結構。

老鳥:這是他們告訴你的嗎?

菜鳥:所有人都知道的,這不是很明顯的事情嗎?

老鳥:確實如此。不過,面向對象是可以做到不引用也能調用的。

菜鳥:好吧,那它是怎么做到的?

老鳥:你應該知道,在面向對象系統里對象會給其它對象發送消息的,對吧?

菜鳥:是的,當然。

老鳥:那么你就該知道,消息發送者是不知道消息接收者是什么類型的。

菜鳥:這要看使用的是哪一種語言了。在JAVA里,發送者最起碼要知道接收者的基本類型。在Ruby里,發送者知道接收者一定會處理它所發送的消息。

老鳥:是的。不過不管是哪一種情況,發送者都不知道接收者具體的類型。

菜鳥:嗯,是的。

老鳥:所以發送者可以給接收者傳遞一個函數,讓接收者執行這個函數,這樣發送者就不需要知道接收者是什么類型了。

菜鳥:沒錯。我了解你的意思。不過發送者仍然依賴接收者。

老鳥:在運行時確實是的,但在編譯時不是這樣的。發送者的代碼里并沒有引用接收者的代碼。實際上,是接收者的代碼依賴了發送者的代碼。

菜鳥:啊!但發送者仍然會依賴接收者的類。

老鳥:看來需要用代碼來說明了,我用Java來寫些代碼。首先是發送者代碼:

java架構到底是做什么的,一段對話讓你懂

 

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

java架構到底是做什么的,一段對話讓你懂

 

老鳥:可以看到,接收者代碼依賴了發送者代碼,也就是說SpecificReceiver依賴了Sender。同時可以看到,發送者代碼對接收者代碼一無所知。

菜鳥:哈,你作弊了。你把接收者的接口放到了發送者的類里了。

老鳥:你開始明白了。

菜鳥:明白什么?

老鳥:當然是架構原則啊。發送者持有接收者必須實現的接口。

菜鳥:如果這意味著我要使用內部類,那么……

老鳥:使用內部類只是方法之一,還有其它的方法。

菜鳥:請等一下。最開始我們討論的是數據庫,那這些跟數據庫又有什么關系呢?

java架構到底是做什么的,一段對話讓你懂

 

老鳥:讓我們來看一下其它代碼吧。首先是一個簡單的業務邏輯

java架構到底是做什么的,一段對話讓你懂

 

菜鳥:這個業務邏輯沒有做什么事情啊。

老鳥:這只是個例子。在實際實現業務邏輯的時候,不會有很多類似這樣的類的。

菜鳥:好吧。那么Gateway是用來做什么的呢?

老鳥:它為業務邏輯提供了所有訪問數據的方法。下面是它的代碼:

java架構到底是做什么的,一段對話讓你懂

 

老鳥:要注意,這個接口是在businessRules包里面的。

菜鳥:好吧。那Something這個類又是用來做什么的呢?

老鳥:它代表一個簡單的業務對象。我把它放在另一個叫entities的包里。

java架構到底是做什么的,一段對話讓你懂

 

老鳥:最后需要實現BusinessRuleGateway接口,這個實現類會知道相關的數據庫細節:

java架構到底是做什么的,一段對話讓你懂

 

老鳥:可以看到,業務邏輯是在運行時對數據庫進行調用的。而在編譯時,是database包引用了businessRules包。

菜鳥:好吧,我想我明白了。你用多態性隱藏了數據庫實現。不過在業務邏輯里,仍然引用了數據庫的工具接口。

老鳥:不,不是這樣的。我們并沒有打算為業務邏輯提供所有的數據庫工具接口,而是業務邏輯創建了它們所需要的接口。在實現這些接口的時候,可以調用相應的工具。

菜鳥:嗯,這樣的話,如果業務邏輯需要所有的工具,那么你必須把所有工具都放到Gateway接口里。

老鳥:哈,我覺得你還是沒有明白。

菜鳥:不明白什么?我覺得已經很清楚了。

老鳥:每個業務邏輯只定義它所需要的接口。

菜鳥:等等,什么意思?

老鳥:這個叫作接口分離原則。每個業務邏輯只使用一部分數據庫工具,所以每個業務邏輯只定義能夠滿足需要的接口。

菜鳥:這樣的話,你就會有很多接口,而且有很多實現類。

老鳥:哈,是的。你開始明白了。

菜鳥:這樣子很浪費時間!我為什么要這樣做呢?

老鳥:這樣做是為了讓代碼更干凈,并且節省時間。

菜鳥:算了吧,這樣只會增加更多的代碼。

老鳥:相反,這其實是很重要的架構決定,這跟你之前所說的那些所謂的重要決定是不一樣的。

菜鳥:什么意思?

老鳥:還記得你剛開始說你要成為一個軟件架構師嗎?你還想要做所有重要的決定?

菜鳥:是啊,我是這么想過。

老鳥:你想做所有關于數據庫、Web服務和框架的決定。

菜鳥:是啊,而你卻說它們都不重要,還說它們其實跟重要的決定不相干。

老鳥:沒錯,它們確實跟重要的決定不相干。一個軟件架構師真正要做的重要決定都在數據庫、Web服務器和框架之外。

菜鳥:但首先要先決定用什么數據庫、Web服務器或框架啊!

老鳥:實際上應該在開發后期才開始做這些事情——在你掌握了更多信息之后。

老鳥當架構師草率地決定要使用一個數據庫,后來卻發現使用文件系統效率更高

老鳥當架構師草率的決定使用一個Web服務器,后來卻發現團隊需要的不過是一個socket接口

老鳥當架構師草率地決定使用一個框架,后來卻發現框架提供的功能是團隊不需要的,反而給團隊帶來了諸多約束

老鳥當架構師在掌握了足夠多的信息后才決定該用什么數據庫、Web服務器或框架

老鳥當架構師為團隊鑒別出運行緩慢、耗費資源的IO設備和框架,這樣他們就可以構建飛速運行的輕量級測試環境

老鳥:當架構師把注意力放在那些真正重要的事情上,并把那些不重要的事情放在一邊。

菜鳥:我完全不知道你在說什么了。

老鳥:好吧,如果在若干年后你還沒有轉做管理,或許會明白這一切的……

對話來源網絡,若有侵權,請聯系刪除

通過上面的對話,讓我們對架構師有了個簡單的了解,那么架構師在一家公司有多重要呢?架構師對一家公司、一個項目有多重要?

我們來看一看調查的數據

java架構到底是做什么的,一段對話讓你懂

 

架構師在公司中擔當著「IT架構靈魂人物」的角色,因為他們不僅做著架構師的本職工作,還同時做程序開發,寫核心代碼。另外,架構師依舊是技術高手,編程能力依然是一流的。

從圖表結果來看,架構師必須具備出色的設計能力、編程能力和溝通能力,在完成本職的架構工作外,還要協調好項目中人員的關系,做出合理的分工,最終完成全部工作。

最后,看下企業對Java架構師的職位描述與職位要求

java架構到底是做什么的,一段對話讓你懂

 

從招聘信息來看,架構師們必須是具有多年的從業經驗,有過項目開發經歷,精通多門編程語言且熟悉數據庫的大咖。所以,想以架構師為目標的讀者,就要加倍努力了!
 



Tags:java   點擊:()  評論:()
聲明:本站部分內容來自互聯網,內容觀點僅代表作者本人,如有任何版權侵犯請與我們聯系,我們將立即刪除。
▌相關評論
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
▌相關推薦
1.關于面向對象的概念a. 類 class :在js中就是構造函數*在傳統的買你想對象語言中,使用一個叫做類的東西定義模板,然后使用模板創建對象。*在構造方法中也具有類似的功能,因此稱...【詳細內容】
2019-10-10   java  點擊:(1)  評論:(0)  加入收藏
Scanner識別庫,識別器可選擇,這里有你常用的二維碼/條碼識別,還有你可能用到的身份證、銀行卡識別,如果沒有你想要的,可以自定義識別器。該庫只識別掃描框內的圖像,識別速率上大大...【詳細內容】
2019-10-10   java  點擊:(1)  評論:(0)  加入收藏
在2011年7月28日,jdk1.7被正式發布。他的一個最大的亮點就是將原來的NIO類庫生成到了NIO2.0,也被叫做AIO。這篇文章將通過案例對AIO進行一個講解。一、IO的演進在jdk1.4之前,ja...【詳細內容】
2019-10-10   java  點擊:(1)  評論:(0)  加入收藏
在Java中,兩個Integer類型的數,都為127時,用雙等判斷是否相等時,返回true。如圖: 但是,當大于127時,比如加了1,當128時,再這樣判斷,就會失敗。如圖: 直接說原因:雙等用在對象上時,判斷的...【詳細內容】
2019-10-10   java  點擊:(1)  評論:(0)  加入收藏
前言在談CAS算法時,我們先來了解一下無鎖的概念。無鎖分為以下兩大派系: 對于樂觀派系而言,它們認為事情總會往好的方向去發展,總是認為壞的情況發生概率特別小,可以無所顧忌的做...【詳細內容】
2019-10-10   java  點擊:(1)  評論:(0)  加入收藏
初始化一個類,生成一個實例的時候;newInstance() 和 new 有什么區別?用newInstance與用new是區別的,區別在于創建對象的方式不一樣,前者是使用類加載機制,那么為什么會有兩種創建...【詳細內容】
2019-10-10   java  點擊:(1)  評論:(0)  加入收藏
創建線程,是多線程編程中最基本的操作,彤哥總結了一下,大概有8種創建線程的方式,你知道嗎?...【詳細內容】
2019-10-10   java  點擊:(1)  評論:(0)  加入收藏
1. 前言對于Flink中各個組件(JobMaster、TaskManager、Dispatcher等),其底層RPC框架基于Akka實現,本文著重分析Flink中的Rpc框架實現機制及梳理其通信流程。 2. Akka介紹由于Fli...【詳細內容】
2019-10-09   java  點擊:(8)  評論:(0)  加入收藏
Java中的return語句總是和方法有密切關系,return語句總是用在方法中,有兩個作用,一個是返回方法指定類型的值(這個值總是確定的),一個是結束方法的執行(僅僅一個return語句)。在...【詳細內容】
2019-10-09   java  點擊:(8)  評論:(0)  加入收藏
大家經常瀏覽一些網站時候會彈出在線聊天窗口,點擊后可以和客服人員聊天,非常方便,之前也做過一款簡單的在線聊天工具,下面就說說在線聊天通訊的主要幾種技術手段。1、Ajax在htm...【詳細內容】
2019-10-09   java  點擊:(4)  評論:(0)  加入收藏
java中基本類型中,long和double的長度都是8個字節,32位(4字節)處理器對其讀寫操作無法一次完成,那么,JVM,long和double是原子性的嗎?...【詳細內容】
2019-10-08   java  點擊:(5)  評論:(0)  加入收藏
引言js的異步操作,已經是一個老生常談的話題,關于這個話題的文章隨便google一下都可以看到一大堆。那么為什么我還要寫這篇東西呢?在最近的工作中,為了編寫一套相對比較復雜的插...【詳細內容】
2019-10-08   java  點擊:(5)  評論:(0)  加入收藏
你可能還記得,Liskov 代換原則是關于承諾和契約的規則。但具體是怎樣的承諾呢?為了確保 subtype(子類型)的安全性,意味著必須保證可以合理地從超類型推導出 subtype,而且這個過程...【詳細內容】
2019-10-08   java  點擊:(5)  評論:(0)  加入收藏
McGovernTheory在StackOverflow提了這樣一個問題:?Java虛擬機最多支持多少個線程?跟虛擬機開發商有關么?跟操作系統呢?還有其他的因素嗎?...【詳細內容】
2019-10-08   java  點擊:(5)  評論:(0)  加入收藏
我們平常的生活工作中,百度、谷歌這些搜索網站已經成為了我們受教解惑的學校,俗話說得好,“有問題找度娘”。那么百度是如何在海量數據中找到自己需要的數據呢?為什么它搜索的速...【詳細內容】
2019-10-08   java  點擊:(7)  評論:(0)  加入收藏
今天一位同事問我關于本文標題描述的功能如何實現,Jerry在網上隨便搜了一下,類似的例子非常多,這里隨便找了一個例子做了精簡,方便Jerry以后重用。 其實之前Jerry的文章 只要200...【詳細內容】
2019-10-08   java  點擊:(4)  評論:(0)  加入收藏
如何創建和初始化一個HashMap,看似簡單的問題,其實真的挺簡單的,但我們希望從多種方法中,選擇一個最簡潔方便、可讀性也高的方法。 代碼塊初始化可以使用靜態代碼塊和非靜態代碼...【詳細內容】
2019-09-29   java  點擊:(11)  評論:(0)  加入收藏
前言明代王陽明先生在《傳習錄》談為學之道時說:私欲日生,如地上塵,一日不掃,便又有一層。著實用功,便見道無終窮,愈探愈深,必使精白無一毫不徹方可。代碼中的"壞味道",如"私欲"如"...【詳細內容】
2019-09-29   java  點擊:(11)  評論:(0)  加入收藏
一、數據庫架構原則 高可用 高性能 一致性 擴展性二、常見的架構方案方案一:主備架構,只有主庫提供讀寫服務,備庫冗余作故障轉移用 jdbc:mysql://vip:3306/xxdb1、高可用分析:高...【詳細內容】
2019-09-27   java  點擊:(6)  評論:(0)  加入收藏
人與人之間通過交流構成了這個豐富多彩的世界,在計算機中,通過即時通信工具傳遞信息為我么的生活增添了很多樂趣也提供了很多遍歷,而在java線程的世界里,線程之間的通信,可以極大...【詳細內容】
2019-09-27   java  點擊:(4)  評論:(0)  加入收藏
推薦資訊
相關文章
欄目更新
欄目熱門
31选7开奖11185