プログラミング言語の習得難易度を分類してみた

      2017/09/06

本を読む女の子

「プログラミング言語ってたくさんありすぎて、どれ学んだらいいか選べない…」
「できれば習得がかんたんな言語が良い…」
「就職・転職で評価される言語が良い…」

どのプログラミング言語を学ぼうか考えるのって楽しいですよね?
私もこれまでC言語, C++, JavaScript/node.js, VB, Java, PHP, Ruby, C#と様々な言語を使ってきました。

ちょびっと触った言語としてPerl, COBOL, PL/SQL, Python, Scala等があります。

入門書は読んだけど、実際使うには至らなかった言語(Haskell, F#, Common Lisp, Clojure, Lua, Go)もたくさんあります。

そんな経験を踏まえて、今回はプログラミング言語の習得難易度を分類してみます。

難易度S(全くものにならず)

Haskell, F#, Common Lisp, Clojureです。つまりは関数型言語ですね。

入門書を読んで文法を頭に入れてみたものの、これらの言語を使って「何か作ってみよう」という気になれませんでした…。

というか、どうプログラムを組むかの発想が全く浮かばなかったんです。つまりは修得できてないということなんでしょう。

「関数型言語を使ってこういうものを作りたい!」っていう具体的な目的がなく、勉強のための勉強になっていました。

プログラミング言語って使わないと身につかないのはわかっているんですけど、関数型言語だと何かを作る発想が浮かばないというデッドロック状態なんです。

難易度A (難しいけど、頑張れば使えた)

C言語, C++です。低水準な(ハードウェアに近い)言語という意味での難しさがあります。

私は18歳の時に専門学校に入学してプログラミングを始めたのですが、その時に習ったのがC言語とC++でした。

「今思えば難しい言語だな」と思います。特にC言語は用意されてる関数が簡素な機能しかなくて、原始的なロジックを自分で組む練習になりました。

JavaやPHPなど、C言語より高水準な言語をたくさん使ってきた今、C言語でコードを書くのはきついなぁと感じます。char配列を直接ごにょごにょ扱うロジック書きたくないですものね。

「ポインターが難しい」って話がよく言われていますが、さほど特別なものでもありません。ポインターをざっくり説明すると他の言語で言う「参照」の一種なんです。

参照ってオブジェクトのアドレスですよね。ポインターもアドレスです。ポインターの場合、アドレスに加算減算などをして参照する先を移動させることができます。違いはそれだけなので、知識として理解するのはそこまで難しくありません。

ただ、知識として分かっていても複雑なポインタ演算を使ったコードは「書いた本人以外よく分からん」ってことがよくあります(笑)

難易度B (かんたんに見えてしんどい)

JavaScript/node.jsです。意外ですかね?

メジャーな言語の多くは同期IOを基本にしているのに対してJavaScript/node.jsは基本的に非同期IOなので、コールバック関数でIOの結果を受け取る書き方をしなければならない所が厄介なんです。

PHPでファイルを読む同期IOのコードって以下のような書き方をします。

同じことをJavaScriptで書くと、非同期IOなので以下のようになります。

非同期IOだと、IOが発生する度に無名関数を書いて結果を受け取らなければならないんです。IOが一回ならいいけど何度もあるとやっかいです。例えば、3個のファイルを読むが場合、こうなります↓

コールバック地獄ってやつです。コールバック関数が何重にもネストしてコードが読みにくくなります。

脳に負荷のかかる言語だと思います。まぁ、修行になっていいかもしれませんけどね。

それから、オブジェクトを定義するのがクラスではなく、プロトタイプによって行うところも特殊です。

メジャーなオブジェクト指向言語はクラス型オブジェクト指向なのに対して、JavaScriptはプロトタイプ型オブジェクト指向なので、他の言語の考え方をそのまま使うことができず、これまた脳に負荷がかかって修行になります。

例えば、PHPでオブジェクトを定義する場合、クラス型オブジェクト指向なので以下のようになります。

JavaScriptでオブジェクトを定義する場合、プロトタイプ型オブジェクト指向なので以下のようになります。

classの方が直感的で分かりやすいですよね。

node.jsをしばらくやった後、PHPやRubyに戻ると、「なんて楽なんだー!同期IOさいこー!クラスさいこー!」って思えたほどです。

とはいえ、言語仕様がコンパクトで覚えるべき基礎知識も少ないので、入門しやすい言語でもあります。入門はかんたんで、しばらく使って次のレベルへと上がるためにもう一度学ぶというタイプの言語かなと思います。

難易度C (ふつうに使える)

Java, C#, PHP, Perl, Python, Rubyです(その他大抵のメジャー言語もこのランク)。

「えっ?PHPの方がJavaよりかんたんでしょ?」って思われたかもしれませんが、大きなくくりとしてPHPとJavaの難易度は変わりません。

これらの言語は

  • クラス型のオブジェクト指向言語、かつ命令型言語

です。基本はみんないっしょなので、文法の差異を学ぶだけですぐ使えるようになります。

命令型言語は、

  1. 逐次実行
  2. 分岐
  3. 繰り返し

の3つの要素でできているので、これら3つを抑えればどの言語でも使えます。

もちろん、その言語らしい書き方ができるようになるにはそれなりに時間を要しますが、それでも、関数型言語のようなパラダイムの違う言語を覚えるよりはずっとかんたんです。

「PHPはかんたん、PHPしか使えないプログラマーはバカ」

などと言ってる人はPHPを使ったことがないんじゃないんだと思います。使ってみれば、言語として持っている機能はほとんど一緒だということが分かりますからね。

PHPの標準関数の引数の並び方のポリシーがバラバラだったりするイライラはありますけど、それは言語設計の美しさの問題であり、言語の習得難易度とは別の問題です。

そんなわけでメジャーな言語のほとんどは難易度Cなので、そんなに構えず、気になった言語を学んでみるといいと思います!

おまけ: 給料で損した経験談

私と同じ失敗をされないよう経験をシェアしてます。

私が新卒で入った会社は社員数80名の零細ベンダーでした。

基本給は17万円で手取りは14万円くらいでした。仕事は客先常駐の業務システム開発(言語はJava)でした。

会社の先輩に「うちの会社って給料安すぎませんか?」って聞いてみたところ、

「どこもそんなもんだよ、ふつうふつう」

と言われて、「そうなのかなぁ…」と半信半疑ながら4年半勤めて年収は320万円でした…。

「やっぱ安すぎだろ!?」と思って試しに転職してみたら、

仕事内容はほぼ同じで年収が120万円もアップしたんです!

「こんなことがあっていいのか…」って感じですが、現実はどんな仕事をするかより、どの会社で働くかで給料が決まる面が大きいんですよね。

給料の高さが全てではありませんが、年収相場より大幅に安いという方は一度転職を検討してみると良いと思います。

相場がどれくらいか分からないという方はこちらの記事も、ぜひ読んでみて下さい!

エージェントを使った方が転職活動は楽です

東京・大阪近郊のイケてるIT企業に転職したい人には『レバテックキャリア』

 東京・大阪近郊のエンジニア経験者向け転職サービスです。

このサービスを運営しているレバレジーズという会社はシステム開発もやっているので、現場の仕事をよくわかってくれてますし、ヒカ☆ラボというIT系の勉強会なども主催していたりteratailというプログラマー専用の質問サイトを運営してて好感が持てます。求人案件もWebやスマホの面白い仕事が多いのでいいと思います。

ホームページを見ると分かるんですが、若くて美人の担当者が多いのもナイスなんです!私の場合(たぶんあなたも)、担当者が美人だと転職活動のモチベーションめちゃ上がりますからね笑

エンジニア未経験の方や地方在住の方にはワークポートというエージェントをおすすめします。

エンジニア未経験の方や地方在住の方には『ワークポート』

全国の求人を扱っていて、しかもITエンジニア未経験の人にも転職支援をしてくれるエージェントです。

未経験の人はサポート対象外のエージェントが多い中、ワークポートは未経験者を支援し転職を成功させています。

未経験の方こそエージェントから職務経歴書の作り方や面接の仕方のレクチャーを受けた方がずっとうまくいきます。

『派遣社員』なら正社員とフリーランスの『良いとこ取り』!

  • 「フリーランスになりたいけど、確定申告とかめんどくさいな」
  • 「定時帰りできる職場や、時短勤務がしたい」

という方には派遣社員がおすすめです。

派遣ってネガティブなイメージありますが、ITエンジニアの派遣社員なら

  • 時給が高く、給料も悪くない
  • やりたい仕事を選べる
  • 確定申告不要(派遣会社がやってくれる)
  • 厚生年金、健康保険も派遣会社が入ってくれる

ので、正社員とフリーランスのいいとこ取りな、とてもいい選択なんです。

 - 技術 , ,