【26】言語だけでなく文化も学ぶ

アンダース・ノラス(Anders Norås)

 高校時代の外国語の授業、私はフランス語を選択していました。ただ当時「自分は将来も英語だけで何とかやっていく」と思っていたので、フランス語の授業では 3 年間ずっと寝続けてしまいました。その何年か後、私はチュニジアに旅行しました。チュニジアの公用語はアラビア語で、かつてフランスの植民地だったことから、フランス語も広く使われています。英語が通じるのは、観光地になっているところだけです。言葉が通じず、仕方ないので、私はずっとプールサイドにいて、ジェームズ・ジョイスの大作『フィネガンズ・ウェイク』を読んでいました。この小説は、文体という点でも言語という点でも、とてつもない作品です。40 ヶ国語を超える言語を駆使した言葉遊びの連続はまさに驚異であり、読んでいて消耗もします。そして、著者は、外国語の単語やフレーズを多数織り交ぜることにより、自分の表現の幅を大きく広げているとも感じます。また、それはどこか、プログラマである私がしてきたことにも通じます。

 Andy Hunt と Dave Thomas は、多くの人に影響を与えた著書『達人プログラマー』の中で、「毎年、新たなプログラミング言語を 1 つは学ぶこと」と勧めています。私はそのアドバイスに従い、過去何年かの間に実際に数多くの言語を学んできました。そして、その中で「言語を学ぶというのは、ただ文法、構文を学ぶことではなく、その背景にある文化も学ぶこと」という重要な教訓を得ました。

 どのような言語でも FORTRAN のように書くことはできます。しかし、言語にはその言語独自の文化というものがあり、真にその言語を知るには、その文化も正しく学ぶ必要があるのです。

 C# を学び始めたばかりのときは、長い Main メソッドと静的なヘルパーメソッドばかりから成るコードを書いてしまうかもしれませんが、恥ずかしく思わなくていいのです。そのかわり「なぜクラスというものが存在するのか」を学び理解する姿勢が重要です。関数型言語で使われるラムダ式が最初なかなか理解できないとしても、怖じ気づくことはありません。ひたむきに、分かるまで使うように努めるのです。

 新しい言語を学び、その勘所をつかんだら、前から知っていた言語の使い方がそれまでと変わっていることに気づき、自分で驚くことがよくあります。

 私は、Ruby を学んだおかげで、C# の delegate をうまく利用できるようになりました。また、.NET の Generics の持つ潜在力を十分に知ったことで、Java の Generics の活かし方がわかるようになり、LINQ を学んだおかげで Scala を楽に理解できるようになりました。

 複数の言語について学ぶと、デザインパターンについての理解も深まります。C のプログラマが C# と Java を学ぶと、そこでは Iterator パターンが一般化され普通に使われていることに気づくでしょう。Ruby などの動的言語を学べば、動的言語でもやはり Visitor パターンは使うけれど、その実装はいわゆる「GoF 本」に載せられた例とは違う見かけになることがわかるでしょう。

 小説『フィネガンズ・ウェイク』に関しては、「これは読めない」と非難する人もいれば、その文体の美しさを絶賛する人もいます。この本の場合、翻訳版の方がかえって読みやすいかもしれません。原書にあった 40 ヶ国語以上の言語が 1 ヶ国語に整理されるのだとしたら、少しは読みやすいとも考えられます。しかし、私にとって皮肉なことに、最初に出た翻訳版はフランス語版でした。

 コードにも同じようなことが言えます。『フィネガンズ・ウェイク』のようなコードを書くのだと言って、一部を Python で、一部を Java、さらに一部を Erlang で書いたとすれば、プロジェクトは大混乱に陥るでしょう。そうではなく、新しい言語から新たな発想を得て、同じ問題に対して違った解決策を見つけられるようになることが大事なのです。新たな言語を学べば、従来から使っていた言語でも、より美しいコードが書けるようになることが多いのです。