国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

鄭曄談 Java 開發(fā):新工具、新框架、新思維【轉(zhuǎn)載】【整理】

2019-11-15 00:07:41
字體:
供稿:網(wǎng)友
鄭曄談 java 開發(fā):新工具、新框架、新思維【轉(zhuǎn)載】【整理】

原文地址

導(dǎo)語:“我很驚訝地發(fā)現(xiàn),現(xiàn)在許多程序員討論的內(nèi)容幾乎和我十多年前剛開始做 Java 時幾乎完全一樣。要知道,我們生存的這個行業(yè)號稱是變化飛快的。其實,這十幾年時間,在開發(fā)領(lǐng)域已經(jīng)有了非常多的新內(nèi)容涌現(xiàn)出來,即便是 Java 開發(fā)這個領(lǐng)域,也有了很多變化……” ——鄭曄

  • 1995年5月23日,Java 語言正式誕生;
  • 1996年1月,JDK1.0發(fā)布;
  • 2000年5月,JDK1.3、JDK1.4 相繼發(fā)布;
  • 2004年9月,J2SE 1.5發(fā)布;
  • 2009年12月,Java EE 6發(fā)布;
  • 2014年3月18日,Java SE 8 發(fā)布

19 年的歷史,Java 已經(jīng)成為全球最流行的開發(fā)語言之一,也是使用最為廣泛的企業(yè)級語言,沒有之一。在軟件開發(fā)的世界里,兩年一小變,三年一大變,QCon 北京2014 大會上,來自 ThoughtWorks的首席咨詢師鄭曄回顧了最近十多年軟件開發(fā)領(lǐng)域的發(fā)展變化,并重點介紹了 Java 世界程序庫、開發(fā)方式、工具等的變化。會后,InfoQ對鄭曄做了一次深入專訪。

InfoQ:為什么會在這次 QCon 演講上選擇“你應(yīng)該更新的 Java 知識”這樣一個話題?

鄭曄:這個話題可能與我個人的經(jīng)歷有關(guān)。我的職業(yè)生涯是從 Java 起步的,中間各種機緣,我做了很多其它不同類型的項目,接觸過各種各樣的程序設(shè)計語言。最近幾年又重新把所有的注意力放回 Java,我很驚訝地發(fā)現(xiàn),現(xiàn)在許多程序員討論的內(nèi)容幾乎和我十多年前剛開始做 Java 時幾乎完全一樣。要知道,我們生存的這個行業(yè)號稱是變化飛快的。 其實,這十幾年時間,在開發(fā)領(lǐng)域已經(jīng)有了非常多的新內(nèi)容涌現(xiàn)出來,即便是Java 開發(fā)這個領(lǐng)域,也有了很多變化。我自己最近的幾個 Java 項目,用到了不少十年前沒有的東西。既然我有了這樣的感覺,為什么不能嘗試著總結(jié)一下呢? 于是,去年我在自己的 blog 上寫了一個系列的《你應(yīng)該更新的 Java 知識》。我自己真正總結(jié)出來的內(nèi)容要遠(yuǎn)比寫下來的多,在公司內(nèi)部,我做了一個有十幾節(jié)的課程,給自己的同事分享過。這次的 QCon 分享的主題,就是基于這個系列課程第一講的概述部分。所以,我在演講上也提到,如果想了解全部內(nèi)容,就看以后還有沒有機會在更多的大會上分享了,當(dāng)然,如果想更完整地了解,可以專門聯(lián)系我,呵呵。

InfoQ:在演講中您提到,您向大家推薦了很多比較好用的 Java 開源軟件,比如 Guava,能詳細(xì)說說嗎?

鄭曄:我推薦的程序庫有一個的原則,它們必須有很易用的 API,而不僅僅為了實現(xiàn)功能。下面是我在演講里列出的幾個我愿意推薦給大家的程序庫。

我對 Guava的一個評價是,只要你做的是 Java 項目,就應(yīng)該用 Guava。Guava 某種程度上是彌補了 JDK 的不足,我們都知道,JDK 是為了給 Java 開發(fā)人員提供一個基礎(chǔ)的開發(fā)包,但是,JDK 基本上定位于功能實現(xiàn)。這在10多年前,沒有問題,但現(xiàn)在,隨著人們對于代碼編寫認(rèn)識的加深,僅僅有功能已經(jīng)不夠了,還要有一個易用的接口。舉個簡單的例子,把文件讀到一個字符串里,如果用 JDK 實現(xiàn),光想著異常處理都回讓人頭疼不已。Guava 是一個現(xiàn)代的程序庫,它有著更易用的 API。當(dāng)然,Guava 也有一些新增功能,比如,一些集合類、緩存等等。Guava 做得怎么樣?看一下 Java 8 的文檔就可以知道,有一些 API 幾乎就是原封不動地從 Guava 上借鑒來的。

