新しい言語を学ぶ3つの理由

新しいプログラミング言語を学ぶことは重要ですが、実行することは困難です。 しかし、言語を "マスター" するのではなく、あくまで "学ぶ" ことが重要であるということに気づけは新言語の学習への心理ハードルをグッと下げることができます。 ここでは、新しい言語を "学ぶ" ことの利点を述べます。
技術の進化はとても速く日々新たなアルゴリズムフレームワーク、そしてプログラミング言語が生まれています。 そのため研究者や技術者として生きていくためには学び続けていく必要がありますが、新しい言語を学ぶとなると非常にハードルが高く、しり込みをしてしまいます。 少なくとも私は
  まだ今使っている言語も十分に理解していないのに...
  今の業務内容で新しい言語を使うことはないから...
などと理由をつけて避けていました。 しかし、 『コーディングを支える技術』 を読んだことで、複数の言語を使えるまでには成らなくとも、 学ぶ だけでも多くのことが得られるということに気がつきました。

新しい言語を学ぶことで今の言語への理解が深まる

『コーディングを支える技術』は、プログラミンが発展してきた歴史を踏まえて言語・アルゴリズム・概念の進化について書かれた本です。
この本の中ではパンチテープや初めてのプログラミング言語であるFORTRANからはじまり、マニアックなものも含め、20種近い言語が紹介されています。 多くの言語が紹介されていますが、個々の詳細な言語仕様にはほとんど触れてはいません。
そのため、この本を読んでも新しい言語を使えるようにはなりません。 しかし、プログラミング言語の進化をたどることで、それぞれの言語には誕生した理由があり、各言語の得意分野・重要とされている概念などの特徴が丁寧に説明されています。 このような各言語の特徴を知ることで、現在使用している言語への理解が深まったと感じました。 これは、海外の文化を知ることで改めて日本文化の良いところや問題点などに気づくことができることに似ていると思います。 それでは、なぜ他の言語を学ぶことで今の言語への理解が深まるのでしょうか。 その理由をもう少し詳しく見ていきましょう。

1. 同じ問題に対して複数の視点を持つことができる

新しい言語を学ぶことの重要性は、Andrew Huntらの名著『達人プログラマー』でも述べられています。
言語が異なると、同じ問題でも違った解決方法が採用されます。 つまり、いくつかの異なったアプローチを学習することにより、幅広い思考が可能になるわけです。 これによって、ぬかるみにはまってしまう事態を避けられるようになります。
それぞれのプログラミング言語には各自の設計思想があり、得意とする分野が異なります。 例えば、Perlは文字操作を得意としており、PHPはwebページの作成を得意としています。 そのため、各言語にはそれぞれの強みを生かしたプログラミング作法があり、問題解決へのアプローチは自ずと決まってきます。 一方、プログラミング言語は高い自由度を持っていることが多く、一つの言語で様々な問題に取り組むことができます。 例えば、Perlは文字操以外にもwebページを作ることもできますし、逆にPHPで文字操作を行うこともあるでしょう。 この時、一つの言語の作法しか知らないと、思考に制限がかかってしまい効率的な問題解決をできないことがあると、『達人プログラマー』では述べられています。 これは、高校数学である条件の確率を求める際に、
 A. 条件を満たす事象を全て挙げてその確率を足し合わせる
 B. 条件を満たさない事象の確率を求め、1からその確率を引く
という2つのアプローチ法を適宜使い分けることに似ているかもしれません。 どちらか一方しか知らなくとも求めたい確率を得ることはできますが、場合によっては非常に複雑な計算が必要になることがあります。 このように複数の言語を学ぶことで、実際に使用する言語は1つのままでもよりスムーズに問題解決が行えるようになることが、複数の言語を学ぶ1つ目の理由です。 しかし私は、この理由は1つの言語にある程度習熟した中上級者がより高いレベルへと上がるためのアドバイスであると感じます。 実は私は『コーディングを支える技術』の前に『達人プログラマー』を読んでいたのですが、その当時には 「1つ目のアプローチすら満足に思いつかないのに別の言語なんて学んでいる場合じゃない」 という感想を持ち他言語を学ぶ気にはなりませんでした。 では、1つ目の言語を習得中の初心者には他言語を学ぶ意味はないのでしょうか。 もちろんそんなことはありません。それでは、他言語を学ぶ2つ目の理由を説明します。

2. 言語仕様への理解が深まる

1つの言語をまだ十分に習熟していなくても、他の言語を少し学ぶことでメインの言語についての理解が深まることがあります。 私はPythonを普段は使用しているのですが、Javaのコードを目にする機会がありました。 PythonJavaでは色々と異なりますが、私が特に気になったことは 型の宣言 でした。 Javaでは変数を定義するときにはまずその変数の型を決める必要があります。 例えば、整数型の a という変数を使用するときには int a のように定義します。 一方、Pythonでは変数を定義する際にどの型を使うかは特に意識する必要はありません。 Javaのコードを読むまでは、Pythonでの型宣言ついては気にしていませんでした。 しかし、Javaのコードを読んだ後では、なぜPythonでは型の宣言が必要ないのかということが気になり調べてみると 動的型付け という技術が使われていることを知りました。 ここでその詳細については触れませんが、動的型付けによってPythonは柔軟なコーディングが許されている一方で、実行速度に制限がついています。 このように今まで気にしていなかった言語仕様を、他言語のコードを読んだことがきっかけとなり知ることが出来ました。
少し具体的すぎる例ではありましたが、一つの言語しか知らないとその言語の仕様を当たり前のものとして受け取ってしまい、より深い仕組みやアルゴリズムを学びにくくなってしまいます。 しかし、他言語を学び、メインの言語と異なる部分に気づくことができれば、より深い理解へのきっかけとなるのではないでしょうか。

3. 読める技術書が増える

プログラミングの学習において技術書の重要性は言うまでもありません。 もちろん、先輩や同僚から教えてもらうということもあるでしょう。 しかし、最も頼りになるのは技術書でしょう。
通常、技術書の中にはコードの実例が多く載せられています。 むしろ、このコードこそが主要な内容であり、日本語などの自然言語は実例のコードを理解するための補助として使われているのではないでしょうか。 すなわち、そのコードの意味が分からなければ、いくら日本語の部分を読んだところでその技術書を読んだとは言えないわけです。 ここに他言語を学ぶ最後の理由があります。 一口に技術書といっても、いくつかの種類があります。 クックブックの様にある言語のTipsやトリックがまとめられているような本もあります。 クックブックの様な本は、基本的には一つの言語に特化した内容となっています。 チュートリアルなどの本も同様でしょう。 このような本は、自分のメインの言語と違う言語のものを読んでも生かせるものは少ないかもしれません。 しかし、技術書の中には複数の言語に共通する包括的な概念や手法について書かれているものも少なくありません。 私が読んだことがあるもので例を挙げれば、 「リーダブルコード」「テスト駆動開発」 などがあります。 「テスト駆動開発」は、前半ではJavaが使われており、後半はPythonが使われているのですが、前半に比べ後半は非常に読みやすかったという経験があります。 これは後半の内容が簡単というわけではなく、単に私がPythonの方に慣れ親しんでいたからでしょう。 このように他言語を学び使えるほどではなくとも読める程度にさえ成れれば、読むことができる良質な書籍が増えるでしょう。

本記事で紹介した書籍