嘉賓 | 李三紅
撰稿 | 云昭
審校 | 千山
欄目介紹:“T前線”是51CTO內容中心專為技術人物開設的深度訪談欄目之一,通過邀請技術界內的業務負責人、資深架構師、資深技術專家等對當下的技術熱點、技術實踐和技術趨勢進行深度的解讀和洞察,推動前沿科技的傳播與發展。
如果從1992年Oka(Java的前身)算起,Java已經走過了30年的道路。作為公認的革新性的編程語言,Java懷揣著James Gosling,Patrick Naughton,Chris Warth,Ed Frank和Mike Sheridan的“可移植”、“跨平臺”的初衷,在Bill Joy,Arthur van Hoff等貢獻者的推動下,為互聯網世界帶來了無限可能。
如今,Java穩定的性能表現,以及較強的擴展性和安全性,使得它在各個領域內都有著非常廣發的應用。但30年后的今天,Python、Go、Ruby、Rust等各種編程語言紛紛涌現,我們也經常聽到Java被詬病的聲音:Java運行速度慢、不夠靈活、抽象程度過高等缺陷。無處不在的Java,總是讓開發者既熟悉又迷茫。那么,Java未來會有哪些改進方向?如何看待云原生時代Java的發展?如何看待各種編程語言之間的“競爭”?在不久前的Java核心技術大會上,“語言、平臺和趨勢”專場為技術圈帶來了一場云原生時代的現代化的Java實踐與演進的主題盛宴。51CTO聯合機械工業出版社華章分社對本次大會主席,阿里云程序語言與編譯器團隊負責人、Java Champion李三紅先生進行專訪,他將為我們詳細介紹Java語言的新特性、國內OpenJDK的發展情況,以及編程語言未來的發展趨勢,以饗讀者。
緣起:Java發展背后的動力
Q:請您先簡單介紹一下自己以及您目前所關注的領域。
A:大家好,我是李三紅,目前就職于阿里云程序語言與編譯器團隊,我們團隊主要的工作是針對阿里、螞蟻的各種云上業務的需求,新技術的發展,新硬件的引入等,在編譯器,語言運行時等基礎領域進行研究創新,目前在語言工具鏈這塊已經有Alibaba Dragonwell(Java), Alibaba LLVM(C++) 等多個產品來支撐我們的業務。我目前關注的領域,也是和我的工作職責相關的,主要也是運行時,編譯器領域。
Q:您最初為什么會選擇Java作為主要研究對象?Java語言具有哪些獨特的優勢?
A:其實是一個極偶然的選擇。我當時讀大學的時候,看到大部分企業計算的場景在使用Java作為主要的開發語言。其實到今天這個狀況也沒有多少改變 – Java仍然是企業計算領域最重要的開發語言。1997年,Java之父James Gosling在Computer上發表了題為《The Feel of Java》的文章。在這篇文章里,他談到的Architecture Neutral, Object Orientation,Distributed Objects等重要的特性,奠定了Java發展至今的基本藍圖。關于Java語言的優勢特點,站在不同比較角度(比如不同語言特性對比),可能會得出不同的結論。
如果我們從軟件交付周期來看,在Java身上體現的優勢還是比較明顯的。開發編碼階段,以康威定律為理論基礎的微服務最佳實踐,可以幫助一個復雜的大型組織極大釋放各個團隊的并行研發效率。Java語言提供了面向框架開發友好的Metaprogramming支持,這也是眾多Java框架成功的重要秘訣。基于Java語言棧的多樣性的Java開源框架,可以幫助開發者快速搭建面向微服務的技術體系。軟件運行維護階段,Java提供了開發者豐富的技術手段,從基礎的JFR(low-overhead JVM profiling技術),BCI(Bytecode Instrument) , JMX到上層的各種監控,探針技術,極大提高了線上Java應用,尤其是大規模部署集群的可觀測性。同時,大量的Java性能診斷,問題排查工具,例如J*(jstack, jmap等)工具,Eclipse MAT/Jifa, VisualVM, JConsole, Java Mission Control等等,都可以快速,有效地幫助開發者解決生產環境碰到的問題。
版本升級:可持續性與穩定性的考量
?
Q:在Java各個版本升級方面,尤其對于企業而言,您有哪些建議?
A:先說下Java版本背景。2018年CodeOne(原JavaOne)大會上,Oracle宣布了Java發布模式的重要變化。就是目前大家都知道的:每6個月發布一個新版本,每2年指定一個LTS (Long-term support)版本(去年Oracle宣布LTS從原來3年變為2年)。對于推薦版本,出于安全,穩定性的考慮,理想情況當然是應用能夠及時跟進Java的最新版本,這意味著:需要每六個月升級一次,這恐怕對大多數企業都是做不到的。軟件版本,尤其底層軟件版本的升級,對企業的基礎底層架構的敏捷性是一個極大的考驗,意味著多方面的能力:比如企業內的Java基礎設施是否在內部被統一強管控,是否很容易支持不同軟件版本的灰度測試,是否有有效的預發測試來覆蓋軟件升級不兼容等帶來的不確定性,是否有圍繞研發效能的支持工具幫助開發者將大部分的升級工作自動化等等。關于Java版本升級,這里給大家一個介紹工具 - Eclipse Migration Tool for Java(EMT4J),由阿里開源,目前在Eclipse Adoptium下孵化。我們的初衷是希望把阿里這么多年大規模升級Java版本的專家經驗沉淀到這個工具,幫助Java社區的用戶可以更快地采納新的Java版本。
Q:您認為開發者對于升級Java動力不足的原因是什么?
A:確實,現實中的Java應用的版本升級是較為緩慢。Java 11(OpenJDK11)距離2018年發布已經將近4年, 據我了解到的,我們目前大多數的國內用戶仍然停留在Java 8。阿里內部已經在大規模地往Java 11遷移,有一部分會直接從Java 8往Java 17遷移。動力不足是多方面的,對開發者來說最直接的原因可能還是來自于:升級后將會帶來很多兼容性問題,以及隨之而來的穩定性問題,這些都會直接影響業務的連續性。這其實也是我們開源EMT4J的初衷:希望將Java升級的經驗通過工具的方式沉淀下來, 通過工具的自動化,幫助Java 應用無縫升級最新版本JDK。
目前EMT4J主要支持的是從Java 8到Java 11&17的升級。Java版本的升級問題,我們還可以從另一個角度 —Software Sustainability— 來進一步探討下。由Google C++代碼庫負責人Titus Winter等編寫的《Software Engineering at Google - Lessons Learned from Programming Over Time》一書中,談到了組織的Codebase Sustainability概念,強調了兩個核心理念:第一,無論是技術的,還是業務需求,你的軟件代碼應當可以做一切你應該做的改變。第二,這些改變帶來的影響是安全的。
回到Java版本升級這個問題,我們在開發Java應用的時候,建議Java的架構師們考慮把Java版本升級納入到Software Sustainability這個維度下考量,對代碼開發規范進行相關的約束,比如:不要讓你的代碼依賴JDK內部未公開的API(通過反射),不要讓你的實現依賴特定的JDK版本行為等等。架構的目標應當是Java應用可以在任何時候根據實際需要平滑升級到不JDK版本(Sustainability),而不應當是盡量少的升級(穩定性隱患的擔心)。
Q:Java17 是在2021年9月發布的一個LTS版本(長期支持版本)。我們也注意到,針對基于Java17升級出版的《Java核心技術(原書第12版)》也于近期出版。您可以給到一些閱讀建議嗎?
A:《Java核心技術》第12版延續之前版本的優良傳統,每當Java有新的LTS版本發布,這本書都會隨之更新,這次也不例外。《Java核心技術》第12版涵蓋了Java 17的最新特性介紹,幫助開發者深入了解使用Java設計和實現軟件涉及的所有基礎知識和特性,相信在學習Java的道路上有了本書的輔助,你的學習一定可以做到事半功倍。

