Ben Evans:保守的設計思想是Java的最大優勢

jopen 10年前發布 | 35K 次閱讀 Java

        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 權威技術手冊》(Java in a Nutshell)是一部經典,它的上一版(第 5 版)長達 1200 頁,而在十年后即將在中國出版的第 6 版卻只有 400 頁,這兩版之間到底有什么樣的變化?對于 Java 來說,這十年意味著什么?

        第 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)你有下一步的計劃嗎?

        《Java 程序員修煉知道》這個項目很好,寫作的過程也很愉快。但是在寫作《Java 權威技術手冊》的過程中我消耗了大量精力,我認為我可能不會再寫這本書的第 2 版了。我和這本書的原出版商 Manning 談過了,但是最新的進展我并不了解,所以很有可能這本書不會再有第 2 版了。

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

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

        關于開源軟件有一個說法,一個好的開源開發者必須找到自己的痛點,他們不得不去解決這個困擾他們的問題。這是大多數人對開源軟件感興趣的原因,也是很多人稱為 Java 開發者的原因。你找到了一個讓你感興趣的點,由于不明所以,你一直學習下去,這就是成長的秘密。

        問:雖然 Lambda 加入了 Java 8,但是在開發者之間始終有關于 Java 語法過于冗長的抱怨。你認為這是很多開發者和團隊不愿意使用 Java 的主要原因嗎?

        我不這么認為。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 各自擅長的領域是什么?

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

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

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

        這里面包含了兩件事,把虛擬和云以及多租戶混在一起并不完全正確。比如說在 QCon 上海上有很多分享是關于 docker 的(docker 是一個并不依賴于虛擬化的平臺),其中一個精彩的分享來自 Chris Swan。 他展示了將 CPU 內存從虛擬環境轉移到以 Docker 為基礎的環境所帶來的好處,雖然仍不夠完善,但是它已經為 Java 帶來了額外的優勢,只要在 Docker 上運行 Java 你就能感受到。我們應該把云和虛擬的關系梳理清楚。另外,有很多其他你可以做的事,比如你可以建立多個 JVM 主機。

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

        問:Java 經常被拿來和 Scala 做比較,這兩種語言的設計目的有什么不同?在未來,這兩種語言是否可能發展方向完全一致?

        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 程序員的百分之一,而這個比例很可能不會繼續增長了。

Ben Evans:保守的設計思想是Java的最大優勢

上海 QCon 采訪 Ben Evans 現場

                    <span id="shareA4" class="fl">                             
                        </span>
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!