プログラミング言語をマスターする近道

「{主要な/主要でもない}プログラミング言語 N種を*解説」とかいうのが流行っているようですが、なんでそんなにいっぱい習得できるんですか、どうやったらマスターできるんですか、という話を書いてみたいと思います。

SQLはプログラミング言語なのかとか、チューリング完全がどうとかには触れません。

私見です。異論、反論、編集リクエスト大歓迎。

----
### おさえるべきは、「文法」と「ライブラリ / フレームワーク」

チュートリアルも参考になる。このへんを見ずに苦労している人が多いみたいだけど、もったいない。検索にひっかかるブログを参考にするくらいなら、まずはオリジナル文書を読めってんだ。

- Javaなら、[JLS](http://docs.oracle.com/javase/specs/index.html), API {[SE](http://docs.oracle.com/javase/8/docs/api/index.html)/[EE](http://docs.oracle.com/javaee/7/index.html)}, Tutorial {[SE](http://docs.oracle.com/javase/tutorial/tutorialLearningPaths.html)([ja](http://docs.oracle.com/cd/E26537_01/tutorial/index.html))/[EE](https://docs.oracle.com/javaee/7/tutorial/index.html)} 
- Python なら、[Language Reference](https://docs.python.org/3/reference/index.html), [Library Reference](https://docs.python.org/3/library/index.html), [Tutorial](https://docs.python.org/3/tutorial/index.html) 
- [JavaScript](https://developer.mozilla.org/ja/docs/Web/JavaScript) なら、[ECMA262](http://www.ecma-international.org/publications/standards/Ecma-262.htm), MDNの[文と宣言](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference#Statements)以降と[組み込みオブジェクト](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference#Global_Objects)、w3cの[DOM](https://www.w3.org/TR/#tr_DOM)、[npm](https://www.npmjs.com/) 
- JScriptなら、MSDNの[JavaScript Fundamentals](https://msdn.microsoft.com/en-us/library/6974wx4d(v=vs.94).aspx)と[Refernece](https://msdn.microsoft.com/en-us/library/yek4tbz0(v=vs.94).aspx)、[DOM](https://msdn.microsoft.com/ja-jp/library/hh772384(v=vs.85).aspx)
- Rubyなら、(編集リクエスト待ち)
- Cなら、ISO/IEC [9899:1999(C99)](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf) か [9899:2011(C11)](http://webstore.ansi.org/RecordDetail.aspx?sku=INCITS%2FISO%2FIEC+9899-2012), 

- (紹介したい言語があれば編集リクエストをください)

パッケージシステム、IDE、ビルドシステムなども言語環境を特徴づける要因といえる。

See Also: [ちゃんと公式ドキュメントで確認するプログラマのリンク集](http://qiita.com/egnr-in-6matroom/items/3847c233be9fbf2a68fc)

----
バリエーションとか、ピボットするときの攻めかた

手続き型、関数型、SQL、低水準⇔高水準、組込系⇔基幹系、フロントエンド⇔バックエンド、コンシューマ⇔エンタープライズ、などなどの軸を意識して俯瞰してみると、自分が持ってるスキルと、トライしようとしてる言語のギャップがどれくらいあるのかの「距離感」が分かるようになる。

- 近所を攻めていけば習得数は増やせるけど、応用は効かない。
- 新しい概念が入るときは、近所を選んだほうがハードルは低い。

JavaScriptはもともとフロントだけだと思ってたけどサーバサイドでも使えるようになった、みたいに、軸を超えてくることもあるので面白い。やめられない。

※ 手続き型、関数型に対してSQLは何型って呼ばれるんだろう。集合型? 宣言型?

----
時間が余ったので

----
### 「ほげ言語のパラドックス」

[ハッカーと画家 コンピュータ時代の創造者たち](http://www.amazon.co.jp/gp/product/4274065979?tag=matobaa-22&linkCode=as2) の [普通のやつらの上を行け (Beating the Averages)](http://practical-scheme.net/trans/beating-the-averages-j.html) より引用

> プログラミング言語は、その力において差がある。…… ある年齢に達すると、プログラマーは自分から使う言語を変えることは ほとんどなくなる。何の言語を使っていようと、これで十分だと思ってしまうのだ …… 彼にとっては「ほげ」言語で十分なのだ。…… 誰であれ、プログラムについて考える時には自分が使うことになった**言語に思考が支配されている**から、その言語に満足してしまうんだ。

----
## オススメはどれなの?

おこがましいので、「[7つの言語、7つの世界](https://www.amazon.co.jp/dp/4274068579?tag=matobaa-22&showDetailProductDesc=1#product-description_feature_div)」の目次を紹介する:

- 第2章 Ruby (オブジェクト指向言語)
- 第3章 Io (小さなメモリ領域で動作し、JavaScriptのようなプロトタイプ言語)
- 第4章 Prolog (古い言語だが，極めて強力な言語)
- 第5章 Scala (JavaVM上で動作する、強力な関数型プログラミングの概念をもたらした言語)
- 第6章 Erlang (並行性、分散処理、耐障害性をきちんとサポートしている関数型言語)
- 第7章 Clojure (JavaVM上で動作する、Lisp方言の1つ)
- 第8章 Haskell (純粋関数型言語、すなわち「状態」がどこにも存在しない)

> 各言語にはそれぞれ，イディオム，長所，短所がある．さまざまなプログラミング言語を学ぶことによって，自分が興味を持っている種類の問題を解くのに最適な言語が分かるようになる．

紹介されている言語それぞれがどんな特徴があるのかは、[About this Title](https://www.amazon.co.jp/dp/4274068579?tag=matobaa-22&showDetailProductDesc=1#product-description_feature_div) 「1.2 この本で扱う言語」で読めます。そして、ぜひこの本も読んでください。難しいと思うけれど、おすすめです。
[主要でもないプログラミング言語200種を一行で解説](http://qiita.com/make_now_just/items/b2ab19f954417c71848d) に簡単な紹介があります。

----
See Also

* [wikipedia:プログラミング言語年表](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E%E5%B9%B4%E8%A1%A8)
* [プログラミング言語の系図(系統図、系統樹)(Computer Languages History)](https://www.levenez.com/lang/)
* [languageposter(oreilly)](http://archive.oreilly.com/pub/a/oreilly/news/languageposter_0504.html)