为什么 .NET 一宣布开源和支援跨平台,一些人就在喊 Java 可以去死?因果关系何在?

今天的 Java 是编程领域的 lingua franca:作为一门语言,它比 C / C++ 学起来更容易,比 Perl / Lisp 读起来更正常,比 VB / PHP 用起来更专业。几乎没有人看不懂 Java,所以讲解个什么概念,用 Java 写出来大家都能明白。而作为平台的 Java,有无所不包的类库,极度优化的虚拟机,根深蒂固的开源项目,结果就是,无论你想做任何事情,理论上——乃至 99% 的实际上——都可以用 Java 实现。我写下这些文字的片刻,就又有几万行 Java 代码在世界上诞生了,所以如果以「不再有任何人使用」为一种技术的死亡界限,那 Java 显然活着,并且活得还不错;如果以「能找得到工作」作为一种技术的死亡界限,那 Java 更是生龙活虎,国内的状况我不清楚,但在欧美任何一个求职网站上以 Java 为关键字搜索职位,都可以很容易地看出它拳打 C++、脚踢 PHP 的霸主地位。没有人质疑它为什么活着,我们 take for granted 它活着,就像我从来不质疑明天去上班时还有没有活干一样,granted。

但如此一来,倒不如就说 Java 已获永生算了。因为,如果你按照上面的两个定义巡视一遍 TIOBE,就会发现没有什么稍微有点名气的编程语言(及其背后的技术)真的死去了。Visual Basic 还活着,Delphi 还活着,COBOL 活着,Fortran 活着,甚至连 FoxPro 都活着。至于比这些更小众的例子,你们听过 IBM AS/400 系统么?我的上个东家还在用,维护它的程序员刚入职的薪水就高得离谱,因为整个公司二十年核心业务逻辑都在里面,一损俱损。AS/400 也活着。

所以当我说「Java 去死 / 已死」的时候,「死」意味着什么呢?很简单:没人爱了。

本版同文那篇改写尼莫拉诗句的答案是对 Paul Graham 那句「of all the great programmers I can think of, I know of only one who would voluntarily program in Java」的完美呼应:十个写 Java 的人里面有九个是「因为工作需要」——剩下一个是因为不会别的。在所有我能想像到的写程序的动机里面,「因为工作需要」是最令人心如死灰的一个。牺牲着前列腺和脊椎的健康久坐在屏幕前忍受着用 Java 写程序只为混口饭吃,反正我觉得没意思。如果你还能笑出来,good for you。

而只要你不是刚从一九九五年穿越过来,就应该能看到现在的 Java 也的确并不可爱。语言特性方面,与其说它没有什么太大的问题,倒不如说它的那些问题已经有了很多成熟的 workaround,比如无法被 override 的静态方法,画蛇添足的 checked exceptions,还有半屁股的泛型。而真正令人难受的是那些它缺失的特性——我可以说 C# 里面的 struct、delegate、async / await、event handler、accessor、operator overloading 支持(好吧这个不一定是好事)乃至 type inference 之类都是 Java 所缺失(或者只有靠隔靴搔痒的第三方库才能实现)的,当然还有真正的运行时泛型。分开来看每一点你都会觉得没什么,但是当所有这些积累起来时,C# 就比 Java 可爱得多。这些功能有朝一日也许终归会在 Java 中出现,就像 Java 7 终于有了 switch on string 和 try with resource、Java 8 终于有了 lambda 一样,但是它们出现之前,你就得忍着,连同 Java EE 那堆臃肿庞杂、诘屈聱牙的技术迷宫一起忍着。而且感谢 Oracle,你还不知道要忍多久——作为一个参照值,Java 8 大概相当于 .NET Framework 3.0,而 .NET Framework 3.0 是二〇〇六年的事情,那时候手机市场的第一巨头是诺基亚。Oracle 以任何标准衡量都不是一个会为开发者着想去改进工具的公司,比 Microsoft 更令开发者厌恶,后者至少有组织良好、行文详尽的 MSDN 资料库,有虽然平庸但不断改善的 CodePlex 开源平台,还有个秃顶胖子汗湿了衬衫站在讲台上大喊过 developers developers developers。而 Oracle 做过什么?把 MySQL 留在路边喂狗。把 OpenOffice 的开发社群赶出家门。无厘头地起诉 Android。

