最近、Javaのプログラムはさわっていないのですが、その動向を知るために「みんなのJava OpenJDKから始まる大変革期! 」を読んでみています。
目次は次の通りで全6章から構成されています。
- Java 14までの機能変更から見る これからのJava
- JDKに関する疑問と不安解消! JDKディストリビューション徹底解説
- Java EEからJakarta EE へ 新しいEnterprise Java
- MicroProfileが拓く Java のマイクロサービス
- ネイティブイメージ生成で注目! Javaも他言語も高パフォーマンスGraalVM
- マイクロサービス、クラウド、コンテナ対応 [新世代]軽量フレームワーク入門
まだ機能変更の章しか読んでいませんが、こうやって整理されている情報を短時間で得ることができるのはありがたいことです。他のプログラミング言語が使われるようになっている分野もあれば、まだまだ現役で使われ続けるだろう分野もあるようなので、後半もフォローはしたいところです。
自分は人材育成分野の視点から、Java 1.0.2 の頃から注目して使ってきたのですが、その視点からすると、Javaが注目されるようになった時は下記メリットがあったと記憶しています。
- Webブラウザで動作する
- クラスベースのオブジェクト指向プログラミング言語
- Windows/MacOS/Linuxなどのマルチプラットフォーム対応
- RDBを利用するのが簡単
- マルチスレッドプログラミングや通信プログラム作成もC/C++に比べて遥かに気軽にできること
これらのメリットについては、いまや他のプログラミング言語でも実現されていることが多いため、現在は強みとはなっていません。
バージョンアップと一緒に言語仕様が変わってきたり、ある機能について推奨する実装方法が変わってきたりして、その分、バージョンを意識したプログラミングの記述が必要となって、それなりに複雑になっていると感じています。これについては他のプログラミング言語も似たような所はあって、なかなか難しいものです。
今、プログラミング初学者が学ぶとしたら、どのプログラミング言語が良いのかは、実装してみたいアプリが簡単に開発できるもの、ということになるのだろうと個人的には考えていて、そうすると「Javaという選択肢はあまりないかもしれないなぁ」と感じています。ちょっと前はAndroidアプリを作ってみたいならJavaと言えたのですがKotlinとかFlutter(Dart)とかがあったりするので、うーん、という。まだ資料はJavaの方が多い気がしますけど。
Webアプリは混沌としてますよね。「プログラミング初学者がWebアプリから学ぶのか?」という疑問がそもそもあるわけですが。ただ、WebアプリはいまやECMAScriptを避けて通れないので、これに統一するならNode.jsをサーバーサイドには使うことになります。Javaの出番は無さそうな気がしますね…
プログラミングが本質的に難しいのは、実装したい対象のモデルを用意して、それを操作する処理をソフトウェアとして実装することだと考えています。はじめてプログラミングを学んだとき、「プログラム可能なアルゴリズムを思いつかないとプログラムは書けないな」と感じたことがあり、『「プログラム可能なアルゴリズム」を思いつくには、そもそもプログラムが書けないと出来ないのでは?』となって、「あれ?」と思いました。
その後、アルゴリズムはプログラミングの基礎にあるけれど、プログラム作成にはアルゴリズムを発見する必要はなくて、用意されているプログラミング言語の機能を使って処理手続きを書けばいいだけだということに気がついて、プログラミングができるようになった気がします。
そうそう、関数型プログラミングは式で表現しやすいモデルを実装するのに適していて、オブジェクト指向プログラミングはオブジェクト単位で表現しやすいモデルを実装するのに適しているだけなので、その視点をもって各プログラミング言語を学べば、なんでこういう機能があるのか、どういった制限が発生するのか、といったことの理解がしやすくなるはずです。
ここまで書いていて、思い出しましたが、プログラミングを学ぶには、開発環境が簡単に用意できることも重要です。コンピューターの仕組みも含めて学ぶなら、ラズパイは良い選択肢だと考えていて、そうするとPythonなのかなぁ、という気もしています。
ということで、なかなかプログラミング初心者に対してJavaを使おうという話にはなりにくいのですが、オブジェクト指向プログラミングを学ぶには良い選択肢になると考えています。問題は世の中には「オブジェクト指向プログラミングを学ぶこと」が直接のモチベーションになる人の数というのはそれほど多くはない点でしょうね。
「あの分野のプログラムを開発するには、このプログラミング言語が強い」が必要で、JavaはサーバーサイドのWebアプリを開発するには良いのですが、その分野は他のプログラミング言語も強くなっていて、なかなか難しいところがあります。手軽さでいくならPHPになりますし、速度でいくならGoになりますし、式として実装しやすいAPIなら関数型プログラミング言語になるでしょうし。
話が随分脱線しましたが、こんなことを考えながら、読んでいくつもりです。