違う言語を学ぶことは思考方法の枠を広げること
下のネタ*1についてです。
あなたは本当に、他の言語を学ぶべきなのか?
InfoQ: あなたは本当に、他の言語を学ぶべきなのか?
自然言語の場合
1つのプログラミング言語しか知らない人が他のプログラミング言語を学ぶのは、日本人が英語を習得する場合ととてもよく似てると思います。
真面目な人は、「英語を習得すること」とは、英語を聞いて日本語に翻訳してから、理解して、話したいことを日本語で考えてから、英語に翻訳して喋ることであると思うかもしれません。
でも、本当に英語を習得するということは、英語で聞いて英語で考えて英語で喋ることだろうと思います。(途中で翻訳が入らないことが重要) アメリカで生まれた赤ちゃんがやるのと同じことができるようになることこそが、習得だと思います。
言語とは、思考の結果を表現するための物のように見えて、実際には、人は言語の枠内に縛られた思考しかできないものです。*2
知らない言語を学ぶ理由というのは、別の言語圏の人とコミュニケーションするためだけではなく、別の言語で思考することできるようになる事で自分の思考方法の枠を広げるためでもあるような気がします。
プログラミング言語の場合
ほとんどのプログラミング言語で、条件分岐と繰り返しはサポートされています。だから、Javaしか習得していない人でも、プログラムの読み書きの都度、他の言語に翻訳していけば、他の言語でプログラムを作成したり修正したりすることができます。しかし、思考は常にJavaで行なっているだけになります。このレベルだったら、他の言語を習得したとは言えないです。他の言語を使って考えることができるようになって初めて、習得したことになると思います。
違う言語を学ぶことは、思考方法の枠を広げることなわけだから、どう考えてもプログラムを書く人にとって無駄な訳がないと思います。だから、下のアドバイスが理に適っています。
Googleにおける研究部門のディレクター、Peter Norvigは、10年かけて自分自身にプログラミングを教えなさい(source)と言う記事を書き、学ぶべき言語をどのように選ぶかについて明確なアドバイスを行っている。
InfoQ: あなたは本当に、他の言語を学ぶべきなのか?最低でも、半ダースのプログラミング言語を学びましょう。そのうちに含めるべき言語の一つはクラスによる抽象化をサポートしている言語(JavaやC++ のように)、一つは関数による抽象化をサポートし(LispやMLのように)、一つは構文上の抽象化を含み(Lispのように)、一つは宣言的な仕様をサポートし(PrologやC++のテンプレートのように)、一つはコルーチンをサポートし(IcomやSchemeのように)、一つは並列処理をサポートしている言語(Sisalのように)にしましょう。
プログラミング言語間の翻訳ができても、習得には程遠いってことなので、新しいプログラミング言語の勉強をするなら、自分の知っている言語のことは忘れて(最初のうちは不自由を感じますが)、新しい言語の中で溺れた方が早く習得できると思います。