所以 James Gosling 在 Sun 被 Oracle 收购的同时辞职,就叫做先见之明。

也难怪大家会竞相在 JVM 上发明新语言,并且将其他语言移植到 JVM 上,只是这些尝试努力的方向太过分散,没有谁能够一统江湖让 Java 社群看到希望。我们的现状是,二〇〇七年之后已经不再有人写 Java ME;Java SE 除去几个 IDE 项目之外最著名的程序只有 Minecraft;Java EE 和 Android 就是 Java 唯二仍旧还算 alive and kicking 的部分。Dalvik 那是另立门户没什么可说的,那么 *nix 上的 JVM,其实是作为平台的 Java 所仅剩的基石。以前它从来没有过一个像样的竞争对手——要么太嫩,要么太虚,这种状况一直持续到二〇一四年十一月十二日为止。而这就是你问题的答案:那个十多年前总裁说过「Linux 是一种癌症」的微软,从今天起官方支持其核心价值观输出平台跑在 Linux 上面了,还开源免费。全世界所有能卖给你一台虚拟主机跑 Linux 的服务商一夜之间都变成 .NET 主机服务商,不爱 Java 的人忽然有了一个新的选择,文档详尽,支持良好,路线清晰,社群强大,工具易用,有企业级的可靠程度,而且最爽的一点是,之前写 Java 的经验,九成都可以无缝移植。

我从没有说过这件事的成效立等可取,不过想想 Java 曾经是如此无孔不入的东西——它甚至跑在你的 SIM 卡里面,直到今天——却也许能在我的有生之年变成一九七三年的 COBOL,就会觉得世事无常。我相信现有 Java 系统会渐渐成为 legacy code,人们继续维护它们,只是因为它们必须被继续维护下去。新的挣扎仍旧会出现,毕竟瘦死的骆驼比马大,一群老鼠啃骆驼的尸体也能啃上一段时间——为了减轻你的柔弱心灵读到刚才这句话所遭受的痛楚,我承认我也只是啃食 Java 的老鼠身上的一只跳蚤(嗯?其实你根本不痛苦?你看,连你也不爱 Java)——这无疑会是个漫长的过程,所以如果你是个刚入行的 Java 程序员,大可不必担心自己的事业发展,只要人类不发明永生技术,你就活不到因为只懂 Java 而找不到工作的那一天。退一万步而言,你若真的能把自己逼到那样的绝境里,还是趁早去做管理吧。

最后,我并没有「喊」Java 去死,因为这并不是一种宣告,更不是什么诅咒,只是陈述在观察现状之后得出的结论而已。当然,「去死」很难不带感情色彩地解读,就好比我输入 kill -9 时很难不让人觉得我不痛恨那个进程一样。虽然我真的并不痛恨它。要痛恨也只有那么一下下而已。

又,所谓「大牛只选择最适于解决问题的工具,而不去争论谁好谁坏」之类的论调,前半句不假,后半句完全是迷思。不是每个人都是 pragmatist,争论工具好坏的大牛多了去了,说这话的人阅读量太少。

利益申明暨 disclaimer
我目前是个 Java 程序员。准确来说,我从事正职的时间里如果在写代码,有六成是写 Java,包括 EJB、JPA、JSF,Swing,甚至还有 GWT,而我上次正经写超过十行 C# 是在八年以前。我开始写这个答案是因为等飞机无聊,能写这么长我也没想到。我没想说服谁,所以如果你不同意,good for you
原发布于 https://www.zhihu.com/question/26601888/answer/33571406