全ての開発者が学ぶべき5つの言語

「どの言語を学ぶべきか」という議論はエンジニア向け記事の定番ネタですが、[HackerNoon](https://hackernoon.com/)に投稿された[5 Programming Languages Every Master Developer Should Learn](https://hackernoon.com/5-programming-languages-every-master-developer-should-learn-a3929a8c6f69)という記事がなかなか興味深かったので翻訳してみました。

(2018/11/04追記)
こちらの記事に関する「別視点からの意見」として下記のような記事を追加いたしました。宜しければこちらも併せてご参照ください。

[Ruby->Go->Scalaという習得順序がエンジニアの爆速の成長に最適である理由](https://qiita.com/poly_soft/items/1feaa1ec5ecab08dc6db)

# はじめに

*「プログラマーは新しい言語を毎年1つは習得するべきだ」という趣旨の文章をどこかで読みました。(多分[CODE COMPLETE](https://www.amazon.com/dp/0735619670)だったと思いますが)
もしそれが難しくても、キャリアの中で最低限この後に紹介する5つの言語に通じておくことをお薦めします。
あらゆる会社は、多言語を自在に操れて、簡単なスクリプトも複雑なJavaプログラムもどちらも使いこなせるオールラウンダーの開発者を好みます。
実際に、シニア開発者にとって「2つ以上の言語に習熟している」ということは不可欠な素養です。*

* * *

面接者は、C++やJava等、複数言語に通じているエンジニアに対して大きな関心を持ちます。

個人的には、C++もしくはJavaどちらかで豊富な経験を持ち、さらにGroovyやPerl、あるいはPython等のスクリプト言語の両方を使いこなせるエンジニアが私の好みです。(多くの場合、小さなスクリプトの方が書くのは簡単でアドホックな作業にはうってつけですし、私は自分の会社のエンジニアがJavaを使ってCSVファイルを読んだりTCP/UDPポートのメッセージをキャプチャするコードを書いたりすることは望みません)

なぜ私はこの5つの言語を選んだのでしょう？ その理由はシンプルかつ実践的で、私はこれらの言語を「用途」「パラダイム」「ポピュラリティ」に基づいて選択しました。

例えば、もしあなたがアプリケーション開発者になりたいなら、Javaを無視することは出来ないでしょうし、Webのあらゆるところで使われているという意味ではJavaScriptも同様です。

Cは「あらゆる開発者がキャリアの初期に学ぶべき言語である」と私は考えています。
Cを使うことで、システムレベルにおけるプログラミングの知見を得ることが出来ますし、JVMやCLRの背後に隠れている重要なコンセプトを学ぶことが出来ます。

Pythonは「スクリプト言語」の用途における私のファーストチョイスです。PerlやGroovyでもよいと思いますが、「オンラインリソースの充実度」という点においてはPythonは本当に偉大です。たくさんのPythonモジュールが存在しますし、それらをほんの数分であなたの仕事に組み込むことが可能です。

同様に、「オブジェクト指向言語」と、HaskellやScalaのような「関数型言語」を学ぶことは、あなたのプログラミングセンスや思考の幅を広げることに役立つでしょう。

これ以外にも、この5つの言語を学ぶべき様々な理由をこの記事の中で説明しています。

# 全ての開発者が学ぶべき5つの言語

さあ、難しい話はこれくらいにして、全てのプログラマーがトライするべき5つの言語に関して早速紹介していきましょう。

オブジェクト指向言語、関数型言語、スクリプト言語、低水準言語、サーバーサイドの開発で使用される言語等、様々な言語がミックスされています。

# 1.Java

Javaはここ20年間ほどで最もよく使われていて、サーバーサイドのアプリケーション開発をリードしてきた言語です。
モバイルゲームやAndroidアプリの開発、そしてエンタープライズWebアプリケーションの開発まで、非常に大きなマーケットシェアを保持しています。

Javaは元々「WORA」、つまり「write once run anywhere」というシンプルな思想から始まりましたが、今では実際にあらゆるところで実行されています。

頑強でスケーラブルなサーバーサイドアプリケーションを開発したいなら、あなたはJavaを学ぶべきです。どのように複雑なシステムであってもJavaで書けますし、様々なツールやテクノロジー、そしてコミュニティのサポートを得ることができます。

**なぜJavaを学ぶ必要があるのでしょうか？Javaを使うことで、システムレベルの詳細事項やメモリ管理に煩わされることなく、アプリケーションのアーキテクチャ設計やコーディングに集中することができるのです。面倒なことは全てJVMが担当してくれます。**

もしあなたがJavaを学ぶことを決心したなら、Udemyの[Complete Java Masterclass](https://www.udemy.com/java-the-complete-java-developer-course/)をお薦めします。全ての基本コンセプトが程よいバランスで網羅されています。

無料のコースをお望みなら、[free Java Courses for beginners](http://www.java67.com/2018/08/top-10-free-java-courses-for-beginners-experienced-developers.html)をチェックすると良いでしょう。

Javaは、銀行や保険会社等のビッグカンパニーでも使用されていますし、Androidアプリを作って一般の人にリーチすることも出来ます。

*もしあなたがJavaの重要性にまだピンと来ていないなら、[10 reasons to learn Java](http://javarevisited.blogspot.sg/2013/04/10-reasons-to-learn-java-programming.html)をチェックすることをお薦めします。*

# 2.Python

Pythonは、世界中のスクールや大学で最も広く教えられている言語です。アメリカにおいては、Pythonはアカデミックなコースで最初に教える言語としての立場をJavaから奪い去りました。Pythonを学ぶことで何が得られるかって？たくさんあります。

Pythonは、スクリプト言語として使用することも可能ですし、オブジェクト指向言語として巨大なプロジェクトの開発に使うことも出来ます。

Reddit等の著名なWebサイトがPythonとDjango等のWebフレームワークを使用して作られていますし、近年ではたくさんの巨大組織がPythonベースのWebフレームに移行しています。

さらにPythonは、機械学習やAIやデータサイエンス等の新世代のテクノロジーと共に頻繁に使われるようになってきていますが、TensorFlowやScikit-Learn、その他様々な機械学習ライブラリがPythonには存在するのですからそれは全く不思議なことではありません。

[Complete Guide to TensorFlow for Deep Learning with Python](https://www.udemy.com/complete-guide-to-tensorflow-for-deep-learning-with-python/)

私は個人的にPythonをスクリプト言語として使用しています。例えばUDPのメッセージリスナーを作成する場合、Javaなら20分必要なところをPythonなら5分で書くことが出来ます。コンパイルやパッケージングに煩わされることなく、アドホックなタスクをすぐに片付けることができます。

もしあなたがPythonを学ぶことに興味を持ったなら、[Complete Python Bootcamp](https://www.udemy.com/complete-python-bootcamp/)は最初に学ぶコースとしてお薦めです。

無料コースに興味があれば、[free Python courses for beginners](http://www.java67.com/2018/02/5-free-python-online-courses-for-beginners.html)をチェックしてみてください。

JavaとPythonのどちらから学び始めるべきか迷っているなら、JavaとPythonを比較したこちらの[Infographic](https://javarevisited.blogspot.com/2018/06/java-vs-python-which-programming-language-to-learn-first.html)をチェックしてみてください。

*それでもまだPythonの価値に確信が持てないなら、私の記事[10 reasons to learn Python in 2018](https://javarevisited.blogspot.sg/2018/05/10-reasons-to-learn-python-programming.html)を読んでみてください。*

# 3.JavaScript

この5つのリストにおいて、JavaをC++に置き換えたり、あるいはPythonをRubyに置き換えることは可能かもしれませんが、今日のWebの世界においてJavaScriptを他の言語で置き換えることは出来ません。過去5年間で、JavaScriptはまさしく世界を完全に支配したのです。

JavaScriptの用途はもはやクライアントサイドのスクリプティング言語にとどまりません。Node.jsやAngular、React等の登場により、JavaScriptはサーバーサイド開発やUI開発にも使用出来るようになりました。

JavaScriptの一部が圧倒的な成功を収めたのはjQueryで、これはクライアントサイドにおけるJavaScriptの使用方法を根底から変えました。

Javaプログラマーの一人としてJSPやサーブレットベースのアプリケーションを開発する際に、jQueryやJavaScriptを並行して使用した経験は何度もあります。

この言語の知見を得ることで、どの機能をサーバーサイドで使用して、どの機能をクライアントサイドで使用するか、そういった決定が非常にやりやすくなります。(例えばサーバーサイドで行っていた多数のバリデーション処理をクライアントサイドに移行する等)

もしあなたがJavaScriptを学びたいなら、Udemyの[The Complete JavaScript Course](https://www.udemy.com/the-complete-javascript-course/)は最良のオンラインコースです。

無料コースに興味があれば、[free JavaScript courses for web developers](http://www.java67.com/2018/04/top-5-free-javascript-courses-to-learn.html)をチェックしてみてください。

# 4.C Programming

CやC++を知らずして真のプログラマーになることは出来ません。厳しすぎる言葉かもしれませんが、これは私の長い経験から断言できます。

C/C++に習熟したエンジニアは、それらを知らないエンジニアよりも単純に優れている場合が多いですし、それは偶然の一致ではありません。C/C++は、あなたが必ず知っておくべき言語なのです。私は学生時代にCを学んだことで、構造体、配列、ポインタ、メモリ管理等、プログラミングのキーコンセプトを知ることが出来ました。

Cは、システム水準のプログラミング言語として今でも最も広く使われている言語ですし、過去2年間に「言語のポピュラリティ」の分野における競争で、Javaと常にトップ争いをしています。

もしあなたがこの素晴らしい言語を学びたいなら、[C Programming for Beginners](https://www.udemy.com/c-programming-for-beginners/)は最初の一歩としてお薦めです。

Cはメインストリーム言語として最も古い言語の一つで、40年以上に渡って生き残ってきました。

ちなみに、CではなくC++を学びたいのであればそれも悪くありません。CとC++は非常によく似ていますし、どちらを使っても低水準のプログラミングを行うことが可能です。

C++は、そのパフォーマンスの高さによって、特にゲーム開発者にとっては非常に重要な言語です。

もしあなたがゲームを作りたくて、C++について学びたいなら[The Unreal Engine Developer Course - Learn C++ & Make Games](https://www.udemy.com/unrealcourse/)は最良のコースの一つです。これは大変素晴らしいコースで、ゲームの開発方法を学ぶ上でこれ以上の学習リソースは無いでしょう。

無料コースに興味があれば、[FREE C++ Courses for beginners](http://www.java67.com/2018/02/5-free-cpp-courses-to-learn-programming.html)をチェックしてみてください。

# 5.Scala

Scalaは、過去20年間のベストプラクティスの蓄積によって産み出された言語です。Scalaは関数型言語でもあり、オブジェクト指向とはまた別のパラダイムを提供します。プログラミングに関するあなたの考え方や感覚を改善することに役立つでしょう。

その他にも、Haskell等の様々な関数型言語が存在しますが、私はJavaエンジニアでもあるので、HaskellよりもScalaを学ぶ方が簡単だったということでScalaを選択しました。

もちろんHaskellにチャレンジするという方法も十分にありですが、多くのJavaエンジニアにとってはScalaを学ぶ方がより実践的であり実利的だと思います。

C++エンジニアの場合はHaskellを学ぶことはより意義があるかもしれませんが、率直に言って、関数型言語は「商用ベースにおける需要」を考慮して選択する方がよいでしょう。

職業エンジニアとして、私は自己投資が自分のキャリアにおいて役に立つことを重視しています。あなたがScalaを学びたいなら、[Beginning Scala Programming](https://www.udemy.com/beginning-scala-programming/)は最初の一歩として良い選択です。

# まとめ

言語を何個学ぶかにかかわらず、プロフェッショナルなエンジニアになりたいのであれば、あなたは[Clean Code](http://www.amazon.com/dp/0132350882)にかかれているようなコーディングとデザインの原則に従うべきです。この書籍に記述されているスキルはあなたのエンジニアとしてのキャリアで大いに役立つでしょう。

以上が私の「全ての開発者が学ぶべき5つの言語」のすべてです。

個人的意見ですが、パラダイムの異なる複数の言語を学ぶことは、プログラミングスキルを改善する最良の手段だと私は考えていますし、それによって日々のタスクをより効率的に片付けていくことが出来るようになると思います。

**理想としては、プログラマーのツールセットには「C/C++等のシステム水準の言語」「Java/Python/C++等のオブジェクト指向言語」「Scala/Haskell等の関数型言語」「Perl/Python/Ruby等のパワフルなスクリプト言語」、そして「代用の効かない言語であるJavaScript」が含まれているべきだと思います。**

好奇心の強い開発者の方には下記の記事もお薦めです。
[10 Tools Every Programmer should know](http://javarevisited.blogspot.sg/2018/01/10-tools-every-software-developer-know.html)
[10 Articles Every Programmer Must Read](http://javarevisited.blogspot.sg/2014/05/10-articles-every-programmer-must-read.html)
[6 Books to Learn and Master Programming](http://javarevisited.blogspot.in/2014/09/top-6-books-to-learn-programming-coding.html)
[10 Tips to become a better Software developer](http://javarevisited.blogspot.sg/2014/01/10-tips-to-improve-programming-skill-become-better-programmer.html)
[10 Object Oriented design Principle Every Programmer should know](http://javarevisited.blogspot.sg/2012/03/10-object-oriented-design-principles.html)
[10 More Books Every programmer should read](http://www.java67.com/2015/03/10-books-every-programmer-and-software-engineer-read.html)
[10 Things Java Developer should Learn in 2018](http://javarevisited.blogspot.sg/2017/12/10-things-java-programmers-should-learn.html#axzz53ENLS1RB)

# 最後に

最後まで読んでくれてありがとうございます。この記事が気に入ったら是非あなたの友人や同僚にシェアしてください。私の[Twitterアカウント](https://twitter.com/javinpaul)と[Mediumのアカウント](https://medium.com/@javinpaul)をフォローすることもお忘れなく！

あなたが疑問を感じた点やフィードバック、あるいはあなたの考える「エンジニアが学ぶべき言語」が他にもあれば、是非我々にシェアしてください。

P.S. もし他の無料リソースを知りたければ、[free data structure and algorithm courses](http://javarevisited.blogspot.com/2018/01/top-5-free-data-structure-and-algorithm-courses-java--c-programmers.html)はプログラミングの旅に出る最初の一歩としてお薦めです。

# 訳者の所感

作者の方はJavaエンジニアということもあってかなりJava寄りの見解になっていると思いますが、「エンジニアとしての能力を伸ばす」という観点においては、この5つのリストに関しては私もほとんど異論がありません。

ただ、日本のWeb業界において「エンジニアとして爆速で成長していく」上では別の組み合わせの方が望ましいというのが私の意見です。これに関しては下記の記事をご参照頂ければと思います。

[Ruby->Go->Scalaという習得順序がエンジニアの爆速の成長に最適である理由](https://qiita.com/poly_soft/items/1feaa1ec5ecab08dc6db)

# 訳者おまけ

Youtubeの方で、Web系エンジニアやWeb系エンジニアに興味のある方たち向けの[雑食系エンジニアTV](https://www.youtube.com/channel/UC_HLK-ksslL-Z_2wiIZDlMg)というチャンネルをやっています。もしご興味ございましたらチャンネル登録してみて頂けると大変嬉しいです。

また、2019年から「[雑食系エンジニアサロン](https://kentakatsumata.net/archives/10)」というオンラインサロンも始めました。

Twitterの方でも「Web系エンジニアのキャリア戦略」を中心に色々と情報を発信しておりますので、もし宜しければフォローしてみてください。[@poly_soft](https://twitter.com/poly_soft)