プログラミング言語は、ただそのひとつを学習すれば良いというわけではなく、作ろうとするプロダクトによって向き、不向きが変わります。
例えば、最近で言えば機械学習と言えばpython、というイメージがあります。これは、元々が研究プロジェクトで採用されることが多かったという背景もありますが、TensorFlowをはじめ、様々な数学系のライブラリが広く開発されていることも大きな要素となっています。
さて、プログラミング言語を習得しようとしたとき、考慮すべきは「需要(トレンド)」、「興味」、「学習コスト」、あるいは、「次のプロダクトに採用予定である(適している)かどうか」に絞られるかと思います。
その中でも、需要と学習コストに焦点を当てて、各言語を評価してみたいと思います。
Java
項目 | 評価 |
---|---|
学習コスト | ★★☆☆☆ |
需要 | ★★★★☆ |
Javaは、静的型付け言語の最初の選択肢として最も有力です。「オブジェクト指向」という抽象的な概念、インターフェースと継承の使い分けなど、わかりづらい面はありますが、プログラミングの基礎を学ぶ段階ではそれほど気にする必要はありません。
システム開発を続けていると、「不便だな」と思うことがあります。その時に手助けをしてくれる良い友人となってくれるものが、オブジェクト指向のような概念です。必要でないうちから学ぶ必要はありませんが、チーム開発を行うにあたっては必須の概念です。
とはいえ、インターフェース、フィールド変数、関数、継承などを正しく理解していれば、オブジェクト指向を理解するのに時間は掛からないはずです。オブジェクト指向は、Javaに限らず複数の言語でサポートされているため、必ず習得したい概念です。
現代においてはWebアプリケーションのサーバーサイドを担うことが多く、比較的需要が安定している言語です。
学習コストは決して高くなく、基礎も習得できるため、お勧めできる言語です。
C
項目 | 評価 |
---|---|
学習コスト | ★★☆☆☆ |
需要 | ★★☆☆☆ |
C#は、Windowsのネイティブアプリケーションの開発言語として長く親しまれてきました。最近ではElectronなどのクロスプラットフォーム用のフレームワークがあり、若干押され気味ですが、ASP.NETなどでWebアプリケーションのサーバーサイドの役割を担うこともあります。
また、ゲームエンジンのUnityでは、コードの記述言語としてC#が採用されていますので、そちらの方面の需要も見込めます。
言語自体が非常にJavaに似ており、LinQやデリゲーションなどの少しわかりづらい要素はあるものの、学習コストとしてはJavaと殆ど変わらない程度です。
JavaScript
項目 | 評価 |
---|---|
学習コスト | ★★★☆☆ |
需要 | ★★★★★ |
JavaScriptは、もともとWebページに上にインタラクティビティをもたらす簡易なスクリプト言語でしたが、現代においては役割を大きく変え、JavaScriptによってどんなものでも作れるようになりました。
Webページのみで動いていたJavaScriptは、Node.jsによってサーバーサイドへと翼を広げ、Electronによってネイティブアプリケーションへと姿を変え、数あるフレームワークによってスマートフォンアプリケーションにも変化することが出来るようになりました。
JavaScriptは動的型付け言語であり、型の概念が静的型付け言語に比べて曖昧なため、正しい概念を学習することが大切です。これを怠ると、容易に変化する変数の型に悩まされ続けることになります。
一昔前のJavaScriptは、大規模なアプリケーションを作るには様々な工夫が必要でした。クラスの概念がなかったため、prototypeオブジェクトという難解な要素を上手く使い、クラスと継承を表現していたのです。
しかし、現在はクラス構文や継承が実装され、他のプログラミング言語と同様の構文で柔軟なアーキテクチャを組むことが出来るようになりました。その意味では、ES6はまさに、時代にJavaScriptが追いついた革命的なバージョンと言えるでしょう。
JavaScriptは進化が非常に早く、時代について行くためには相応の努力が必要となります。
Python
項目 | 評価 |
---|---|
学習コスト | ★★★☆☆ |
学習コスト(機械学習込み) | ★★★★★ |
需要 | ★★★★☆ |
Pythonは、機械学習の最適解とも言える言語で、この言語を学習する場合は是非機械学習を同時に学ぶことをお勧めします。
機械学習(AI)への需要は日に日に高まってきており、もし機械学習とセットで習得出来れば大きな強みとなります。
また、サーバーサイドフレームワークも開発されているので、何かの時に軽くRESTAPIを書けてしまうのは便利ですが、サーバーサイドのメイン言語としてpythonを選択しているプロジェクトは、現時点ではそれほど多くありません。
機械学習や研究プロジェクトに比重を置きたい方にはお勧めです。
Scala
項目 | 評価 |
---|---|
学習コスト | ★★★★☆ |
需要 | ★★★☆☆ |
関数型言語のひとつであるScalaは、Java VM上で動作し、根強いファンが多くいる言語です。Play Frameworkでは、メイン言語として選択できることから、専らサーバーサイドの言語として人気を集めています。
Java VM上で動作しているだけあって、数多くのJava用ライブラリが使えるというのは大きな強みです。
関数型パラダイムは、従来主流であったオブジェクト指向や手続き型などの言語に比べると、かなり取っつきづらい印象を受けるはずです。最近ではJavaにも関数型インターフェースが実装され、互いの垣根は低くなってきましたが、いずれにせよ癖の強い言語であることは否めません。
ただ、第二のプログラミング言語として関数型の概念を学習しておくことは損になりません。オブジェクト指向などの言語との違いを意識しながら学習できるため、習得にもさほど時間はかからないはずです。
C
項目 | 評価 |
---|---|
学習コスト | ★★★☆☆ |
需要 | ★★☆☆☆ |
プログラミング言語の親とも言うべきCは、コンピューターサイエンスの基礎を学ぶことができます。ポインタの概念やメモリの使われ方を知っておくことは、様々なシーンで役に立つことでしょう。
時間が充分にある場合は、CやC++などでメモリ管理の基礎を学ぶことをお勧めしたいところですが、それほど新しくない言語であるため、需要はそんなに多くないのが現状です。
C++
項目 | 評価 |
---|---|
学習コスト | ★★★★★ |
需要 | ★★☆☆☆ |
マルチパラダイム言語のC++は、C言語をもとにモダンな機能を取り入れながら進化してきました。最近では、主にゲーム開発言語として重用されてきました。しかし、その学習コストの高さと複雑怪奇な言語仕様によって敬遠されることが多い不遇な言語です。
反面、その自由度によって高パフォーマンスな処理を構築することができるため、パフォーマンスを要求されるプロジェクトで採用されることがあります。
オープンソースのソフトウェアでも、データベースなどパフォーマンスが重要なものに使われることが多く、その潜在能力たるや推して知るべし、といったところです。
このように、主に3Dゲーム開発で使われていたC++ですが、最近はUnreal EngineやUnityなどのゲームエンジンにより昔ほどの重要性はなくなってきたかもしれません。しかしそれでも、ゲームプログラマを志すのなら学習して損はない言語です。
まとめ
主要なプログラミング言語について解説してきましたが、どれかひとつの基礎をしっかり覚えてしまえば、他の言語の学習コストはかなり下がります。
プログラミングパラダイムや、設計思想の異なる言語を習得するのにはそれなりの時間が掛かりますが、まずは自分が何をやりたいか、次に学習コストと需要を考慮して学習を進めるのがよいでしょう。
ところで、いわゆる「稼げるプログラミング言語」というものもありますが、母数が少なく、一部の大手プロジェクトが報酬の平均値を押し上げている言語も少なくないので、参考程度に留めておくのが無難です。
人生の貴重な時間を使って学習するわけですから、出来るだけ自分にとって価値のある言語を選びたいですね。