Joda Time是我提到的另一個程序庫。它現(xiàn)在的位置很有趣,我們都知道 JDK 中原有的日期庫設(shè)計的非常糟糕,Joda Time 就是為了讓我們躲開 Java 的日期庫。但是,因為它設(shè)計得很好,它也被 JDK 借鑒了,于是有了 JSR 310,現(xiàn)在已經(jīng)是 Java 8 的一部分。不過,從技術(shù)發(fā)展來看,Java 8 廣泛使用起來還有很長的路要走。大多數(shù)人還會繼續(xù)與 Java 6 做斗爭,所以,我還是把它列了出來。

Hamcrest 和 Mockito,是兩個用來測試的庫。Hamcrest 讓我們更好地寫斷言,而 Mockito 讓我們更好地編寫 Mock 對象。

DropWizard,我們可以把它理解一個開發(fā) REST 服務(wù)的框架,但其實它什么都沒做,只是把一些已有框架集成到了一起。它同前面幾個程序庫有很大的不同,它更多地是代表了一種的開放方式:輕量級部署風(fēng)格,拋開沉重的應(yīng)用服務(wù)器。它未必會是未來的贏家,但值得了解。

其實,還有一些不錯的程序庫值得推薦,比如,像實現(xiàn)了 Actor 的 Akka,但這些庫往往是代表了一種特定的程序設(shè)計風(fēng)格,所以,我沒有特意列出。 近些年,Java 世界里出現(xiàn)的“新”工具“新”框架,在學(xué)習(xí)這些工具框架方面,您有什么好的方法提供給大家?

InfoQ:對于這些新工具、新框架的學(xué)習(xí),您有什么好的方法分享給大家?

鄭曄:軟件開發(fā)行業(yè)是一個發(fā)展變化很快的行業(yè),盡管很多思想層面的東西變動不大,但在具體操作層面上,總會有新的東西層出不窮。作為一個程序員,如果不希望為這個時代淘汰,一個開放的心態(tài)必不可少。就我個人而言,我會一直開著自己的雷達,了解各種新技術(shù)、新知識的。至于到具體的工具框架學(xué)習(xí),沒有什么特別的,文檔是最好的老師。基本上,文檔會把功能性的東西都告訴你。

InfoQ:在實際的開發(fā)中,同一個功能往往有不同的框架做了實現(xiàn),比如 MVC 的實現(xiàn)就有 Struts、SPRingMVC 等。在遇到類似的情況時,您是怎么選擇框架的?

鄭曄:在功能類似的情況下,我會選擇更符合技術(shù)發(fā)展方向、API 設(shè)計更好的庫。

舉個例子,如果開發(fā)一個 Web 應(yīng)用,以前的做法是用 Spring MVC 一個一個頁面寫,但現(xiàn)在我不會這么做了。我會傾向于基于微服務(wù)的架構(gòu),這是一個符合技術(shù)發(fā)展方向的做法。更容易理解的說法是,后臺提供基于 REST 的 API,由前臺頁面進行訪問。這樣原來傳統(tǒng)的方式就顯得笨拙了,它們是為了由后臺渲染頁面準(zhǔn)備的,所以,后臺框架我會選擇一個更容易做 REST API 的框架,比如用 Jersey 加上 Jackson。

再舉一個 API 影響選型的例子,我們常用的 Log 庫,以前我們都會選擇 Commons Logging,但是使用這個庫,通常我們的代碼都是在正式地寫日志之前,先判斷一下 isXXXEnabled。因為這個庫是 Java 5 之前設(shè)計的,之所以這么做,有許多性能之類的考量。而現(xiàn)在,我的首選Log庫是 SLF4J,就省去了那些不必要的代碼,非常清爽。

InfoQ:在演講中,你還重點講了自動化。那么,在這方面您是怎么做的?

鄭曄:對于自動化,我的基本理念是,盡可能自動化一切能夠自動化的東西。十幾年前,我們提到自動化,基本上就是編譯、打包,而現(xiàn)在自動化的范圍比以前大得多。我在 2011 年曾在 InfoQ 上發(fā)表了一篇名為《軟件開發(fā)地基》的文章,里面談到了我在項目里所做的一些基本的自動化工作。時隔三年再來看這篇文章,大部分內(nèi)容依然是適用的。而現(xiàn)在,當(dāng)我們談到自動化,應(yīng)該比那篇文章的范圍還大,在我自己的項目里面,我們會把一些環(huán)境部署的過程也自動化起來,按照現(xiàn)在流行的說法,目標(biāo)是要做持續(xù)交付。

在 Java 自動化領(lǐng)域,最近幾年一個比較大的變化發(fā)生在工具領(lǐng)域。我在演講中提到了,如果你現(xiàn)在還在用 Ant 和 Maven,你就落伍了,Ant 做簡單的事不簡單,Maven 做復(fù)雜的事情很困難。現(xiàn)在的趨勢是,以全功能語言做自動化腳本。《軟件開發(fā)地基》那篇文章里,我用的工具是 buildr,它依賴于 Ruby 語言。最近幾年 Java 領(lǐng)域表現(xiàn)最活躍的自動化工具是 Gradle,它現(xiàn)在幾乎是我做 Java 項目的默認(rèn)之選,其基礎(chǔ)是 Groovy

