プログラマが知るべき97のこと/言語だけでなく文化も学ぶ


高校時代の外国語の授業、私はフランス語を選択していました。ただ当時「自分は将来も英語だけで何とかやっていく」と思っていたので、フランス語の授業では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で書いたとすれば、プロジェクトは大混乱に陥るでしょう。そうではなく、新しい言語から新たな発想を得て、同じ問題に対して違った解決策を見つけられるようになることが大事なのです。新たな言語を学べば、従来から使っていた言語でも、より美しいコードが書けるようになることが多いのです。