プログラマが知るべき97のこと/プログラミング言語は複数習得すべき
プログラミング技術の習熟度は、どれだけ多くのプログラミングパラダイムに親しんでいるかによって大きく変わることが知られています。「親しんでいる」とは、名前について知っている、ちょっとかじったことがある、というような程度では駄目で、その言語を使って正しくプログラムを書けるということです。

はじめから複数の言語を知っているプログラマはいません。だれもが言語を一つずつ習得していくのですが、プログラマのソフトウェアに対する考え方は、どの言語を使用しているかによって大きく左右されます。特に最初に覚えた言語の影響は大きくなります。何年プログラミングを経験しようとも、ずっと同じ言語だけを使い、1つの言語しか知らないプログラマは、その言語の枠の中でしかものを考えられなくなってしまいます。

プログラマにとって、新たな言語を学ぶのは、かなり大変なことです。特に、最初に覚えた言語とはパラダイムの異なる言語を第二の言語として習得しようとすれば、そこには困難が伴います。C、Pascal、Fortranなどは同じパラダイムなので、たとえば、Fortranを最初に学んだ人が新たにCを学ぶ場合、さほど苦労はしないでしょう。しかし、CやFortranを使っていた人がC++やAdaを学ぼうとすれば、おそらく苦労することになるはずです。プログラムの振る舞いに根本的な違いがあるからです。同様に、C++を使っていた人がHaskellを学ぶことや、Cを使っていた人がPrologを学ぶことも、言語の性質が大きく違っているために困難を伴うでしょう。

プログラミング言語のパラダイムは大きく、手続き型、オブジェクト指向型、関数型、論理型、データフロー型などに分類することができます。2番目に学ぶ言語のパラダイムが最初の言語と同じであれば習得は楽ですが、パラダイムが違っていると、習得は困難になります。

しかし第二の言語には、是非とも、最初の言語とはパラダイムの違う言語を選ぶべきです。それはなぜかというと、パラダイムの違う言語を学ぶと、アルゴリズム、イディオム、パターンの実装について嫌でも考えるようになるからです。同様のアルゴリズムを実装するにしても、色々なやりかたがあり得ることに気づきます。この体験が、プログラマの技術を大きく向上させます。ある問題を解決するのに、言語Aではこのイディオムを使用するが、言語Bで同じイディオムは使えないというような体験が重要なのです。イディオムを言語Bでも使えるものに移植しようとすれば、両方の言語について、解決する問題について、よく考え学ぶ必要が出てくるからです。

パラダイムの違う言語を学ぶ効用は他にもたくさんあります。最も顕著な効用は、1つのパラダイムしか知らなければ思いつかないような表現を使用することができるということです。たとえば、宣言型言語の経験を積んだユーザなら、Cのような命令型言語においてもそのパラダイムを使用することができるでしょう。宣言型パラダイムを取り入れることにより、より簡潔で理解しやすいプログラムを書くことが可能になります。C++などの言語は、初めから様々なパラダイムの語法を使用できるような作りになっています。それらの言語では、様々なパラダイムに関する知識は、むしろ必須のものになっていると言えるでしょう。

プログラマは少なくとも2つのパラダイムの言語を使いこなせるようになるべきです。もちろん、先に触れた5つのパラダイムすべての言語を使いこなせるというのが理想です。プログラマは常に新しい言語、特に馴染みのないパラダイムの言語を学ぶ意欲を持つべきでしょう。たとえ日々の業務で使う言語が1つだけだったとしても、パラダイムの違う言語を学べば、普段使っている言語をよりうまく使いこなせるようになります。実際に試してみれば効果に驚くことになるはずです。企業もそれを考慮し、社員が新たな言語を学ぶことを奨励すべきでしょう。できれば、そのための予算も確保しておくことが望ましいと言えます。

ただし、1週間のトレーニングコースを受ける、という程度の学習では不十分です。良いきっかけにはなるでしょうが、それだけで新たな言語を学んだとは言えません。言語を使いこなせるレベルになるためには、何ヶ月かの問、毎日少しでもその言語に触れる必要があるでしょう。大事なのは、その言語の構文や計算モデルについて知るだけでなく、言語のイディオムを身につけることです。