Java開発者が学んでおくべき3つの言語
http://codezine.jp/a/article/aid/1502.aspx
ちょっと問題ありなので後で何か書こうと思っていたけど,一から書くのは面倒なのでちょっと拝借.
http://d.hatena.ne.jp/Isoparametric/20070725/1185341963
要約すると難易度的には
C++ >= Java == C# > Perl == PHP == Ruby == Python == JavaScript == C >= VisualBasic
……なんかおかしくね?
難易度の比較は難しいなあ.
- ポインタの有無:ポインタのある言語の方がポインタ関係のバグが出るので難しい.
- 言語仕様:C++は不必要なまでに複雑だと思う.
- 並列処理:有りの方が並列回りのバグが出るので難しい:Java.多分C#も?
他にも色々な基準での比較があるから,どれが簡単とかは言えない気がする.一般的には
- C++ > C
- C++ > Java*1,C#
- Ruby,Python > Perl > JavaScript
- PHPやVisualBasicはJavaの右くらい.ただしかなり癖が違う.C/C++とJavaでもそういう傾向はある.
くらいかな?しかし実際にはケースバイケース.たとえば「ポインタがどうしても理解できない」という人にとってはC/C++は難攻不落の要塞と化すし,ポインタが楽勝でもOOPやマルチスレッドが理解できない人がJavaやRubyを使いこなすことはできないだろう.
http://d.hatena.ne.jp/Isoparametric/20070726/1185427214
「手続き型言語」「オブジェクト指向言語」「関数型言語」から一つずつ、
また
「動的」「静的」を偏り無く選んで学んでみよう、みたいに分けたら良かったのに。
Javaな人に勧めるものとして一例を挙げれば
- Java(デフォルト):静的型,オブジェクト指向,重量級/非スクリプト
- C言語:低レベル(高級アセンブラ,VMなし),静的型,非オブジェクト指向,
- Ruby:動的型,オブジェクト指向,LL/スクリプト言語.
かな.*2あと可能ならLISPのような関数型言語*3にも是非挑戦して欲しいと思う.たとえマスターできなかったとしても,他の言語を知ることは言語に対する理解を深める上でも非常に意義のあるものだ.*4
学習する順番は難しいけど,時間的に余裕があるならC => Ruby => Javaでもいいと思う.
「HashMapはMapインターフェースのハッシュテーブル実装だ」「TreeMapはMapインターフェースの平衡木実装だ」と言われてチンプンカンプンな人は,ハッシュテーブルやAVL木をC言語で実装してみることがいい経験になる.C言語は逐次処理ベースで静的最適化オンリーなように,ある意味では単純な言語でもある*5.またポインタバグのような悪質なバグを経験すると,行き当たりバッタリな「当たって砕けろ」型のプログラミングスタイルの危険性も,身をもって理解できるだろう.
関連:http://alohakun.blog7.fc2.com/blog-entry-799.html
JavaにしろRubyにしろ,C言語と大きく異なるのがオブジェクト指向プログラミングの概念だ*6.これについてはある程度大規模なコードを書かないと,その良さが理解できないのだが,Rubyの方が比較的小規模なコードでこれが体感できる.また静的なクラス定義*7も初心者には難しい.その辺もRubyの方が良い意味で「いい加減」で,試行錯誤して動かしながら学習を進められるのだ.
あとCとRubyのギャップは大きく,そのギャップを乗り越えるのは大変だろう.だが早い段階でそのギャップを経験することで,「ひとつの言語が使えるようになれば、他の言語は簡単にマスターできる」などという下らない幻想をうち砕くこともできると思う.
http://d.hatena.ne.jp/bleis-tift/20070727/1185501353
この記事自体で挙げられている言語については他の方も色々と言及されているのですが、SQLのこともたまには思い出してあげてください。
SQLも学ぶべき言語の一つではあるけれど,あれはJavaやCなどの汎用言語とはちょっと毛色が違うんじゃないかな.
実はJavaScriptやTeX(やVB)にもそういう側面はあると思う.ActionScriptもこっち系なのかな?
*1:もちろん素のJava.Javaの場合は膨大なライブラリやフレームワークがある.Rubyなんかでも似たような側面はある.特にWebでは素のRubyを使うことはほとんどないのでは.
*2:あくまで一例なので他の組み合わせも考えられる.たとえばRubyではなくPythonやPerlとか,CではなくC++とか.
*4:たとえそれが,自分の才能の壁にぶつかり,今までの自分が「井の中の蛙」に過ぎなかったのだと自覚するだけであっても.
*5:仕組みが単純だからと言って操るのも簡単だというわけではない.たとえば急な坂道を上り下りする時,バイクと一輪車では一体どちらが簡単だろう?或いは複雑な計算をする時,関数電卓とソロバンではどちらが簡単だろうか?
*6:http://itpro.nikkeibp.co.jp/article/COLUMN/20060825/246409/
*7:というよりクラス設計.