プログラミング言語は『同時に複数』学んだ方がいい理由
「プログラミング言語を同時に学ぶとわけわかんなくなるんじゃないの?」と思いがちですが、そんなことはありません。
私が情報処理の専門学校でプログラミングを始めたですが、授業では同時に複数の言語が教えられていました。
教わったのはC/C++とVisualBasicでした。
私が通っていたのは1998年4月~2000年3月なので、マイクロソフトの技術が全盛の時代でした。
Webはまだこれからってときだったので、HTMLやJavaScriptの授業もありましたが、中心はC/C++とVisualBasicだったんです。
そんな風に同時に複数の言語を教わったんですが、私自身はどちらもちゃんと身についたし、クラスメイトも同じように複数の言語を使いこなしていました。
なので、複数同時に学べるということです。その理由について詳しく紹介します。
Contents
バイリンガルの方が的確に言葉を使える?
自然言語の場合、例えば、日本人のお母さんとアメリカ人のお父さんの間に生まれた子供は日本語と英語のバイリンガルになりますよね。
その場合、どちらの言語も中途半端になるとか、発達障害になるとか言う人もいますが、それって半分嫉妬があるような気がします。
以前職場に、子供の頃、親の都合でアメリカで暮らしてた、いわゆる帰国子女の人がいたんですけど、日本語も英語もばっちりでした。厳密に言えば、英語がどれくらい出来てるかは私には判定できませんけどね。
日本語での話し方はとても論理的で説明的な言葉遣いをしていました。
ここにポイントがあります。
複数学ぶと言語を俯瞰して見れる
2つ以上のものを知ると、それらを比較して共通点を見出すことが出来ます。
単純な例で言えば、コップというものを2つ以上見たことがある人は、
「コップというものは、液体を入れるもので、取っ手がついてたり、ついてなかったりする」
という特徴を見いだせます。一つしかコップを知らない人は例えば、
「コップというのは白くて取っ手がついていてコーヒーを入れるもの」
という理解をするかもしれません。この人が見たコップはコーヒーカップだった場合です。一つしか知らないと物事の本質はわからないということです。
ですから、自然言語で言えば、日本語と英語を両方話せる人は、日本語と英語を比較して、言葉というものの本質が見えています。
英語を学ぶと日本語もうまくなる
日本人は義務教育で英語の授業があるので、日本語と英語を知っています。なので、言葉というものに本質を理解できてるはずです。
英語を学ぶことで言葉には文法があり、構造を持っていることが意識できます。日本語は無意識に自然と覚えてしまったので気づかなかったけれど、第二言語を学ぶとそれらが意識できます。
さらに本気で英語を使うと、言葉の本質の理解は深まります。
私の場合、海外旅行に一人で行った際に、本気で英語を使う体験が出来ました。
外国で自分一人しかいないわけですから、本気で英語を話さないと、旅が前に進めません。
その瞬間意識が変わります。本気になると、
「自分が今伝えなきゃいけない内容は何か?その内容を的確に相手に伝えるにはどういう単語を使い、どういう表現をすればいいか?」
という意識が働いたんです。
これによって、言葉とは相手に自分の意志を伝えるものという本質がわかりました。日本語だとなんとなく喋っていれば、伝わるので意識しませんが、英語の場合、どう言えば伝わるかということを真剣に考えることになるんです。
つまり、言葉の本質とは「伝わること」だと気づいたんです。
旅行から帰ってきて、旅行記のブログを書いたんですが、その際に日本語版と英語版両方作ってみました。
すると、「日本語でこう書いたけど、意味としては何を伝えているのだろう?」という意識が働いたんです。
日本語でなんとなく書いていると、案外意味が少ない文章を書いていたりします。
「~な感じで、それに○○は~で~、…」みたいな文章って論理構造がなくて、英語に訳せなかったりするんです。
これに気付くと日本語の文章の書き方や話し方も変わります。しっかりと意味を伝える言葉の使い方に変わるんです。
一つ視点が高くなったということです。視点が高くなり、日本語視点ではなく言語の本質視点(言葉は意思を伝えるもの)で言葉を使うようになれたということです。
前置きが長くなりましたが、プログラミング言語も同じです。
プログラミング言語の本質が見える学習方法
プログラミング言語も2つ以上知っていると、
「プログラミング言語ってif文みたいな条件分岐があってwhile文やfor文みたいな繰り返しの構文があるもの」
というような共通点 = 本質が見えてきます。
「PHPだとこういう書き方をするけど、Rubyだとこう書くんだな、じゃあ、この表現の共通点(本質)はなんだろう?」
というような視点が生まれます。
あるいは、新たな言語のロジックの組み方を学ぶことで、元々使っていた言語のコードの書き方が変わるということもあります。
別の言語の視点を持つことの重要性
例えば、RubyやJavaScriptでは高階関数を使う機会がたくさんあります。すると、C#やPHPでコードを書く際にも、高階関数使う発想が生まれるんです。違う視点でその言語を見るようになったということです。
違う視点で見れるということは、物事を俯瞰して見れるようになったということです。視点が一つ上がっているのです。
ですから、同時に複数の言語を学んだほうが高い視点を持ってプログラミング言語を学ぶことが出来るので学習効率が良いんです。
それに、ある言語を学んでいる時にわからなかったことが、別の言語を学んだら理解できたってこともよくあります。
node.jsを学んだらRubyのブロック構文が理解できた
私の場合、Rubyのブロックがよくわからない時期があったのですが、node.js(JavaScriptのサーバーサイド処理系)をしばらく使った後にRubyのブロックを見たら、よく理解できたんです。
「あぁ!Rubyのブロックって無名関数を高階関数に渡す表現なんだな!」と。
これがわかったのも、node.jsでさんざんそのようなコードを書いたからなんです。
普通の言語でファイルを読み込むコードって↓みたく書くじゃないですか。
data = File.read();
これは同期IOの書き方なんです。
node.jsの入出力って基本的に非同期IOなのでIOが発生する度に、IOが結果を受け取るための高階関数を使うんです。こんな感じのコードです↓
File.read(function(data) { // dataにファイル読み込み結果が入っている });
非同期IOだとIO結果を受け取るコールバック関数を高階関数に渡す書き方をするんです。これがRubyのブロック構文と同じなんです。Rubyのブロックは非同期IO以外の場面で多用されますけどね。
Rubyで同じロジックを書くと
File.read do |data| // dataにファイル読み込み結果が入っている end
って書きます。
JavaScriptの場合、無名関数が
function(arg) { }
なので、理解しやすかったんです。
Rubyのブロックって
do |arg| end
なので、構文の意味を知ってる人からしたら、美しい構文なんですけど、知らない人がしたら、「え?どういう意味?」って感じになってしまいがちで、そんな時に別言語(JavaScript)での知識が加わって自然と理解が出来たということです。
まとめ
- 複数同時に学ぶとプログラミング言語の共通点を抽象化した知識が得られる。それによってプログラミング言語を扱う際の視点が上がり、ますます、新たな言語を理解しやすくなる。
- ある言語をマンでいてわからなかったことが別の言語を学んだ際に理解できることがある
ということで、プログラミング言語はぜひ同時に複数学んでみてください!