人必须要保持成长性,明白以前囫囵吞枣接受的观念,有其局限性——而输入在很大程度上决定了输出,要不停地锻炼认识和思辨能力,并在两者不断发展的过程中,结合事实、常识和逻辑对旧有观念进行重新审视和扬弃,才能摆脱局限、拓宽精神世界。


Mark Reinhold(Java 平台首席架构师),2017 :Moving Java Forward Faster

二十多年来,Java SE Platform 和 JDK 以巨大、无规律,甚至是无法预料的方式在演进。每一次特性发版都由一个或多个重要特性驱动,为了迁就这些特性的实际进展,新版本的发布时间经常需要做出调整,有时甚至需要调整多次。

这种方法通过早期采用者全面的审查和测试,保障了新推出的重大特性的高质量。缺点是较小的 API、语言、JVM 特性调整需要等到重大特性准备就绪,才能跟着一起推出。

在世纪之交的几十年里,当和 Java 竞争的其余平台也以同样缓慢的方式演进时,这是一种可以接受的折衷方案。但今非昔比,当前 Java 的竞争对手正以更快的频率发布更新。

为了保持竞争力,Java 不能再仅仅满足于往前走,而需要往前赶。

Back on the train

5 年前,我开始思考一种张力——开发者更喜欢快速创新、企业更喜欢保持稳定、大家都喜欢有规律、可预测的发版计划。

为了应对不同的诉求,我建议从历史沿革下来 基于特性的发版模式 转换到 基于时间的列车模式 ——具体可以是每两年推出一个特性版本。在这种模式下,开发流程就是一个持续的创新管道,和实际的发版流程是松耦合关系——发版流程有自己的固有频率。任何特性,不管大小,当且仅当接近完成的时候才进行合并。如果一个特性错过了当前这班列车,只能表示遗憾,并等待搭乘下一班列车。

两年制列车在理论上很吸引人,但实际证明行不通。我们额外花了 8 个月来处理 Java 8 中关键的安全问题和完成 Lambda 项目,这比再延迟两年推出 Lamdba 更好。在开发 Java 9 的时候,为了包含 Jigsaw 项目,一开始的版本规划是两年半,这比再延迟 18 个月才推出 Jigsaw 更好,但在最后,我们又焦躁不安地多花了一年,所以 Java 9 在 Java 8 发布 3 年半之后才推出。

回顾过去,两年发一次版实在太慢了。为了保持一个持续稳定的步调,必须以更快的频率发版。推迟一个特性到下一个版本再发布,应该是一个带来少量不便的战术决定,而非一个带来重大后果的战略决策。

那么,我们就每 6 个月推出一个特性版本。

这样最小化了等待下一班列车的痛苦,并且足够慢以保障交付质量。

Proposal

其他平台和很多操作系统发行版都采用了这种发布模式,这让我备受鼓舞,所以提议在 Java 9 之后就采用一种严格的、基于时间的发布模式——每 6 个月发布一个 Feature 版本,每个季度发布一个 Update 版本,每 3 年发布一个 LTS 版本。

  • Feature release,可以包含任意特性,不只是新增和改善 API 的特性,也可以是语言和 JVM 特性。当新特性接近完成时,才被合入,这样保证了待发布版本总是处于特性就绪状态。从 2018 年 3 月起,每年的 3 月和 9 月推出 Feature 版本。
  • Update release,仅用于修复安全漏洞、回退、bug 修复。两个 Feature 版本之间包含两个 Update 版本。Update 版本将在每个季度的首月推出:1 月、4 月、7 月、10 月。
  • LTS release,提供长期支持,从 2018 年 9 月开始,每 3 年推出一个 LTS 版本,针对 LTS 版本的 Update 版本至少会持续 3 年,并可能更长——取决于你的支持厂商。

这种模式下,整体变更率和当前差不多,区别在于有更多的机会推出创新。每 6 个月的特性发版比之前的基于几年的特性发版要小,更易于采用。6 个月的发版周期也减小了将新特性移植到旧版本的压力,因为下一个特性版本的内容不会超过 6 个月。

偏爱快速创新的开发人员可以采用最新的 Feature 版本或者 Update 版本并在新版本推出后迅速迁移过去,以尽快将新特性运用到生产上。现在可以基于 Docker 镜像或者其他容器打包类型来发布应用,并配套指定的 Java 发行版。在现代持续集成、持续部署流水线中,应用和 Java 发行版总是结合在一起进行测试,使得从一个 Java 发行版迁移到下一个版本变得更简单。

偏爱稳定的企业可以选择 LTS 版本,使得可以将若干大型应用运行在同样的 Java 发行版上(博主:归约技术栈)。同时可以提前做好规划,每 3 年从一个 LTS 版本迁移到下一个。

具体点说,这些都是基于时间的版本,可以方便地计算出任意特定版本下一次发版日期,版本号由 年.月 组成。这样,明年 3 月份的版本就是 18.3,9 月份的 LTS 版本就是 18.9。

Implications

如果被采纳,这项提议将对 OpenJDK 社区的贡献者如何生产 JDK 产生重大影响。我已经就该事项提交了一些初步想法。如果能减轻 JCP(负责 Java SE Platform 的演进) 的工作负荷,将使得事情更容易推进。我的同事 Brian GoetzGeorges Saab 已经在 JCP 执行委员会里发起了议题。

这项提议最终将影响到依赖 Java 平台的每个开发人员、用户和企业。如果顺利,将在保有 Java 平台核心价值 —— 兼容性、可靠性、深思熟虑的演进 —— 的基础上,让 Java 在后续的许多年里继续保持竞争力。

The End

2021:Moving Java Forward Even Faster,提议将 3 年一个 LTS 版本缩短为 2 年一个 LTS 版本。

分类: CODE扯淡

0 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注