プログラマーSEはプログラミング言語をいくつ覚えればいいか?

      2017/01/20


プログラミングの達人というと、いくつもの言語をマスターしていて、必要に応じて使い分けているようなイメージがありますが、達人というほどでなくても、複数のプログラミング言語を使える人はたくさんいます。

私自身もそうなんです。仕事で使ったものだけでも、Java, C#, PHP, Perl, C言語, JavaScript, PL/SQL, VBA, COBOLとけっこうな数あります。

趣味で使ったもので言うとRuby, Node.js, C++, MQLがあります。

「こんなにたくさんの言語を使えるなんてすごい!」と思われた方もいらっしゃるかもしれませんが、たいしたことありません、あなたにも出来ます!

プログラミング言語ってどれもよく似ているので、方言みたいなものなんです。

東京生まれの人でも、テレビでお笑い芸人が喋っているのを真似して「なんでやねん」とか、えせ関西弁って話せますよね。本気になれば、えせじゃなく全部関西弁のイントネーションで話すことも出来るはずです。

複数のプログラミング言語を使えるようになるのも同じようなものです。

先程のえせ関西弁と同じでプログラミング言語をちょっと使える程度になる「えせ状態」になら簡単になれます。そこから、プロとしてお金をもらえるレベルになるにはもう少し努力が必要になります。努力と言っても英語をマスターするのに比べればずっとずっと簡単です。

では、本題である「いくつ覚えればいいのか?」について考えていきましょう。

一つでもいいけど…、

究極を言ってしまえば、いくつでもいいのです。「おれは一つの言語を極める!」と決めて、その言語のスペシャリストになっていくのもいいと思います。

ただ、その言語の需要がなくなってしまった場合、職業人プログラマーとしては困ってしまいます。とはいえ、実際、それまでにある程度以上需要のあった言語の需要がゼロになることはなかなかありません。COBOLだって未だに需要があります。

仮に需要がなくなったとしたら、その時に別の言語を覚えればいいので、それほど問題ではありません。方言を覚えるようなものなんですから。

言語には系統の近さがある

プログラミング言語の違いは日本語の方言みたいなものだと言いましたが、とはいえ、似てる度合いが近い言語、遠い言語があります。

自然言語でも英語とドイツ語は単語や構文規則が近いと言われています。日本語と文法が近いのは韓国語だと言われてます。

これと同じようにプログラミング言語にも系統があります。

例えば、C言語系統の言語として、C言語の子供として、C++があり、さらにその子供にJavaとC#がいます。PerlやPHPもC言語系統の言語です。

これらの言語は一つ覚えれば、他の言語を覚えるのも簡単です。文法やキーワードがほとんど同じだからです。
例えば、Javaのif文と代入文は以下のようになります。

PHPだと以下のようになります。

ほとんど同じですよね。PHPの場合、変数の頭に$をつけるのがルールなんです。それ以外はほぼ同じです。

これに対して、別の系統の言語であるCOBOLを覚えるのは少し大変です。

「え?」って感じですよね。とはいえ、これは短いコードサンプルなのでなんとなくは分かるかと思いますが、C言語系統の言語では変数への代入を

val2 = 5;

と数式のようにイコール(=)使っているのに対して、COBOLは

MOVE 5 TO val2

と英語のような書き方になっています。このように基本的な表記方法に違いがある言語を覚えるのはちょっとだけ大変です。

そして、主要な言語の中でCOBOLのような表記をしているのはCOBOLだけです。

ですから、COBOLしかわからない人は他の主要な言語を覚えるのに苦労することになります。

ということで、C言語系統の言語をまずは一つ覚えるといいと思います。すると、他の言語を覚えるのも簡単になります。

複数の言語を学ぶと視点が一つ高くなる

複数の言語を覚えると、複数言語にまたがるプログラミングの共通点が見えてきます。

「Rubyでは高階関数を使った書き方が多用されてるなぁ、それならPHPを使う時にも高階関数を使った書き方も試してみよう」

という風に、他の言語で学んだプログラミングテクニックを別の言語に応用することが出来るようになります。

これって一つの言語しか学んでない人には出来ないことです。

そうやって、いくつもプログラミング言語を学んでいくと、どんどん言語感の共通点に関する知識が増えてきます。すると、プログラミング言語ってこういうものだよなという、本質のようなものが見えてきます。

すると、新たに言語を覚える際にも、それらの知識を使ってすばやく習得が出来るんです。

