今後のJavaについて
ここまで、Java 9の大きな追加機能や変更点を紹介してきましたが、せっかくなので、これらの機能が必要になった背景や、現在のJavaが求められていることについて筆者なりに考察してみたいと思います。
というのも、最近では、Java自体のトレンドについてネット上で熱く語られるという場もなくなりました。また、かつてのJ2EEシステムやStrutsのように、デファクトとなるフレームワークに代わるものについてもあまり聞かなくなりました。
そのため、Javaに携わっていないエンジニアから見ると、より参加しにくくなってしまった言語といった印象を受ける方もいるようです。そんな中、筆者はたびたび、Javaのトレンドについて聞かれることが多くなりました。
そこで、筆者の利用シーンを踏まえた背景とはなりますが、1つの利用シーンとして少しでも多くの方の参考になればと思い記します。また、この流れは今回のJava 9での改善や今後のJava 10以降の流れを理解する上でも参考になると思います。
マイクロサービスとJava
まず、筆者はWebシステムの構築において、主にJavaを利用してきました。そして、そこでサーバーサイドの開発をする際にはJavaとPHPを主に使っています。
5年くらい前までは、PHPのみで作成する場合が多かったと感じます。PHPではなく、RubyやPythonなどを使うエンジニアも多いと思います。
その中でJavaを使うのは、Webシステムの裏側で動作するバックエンドサービスのためでした。
しかし、最近はそういった構成ではない場合でもJavaを使う比率が高くなってきました。その理由は大きく2つあります。
1つめがWebSocketの必要性です。WebSocketを使うことになると常駐型サービスの必要性があります。PHPやRubyでも実装は可能かと思いますが、むしろJavaで実装する場合よりも難しいケースが出てきます。
また、WebSocketを使うサービスの場合、HTMLを前提とした場合と比べ、大量のクライアントからの接続を同時に扱うことを想定しなければいけないケースもあります。いわゆるC10K問題といわれる、同時1万接続以上を考慮する必要性です。こういった場合ではノンブロッキングI/Oが必要になることがあります。
ノンブロッキングI/Oを用いた実装で有名なものとしてはNode.jsがありますが、JavaにもノンブロッキングI/Oをサポートしたライブラリやフレームワークが多くあり、筆者の場合はNettyというライブラリを使っています。
そして、もう1つがスマホアプリとSPA(シングルページアプリケーション)が広まったことによる影響です。
SPAを簡単に説明するとブラウザ側でサーバーから取得したJSONデータを利用して動的にHTMLを作成するものです。スマホアプリとSPA形式のWebアプリの共通点は「サーバー側でHTMLを生成するのではなく、JSONデータを返すのみ」という点です。そのため、スマホアプリとWebアプリでAPIを共通化できるとともに、UI/UXに関する制御を本来あるべきクライアント側に戻すことができるので、システムを単純化できます。
また、こうした背景によりベンダー側もWeb APIの提供が行いやすくなり、提供する側と利用する側の障壁が低くなってきています。その結果、自分たちの内部で完結する機能のみでシステムを提供するケースは少なくなりつつあります。
つまり、図4中の上の図のような、集中管理を中心とするWeb+DB型のシステムから、下の図のような複数のサービスで構成するマイクロサービス型になってきているといえます。そして、それぞれのサービスで提供される機能は、より特定のニーズに対応していき、また、求められるレベルもだんだんと高いものになってきています。
つまり、システム全体をどの言語で構築するかに関心がなくなってきたと同時に、一つひとつの機能の高度化が進んでいる印象があります。
このためJavaに限らず、言語自体のトレンドへの関心よりも、ニーズのトレンド、もしくはそのニーズを満たすための手法のトレンドに関心が移ってきています。
そして、こういった状況を踏まえると、Javaは言語としての汎用性やネットワークへの親和性を備えていると共に、すでに蓄積された用途特化型のオープンソースソリューションやライブラリも豊富であるため、利用しやすくなってきているということが、筆者が関わる実際のプロジェクトでも感じられます。そのため、Javaという言語の重要性が高まることはあっても、低くなることはないのではないか、というのが筆者の印象です。
ただし、あるニーズにより特化した機能を提供したい場合には、Javaでない言語がふさわしい部分があることも事実です。そのため、それらの機能をつなぎ、そしてその機能の中で足りない部分を手軽に補完できることを今後Javaに期待しています。
Java 10へ
Java 9から6カ月毎に新しいバージョンがリリースされることが決まり、実際にJava 9のリリースから6カ月がたった3月には無事Java 10がリリースされました。
それでもまだ、本格的にJava 9以降に移行しようとする方はそれほど多くはないのではないかと思います。Java 9で導入されたモジュール機能は非常に大きな変更であり、今後Java 9以前と以後である程度の分断は発生するはずです。その分断のデメリットよりもメリットを大きくするためには、Java 10以降のアップデートが魅力的である必要があります。
そのJava 10以降は、「Project Valhalla」や「Project Panama」といったハードウェアやOSなどへの最適化が大きなテーマになっています。
この流れはより小さい環境で、より速く、より軽く開発できることにつながるはずです。また、ハードウェアとの親和性を高めることは、これまでJavaが苦手としていた領域でもあります。
これらはIoTなどの流れにも通じるところがある上、先述した筆者がJavaに期待するところと一致します。それらの機能を使った魅力あるライブラリが今後出てくることを期待するばかりです。
最後に
これまで、全7回にわたりJava 9について紹介してきました。本連載の中では一部の機能や、実際に使う際の細かい部分まで紹介しきれなかったものもあります。
特にモジュール機能に関連する部分は、まだまだ利用事例が少なく、実際はどういった使い方がよいのか、もしくはどのようなケースまで対応できるかなど、手探りの状況が続いていると感じています。
その中で本連載の内容が少しでも皆さまの参考になれば幸いです。