プログラミング言語関連の記事でいつもいつも大量のビューを集めるのが「どのプログラミング言語が稼げるか?!」という内容のもの。
例えば
プログラミング言語別年収中央値を発表 1位:Go(600万円)、2位:Scala、3位:Python(求人検索エンジン「スタンバイ」調べ)|株式会社ビズリーチのプレスリリース
ちなみに10年前も同じような内容の記事が転がってる。
求人数はJava、年収はC#がトップ――ワークポートが調査:市場価値の高い言語はどれだ? - @IT
お金と時間と労力を投資するわけだから、よく調べておきたい。
ただ、昨今のプログラミング教育熱で、自分の子供にもプログラミング教育をさせないといけない!っと焦っている親御さんも多くいらっしゃるようです。
それで、勉強させるとしたらどのプログラミング言語がいいでしょうか?みたいな話になったりすることもあったりします。
そういう時は僕は迷わず
まずは母語(日本語)をしっかり勉強して基礎にする。
次に選ぶとしたら英語。
それと同じかもしかしたらもっと重要なのが数学。
という風に言うようにしてます。
母語(日本人にとっては日本語)
プログラミングという知的活動を行う上で、もっとも重要なのは「考えること」です。プログラミングを実際に行う作業は「コーディング」と言ったりしますが、この作業を行う時点では、ある程度「考え」がまとまっています。つまりコーディングの前に「考える」作業があって、その逆はありえません。
プログラミングはひとりでやるものからチームでやるものに変わってしまいました。仮にひとりで書いたとしたも、大抵の開発チームでは「コードレビュー」といって同僚にチェックしてもらう作業が入ります。その時に「自分の言葉で」コードの内容を説明できなくてはなりません。チームのメンバーはおそらくほとんどが自分の国の人たちでしょうから日本語での説明になります。また、コーディングの前段階での「デザイン」もチームで話し合いながら決定していくのが一般的です。そこでは日本語の理解力が重要です。
でも英語の方がプログラミング言語のベースになってるので大切じゃないか、そう思う人もいるかもしれません。ただ複雑で抽象的な概念を考える時、母語で整理して考えることが出来ない人が外国語(英語)で出来るとは考えにくいです。
ただし、これは私個人の経験なんですが、いくらか英語で考えることが出来るようになったら、英語で考えた方が理解しやすいという現象が起こることはあります。でもその場合は、その英語レベルに到達するまでの労力も考慮しなくてはなりません。
英語
ご存知のように、一般に利用されているプログラミング言語のほとんどは英語をベースにしています。プログラミング言語の中で使われる予約語などはほとんどが英語そのものです。なので、英語を深く理解することは投資効果が高いでしょう。
特に大切なのが、英語的なとらえ方、考え方に成れることです。
例えばC#の予約語の中に「await」というものがあります。これは「a」と「wait」の合成語で、普段使う英語で似たようなものに「asleep」とかがあります。「a」に続く動詞の状態が継続している様子を表しますが、このような「感覚」が理解できればプログラミング言語が意図している効果をより直感的に理解できます。そうでなければ「暗記」などに頼ってしまい、そうなるとすらすらとコードを読んだりするのは難しくなります。
同様に「while」という予約語は、命令型プログラミング言語ではほぼ間違いなく使われます。この言葉も「~している間は」みたいに日本語訳された状態で理解するのではなく「while ~」というように、英語の語順で理解することが大切です。そうすることで、コードを読むときにより自然な流れで理解することが出来ます。
数学
英語と同じぐらい、もしかしたらもっと重要なのが数学です。コンピュータ(計算機)がそもそも算数の問題を解くために作られたことからもわかるように、いまさら説明はいらないぐらいに、重要ですが、とくにプログラミング能力の基礎として大切だと個人的に思うのが:
代数 記号を使って抽象的に考える
ブール代数と集合 データの処理や分岐で頻繁に出て来る概念
離散数学 デジタルな考え方の数学(アナログのような連続した値を取らない)
統計・確率 とくにAIの時代では重要
実は私はずっと文系で来たので大学院でいきなりコンピュータサイエンスを専攻した際にかなりやっつけ仕事で数学を学びました。本来なら中高の頭の柔らかい時期にしっかりと学んでおけばよかったんですが・・・(少し後悔)。それでも、大人になってからでも十分、プログラミングが出来るようになる程度の基礎的な数学は勉強できます。
ことろで他の教科は無駄?理科は?社会は?歴史は?
学校で学ぶ科目では「国語・英語・数学」以外にもいろいろありますが、プログラミングを主なスキルとして働く人にとって、例えば社会などが不要かというと実はそうでもないです。
これはアメリカの事情かもしれませんが、アメリカでは「プログラマー」という職業はあまりなくて、「開発者」や「ソフトウェア・エンジニア」という職業に就いた人がプログラミング言語を使います。
開発者は、仕様書に従ってコーディングをする、という人もいるかもしれませんが、私はそういう完全受け身でプログラミングをする人は見たことはありません(コンサルタントやフリーランスの人がもしかしたらそういうコーディングをするかもしれませんが)。
プログラミングを行う上で、理解すべきことに「domain knowledge」というのがあります。それは問題領域のことで、例えば税金を管理するアプリであれば「税務」、オンラインでものを売るサービスであれば「eコマース」、というような技術的なことではなく、解決しようとしている問題のコンテクストのことです。
この「domain knowledge」をより深く明快に理解することは有能な開発者の条件でもあったりします。もちろん、PM(プロダクトマネージャー)という役職の人がチームにいて、その人が「domain expert」または「subject matter expert」としてきちんと整理してくれる場合がほとんどですが、それでもPMが求めていることをちゃんと理解出来た上でコーディング(実装)するのとそうでないのでは、結果に違いが生まれます。
社会学や経済学などの広い知識があって損することはありません。
まとめ
というわけで、どのプログラミング言語が年収がいい、とかかなりどうでもよいことで、それよりも何よりも「どんなプログラミング言語でも少しの時間があればマスターできる基礎力」を付けることが大切で、そのためには母語(日本語)、英語+数学、が大切だと思うわけです。