自然言語でも同じで、英語を学んだ後にドイツ語を学ぶのは簡単になりそうですよね。更にその後、フランス語を学ぶの簡単になります。

というように、学べば学ぶほど、次学ぶのが楽になるという好循環が生まれます。

ですから、少なくともプログラミング言語は2つ以上学んだほうがいいのです。

その他に言われているのが、パラダイムの違う言語を学ぶというものです。

プログラミング言語のパラダイムとは?

例えば以下の様なものがあります。

  • 手続き型言語 → C言語, Pascal, FOTRAN, COBOL
  • オブジェクト指向言語 → Java, C#, Ruby, PHP, Python, Perl, JavaScript

オブジェクト指向言語の中にも大きく分けて2つのタイプがあります。

  • クラス型オブジェクト指向言語 → Java, C#, Ruby, PHP, Python, Perl
  • プロトタイプ型オブジェクト指向言語 → JavaScript

↓クラス型オブジェクト指向言語(PHP)のサンプルコード

↓プロトタイプ型オブジェクト指向言語(JavaScript)のサンプルコード

けっこう違いますよね。プロトタイプ型の場合、オブジェクトをnewした後にメソッドを追加することも出来ます。

このような様々なタイプの言語を学ぶとタイプごとに特徴的なプログラミング哲学があって、それらを学ぶことによって、プログラミングをする時の発想の幅が広がります。

とはいえ、上記で紹介した言語は大きなくくりで言うと「命令型言語」というものです。

命令型言語に対して、関数型言語というものもあります。

命令型言語と関数型言語の違いはデカイ

命令型言語は、命令を一つずつ順番に実行していくことで処理を進めていきますが、関数型言語は関数を連鎖させることで処理を進めていきます(命令型言語でも関数を定義することが出来るので、関数を連鎖させて処理をすすめることは出来ます)。

例えば関数型言語であるHaskellでFizzBuzzのプログラムを書くと以下のようになります。

「は?」ってなりますけど、

FizzBuzzとは、引数が3で割り切れる場合は「Fizz」、5で割り切れる場合は「Buzz」、15で割り切れる場合は「Fizz Buzz」を返すプログラムです。

それでも「は?」ですよね(笑) 私もです。Haskell意味不明です(笑)

同じプログラムをPHPで書くと以下のようになります。

「これなら分かるわいっ!」ですよね(笑)

言語学習に失敗しない秘訣

私も関数型言語に何度もチャレンジしては、敗れてきました。

なんでかというと、関数型言語で作りたいものがなかったからです。関数型言語の考え方を学ぼうと思って、入門書を何冊も読んだんですが、全然身につかなかったんです。勉強のための勉強ってやっぱダメですね。

なので、パラダイムの違う言語を勉強するために勉強するっていうのではなく、パラダイムの違う言語を使って何かを作りたくなった時に学ぶといいんでしょうね。

まとめ

  • 主流な言語は皆似てるので、2つ以上学んでプログラミング言語間の共通点 = 本質を学ぼう
  • パラダイムの違う言語を学ぼう(勉強のための勉強にならないように、学ぶ目的が出来てから学ぼう)
プログラミング初心者におすすめのサービス
1. 講師から対面で学びたい派なら

プログラマカレッジをおすすめします。ProEngineerという転職エージェントが運営しているプログラミングスクールです。20代限定なんですが、無料で受講できて、修了後、就職支援もしてくれるんです。最高過ぎですよ、これ!!就職の紹介料を企業からもらえるのでスクールを無料にできるんでしょうね。すばらしいシステムだと思います!

30代以上の方には

プログラマカレッジは20代限定なので30代以上の方にはWebスクをおすすめします。受講料の返金保証がついているし、毎日11時〜23時まで通い放題なのでとてもいいと思います!

2. 自宅で学びたい派なら

「就職保証付き」オンライン就職予備校をおすすめします。Javaエンジニアコースでは就職保証がついているのでプログラマーとして就職したい方にはぴったりです。Javaエンジニアの求人ってめっちゃ多いし、求められる技術レベルもそこまで高くないのでちゃんとした教育プログラムなら就職保証できるだろうなとJavaエンジニア経験者の私も思います。

3. つまづいた時に質問したくなったら

プログラマー専用の質問サイトteratailをおすすめします。 つまづいた時にteratrailで質問すれば教えてもらえます。

これらのサービスを活用すれば、全くの初心者からでもプログラミングをばっちり出来るようになると思います!レッツトライです!

 - 勉強法 , , ,