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