Java 的过去,现在与未来
导读:6月21-23日,2019 GIAC全球互联网架构大会将于深圳举行。GIAC是面向架构师、技术负责人及高端技术从业人员的年度技术架构大会,是中国地区规模最大的技术会议之一。今年GIAC邀请到了众多布道师、明星讲师以及105位来自Google、微软、Oracle、eBay、百度、阿里、腾讯、商汤、图森、字节跳动、新浪、美团点评等公司专家出席。
在大会前夕,高可用架构采访了本届 GIAC Java分论坛 出品人于海波,就目前大家广泛关注的Java方面的问题进行了访谈。
于海波老师您好,我是高可用架构编辑王渊命,很高兴采访到您。
王渊命:您也是技术圈的老兵了,请给高可用架构的读者介绍一下自己。
于海波:我现在担任Oracle Java Platform Group北京研发总监,带领中国研发团队负责JDK的feature release和update release的开发测试,以及提供对本地社区的支持。2015年加入Oracle之前,在IBM负责IBM i for Power系统(OS/400)的研发,涵盖数据库、高可用、中间件、开发工具和管理工具等各个领域,长期服务于企业客户。在早年也曾参与国产Linux系统的研发工作,包括开源的Java虚拟机、嵌入式系统、网络存储等等。
王渊命:您在 GIAC 的演讲主题是 《Java, Today and Tomorrow》,但是没有说 Java 的过去。正好前几天 5 月 23 日是 Java 24 岁生日。那我们这里回顾一下 Java 的过去。20 多年以来,Java 几乎一直雄霸编程语言排行榜。当初各种编程语言也很多,为什么 Java 能突破出来?如果回过头来看,您觉得在这个过程中,Java 的哪些努力做对了,哪些做错了,遇到了哪些机遇,才造就了今天的 Java?
于海波:任何一种编程语言如果要获得用户和开发者的认可,一定是要解决一些应用开发和运维的痛点的。Java当初诞生的时候,正是上世纪90年代末互联网兴起的时代,在企业应用开发中存在几个问题,一是以IBM,SUN和HP的UNIX服务器和大型机为主的异构环境,C/C++和其它语言编写的应用跨平台支持和移植比较困难,二是基于CGI和其它技术的网络应用从开发效率和功能性角度来看都不够理想,三是C/C++在当时是主流编程语言,门槛高、易出错、对经验要求很高,而Java简单易学、安全可靠,并且一次编写到处运行,再加上applet、servlet和JSP技术,解决了这些痛点,满足了当时互联网程序设计和运维的要求,伴随着互联网的发展一下子就脱颖而出并长期占据主流地位。
Java能够长盛不衰得益于在标准的统一和开放基础上不断的与时俱进。Java除了是一种编程语言,也同时是一个运行时,为了能够在最广泛的平台和环境中运行,在诞生伊始就联合各个厂商和组织形成语言和虚拟机统一标准,并通过TCK对标准的具体实现进行认证,保障了来自于任何一个厂商的JDK的兼容性,使得Java没有出现如UNIX系统那样的问题。开放性是Java生命常青的另一个基石,Java的演进一直由各个厂商和用户组成的社区来协调和驱动,遵从JCP的流程来讨论决定重大特性和问题,这一点保障了Java生态的发展壮大和活跃。社区和生态的活跃反过来又促进了Java的发展,Java的一些特性和类库就是直接继承自社区的项目,比如JDK 5引入的JSR 166 until.concurrent,JDK 8 引入的新Java date和time API等等。正在开发中的很多重要项目,比如Amber、Valhalla、Loom等等,也都是社区呼声很高的,并且在迭代中积极吸纳社区的意见和反馈。
从JDK 10开始,Java改为每6个月发布一个feature release,这是Java适应云时代技术快速发展的另一个重要举措。过去一个主版本的发布需要3年甚至更久,使得很多社区期待但又不用很长时间就可以实现的特性,也不得不等待更久。6个月一个版本,使得短平快的特性能够及时发布来满足开发者需求,同时对于大的复杂的特性又能够分解成小的可以发布的单元,及时获得社区的使用和反馈。在6个月一个版本的基础上,针对需要更加稳定的运行环境的企业客户,我们又提供LTS版本。这个新的release模式,使得Java能够同时满足两种不同类别用户的需求,更加有利于Java向前推进。
回顾历史,如果说Java还有哪些做的不足的地方,我想最主要的可能是跟某些新兴的语言比,广大开发者认为Java的新特性引入的过于慢或者说保守,这背后有一个很重要的因素就是Java的强向后兼容性。因为巨大数量的应用在企业环境里运行,通过保持向后兼容性来保护企业对现有应用的投资是Java的一个重要原则,每一个新特性的引入,都要在社区内经过严格的兼容性评估,以及新特性本身的成熟度的评估,一旦引入了不够完备或者成熟的特性,意味着我们要付出很久的代价去维护它。所以,鱼与熊掌很难兼得。当然,随着新的release模式的采用,我们希望这个问题被很好的解决。从社区的反馈来看,新的release模式还是很受欢迎的。
王渊命:历史上 Java 面临的最大挑战是来自于哪个语言的?C# 吗?C# 的运行模式和 Java 非常相似,语法特性上也有后来居上的许多优点,但为什么 C# 没能撼动 Java 的地位?
于海波:C#的出现在Java之后,兼收并蓄了C/C++和Java的优点,并且C#主要是微软一家主导,有些决策比较容易,所以它的演进要更快一些。微软是一家伟大的公司,不论是前面的Visual C/C++,VB等等还是后面的C#,开发工具都很好用很流行,但C#主要是部署运行在微软的平台上,由微软一家在主导,而Java从一开始就是厂商和用户组成的社区在驱动,拥有更加广泛的生态,支持运行部署在所有主流平台上,比如Windows、Unix和Linux等等,这是C#所不具备的优势。而且,Java具有最广泛的开发者数量,社区活跃度很高。这些都会成为一个项目或者产品选择开发语言的决定因素,所以在整个20多年的发展历史中,虽然有一些语言也获得一定的开发者青睐和支持,但Java主流应用开发语言的地位始终在保持。当然,随着技术发展越来越快,开发和部署环境的变化,Java社区也意识到我们需要做出改变来拥抱新的挑战,让Java保持生命活力。新的release模型和很多正在开发中的OpenJDK项目,就是让Java在云时代继续保持活力保持主流地位。
王渊命:我个人的一个观察,10 年前是 Java 的黄金时间,那时候各种大型的开源项目,用 Java 开发的非常多,好像是集中爆发一样,但最近明显感觉到新的开源项目使用 Java 的就比较少了。您有这种感觉吗?对此有什么解释?
于海波:首先,据https://octoverse.github.com/projects.html统计,Java稳稳的在GitHub的所有公开和私有代码库使用的top languages的第二位(JavaScript估计很难被其它语言短期内超越😉),在https://www.tiobe.com/tiobe-index/索引中,仍然以16%的得分排在第一位。10年前,正是企业级Java应用发展到了顶峰的时期,既包括传统的Java EE产品,也包括如Spring这样的轻量级框架,围绕着这些产品和应用的领域,很多开源项目蓬勃发展起来,必然也是大多采用了Java。但世界上没有解决一切问题的银弹,也没有适用一切场景的编程语言。随着新一代互联网的兴起,应用的架构和部署模式产生了很大变化,由传统的集中式演变到分布式为主,尤其是互联网项目的特点,快速搭建、上线和迭代演进,使得一些脚本语言如JavaScript,PHP,Python,Perl,Ruby等等成为可以顺手拈来的首选。另外,DevOps的发展,云的大规模部署和应用,微服务等等的出现,也使得像GO, Rust这样为网络应用而生的新语言变得流行起来。所以,就如同当年Java流行起来一样,基于这些语言的应用领域的开源项目也就越来越多。但Java作为一个成熟的有着大量开发者和可重用资源的语言,也是各大主流网站建设不可或缺的 (https://en.wikipedia.org/wiki/Programming_languages_used_in_most_popular_websites), 尤其是当需要更好的性能和安全特性的时候,Java的优势可以更好的体现出来。 比如,Twitter曾在2011年左右完成核心架构从Ruby到Java的迁移,对Twitter后续的爆发式增长起到稳定的支撑作用,但Ruby也确实因为简单易用而在Twitter初始发展阶段起到不可磨灭的贡献。
在我看来,技术的多样性是好事情,使得开发者可以选择相对适用的语言,同时多样性也必然带来竞争,而竞争是不断创新的驱动力。Java仍然在社区集体力量的推动下不断吸纳其它语言的优点、适应新的需求,如果你的应用需要一种稳定的、安全的和高效的开发与运行平台,Java仍然是你应该考虑的选择。
王渊命:您个人是怎么看待 Oracle 和 Google 关于 Java 的版权之争的?如果 API 也有版权保护的话,岂不是众多开源项目都有风险了?我个人觉得如果最后判决 Java API 也受版权保护,对 Java 的生态发展很不利。你们内部有争议吗?
于海波:这个问题是一个热点问题,也是一个法律问题,所以我不能在此给出任何解释。但我想说明一点,IT行业能够发展到今天,拥有这么多丰富的产品和项目,为全世界人带来这么多便利和服务,这是与合理的版权保护分不开的。没有良好的版权意识的保护,就无法建立良性的业务模式,也就会失去对创新者的激励和保护,技术发展将停滞不前。
王渊命:讨论到这里,背后其实隐含着一个更基础的问题需要讨论。到底什么是 Java?我们谈论 Java 的时候实际上指是什么?Java 的语法和 API?JDK?字节码?或者 JVM?像 Android 这样,用了 Java 的语法,但新造了一套 VM 的,算 Java 吗?JVM 上编译成字节码的其他语言呢?
于海波:像我在前面提到,Java既是一种程序设计语言,也同时是一种运行平台或者环境,一个Java版本的发布是伴随着两个重要的spec的更新的,一个是Java Language Specification,一个是JVM Specification。语言的specification定义了语法和API,JVM的Spec定义了字节码、类的格式、加载等等。
Android的产生和演变过程,我在这里不加评论。但我可以谈一谈JVM和建立在JVM上的语言生态。让Java能够到处运行的实际上是字节码和运行字节码的JVM,字节码定义了一套独立于任何CPU架构的系统级指令集,这也是Virtual Machine的由来,然后由实现在各个硬件平台上的JVM来执行这个虚拟的指令集。而且在JVM的Spec中,留有足够的灵活性给实现者根据具体运行环境来权衡,比如,要不要GC,采用何种GC,是用JIT编译执行,还是仅仅解释执行,等等。这使得字节码可以运行在从客户端到服务器端再到嵌入式设备等等各种类别的计算能力的环境中。字节码定义和JVM与Java语言的分离带来了更多的可能性,随着JVM的广泛部署,产生了很多可以编译成为字节码的语言,这些语言与Java语言共同丰富了JVM上的语言生态,可以让字节码和JVM满足更多场景的应用。
王渊命:现在 Go 语言,Rust 语言,都在逐渐崛起,您觉得这两种语言会影响到 Java 的地位吗?
于海波:无疑,Go和Rust是近年来快速崛起的程序设计语言之一,在最近的Github统计上,Go和Rust的项目的贡献者数量的分别是前一年的1.5倍和1.7倍,可见这两种语言是很受欢迎和认可的。我个人认为,Go和Rust会争取到一定的现有C/C++和Java的用户,但不会对Java现有的地位有太大的影响。虽然Go和Rust这样新语言的诞生是基于解决传统语言的痛点,没有任何历史包袱,用简洁的语言特性满足了新兴互联网应用的需求,但他们初始的问题域也是一些特定领域,比如Rust更底层更系统层面,Go比Rust略高,以网络应用、微服务的实现等为主,而Java作为一种成熟的通用语言,拥有更加丰富多样和成熟的生态,适用范围、开发者数量和企业应用支持的力度,是Go和Rust这样的后来者暂时难以撼动的。尽管随着Go和 Rust的发展,越来越多的特性被加入,基于这些语言的项目也逐渐延伸到更多更广的领域,但Java也在积极的演进,解决当前的痛点和热点问题,随着Amber, Valhalla和Loom这些项目不断的集成到JDK主线,不论是开发者的效率还是Java应用的性能都在逐步提升。
王渊命:任何一个语言的发展都需要一个协调组织,来决定这个语言的特性,发展重点,协调开发者,使用者,厂商之间的关系。Java 中的这个组织就是 JCP(Java Community Process)。JCP 在最初成立之时,是很开放的,再后来感觉逐渐封闭,离个人开发者越来越远,所以也有很多改革的呼声。您是否可以总结下 JCP 这些年的发展?对其他编程语言社区有哪些启示意义?
于海波:我个人认为说JCP(https://jcp.org/en/home/index)或者Java越来越封闭是一种误解。Java语言和JVM的演进是由JCP来推动的,任何人都可以注册和参与JCP,审查JSR(Java Specification Request)和提供反馈意见。任何人也可以成为JCP成员,参与专家组,甚至提交他们自己的JSR。JCP的执行委员会(EC, Executive Committee)也是由JCP的代表成员选举组成的,都是各个厂商和组织的代表。这样的一种形式,保障了Java的标准的一致性和向后的兼容性,也保障了需求和提议能够在更广泛的范围内得到权衡,业界最普遍需要的特性得以批准实现。当然,因为流程的严谨性,以及真正参与其中发挥作用所需要的经验和对Java深入的理解,这些客观因素可能会让新入门者感觉到困难,这也是我们逐步需要解决的问题。从国内来说,阿里就在去年成功加入JCP并成为JCP EC的成员,这是一个很好的例子,表明只要有意愿积极参与,JCP的大门是敞开的。
开发者也许因为误解或者思路不同,对JCP有这样那样的意见,但事实上Java这么多年的发展和成熟,到现在既保持了标准的统一、强的向后兼容,又能够通过不断的创新演进保持强大的生命力,我认为这是其它语言社区应该借鉴的。
王渊命:一个新的编程语言需要有长期的,大量的开发人力投入,所以就牵扯到另外一个问题,编程语言的商业化。单从编程语言本身的发展来说,肯定越开放越好。但如果没有商业化,这么巨大的投入成本谁来负担?而如果要商业化,就必须围起栅栏,和语言本身的发展产生冲突。您如何看待这个问题?Go,Rust 当前还没凸显这个问题,只是因为它们尚未成熟吗?
于海波:在当今的开源与开放为主流的技术环境中,开放与商业化并不是完全对立的。良好的开源生态和商业化已经为我们提供了很好的参考,比如以Linux商业化发展起来的红帽和SUSE,他们并非通过私有技术建立壁垒,而是通过对开源的技术进行打包和服务,对需要稳定的产品和服务支持的企业提供付费的服务,来建立良好的业务模型,当2013年初红帽的财年收入突破10亿美金的时候,我想整个开源圈都为之振奋。 同时,开源技术要想获得良好的发展,必然也需要商业化的公司对其良好的支持,纵观Linux内核的开发,很多开发者都是就职于实体公司,没有商业化的资金和人力投入,Linux也很难获得当今的地位。对于编程语言的发展也是一样,Java从一开始一方面是标准开放的,一方面是Oracle(SUN,BEA)、IBM等厂商纷纷提供自己的基于标准的实现和商业服务,各个厂商在规范范围内进行各自的优化,但并没有利用语言特性等等建立封闭的壁垒,从JDK 9开始Oracle甚至逐渐把之前标准之外的商业化特性也开源出来,从JDK 11开始OpenJDK与Oracle JDK除了后续支持策略不同,代码上已经完全一致,这进一步促进了社区对于Java和JDK的热情,产生更多基于OpenJDK提供付费或者免费支持的厂商,对促进Java的演进和社区的繁荣起到推动作用。在这背后是Oracle和一众厂商对于OpenJDK的大量资金和人力投入,Oracle在每个Java版本发布后都会有一个社区贡献的统计,可以看出绝大部分代码都是以Oracle为主的各个公司的开发者贡献的。
Go来自于Google,Rust起源于Mozilla,但目前并没有像Java一样有公司对其提供商业化的支持,在语言逐步向前演进的过程中一定会面临一些挑战,诸如版本维护,兼容性考量,需求的优先级权衡等等,开源社区如何解决这些问题,最终这些语言走向何方,让我们拭目以待。
王渊命:最后给读者透漏下您这次演讲的主题内容,以及对 GIAC 大会的一些寄语。
于海波:我和我的同事尹旭将共同宣讲一个主题,就是Java的现在与未来,我们将揭示推动Java演进的背后的动力和逻辑,以及将对Java未来产生重大的影响的项目和特性,希望通过这个演进解决大家对于Java发展的困惑。
GIAC是国内办的比较成功的面向开发者的大会,很高兴我们能参与进来,我们预祝GIAC大会取得越来越大的成功,进一步推动社区的技术交流,为国内的开发者社区繁荣贡献力量。
注:本文仅代表被访者于海波的个人观点,并不代表 Oracle 公司。
本届GIAC Java专场的精彩议题如下: