專訪《Java程序員修煉之道》做者Ben Evans

 轉帖這篇文章,很大成分就是認同「保守的設計思想是Java的最大優點」這句話程序員


------------------------------------------------------------------shell


【編者按】Java是一種能夠撰寫跨平臺應用軟件的面向對象的程序設計語言,它幾乎是每一個程序員的入門語言,而《Java程序員修煉之道》更是深受程序員歡迎的學習書籍。該書做者之一Ben Evans最近參加了上海QCon大會,圖靈社區採訪了這位大牛級人物。編程


Ben EvansjClarity的聯合創始人。其公司致力於開發能夠爲開發和運維團隊提供幫助的性能工具和服務。他是LJC(倫敦Java用戶組)的組織者之一,也是JCP(Java社區過程)執行委員會的成員之一,幫助定義Java生態系統中的一些標準。他仍是「Java Champion」榮譽得主。他曾與人合著了《Java程序員修煉之道》The Well-Grounded Java Developer)和《Java權威技術手冊(第6版)》(Java in a Nutshell)。他曾就Java平臺、性能、併發和相關主題發表過屢次演講。
網絡


Ben Evans
架構

問:《Java權威技術手冊》(Java in a Nutshell)是一部經典,它的上一版(第5版)長達1200頁,而在十年後即將在中國出版的第6版卻只有400頁,這兩版之間到底有什麼樣的變化?對於Java來講,這十年意味着什麼?併發

Ben Evans:第1版《Java權威技術手冊》是在Java剛剛變得流行以後很快出版的,那個時候人們對於Java充滿了想象。在接下來的五個版本里,這本書越變越大,內容不斷延續。因此每一本的重點都有些着眼於歷史,由於幾個版本之間有着演進的關係。這是由幾個因素形成的結果,有一部分緣由純粹是由於這樣比較好寫,你只要知道這個版本和上一個版本相比增減了什麼就能夠了。可是更重要的是,在早些時候,在大部分企業中,Java的生命週期很長,因此你常常能夠看到很老版本的Java。因此理解不一樣版本之間的區別變得很重要。因此當你在某家公司某個Java版本上工做時,若是你知道版本是哪一個,你也就知道了能作什麼不能作什麼,以及這個版本與其餘版本相比有什麼樣的改變。運維

這就是當我開始寫新一版時,第一個想改變的事情。由於如今最新版的Java 8(說到這裏,容易讓人有些混淆,《Java權威技術手冊》的第6版講的是Java的第8版)的生命週期比之前短了不少。固然,這要取決於具體領域,可是瞭解了廣泛的使用狀況後,你會發現使用老版本的(好比Java 6)只是極少數的人。固然仍然有一些瘋狂的人仍然在使用6之前的版本,大部分的用戶使用的是版本7。如今,版本8正在以很快的速度佔領市場,僅僅在半年時間,有15%到20%的用戶已經在使用Java 8了。因此新版《Java權威技術手冊》的關注點比以往更加開放,咱們開始關注Java之外的世界,也會討論如今和將來。編程語言

第二件重要的改變是長度,正如你所說,第5版長達1200頁,而第六版只有它的三分之一,當我開始着手整理上一版的時候,我作的第一件事就是去掉了三分之二的內容。若是你看過第五版,你就知道除了討論Java的主要內容以外,這本書的第二部分是關於索引的。固然這也是歷史緣由形成的,當Java剛出來的時候,網絡的使用還不是很廣泛,因此書自帶一份索引是很合理的事。可是還有另外兩個緣由,Java平臺變得愈來愈大,在《Java權威技術手冊》的第一章我討論了Java版本進化,指出了Java平臺的增加速度之快。要描述Java 5平臺的基本知識就用了800頁,那仍是Java 5的時候,若是用一樣的方法討論Java 8的話,這本書就要頂到天花板上了。可見這個方法不可行了,沒有人會願意拿着這樣一本書。另一個緣由(也許這兩件事是相關的)就是人們利用技術信息的方式發生了改變,因特網現在無處不在,人們不肯意攜帶厚重的書籍,全部的索引均可以在網上的PDF、網站等資源中找到。因此這個時候還要在紙質書的後面加上厚重的索引就很不合理了。這就是《Java權威技術手冊》兩個版本之間的重大改變。函數

