什么.NET一开源一跨平台,一些人就在喊Java去死?

今日の Java はプログラミング分野のリングワ・フランカ(共通語)だ。言語として、C / C++ より学びやすく、Perl / Lisp より読みやすく、VB / PHP より専門的に使える。Java を理解できない人はほとんどいないので、何か概念を説明するときも Java で書けば誰にでもわかる。

一方、プラットフォームとしての Java には、何でも揃ったクラスライブラリ、極限まで最適化された仮想マシン、根付いたオープンソースプロジェクトがある。その結果、何をしようとしても、理論上はもちろん、99% の現実においても Java で実現できる。

私がこの文章を書いている瞬間にも、また数万行の Java コードがこの世に生まれている。つまり「もはや誰も使っていない」ことを技術の死の基準とするなら、Java は明らかに生きているし、しかも結構うまくやっている。「仕事が見つかるかどうか」を技術の死の基準とするなら、Java はなおさら元気いっぱいだ。中国国内の状況は知らないが、欧米のどの求人サイトでも Java をキーワードに職を検索すれば、C++ を打ち負かし、PHP を蹴散らす覇者の地位にあることがすぐにわかる。

誰もなぜ Java が生きているのか疑問に思わない。私たちは Java が生きていることを take for granted(当たり前)だと思っている。まるで私が明日出社したときに仕事があるかどうかを疑ったことがないのと同じくらいに、granted だ。

しかしそうなると、いっそ Java は永遠の命を得たと言ってしまったほうがいい。なぜなら、上記の2つの定義に従って TIOBE を見渡せば、少しでも名の知れたプログラミング言語(とその背後にある技術)で本当に死んだものは何もないことが分かるからだ。Visual Basic も生きている、Delphi も生きている、COBOL も生きている、Fortran も生きている、FoxPro でさえ生きている。

これらよりもさらにニッチな例だが、IBM AS/400 システムを知っているだろうか? 私の前の会社は今もそれを使っている。それを保守するプログラマーは、入社したばかりでも給料が桁外れに高い。会社全体の20年にわたる中核ビジネスロジックがすべてそこにあり、一つ壊れれば全てが損なわれるからだ。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 を書く人の10人のうち9人は「仕事の必要があるから」であり、残りの1人は他にできないからだ。私が想像できるプログラミングの動機の中で、「仕事の必要があるから」は最も気力を失わせるものだ。

前立腺と脊椎の健康を犠牲にしながら長時間画面の前に座り、Java でプログラムを書くのを我慢して、ただ食い扶持を得ている。とにかく私はつまらないと思う。それでも笑っていられるなら、good for you(それは結構なことだ)。

そして、あなたが1995年からタイムスリップしてきたばかりでない限り、今の Java があまり可愛くないことも分かるはずだ。

言語機能の面では、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-resources が、Java 8 でようやく lambda が導入されたように。だが、それらが登場するまでは我慢しなければならない。Java EE のあの肥大化・晦渋な技術迷宮と一緒にだ。そして Oracle に感謝しよう、それがどれだけ続くのかも分からない。参考までに言うと、Java 8 はだいたい .NET Framework 3.0 に相当する。.NET Framework 3.0 は2006年の話で、当時スマートフォン市場の最大手は Nokia だった。

Oracle はどの基準で測っても、開発者のことを考えてツールを改善するような会社ではない。Microsoft よりも開発者から嫌われている。Microsoft には少なくとも、きちんと組織化され詳細に書かれた MSDN ドキュメントがあり、平凡だが改善を続ける CodePlex オープンソースプラットフォームがあり、さらに、はげた太った男がシャツを汗でびしょびしょにして講壇で「developers developers developers」と叫んだこともあった。

では Oracle は何をしてきたのか? MySQL を路端に置き去りにして犬に食わせた。OpenOffice の開発コミュニティを家から追い出した。理不尽に Android を訴えた。

だから James Gosling が Sun が Oracle に買収されるのと同時に辞職したのは、先見の明というものだ。

皆が競って JVM 上で新しい言語を生み出し、他の言語を JVM に移植しようとするのも無理はない。ただ、それらの試みは方向性が分散しすぎていて、誰一人として天下を統一して Java コミュニティに希望を見せることができていない。