InfoQ:您講到輕量級部署相關(guān)的一些建議,能詳細(xì)說說嗎?

鄭曄:一說起 Java 應(yīng)用的部署,大家直覺上就會想到“打個包,部署到應(yīng)用服務(wù)器”。這也是幾乎十多年前就定型下來的開發(fā)方式。但對于開發(fā)人員來說,這就幾乎就意味著各種開發(fā)的噩夢。為了在開發(fā)階段定位一些問題,我們就不得不在“本地”進行用上“遠(yuǎn)程”調(diào)試。

應(yīng)用服務(wù)器是一個“老大哥”年代的產(chǎn)物,那時候大公司要賣應(yīng)用服務(wù)器,更要賣硬件,所以,它們炮制出復(fù)雜的業(yè)務(wù)場景。但是,對于許多團隊來說,你可能一輩子都碰不到這樣復(fù)雜的情況。當(dāng)年,EJB的破產(chǎn)已經(jīng)讓我們見識了這種虛幻的需求在程序員社區(qū)里是站不住腳的。現(xiàn)在,輪到應(yīng)用服務(wù)器本身了。我在演講里曾經(jīng)舉過一個例子,說明這個應(yīng)用服務(wù)器中一個虛幻的需求,在一臺應(yīng)用服務(wù)器上部署多個應(yīng)用。現(xiàn)在我們看到,大多數(shù)應(yīng)用多個應(yīng)用服務(wù)器都不夠,一個應(yīng)用服務(wù)器部署多個應(yīng)用除了測試玩玩,在實際的場景中,幾乎就是站不住腳的。開源社區(qū)的興起讓普通程序員有機會見到高手是如何工作的,高水平程序員總會追求更“簡單”的工作方式,吸引更多程序員走入這種方式中。我很高興地看到,我們的開發(fā)方式不再是由老大哥主導(dǎo)了。

最近幾年,隨著云和移動開發(fā)的興起,微服務(wù)(en,cn)的概念逐漸進入了我們的視野,隨之而來的就是社區(qū)對于開發(fā)和部署的反思。前面提到的DropWizard 的就是一個很好的例子,通過它,我們只要打出一個 JAR 包,和傳統(tǒng)的方式不同的是,這個 JAR 包直接就是一個可運行的應(yīng)用。是的,它是有 Main 函數(shù)的。有 Main 函數(shù)就意味著,我們可以很方便地在 IDE 里做我們想做的一切,包括調(diào)試。這樣一來,對比從前那種笨拙的方式,開發(fā)人員可以做到“易者易為”。

關(guān)于部署,現(xiàn)在的一個方向是部署的自動化,有很多工具可以支持我們做到這一點,比如 Chef、Puppet,我最近的一個項目上用了 Docker。有了這些基礎(chǔ),我們可以一鍵式在一臺空機器上建立起一個完整的應(yīng)用。這就是持續(xù)交付中一個很重要的基礎(chǔ)。再進一步,我們可以把這種部署同虛擬化和云結(jié)合起來,用自動化工具在云端一個節(jié)點部署出我們的應(yīng)用。你可以想一下,如果我需要測試一下我的應(yīng)用,或是在產(chǎn)品環(huán)境上增加一個新節(jié)點,我只要用一條命令,就會自動在云端的某個節(jié)點上建出我們所需的全部內(nèi)容。傳統(tǒng)做法僅僅是申請機器就是一個漫長的過程,遑論手工安裝應(yīng)用,配置參數(shù)這些麻煩事。這不是對未來美好生活的暢想,實際上,我們公司的許多項目已經(jīng)做到了這一點。

把部署自動化和輕量級部署、微服務(wù)結(jié)合起來,我們的開發(fā)方式就是,在本地編寫好一個服務(wù),調(diào)測好,再部署到云端,由其它人進一步測試。這才是一種簡單的開發(fā)方式。程序員應(yīng)該追求簡單,包括我們個人開發(fā)方式的簡單。

鄭曄,一個有十多年工作經(jīng)驗的程序員,現(xiàn) ThoughtWorks 首席咨詢師。Blog 夢想風(fēng)暴 http://dreamhead.blogbus.com/,新浪微博@dreamhead。

 

你應(yīng)該更新的Java知識之常用程序庫【轉(zhuǎn)載】
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 阿拉善右旗| 黎川县| 建湖县| 永顺县| 岳普湖县| 包头市| 克什克腾旗| 英德市| 柏乡县| 拉萨市| 中方县| 天气| 鹰潭市| 桑植县| 元氏县| 郎溪县| 织金县| 丽江市| 合阳县| 泸西县| 延津县| 靖西县| 丹阳市| 黄冈市| 博野县| 会同县| 砚山县| 伊春市| 巴里| 绥芬河市| 江源县| 开原市| 调兵山市| 公主岭市| 四平市| 海林市| 大埔县| 荥经县| 武清区| 禹城市| 美姑县|