寺田さんにつづき、Java Advent Calendar 2011の12月20日分です。明日はzinbeさんです。
さて今回はJava自体の話ではなくて、現在の勤務先でやっているようなソーシャルサービスの開発とJavaの関係について少し考察します。まず自分自身のスキルを簡単に紹介しておくと、Sun Microsystems時代には7年程度Javaに関連する仕事をしていました。その内容は金融業、流通業、製造業など様々な業種のサービスを支えるシステム構築や、トラブル解決のお手伝いという内容でした。その後、ACCESSに移ってすこしJavaから離れてObjective-Cを書いていました。現職ではObjective-Cも時々触りますがPHPがメインです。Objective-Cは実質1年、PHPも同じく1年ぐらいというところでしょうか。本格的にJavaを使うことから離れておよそ3年たちましたが、未だに一番詳しいのはたぶんJavaだと思います。

幸か不幸か、2008年にSunを退社してからしばらくはOracleによるSun買収などもありJava自体のテクノロジー的な進歩が停滞していました。このため、世の中に流通しているJava技術はまだ僕の知っている頃のものとそんなに差分がないと思っています。今年に入ってOracle持ち前の推進力がようやくJavaに対して効果を見せ始め、大きな変化のタイミングに入ってきたなと感じています。
Javaは2000年頃から続くエンタープライズ時代からのしがらみもあり、その殻からしばらく抜け出せず、「クラウド」が当たり前になって、もはや必須になった状況にはうまく対応できずにいました。最近になってようやくJBossがクラウドのソリューションを発表したり、Java EE 7にはクラウドプラットホームを前提とした仕様が入るようになってきました。こういう状況を見ていると、数年以内にJavaで育ったソーシャルサービスが世の中に増えてくることはおそらく間違いないだろうと思っています。それは、SIをしていた会社がB2Cサービスに転身したり、Javaの資産を使ったWebサービスがいよいよ現実的にマススケールに対応できるようになるだろうからです。
一方、現在のソーシャルサービス開発の現場を見渡してみるとJavaはまだまだこの分野に踏み込めていないことがわかります。たとえば、GREEやFacebookはPHP、mixiやmobageはPerl、CookpadはRubyなどいわゆるスクリプト言語が開発現場での主流です。各社の求人も多くはこれらに関連するスキルを持ったエンジニアに対するものが中心であることからもよくわかります。

これにはいくつか要因があると思いますが、今回は2つ紹介しておこうと思います。
ひとつめは、既存資産の問題です。ソーシャルサービスは各社とも個人レベルで小さく始めていたサービスが人気を呼び、拡大していった。という歴史を持っています。このため当然ながら、システムを支える多くの部分は開発当初に選んだ環境、2004〜2006年頃に価格的・技術的にリーズナブルであった選択肢をベースとしています。それが結果的にPHPであったり、PerlやRubyであるわけです。仮に、2011年の今、ソーシャルサービスを開発するのに最も適した言語がJavaであると判断したとしたとしても、わざわざいま開発環境を変え、PHPで書いてあるコードをJavaに移し替えることは労力や期間などを考えれば現実的ではないですし、費用対効果の面からも新しい環境に乗り換えることは十分説明がつかないでしょう。

二つ目は、リリースサイクルの問題です。現在もJavaは多くのエンタープライズシステムで使われています。Javaはエンタープライズシステムのリリースサイクルと相性がよいと思っています。エンタープライズシステムは統計などをみるとおおざっぱには、3〜18ヶ月程度かけて開発され、12〜48ヶ月程度で新しいシステムにバージョンアップしたり、リプレースされているとおもいます。安定性を重視するシステムでは、バグ修正や、バージョンアップは数週間に1度程度であることがほとんどでしょう。一方、ソーシャルサービスはユーザの動向を見ながら、ほぼリアルタイムにシステムを更新することが求められます。Java EEアーキテクチャのように、コンテナ側で多くの状態管理をしてくれることはスケーラビリティーやパフォーマンスの観点から重要なのですが、サービスを止めずにシステムを部分的に置き換えたり、追加や削除するにはあまり向いていません。OSGiやJSR 277、JSR 294のような仕様は部分的にこれらの問題を解決できるかもしれませんが、運用フローまでのノウハウが蓄積されるまでにはまだ2〜3年単位の時間がかかるのではないかとおもいます。
以上、結論としてはややJavaに対してネガティブなものになりましたが、この現状をきちんと認識した上でテクノロジーとしてのJava、それを支えるコミュニティーが問題解決に取り組んでいければ、ソーシャルサービスの中でのプレゼンスをどんどん高めていけるのではないかと思いました。