Q:針對目前Java的新特性和發展方向,您認為是否可以解決開發者當前的業務挑戰?
A:2019年,圖靈獎的兩位得主John L. Hennessy 和David A. Patterson在Communications of the ACM上發表了《A New Golden Age for Computer Architecture》的報告,詳細描述了引發計算機架構新時代到來的種種變化。后摩爾時代,算力增長放緩,更多利用多核,SIMD(單指令多數據流)等并行計算技術,以及異構來釋放更大的計算機算力。Java這樣的高級語言,處在軟件棧上更高的抽象級別,同時也帶來更多創新可能。Java的發展演進,在多核,異構加速領域做了多方面的探索,適應與優化。
比如:在通用CPU領域,OpenJDK社區的Vector API項目可以依賴CPU 的 SIMD能力獲得計算性能的成倍提升。即將發布的OpenJDK 19引入了Virtual Threads (Preview),旨在幫助Java開發者高效處理并發(尤其針對 IO密集型場景) 。而在異構領域,早2014年 JVM技術峰會,AMD就分享了Sumatra項目,嘗試實現 JVM 與 Heterogeneous System Architecture目標硬件交互。由The University of Manchester發起的TornadoVM項目,目標是幫助Java開發者不需要了解GPU編程語言或者相關的GPU體系結構知識就可以編寫面向異構的并行程序。另外,從計算模式變化來看 — 云原生時代的到來,軟件的交付方式發生了根本性變化。以Java為例,在之前Java開發交付的是應用本身,具體體現在以‘jar’'war’的形式交付,而云原生最佳實踐,則是基于微服務形式,以Container為基本交付單位,并在K8S中編排。
云原生應用要求更快速的啟動、強調資源按量消費,彈性擴展,以及可觀測性等。事實上Java技術在云原生時代也在不停地進化。這里舉些例子:更多支持Container部署的特性已經加入到OpenJDK 版本(例如UseContainerSupport選項)。著眼于Java啟動性能的優化,基于OpenJDK的幾個創新項目在多個不同方向探索Java技術棧的邊界,包括CRaC(Coordinated Restore at Checkpoint) ,Leyden,以及由阿里和Google作為主要貢獻者的 Fast Startup Incubator 項目( Eclipse Adoptium 下孵化)。JVM資源彈性使用方面,由Alibaba Dragonwell提供的ElasticHeap功能,主要目的是解決云計算環境下內存資源使用的彈性問題。最后,JFR以及JFR Streaming技術為構建Java云原生可觀測工具提供了重要的技術支撐。
Q:國內廠商對于OpenJDK的態度如何?未來各大廠商在OpenJDK上的競爭格局將會是怎樣的?深度參與OpenJDK對于Java、IT公司和云廠商來說,分別有什么影響?
A:OpenJDK是Java SE開源的引用實現 (Reference Implementation) 。從Sun (后來被 Oracle 收購)在2006年的JavaOne大會上宣布Java技術開源,到現在已經將近16年。這個過程中,Java生態越來越開放,有越來越多的公司參與到了OpenJDK社區。阿里最早是在2012年簽署OCA,并參與到了OpenJDK的開發。國內友商包括騰訊,華為,龍芯等也在積極參與。更多的廠商參與進來合作共建,這對Java社區的健康,可持續發展是好事,也是一個健康的技術社區所希望看到的。
Q:在Java核心技術大會上,我們注意到云原生時代的現代Java、封閉式Java部署模型、虛擬機方面都有了新的演進。那么,請問您會從哪些角度看待編程語言的發展趨勢呢?現狀如何呢?
A:在計算機的歷史上,第一個完整的編譯器由IBM的John Backus領導的 FORTRAN團隊在1957年推出。Fortran語言也是第一個被廣泛使用的高級語言。如果從1957年開始算起,隨著硬件架構的更新迭代,圍繞軟件生產力(productivity),可靠性(reliability),簡潔性(simplicity),在編程語言編譯器發展的60多年里,最了不起的成就是今天編程語言的廣泛使用。毫無疑問,編程語言已經成為支持全球經濟的無處不在的軟件設施的基礎。
Java核心技術大會上我們探討了Java的演進和發展趨勢,包括在后摩爾時代,硬件性能的增長趨緩的情況下,如何做更好的軟硬件結合,以及如何充分發掘硬件性能,面向云計算模式下的Java運行時系統探索和創新等等。這些探索和創新,對于其他編程語言來講,也是可以互相學習和借鑒的。
Q:去年,Google官方宣布:Kotlin是Android應用程序開發人員的首選語言。這是否意味著Java占據Android開發絕對統治的時代一去不復返了?
A:如果從Java運行時這個角度看, Kotlin屬于JVM領域的語言,和Scala一樣,與Java沒有什么本質的區別。事實上,Google在2016年就宣布了Android 從Apache Harmony-based(谷歌與甲骨文長達十多年的Java版權糾紛官司)實現切換到OpenJDK。Android使用的類庫就是基于OpenJDK的。
編程語言:沒有銀彈,勿輕言放棄
Q:在您看來,目前最流行的編程語言是哪個?Java、Python、C、C++、Go、Rust,您未來更看好哪些語言的發展?對于編程語言的選擇上,您有哪些建議?
A:很難講什么算是最流行(需要具體語境), 如果大家關心語言排行榜,可以參考下TIOBE Index,GitHub這些。編程語言本身僅僅是一個工具,面向一個業務領域,選擇適合的語言工具,解決你的業務問題。沒有銀彈—對于編程語言也是一樣 — 沒有哪種編程語言,比其他的絕對的好或者絕對的不好。
比如Java的簡潔在于主要以面向對象為其主要的編程范式,而C++的復雜(另一方面帶來了編程靈活度)在于提供了開發者復合的編程范式、面向過程、面向對象,以及面向泛型編程。C++在提供更強大的抽象 (powerful abstraction) 同時,允許開發者更高效地使用硬件 (efficient use of hardware) 。當你在面臨一個業務問題的時候, 需要充分考慮的是業務本身的屬性,然后根據業務需求選擇適當的編程工具。
1986年,Fred Brooks在他的《No Silver Bullet—Essence and Accident in Software Engineering》 經典論文中,把軟件復雜度分為本質復雜度(Essential Complexity)和偶然復雜度(Accidental Complexity)。關鍵的點是,合適的編程工具的選擇,是用來解決軟件開發中的偶然復雜度的。如果為了選擇某種語言(比如出于某些群體的興趣喜好),反而引入了更多的偶然復雜度,那本身就是本末倒置了。
Q:您能為Java人的職業和技術成長道路提出一些建議嗎?
A:最后,我引述一下James Gosling在《遠大前程:從軟件新手到行業大牛》(英文書名: Making It Big in Software)一書中接受采訪時說的一段話:”Be really stubborn. A lot of these things are really easy to give up on. Whether it’s organizations that you give up, or APIs, or software, a lot of times, it’s too easy to give up too early.”
堅持自己的初心,不要輕言放棄。
嘉賓介紹

李三紅
阿里云程序語言與編譯器團隊負責人,在虛擬機領域擁有20+項技術論文/專利。活躍于 Java 技術社區,GreenTea JUG(Java User Group) co-leader。Java Champion,Java標準執行委員會(JCP-EC)、GraalVM Project Advisory Board成員,Eclipse Adoptium(AdoptOpenJDK) PMC。
?


