我嘗試的第三件事是捕捉Java的變化趨勢和規律。因此不少關於過去如何使用Java的內容都被去掉了,我加入了更多現代的使用方法,讀者們須要瞭解垃圾回收,內存分配,併發編程,我在這些方面講了不少。這裏面涉及了大量的工做,由於原來的版本都着力於保存原有的內容。在第五版留下的三分之一內容中,大概只有25%-30%留到了第六版中,這些內容也都從新編輯整理過,而剩下的70%左右的內容則是全新的。工具

由於,咱們想在Java 8投入使用的時候就把這本書弄出來,因此Java 8尚未出來的時候咱們就動筆了,到了後來還出現了一些一開始沒有想到的工做(好比Java 8上隱藏的特性)。可是此次咱們的經驗更豐富了,因此咱們但願能在2016年4月,Java 9出來的時候完成下一個版本。事實上我已經作好具體計劃了。

問:對於《Java程序員修煉之道》(The Well-Grounded Java Developer)你有下一步的計劃嗎?

Ben Evans:《Java程序員修煉知道》這個項目很好,寫做的過程也很愉快。可是在寫做《Java權威技術手冊》的過程當中我消耗了大量精力,我認爲我可能不會再寫這本書的第2版了。我和這本書的原出版商Manning談過了,可是最新的進展我並不瞭解,因此頗有可能這本書不會再有第2版了。

問:一位Java大牛和一位普通Java程序員之間的區別是什麼?

Ben Evans:我認爲能夠把程序員的層次看做一個金字塔,其中能夠大體分紅3個層次。在最底層的是很勤勞的程序員,可是他們可能對編程自己興趣不大,他們也能作好工做,可是他們下班以後就不會再想關於編程的事。這是很正常的現象,軟件業須要不少程序員,而且這個需求仍然在不斷增加。中間層次上的程序員,想再多作一些,他們閱讀科技新聞和網站上的消息,他們會跟進下一個版本的進展,他們關心本身的技能,這個層次的程序員頗有趣。而最上層的程序員則是時刻對技藝以及技術的本質着迷。當你到達了這個金字塔的最頂層時,你就會開始有反饋環,你能夠從自身學習,對技藝的瞭解也更深入。可是我認爲最難的部分就是如何從第二層突破到最頂層。若是你對你所作工做以外的知識有一丁點興趣,你就要尋找屬於本身的那個點,這個點對於每一個人都不同,一旦發現那個讓你着迷的領域,你就能夠隨着好奇心的驅使深刻學習下去。

關於開源軟件有一個說法,一個好的開源開發者必須找到本身的痛點,他們不得不去解決這個困擾他們的問題。這是大多數人對開源軟件感興趣的緣由,也是不少人稱爲Java開發者的緣由。你找到了一個讓你感興趣的點,因爲不明因此,你一直學習下去,這就是成長的祕密。

問:雖然Lambda加入了Java 8,可是在開發者之間始終有關於Java語法過於冗長的抱怨。你認爲這是不少開發者和團隊不肯意使用Java的主要緣由嗎?

Ben Evans:我不這麼認爲。James Gosling有三句話能夠解釋Java的語言設計,以及爲何Java是如今這個樣子。第一句就是英語中所說的「藍領」語言,藍領工人是從事第一線工做的人,而白領則表明了辦公室以及經理們的工做。Java就是一種藍領語言,它的設計是爲了讓工做中的程序員解決真正的問題。Java是實用的語言,它解決的是真實世界中的業務

James Gosling在2014年JavaOne大會上談到了Lambda以及Java的早期版本中沒有出現的一些設計,他說:若是我沒有找到完成一件事的正確方法,那我就什麼都不作。這句話表達了一種緩慢而保守的演進設計思想,要想理解Java是什麼,就必需要明白這點。不少人以爲Java老了,編程語言須要改變,可是他們沒有搞清楚的是,真正變化的是他們本身。他們在能力上有了發展,他們想看得更遠更深,而語言反映出了這一點。並非語言須要改變,而是提出這個觀點的程序員自身發生了變化。Java從過去到將來都是一種設計保守的語言。這也是Java的一大優點。

