嘉賓 | 李三紅
撰稿 | 云昭
審校 | 千山
欄目介紹:“T前線”是51CTO內(nèi)容中心專為技術人物開設的深度訪談欄目之一,通過邀請技術界內(nèi)的業(yè)務負責人、資深架構師、資深技術專家等對當下的技術熱點、技術實踐和技術趨勢進行深度的解讀和洞察,推動前沿科技的傳播與發(fā)展。
如果從1992年Oka(Java的前身)算起,Java已經(jīng)走過了30年的道路。作為公認的革新性的編程語言,Java懷揣著James Gosling,Patrick Naughton,Chris Warth,Ed Frank和Mike Sheridan的“可移植”、“跨平臺”的初衷,在Bill Joy,Arthur van Hoff等貢獻者的推動下,為互聯(lián)網(wǎng)世界帶來了無限可能。
如今,Java穩(wěn)定的性能表現(xiàn),以及較強的擴展性和安全性,使得它在各個領域內(nèi)都有著非常廣發(fā)的應用。但30年后的今天,Python、Go、Ruby、Rust等各種編程語言紛紛涌現(xiàn),我們也經(jīng)常聽到Java被詬病的聲音:Java運行速度慢、不夠靈活、抽象程度過高等缺陷。無處不在的Java,總是讓開發(fā)者既熟悉又迷茫。那么,Java未來會有哪些改進方向?如何看待云原生時代Java的發(fā)展?如何看待各種編程語言之間的“競爭”?在不久前的Java核心技術大會上,“語言、平臺和趨勢”專場為技術圈帶來了一場云原生時代的現(xiàn)代化的Java實踐與演進的主題盛宴。51CTO聯(lián)合機械工業(yè)出版社華章分社對本次大會主席,阿里云程序語言與編譯器團隊負責人、Java Champion李三紅先生進行專訪,他將為我們詳細介紹Java語言的新特性、國內(nèi)OpenJDK的發(fā)展情況,以及編程語言未來的發(fā)展趨勢,以饗讀者。
緣起:Java發(fā)展背后的動力
Q:請您先簡單介紹一下自己以及您目前所關注的領域。
A:大家好,我是李三紅,目前就職于阿里云程序語言與編譯器團隊,我們團隊主要的工作是針對阿里、螞蟻的各種云上業(yè)務的需求,新技術的發(fā)展,新硬件的引入等,在編譯器,語言運行時等基礎領域進行研究創(chuàng)新,目前在語言工具鏈這塊已經(jīng)有Alibaba Dragonwell(Java), Alibaba LLVM(C++) 等多個產(chǎn)品來支撐我們的業(yè)務。我目前關注的領域,也是和我的工作職責相關的,主要也是運行時,編譯器領域。
Q:您最初為什么會選擇Java作為主要研究對象?Java語言具有哪些獨特的優(yōu)勢?
A:其實是一個極偶然的選擇。我當時讀大學的時候,看到大部分企業(yè)計算的場景在使用Java作為主要的開發(fā)語言。其實到今天這個狀況也沒有多少改變 – Java仍然是企業(yè)計算領域最重要的開發(fā)語言。1997年,Java之父James Gosling在Computer上發(fā)表了題為《The Feel of Java》的文章。在這篇文章里,他談到的Architecture Neutral, Object Orientation,Distributed Objects等重要的特性,奠定了Java發(fā)展至今的基本藍圖。關于Java語言的優(yōu)勢特點,站在不同比較角度(比如不同語言特性對比),可能會得出不同的結論。
如果我們從軟件交付周期來看,在Java身上體現(xiàn)的優(yōu)勢還是比較明顯的。開發(fā)編碼階段,以康威定律為理論基礎的微服務最佳實踐,可以幫助一個復雜的大型組織極大釋放各個團隊的并行研發(fā)效率。Java語言提供了面向框架開發(fā)友好的Metaprogramming支持,這也是眾多Java框架成功的重要秘訣。基于Java語言棧的多樣性的Java開源框架,可以幫助開發(fā)者快速搭建面向微服務的技術體系。軟件運行維護階段,Java提供了開發(fā)者豐富的技術手段,從基礎的JFR(low-overhead JVM profiling技術),BCI(Bytecode Instrument) , JMX到上層的各種監(jiān)控,探針技術,極大提高了線上Java應用,尤其是大規(guī)模部署集群的可觀測性。同時,大量的Java性能診斷,問題排查工具,例如J*(jstack, jmap等)工具,Eclipse MAT/Jifa, VisualVM, JConsole, Java Mission Control等等,都可以快速,有效地幫助開發(fā)者解決生產(chǎn)環(huán)境碰到的問題。
版本升級:可持續(xù)性與穩(wěn)定性的考量
?
Q:在Java各個版本升級方面,尤其對于企業(yè)而言,您有哪些建議?
A:先說下Java版本背景。2018年CodeOne(原JavaOne)大會上,Oracle宣布了Java發(fā)布模式的重要變化。就是目前大家都知道的:每6個月發(fā)布一個新版本,每2年指定一個LTS (Long-term support)版本(去年Oracle宣布LTS從原來3年變?yōu)?年)。對于推薦版本,出于安全,穩(wěn)定性的考慮,理想情況當然是應用能夠及時跟進Java的最新版本,這意味著:需要每六個月升級一次,這恐怕對大多數(shù)企業(yè)都是做不到的。軟件版本,尤其底層軟件版本的升級,對企業(yè)的基礎底層架構的敏捷性是一個極大的考驗,意味著多方面的能力:比如企業(yè)內(nèi)的Java基礎設施是否在內(nèi)部被統(tǒng)一強管控,是否很容易支持不同軟件版本的灰度測試,是否有有效的預發(fā)測試來覆蓋軟件升級不兼容等帶來的不確定性,是否有圍繞研發(fā)效能的支持工具幫助開發(fā)者將大部分的升級工作自動化等等。關于Java版本升級,這里給大家一個介紹工具 - Eclipse Migration Tool for Java(EMT4J),由阿里開源,目前在Eclipse Adoptium下孵化。我們的初衷是希望把阿里這么多年大規(guī)模升級Java版本的專家經(jīng)驗沉淀到這個工具,幫助Java社區(qū)的用戶可以更快地采納新的Java版本。
Q:您認為開發(fā)者對于升級Java動力不足的原因是什么?
A:確實,現(xiàn)實中的Java應用的版本升級是較為緩慢。Java 11(OpenJDK11)距離2018年發(fā)布已經(jīng)將近4年, 據(jù)我了解到的,我們目前大多數(shù)的國內(nèi)用戶仍然停留在Java 8。阿里內(nèi)部已經(jīng)在大規(guī)模地往Java 11遷移,有一部分會直接從Java 8往Java 17遷移。動力不足是多方面的,對開發(fā)者來說最直接的原因可能還是來自于:升級后將會帶來很多兼容性問題,以及隨之而來的穩(wěn)定性問題,這些都會直接影響業(yè)務的連續(xù)性。這其實也是我們開源EMT4J的初衷:希望將Java升級的經(jīng)驗通過工具的方式沉淀下來, 通過工具的自動化,幫助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概念,強調(diào)了兩個核心理念:第一,無論是技術的,還是業(yè)務需求,你的軟件代碼應當可以做一切你應該做的改變。第二,這些改變帶來的影響是安全的。
回到Java版本升級這個問題,我們在開發(fā)Java應用的時候,建議Java的架構師們考慮把Java版本升級納入到Software Sustainability這個維度下考量,對代碼開發(fā)規(guī)范進行相關的約束,比如:不要讓你的代碼依賴JDK內(nèi)部未公開的API(通過反射),不要讓你的實現(xiàn)依賴特定的JDK版本行為等等。架構的目標應當是Java應用可以在任何時候根據(jù)實際需要平滑升級到不JDK版本(Sustainability),而不應當是盡量少的升級(穩(wěn)定性隱患的擔心)。
Q:Java17 是在2021年9月發(fā)布的一個LTS版本(長期支持版本)。我們也注意到,針對基于Java17升級出版的《Java核心技術(原書第12版)》也于近期出版。您可以給到一些閱讀建議嗎?
A:《Java核心技術》第12版延續(xù)之前版本的優(yōu)良傳統(tǒng),每當Java有新的LTS版本發(fā)布,這本書都會隨之更新,這次也不例外。《Java核心技術》第12版涵蓋了Java 17的最新特性介紹,幫助開發(fā)者深入了解使用Java設計和實現(xiàn)軟件涉及的所有基礎知識和特性,相信在學習Java的道路上有了本書的輔助,你的學習一定可以做到事半功倍。
Q:針對目前Java的新特性和發(fā)展方向,您認為是否可以解決開發(fā)者當前的業(yè)務挑戰(zhàn)?
A:2019年,圖靈獎的兩位得主John L. Hennessy 和David A. Patterson在Communications of the ACM上發(fā)表了《A New Golden Age for Computer Architecture》的報告,詳細描述了引發(fā)計算機架構新時代到來的種種變化。后摩爾時代,算力增長放緩,更多利用多核,SIMD(單指令多數(shù)據(jù)流)等并行計算技術,以及異構來釋放更大的計算機算力。Java這樣的高級語言,處在軟件棧上更高的抽象級別,同時也帶來更多創(chuàng)新可能。Java的發(fā)展演進,在多核,異構加速領域做了多方面的探索,適應與優(yōu)化。
比如:在通用CPU領域,OpenJDK社區(qū)的Vector API項目可以依賴CPU 的 SIMD能力獲得計算性能的成倍提升。即將發(fā)布的OpenJDK 19引入了Virtual Threads (Preview),旨在幫助Java開發(fā)者高效處理并發(fā)(尤其針對 IO密集型場景) 。而在異構領域,早2014年 JVM技術峰會,AMD就分享了Sumatra項目,嘗試實現(xiàn) JVM 與 Heterogeneous System Architecture目標硬件交互。由The University of Manchester發(fā)起的TornadoVM項目,目標是幫助Java開發(fā)者不需要了解GPU編程語言或者相關的GPU體系結構知識就可以編寫面向異構的并行程序。另外,從計算模式變化來看 — 云原生時代的到來,軟件的交付方式發(fā)生了根本性變化。以Java為例,在之前Java開發(fā)交付的是應用本身,具體體現(xiàn)在以‘jar’'war’的形式交付,而云原生最佳實踐,則是基于微服務形式,以Container為基本交付單位,并在K8S中編排。
云原生應用要求更快速的啟動、強調(diào)資源按量消費,彈性擴展,以及可觀測性等。事實上Java技術在云原生時代也在不停地進化。這里舉些例子:更多支持Container部署的特性已經(jīng)加入到OpenJDK 版本(例如UseContainerSupport選項)。著眼于Java啟動性能的優(yōu)化,基于OpenJDK的幾個創(chuàng)新項目在多個不同方向探索Java技術棧的邊界,包括CRaC(Coordinated Restore at Checkpoint) ,Leyden,以及由阿里和Google作為主要貢獻者的 Fast Startup Incubator 項目( Eclipse Adoptium 下孵化)。JVM資源彈性使用方面,由Alibaba Dragonwell提供的ElasticHeap功能,主要目的是解決云計算環(huán)境下內(nèi)存資源使用的彈性問題。最后,JFR以及JFR Streaming技術為構建Java云原生可觀測工具提供了重要的技術支撐。
Q:國內(nèi)廠商對于OpenJDK的態(tài)度如何?未來各大廠商在OpenJDK上的競爭格局將會是怎樣的?深度參與OpenJDK對于Java、IT公司和云廠商來說,分別有什么影響?
A:OpenJDK是Java SE開源的引用實現(xiàn) (Reference Implementation) 。從Sun (后來被 Oracle 收購)在2006年的JavaOne大會上宣布Java技術開源,到現(xiàn)在已經(jīng)將近16年。這個過程中,Java生態(tài)越來越開放,有越來越多的公司參與到了OpenJDK社區(qū)。阿里最早是在2012年簽署OCA,并參與到了OpenJDK的開發(fā)。國內(nèi)友商包括騰訊,華為,龍芯等也在積極參與。更多的廠商參與進來合作共建,這對Java社區(qū)的健康,可持續(xù)發(fā)展是好事,也是一個健康的技術社區(qū)所希望看到的。
Q:在Java核心技術大會上,我們注意到云原生時代的現(xiàn)代Java、封閉式Java部署模型、虛擬機方面都有了新的演進。那么,請問您會從哪些角度看待編程語言的發(fā)展趨勢呢?現(xiàn)狀如何呢?
A:在計算機的歷史上,第一個完整的編譯器由IBM的John Backus領導的 FORTRAN團隊在1957年推出。Fortran語言也是第一個被廣泛使用的高級語言。如果從1957年開始算起,隨著硬件架構的更新迭代,圍繞軟件生產(chǎn)力(productivity),可靠性(reliability),簡潔性(simplicity),在編程語言編譯器發(fā)展的60多年里,最了不起的成就是今天編程語言的廣泛使用。毫無疑問,編程語言已經(jīng)成為支持全球經(jīng)濟的無處不在的軟件設施的基礎。
Java核心技術大會上我們探討了Java的演進和發(fā)展趨勢,包括在后摩爾時代,硬件性能的增長趨緩的情況下,如何做更好的軟硬件結合,以及如何充分發(fā)掘硬件性能,面向云計算模式下的Java運行時系統(tǒng)探索和創(chuàng)新等等。這些探索和創(chuàng)新,對于其他編程語言來講,也是可以互相學習和借鑒的。
Q:去年,Google官方宣布:Kotlin是Android應用程序開發(fā)人員的首選語言。這是否意味著Java占據(jù)Android開發(fā)絕對統(tǒng)治的時代一去不復返了?
A:如果從Java運行時這個角度看, Kotlin屬于JVM領域的語言,和Scala一樣,與Java沒有什么本質(zhì)的區(qū)別。事實上,Google在2016年就宣布了Android 從Apache Harmony-based(谷歌與甲骨文長達十多年的Java版權糾紛官司)實現(xiàn)切換到OpenJDK。Android使用的類庫就是基于OpenJDK的。
編程語言:沒有銀彈,勿輕言放棄
Q:在您看來,目前最流行的編程語言是哪個?Java、Python、C、C++、Go、Rust,您未來更看好哪些語言的發(fā)展?對于編程語言的選擇上,您有哪些建議?
A:很難講什么算是最流行(需要具體語境), 如果大家關心語言排行榜,可以參考下TIOBE Index,GitHub這些。編程語言本身僅僅是一個工具,面向一個業(yè)務領域,選擇適合的語言工具,解決你的業(yè)務問題。沒有銀彈—對于編程語言也是一樣 — 沒有哪種編程語言,比其他的絕對的好或者絕對的不好。
比如Java的簡潔在于主要以面向對象為其主要的編程范式,而C++的復雜(另一方面帶來了編程靈活度)在于提供了開發(fā)者復合的編程范式、面向過程、面向對象,以及面向泛型編程。C++在提供更強大的抽象 (powerful abstraction) 同時,允許開發(fā)者更高效地使用硬件 (efficient use of hardware) 。當你在面臨一個業(yè)務問題的時候, 需要充分考慮的是業(yè)務本身的屬性,然后根據(jù)業(yè)務需求選擇適當?shù)木幊坦ぞ摺?/span>
1986年,F(xiàn)red Brooks在他的《No Silver Bullet—Essence and Accident in Software Engineering》 經(jīng)典論文中,把軟件復雜度分為本質(zhì)復雜度(Essential Complexity)和偶然復雜度(Accidental Complexity)。關鍵的點是,合適的編程工具的選擇,是用來解決軟件開發(fā)中的偶然復雜度的。如果為了選擇某種語言(比如出于某些群體的興趣喜好),反而引入了更多的偶然復雜度,那本身就是本末倒置了。
Q:您能為Java人的職業(yè)和技術成長道路提出一些建議嗎?
A:最后,我引述一下James Gosling在《遠大前程:從軟件新手到行業(yè)大牛》(英文書名: 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 技術社區(qū),GreenTea JUG(Java User Group) co-leader。Java Champion,Java標準執(zhí)行委員會(JCP-EC)、GraalVM Project Advisory Board成員,Eclipse Adoptium(AdoptOpenJDK) PMC。
?