私たちの現状はこうだ。2007年以降、Java ME を書く人はもういない。Java SE は、いくつかの IDE プロジェクトを除けば、最も有名なプログラムは Minecraft だけだ。Java EE と Android が、Java でまだ alive and kicking(元気に生き残っている)と言える唯一の2つの部分だ。Dalvik は別に独自路線を行ったので語ることはない。とすれば、*nix 上の JVM こそが、プラットフォームとしての Java に残された唯一の基盤である。かつてそれに対抗できるまともな競争相手は一度もいなかった——若すぎるか、中身のないものばかりだった。その状況は2014年11月12日まで続いた。

そしてこれがあなたの質問への答えだ。十数年前に CEO が「Linux は癌だ」と言ったあの Microsoft が、今日から、その中核的価値観を発信するプラットフォームが Linux 上で動くことを公式にサポートし、しかもオープンソースで無料にした。

世界中で Linux を動かす仮想ホストを売ってくれるすべてのサービスプロバイダーが、一夜にして .NET ホスティングプロバイダーになった。Java が好きではない人々は、突然新しい選択肢を手に入れた。ドキュメントは充実し、サポートは良好、ロードマップは明確、コミュニティは強力、ツールは使いやすい、エンタープライズ級の信頼性がある。そして何より嬉しいのは、これまで Java で書いた経験の9割がシームレスに移植できることだ。

私はこのことの効果がすぐに得られるとは一度も言っていない。しかし、Java がかつてこれほど隅々にまで浸透していたもの——それは今日に至るまで SIM カードの中でも動いている——が、もしかすると私の生きているうちに1973年の COBOL のようになるかもしれないと思うと、世の無常を感じる。既存の Java システムは徐々にレガシーコードになっていき、人々はそれらを保守し続けるが、それは単に保守し続けなければならないからだ、と私は信じている。

新たな苦悩はまだ続くだろう。何しろ痩せた駱駝も馬より大きい。一群のネズミが駱駝の死骸をかじるのも、しばらくは続く——あなたの繊細な心が今の一文で受けた痛みをとらげるために言っておくと、私も Java をかじるネズミにたかっている一匹のノミにすぎない(ん? 実はあなたは全然苦しくない? ほら、あなたも Java を愛していないじゃないか)——これは間違いなく長いプロセスになるだろう。だから、あなたが駆け出しの Java プログラマーなら、自分のキャリアのことを心配する必要はない。人類が不老長寿の技術を発明しない限り、あなたは Java しか知らないせいで仕事が見つからなくなる日を生きて迎えることはないからだ。

万が一にも、本当にそんな絶体絶命の状況にまで自分を追い込んだのなら、早いうちに管理職に転身したほうがいい。

最後に、私は Java が死ねと「叫んで」はいない。これは宣告でもなければ、ましてや呪いでもない。現状を観察した上で導き出した結論を述べたにすぎない。もちろん、「死ね」を感情抜きで解釈するのは難しい。ちょうど、私が kill -9 を入力するとき、そのプロセスを憎んでいないと人に思わせるのが難しいのと同じだ。実際には本当に憎んではいないのだが。憎むとしても、ほんの一瞬だけだ。

また、「達人(大牛)は問題を解決するのに最も適したツールを選ぶだけで、どちらが良い悪いを論じたりはしない」といった論調は、前半はその通りだが、後半はまったくの迷思(ミス)だ。誰もがプラグマティストなわけではない。ツールの良し悪しを論じる達人はたくさんいる。そんなことを言う人は読書量が足りなすぎる。

利益に関する申告および免責事項(disclaimer):

私は現在 Java プログラマーだ。正確に言うと、本業の時間にコードを書いているなら、その6割は Java を書いている。EJB、JPA、JSF、Swing、さらには GWT も含む。そして、まともな C# を10行以上書いたのは8年前が最後だ。この回答を書き始めたのは飛行機を待っている間の退屈しのぎだった。こんなに長くなるとは思ってもみなかった。私は誰かを説得しようとは思っていない。だから、もし同意できなくても、up to you(あなた次第)だ。

出典:知乎