當James解釋他設計Java的初衷時說:當我在設計的時候,我知道人們想要自動內存管理,人們想要強型式,可是這些功能會嚇跑藍領工人。好比說Smalltalk,這是一門很優秀的語言,可是它太先進了,它和現實中開發者們在構建應用時的思惟脫離開來。因此Java繼承了其中的一些理念,並將其簡化,把這些理念放入一種語言和格式中。這些事解釋了這門語言設計的基本動機。

因此你固然能夠說Java是一種冗長的語言,但我認爲額外的內容是爲了方便閱讀。特別是當你仍是一位初級或中級程序員的時候,那些看似多餘的文字可以幫助到你。人們永遠都銘記咱們對於生產力的需求愈來愈高,可是代碼仍然是寫出來的。因此我不認爲Java冗長,雖然咱們能夠加入一些高級功能,可是有些事永遠都沒法在一個語言中改變,這很遺憾。固然咱們也會進步,可是就像我總說的一句話,人們老是過於關心語法,而不是能用語言來實現什麼。

問:如今很多的大企業(Paypal等)從Java切換到Node.js,Java在企業中的地位受到威脅,Java和Node.js各自擅長的領域是什麼?

Ben Evans:這個問題中有一個誤解,事實上並無出現大波公司棄用Java轉向Node.js的狀況。Paypal中啓用Node.js的部分規模很小,Paypal的大部分運行代碼仍然是Java。Node.js參與的只是一個試點項目,這是能夠理解的,Node.js是一個有趣的環境,其中也有一些有趣的想法。Node.js十分年輕,同時,它也有不少嚴重的問題,因此如今預測Node.js的將來發展還爲時尚早。因此雖然各類開發者網站上有不少支持Node.js的聲音,GitHub上有不少有趣的項目(好比用它寫Ardruino,玩硬件),可是在全部生產環境下的產品中,毫無疑問,Java擁有最多的代碼行。企業在沒有充分理由的狀況下不會捨棄工做軟件,雖然有不少使用Node.js的創業者,可是創業者們來得快,走得也快。

做爲近些年來有趣的產品之一Twitter,若是你觀察一下他們的發展你會發現他們最開始用的是Ruby on Rails。三四年前,他們的網站開始出現一個很是可愛的卡通形象,失敗鯨。這是一件很尷尬的事,爲了弄明白到底發生了什麼,他們作了不少調查,在查看了Ruby的垃圾收集以後,他們發現本身無能爲力。同時,他們的Java試點項目得到了成功,他們意識到Java能解決他們的擴展性問題。而後在接下來的18個月,他們使用了一些JRuby做爲中轉站,而後將整個系統改寫成Java。最終的效果也很好,他們圍繞Java引入了新的服務,新的架構。曾幾什麼時候,Ruby被視爲企業級軟件的將來,但現現在,Ruby只是衆多編程語言中的一種。如今應用最廣的三種語言是Java,JavaScript,以及C/C++,可是大部分的JavaScript代碼都是在客戶端,若是把這三種語言去掉,其餘語言的市場份額都很是小。

問:直到如今,Java應用的虛擬託管模型須要分配給整個x86虛擬機用來託管一個單獨的JVM實例,相對來講實例上也託管了單獨的Java應用。這樣的方法效率很低,可是Java本地並不支持多租戶虛擬以及雲計算配置。幸運的是,在社區裏能夠找到一些爲了解決雲計算問題而產生的多租戶Java解決方案,你認爲哪一個方案足夠成熟能夠應用到生產環境?

Ben Evans:這裏麪包含了兩件事,把虛擬和雲以及多租戶混在一塊兒並不徹底正確。好比說在QCon上海上有不少分享是關於Docker的(Docker是一個並不依賴於虛擬化的平臺),其中一個精彩的分享來自Chris Swan。他展現了將CPU內存從虛擬環境轉移到以Docker爲基礎的環境所帶來的好處,雖然仍不夠完善,可是它已經爲Java帶來了額外的優點,只要在Docker上運行Java你就能感覺到。咱們應該把雲和虛擬的關係梳理清楚。另外,有不少其餘你能夠作的事,好比你能夠創建多個JVM主機。

