人物聚焦:Codename One 创始人 Shai Almog 谈开源与 Java 生态
打造并维系一个开源项目十多年,需要什么?对 Codename One 的创建者 Shai Almog 来说,这需要愿意挑战传统的软件开发方式,并持续对依赖这项工作的开发者负责。
我最近与 Shai 聊了聊 Codename One 背后的灵感、维护开源项目的现实,以及他对 Java 生态这些年演变的看法。请看下文!
1. 什么是 Codename One?最初是什么促使你创建它?
Codename One 就是我们一直希望 Java 成为的样子:一次编写,到处运行,同时拒绝向最低共同标准妥协。它就像是 Spring Boot、Flutter、Go 和 Node.js 生下的孩子,继承了四者最好的特质。你能得到 Java 成熟的生态、Flutter 式的 UI/可移植性控制、Go 式的原生二进制文件与资源占用,以及人们常与 Node.js 联系在一起的全栈客户端/服务器连接能力。使用 Codename One,一套 Java 代码库可以面向 iOS、Android、macOS、Windows(x64 和 ARM64)、Linux(x64 和 ARM64,支持 glibc 或 musl),甚至浏览器。一个自包含的小型桌面 GUI 应用大约只有 4--5 MB,无需安装 JVM。
在底层,Codename One 针对不同目标平台使用不同的流水线。在我们的提前编译平台上,ParparVM 会分析可达的 Java 字节码,移除未使用的代码,将剩余部分转换为 C,然后把结果交给平台的原生编译器。Codename One 还提供处理棘手平台特定细节所需的可移植性库、UI 工具包、测试、主题和构建系统。我们不会假装每个平台都是一样的。我们的构建器架构会组装每个应用所需的原生部分,因此开发者可以使用平台特定能力,而不必让整个代码库碎片化。
最初的灵感来自对 Java 未兑现承诺的失望。Java 给了我们可移植性,但传统的 Java 应用部署变得越来越沉重。我们想要语言和生态,同时不要求庞大的运行时,也不放弃原生性能、平台访问能力或对 UI 的控制。现在我们正把这种架构带到后端。目标是将我们为受限设备开发的启动时间、资源占用和原生编译工作引入无服务器与微服务工作负载。我希望 Java 开发者能获得他们期待从 Spring Boot 得到的全栈生产力,同时拥有更接近 Go 和 Node.js 的部署经济性。
2. Codename One 已经存在十多年了。是什么让你保持动力?
社区是最大的原因。有人在 Codename One 上建立了业务和产品。当别人把如此重要的事情托付给你的工作时,你不可能一走了之。很长一段时间里,在这个市场竞争非常残酷。我们的竞争对手不是普通创业公司。它们是 Google、Facebook、Microsoft,以及团队规模比我们整个社区还大的公司。一个小团队能构建、测试、编写文档和支持的内容是有限的。智能体驱动的开发改变了这个局面。它让我们能够以几年前根本不可能的方式扩展工程工作。我们现在维护着一个庞大的跨平台测试矩阵,并且能以可与大得多的组织竞争的速度推进。在大多数功能维度上,我认为我们已经领先于那些知名替代方案。我们仍然有差距。我们是一个小团队,假装不是这样会很可笑。但我们的规模也是一种优势。阅读缺陷报告的人,可能也是修改编译器的人。我们可以在几小时内回复开发者,而大公司可能需要三个团队、一个季度路线图,以及产品经理的批准。另一个原因更简单:我们热爱 Java,而且我们会使用竞品工具。每次使用它们,我们都会遇到 Codename One 当初为了消除而存在的某种妥协。
3. 开发者对维护开源项目最大的误解之一是什么?
认为维护开源主要就是接受代码贡献。从外部看,一个拉取请求像是免费的工作。对维护者来说,它可能是一大堆工作的开始。代码正确吗?符合项目标准吗?能在每个目标平台上工作吗?五年后谁来维护它?你如何告诉一个花了一周做某件事的志愿者,这个设计是错的?你能合理地要求他们做多少轮修改?我们最近停止接受外部拉取请求。AI 并不是原因。如果说有什么影响,AI 提高了许多贡献的基础质量。它也让其中一些贡献变得极其庞大,因为再生成一千行代码几乎免费,而审查这一千行代码却不是。真正的问题是验证。Codename One 目前有 60 多个 GitHub Actions 工作流文件。一个小小的框架改动就可能影响 Android、iOS、JavaScript、桌面端、字节码转换、原生编译和截图基线。这个矩阵代表着每月大约价值 15,000 美元的 CI 容量,目前由 GitHub 提供给我们。到了那个程度,验证和修复一个外部补丁,往往比我们自己实现已确认的改动更耗时。所以今天我们请人们通过可复现的问题、基准反例、设计讨论、测试和文档反馈来贡献。这些贡献往往比代码更有价值,因为它们暴露了我们在自己环境中无法复现的问题。另外,为所有 GitHub Actions 停机时间说声抱歉 ;-)
4. 你见证了 Java 和更广泛开发生态的巨大演变。哪些变化最让你惊讶?
最大的惊喜是,Java 实际上放弃了“做小”的理念。GraalVM 是一项了不起的工程,所以我们并非字面意义上孤军奋战(尽管它是一个非常不同的项目,并没有真正走上同样的方向,也没有走到那么远)。但主流 Java 多年来把“大”当作严肃性的证据:更大的运行时、更大的框架、更多动态机制、更长的预热时间和更多内存。行业开始把这种重量视为不可避免。我不反对全面/大型;Codename One 本身就很庞大……但不是运行时庞大,只是 API 和范围庞大。大多数成功的新平台都朝相反方向前进。Go 让自包含的原生二进制文件成为常态。Node.js 让应用部署几乎变得轻而易举。移动端和无服务器让启动时间和内存消耗重新具有经济重要性。Java 在很大程度上是通过优化大型系统来回应,而不是质疑为什么每个系统都必须是大型的。模块就是一个好例子。它们有助于组织和封装大型依赖图。它们并没有消除那个依赖图,也没有把它变成一个小型、封闭世界的原生程序。Codename One 能把一个真正的 Java GUI 应用或完整服务器放进大约 5 MB 的二进制文件中。让我惊讶的不是这能行。我们花了很多年证明它能行。让我惊讶的是,这个立场至今仍然如此孤独。Java 本可以成为小型原生应用和低成本无服务器工作负载的最佳语言之一。但生态中的大多数只是停止尝试实现这一点,让 Go 抢走了我们的饭碗。
5. 在技术行业度过了这么多职业生涯后,当你完全离开屏幕时,你喜欢做什么?
完全离开屏幕?你可能问错人了。我刚和孩子们从泰国回来。我们玩得很开心。我也带着笔记本电脑,在海滩上处理拉取请求。这就是我喜欢做的事。我没有“放松”按钮。假期常常让我比工作还累,因为坐着不动并不能让我恢复精力。如果我有想法,并且能把它做出来、修好,或者和另一个开发者争论它,那就是我放松的方式。在这里了解更多 Shai 的内容。DZone 贡献者表达的观点仅代表他们自己。