未経験にJavaが人気がない問題についての個人的見解

5 min read読了の目安(約4800字

こんな感じのツイートが流れてきました。何となく気になったので、個人的見解を残しておこうと思います。

https://twitter.com/engineer_droid/status/1383912150146580491?s=20

Javaは難しい?

全ての項目について言えるのですがJava言語単一で見てしまうと、個々人の感覚論に寄りすぎてしまうので、何と比べてどういう観点で難しいのかな?簡単なのかな?という考えで見ていこうと思います。

Javaの文法は他と比べてどう?

言語を学ぶ上で未経験の方がまず始めるであろうものが文法(構文)の勉強だと思います。ここで覚えることが多いかどうか?他の言語と比べるとどうか?について考えていこうと思います。

構文の複雑さはBNF(バッカス・ナウア記法)でどのような構文のパターンがあるか見ると良さそうです。

JavaのBNF個人的に学んできた言語の中でもかなりシンプルで、純粋に構文だけであれば1日, 2日あれば覚えれてしまうのではないかと思っています。このBNFはラムダ構文なども書かれていなそうなので、Java7以前のBNFのようですが、せいぜい多くて2倍ぐらいの量になっているぐらいだと思います(もし新しめのBNFを見つけられた方いらっしゃったらコメントにて教えてくださると嬉しいです)。

追記
最新のJavaのBNFをフォロワーの方に教えてもらいました。予想通り2倍はなさそうぐらいだと思います。

JavaScript・・・と書いてしまうと、もしかしたら混同されてしまう方もいるかもしれませんので、ECMAScript 2015のBNFはこんな感じです。もう比べるまでもなく、圧倒的にECMAScriptの方が複雑であることがわかります。毎年のように現れる、この文法だけ押さえれば良いベストプラクティスのような記事を読めば良いのではないか?という意見が上がってきそうですが、未経験者の方はそのようなベストプラクティスの存在を知らないでしょうし、毎年見るべき機能が変わるのはJavaと比べると未経験者フレンドリーな言語ではないと言えそうです。

PythonのBNFはJavaと同量ぐらい構文の複雑さです。もし、Pythonのみ経験したことがある方がいるのであれば、JavaはPythonぐらいの構文の複雑さか、と捉えれば良さそうです。

3言語しか比較していませんが、Javaは比較的、構文がむしろ易しい言語であると言えそうです。気なる方はご自分の触っている言語のBNF等を探して比較してみてはいかがでしょうか。

Javaはパラダイムが難しい?

Javaはオブジェクト指向がメインの手続き型で記述していく、Java8からはラムダなどの関数型エッセンスも含んでいるマルチパラダイムな言語と言えます。Java単一で見るといろんなパラダイムを抑える必要があり、難しく感じます。

しかし、最近の汎用で人気のある言語はほとんど同様にマルチパラダイムな言語です。先ほど上げた、ECMAScript, PythonやPHPなどもオブジェクト指向、手続き型、関数型の考えをミックスして進化しています。Javaだけ突出して何かこれらのパラダイムを難しくしている要素はないと思われます。

まとめ

その言語を使って何をしたいかによって、学習の難しさは変わっていくと思いますが、その学習の土台となるものはやはり、構文やパラダイムなのでそこを考慮するとJavaの学習は他の言語並み、むしろ構文面では覚えることが少ないぐらいだと思われます。

Javaは環境構築大変?

最近ではクラウドでの開発環境を手に入れることは難しくありません。しっかりと開発できそうなメジャー環境だとCloud9、PaizaCloudですが、パッと書き始めるだけであればもっと手軽に始められる環境もありそうです。ある程度の実力が備わってきたらDocker等のコンテナ技術を使ってしまう方も一定数おられると思います。、が一応今回はある程度真面目にローカルで導入する方法を考察をしていきたいと思います。

Javaの環境構築手順

  • JDKインストール
  • JAVA_HOMEのパスを通す(IDEによっては、この工程は省略可)
  • IDE, エディタで編集・実行

3ステップ、もしくは最近のIDEは強力なためJDKのインストールさえポチポチでやってくれるケースさえあります。

依存関係の管理は未経験者は少し手間取るのではないのかな?と思いました。一番メジャーはMaven、若干易しいのはGradleでしょうか。MavenでXMLを書くのはなかなか面食らいますし、Gradleは自由度が高くドキュメントも膨大なので、一踏ん張り必要そうです。

ECMAScriptの環境構築手順

環境構築最速と名高いECMAScriptです。ブラウザのデバッガでコンソールさえ開いてしまえば、すぐにでも勉強が開始できます。

もし、依存関係を管理したい場合はnodeをインストールさえすれば、npmでコマンド一つでライブラリ追加できる点で、Javaと比べて易しそうです。手で修正する場合でも、JsonなのでXMLより心理的障壁は低そうです。

Pythonの環境構築手順

Pythonは2系ならMac標準では入っています。Linuxもディストリビューションに寄りそうですが、大抵は入っていそうです。Windowsの場合は、インストーラ等で入れることができます。

スクリプト言語なので、メモ帳でもいけちゃいそうですが、同様にIDEやエディタを入れて編集・実行がJavaと同じ手順としてありそうです。

依存関係の管理はpipが標準搭載されているのが楽ですね。コマンド一つでライブラリ追加できる点で、Javaと比べて易しそうです。

まとめ

言語を導入するところだけに絞ってしまえば、ブラウザがあればできるECMAScriptやOS標準で入っているPythonを使った方がスタートのスタートダッシュは早そうです。しかし、その後続く勉強時間と比べたら誤差でしょうし、冒頭で述べたようにクラウドでの開発環境を手に入れたりDockerを整えさえすれば、その差異は無くなるでしょう。強いて言えば、依存関係の管理が多少ネックになりそうです。

Javaを使っている企業はパワハラが横行している?

この項目は単なる言語の話と組織・人間の話になってしまうので、同列に語るのはナンセンスだと思います。

ただ無理くり考えてみますと、傾向として、年齢層が高ければ高いほどパワハラを経験している世代が多いため、使用者の年齢層が比較的高めのJavaを避けることで、パワハラ企業を避けることができるのかもしれません、が、そもそもJava、JavaでなくてもJVMを直接的・間接的に一切利用していない企業を探すのは、企業規模が大きくなればなるほど難しいと思います。さらにJavaを使っていなければ、パワハラがないなんて保証は一切ないので、例えば就職・転職時にJavaのことを考えながら面接を受けるよりは、人に寄り添った企業であるかどうかを素直に探りを入れた方が効率的かと考えます。

Javaはフレームワークが乱立している?

これは一体何のフレームワークを指しているのでしょうか。仮にWEBフレームワークを指していると限定させてください。

Javaの人気フレームワークは?

Javaの中でも人気がありそうなフレームワークを3つ並べてみましたが、Spring Framework一択のようです。乱立はしていなそうです。(他に対抗馬があれば教えてください)

強いて言えば、自社フレームワークというのが横行しているのでしょうか・・・?(詳しくないので、コメントにて情報お待ちしております。)

ECMAScriptの人気フレームワークは?

今でもExpressの独壇場そうです。

PHPの人気フレームワークは?

Python君に変わって、少し乱立度合いが高そうなPHPを見てみます。Laravelが圧倒的人気で、多少Cake PHPが息をしているぐらいでしょうか。

まとめ

比較がしやすそうという点で、WEBバックエンドのフレームワークで比較しましたが、乱立しているという事実は強いて言えばPHPが一番多そうですが、マイナーフレームワークを全部引っ張り出したらとんでもない数になりそうなので、トレンドをみてみたころ大体1つか多くて2つのフレームワークに絞れる。むしろ、JavaはSpring Framework一択で乱立と程遠いという結論になりました。

Javaは学習コストが高い?

一番最初の「Javaは難しい?」に吸収させてください。あえて補足をすると、学習環境という意味ではJavaほど充実している言語はないと思います。また、後方互換性を強く意識している言語のため、古い教材で学んだとしてもその知識が使える可能性は高いです。

Javaは成果が実感しにくい?

未経験者の方はどのような時、成果を実感するのでしょうか?JavaはJVMのおかげでいろんなプラットフォームで動きます。アプリケーションの種類は圧倒的に多そうです。

  • 競技プログラミング(AtCoder等)
  • Android
  • GUIフレームワーク(Swing, JavaFX)
  • WEBフレームワーク

強いて言えば、かつては動いていたApplet等がブラウザ環境で動かなくなったので物足りないのでしょうか?しかし、ECMAScript(AltJS)を除くと大体がブラウザで動かない言語のため、Javaだけが成果を実感しにくいということはなさそうです。

他の観点があれば、是非教えてみてください。

まとめ

挙げられた観点に関して、大きくJavaが劣っている何かがあるようには感じられませんでした。元のお題は、「未経験にJavaが人気がないのはなぜか?」という物でしたが、否定的な側面で見るよりも、この言語はこういうところで魅力的などのようにポジティブな側面で比較をした方が、皆さんや未経験者にとって嬉しいんじゃないのかなあ。と考えたりしました。