嘉宾 | 李三红
撰稿 | 云昭
审校 | 千山
栏目介绍:“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。