可是這個問題真正在問的是多租戶。關於這個問題,有一個產品在我心中是當之無愧的冠軍,那就是Waratek。Waratek能夠把一個單獨的非熱點JVM分開,並在其中運行主機JVM,在JVM裏運行的是Java虛擬多租戶JVC,而JVC能夠作到很輕量級。我認爲Waratek是一個很成熟、能夠投入使用的產品,德意志銀行剛剛宣佈把本身的第一個工做JVM挪到Waratek上,既然德意志銀行已經承認了這個產品,那麼這個產品應該也值得你花時間研究一下。

問:Java常常被拿來和Scala作比較,這兩種語言的設計目的有什麼不一樣?在將來,這兩種語言是否可能發展方向徹底一致?

Ben Evans:Java和Scala是有着很大不一樣的語言。以前咱們談到過Java的設計哲學,如今咱們能夠來講一說Scala的設計思想,以及它們之間有什麼不一樣。Scala最初是一門來自學術界的語言,最開始Martin Odersky創造的語言叫作Pizza,那時候Java仍是版本4,這個時候Pizza開始逐漸加入了一些相似於Java範型的功能,Java 5中也加入了一些Pizza的功能做爲範型。

Martin是一個很聰明的人,Scala也有不少很棒的設計。可是同時,這個語言也有本身的問題。有時候它被稱爲「廚房水槽」語言,可見人們對這門語言又愛又恨。這個比喻的意思是:水槽裏面裝了各類各樣數量過多的東西。這確實是Scala的一個問題,它的功能太多了。有一條語言設計的準則,同時也是Java設計過程當中的一個重要原則——保守。具體說來,就是每當你添加一個新特性的時候(《Java程序員修煉之道》14頁談到了了一個具體的例子),可能你也形成了新的問題。若是你的語言有200種特性,而這個時候你想再加入一個,我須要檢驗它和全部其餘特性的交互狀況。對於Scala來講,它老是頻繁地加入新的特性。要想知道這些特性之間的交互狀況是很困難的。就算Scala有一個很靈活,可以擁抱改變的社區,語言特性的變更也是件不容易的事。因此你會發現雖然Scala擁有不少優秀的工做性能,可是你須要決定哪些特性是你想要的,而哪些特性是你不能碰的。當你在團隊中編程的時候,這不是個問題。真正的問題在於,現代社會的軟件棧歷來都不是僅僅依賴於代碼,問題來自於函數庫。有一些Scala特性的動做不只影響目標對象,還會影響其餘一些東西。Scala的特性越多,這些問題就更容易互相重疊。

另外,他們一直都糾結於二進制兼容的問題。Java、Sun以及Oracle一直都認爲這是對Java來講最重要的設計理念,因此我能夠用Java 1.0寫程序,編譯一下,放到Java 8的虛擬機中,仍然能夠運行,並且運行速度會比之前快不少倍。而Scala從未作出這方面的承諾,哪怕就是上一個版本也會出現問題。在函數庫空間中,這個問題就更嚴重了,我知道不少項目都放棄了Scala,就是由於每次只要升級函數庫,整個系統就會崩潰。

因此說,這兩種語言的設計思想很不相同。人們老是喜歡新鮮事物,第一個嚐鮮的人也會第一個享受到不少好處,可是在更多的狀況下,人們更願意作第二個嘗試的人。你能夠觀察第一我的犯下的錯誤,而後從中學習。而Java就是這樣一個從別人的錯誤中學習的語言。我剛纔提到過程序員的金字塔,我認爲Scala並不適用於底層,它的做用更多在於爲最頂層的程序員們激發思考。而Java是一種適用於整個金字塔的語言,並且它對底層和中層的程序員尤爲適用。我相信在將來的不少年內都會有一個強大且健康的Scala社區,我也但願能和他們一塊兒交換思想。可是我並不認爲Scala會從一種小衆語言成長成一種大衆語言。如今地球上可能有上百個Scala程序員,可是這個數量頂多也就是Java程序員的百分之一,而這個比例極可能不會繼續增加了。

相關文章
相關標籤/搜索