Yugui(ゆぐい)
電波系Rubyプログラマ。好きな言語はC++とLua。最近,仕事ではRailsでのWebアプリケーションの開発を主にやっています。Webアプリケーションばかり触っていると,ときどきアセンブラが恋しくなりますね。仕事にかまけているうちに,趣味で開発したいプログラムのネタが大量にたまっています。

 Rubyで記述されたWebアプリケーションフレームワークRuby on Rails(Rails)が人気を博し,Railsを使うのに必要なRubyもまた話題になっています。Railsの作者であるDavid Heinemeier Hansson氏は「Railsには,Rubyと同じ感触,同じ匂い,同じ味わいがある」と言っています。この言葉には様々な解釈がありますが,筆者は,「Rubyのやりかた」を極限まで突き詰めてフレームワークに適用したのがRailsであると考えています。

 Rubyは何かにつけ「人に優しい」とか「柔軟」であると表現されます。しかし,それは一つの側面に過ぎません。Rubyは一方で,押し付けがましく拘束的な側面を持っています。この知られざるRubyの側面があってこそ,その延長上にRailsが誕生したのです。この記事では,RailsがRubyから受け継いだこの特徴を見ていくことで,Railsのような優れたフレームワークを生み出すにはどうすればいいのかを考えていきます。

「言わなくてもわかる」ことの価値

 プログラミング言語の使命は,プログラマとコンピュータの間のコミュニケーションの手間を減らすことです。しかし,本当にその使命を果たせているのでしょうか。

 例えば,食堂でこんな会話があったと思ってください(図1)。

図1●一言でわかってくれない相手だとイライラする
図1●一言でわかってくれない相手だとイライラする

「それ取って」「何を?」「その机の上にあるビン」「どの机?」「この机!(指で示す)」「取ったよ」「取って,渡して」「誰に?」「私に!!」

 疲れて食欲がなくなりそうです。日常会話では,こんなに杓子定規なことを言う人はいません。たいてい,最初の「それ取って」だけで大丈夫ですよね。人間が人間に意思を伝える場合は,「一から十まで言わなくても間を補ってわかってくれること」を期待します。人間同士であれば,文化,常識,話の流れといった暗黙の情報を活用して,一から十まですべてを語らなくても通じる場合が多いのです。

 ところが,「プログラミング」というコンピュータに意志を伝える行為では,まさに上の食堂の会話のようは杓子定規なもの言いが必要になります。言語処理系は「引数が不足した」といってはエラーを出します。フレームワークも設定ファイルの項目が足りなければ動いてくれません。プログラムを正しく動かすのに必要な「おまじない」の数々,繰り返し書かねばならない定型句。楽しいはずのプログラミングにおいて,どうしても感じてしまうストレスのいくらかは,こうした「コンピュータが人間の言いたいことをわかってくれない」ために発生しているのです。

 このような格言もあります。「プログラムは思った通りに動かない。書いた通りに動く」。真理ではありますが,できることなら思った通りに動いてほしいものです。思った通りに動かないとイライラします。

「大胆な決め付け」の必要性

 どんなプログラミング言語でも,多かれ少なかれ「プログラマが言わなくてもわかる」「プログラマが思った通りに動く」ことを目指しています。しかし,それを阻む要素があります。言語の利用者が背景として持っている経験や文化が多様であることです。

 言語がいくら「プログラマが何をしたいのか」を推量しようとしても,プログラマが当たり前だと思うことは,個人が持つ背景に大きく依存します。このため,たいていの言語は,「プログラマが言わなくてもわかってくれると期待すること」をくみ取る努力をあきらめ,プログラマ側に明示的な記述を求めることで,あいまいさを排除しようとします。下手に決め付けて誤った解釈を行うよりは,手間をかけてもらったほうがまだマシだと判断しているのです。

 ただ,このような言語側の「勇気の不足」は結局,プログラマの「思った通りに動かないイライラ」を解消してはくれません。必要なのは,「そうあるべき解釈ならば,大胆な決め付けも辞さない」という覚悟です。Rubyにはそれがあります。ある意味,Rubyではこのように解釈する,ということをプログラマに押し付けています。「Rubyはプログラミングが楽しい」という評判を聞いたことのある方は多いでしょう。しかし,そこには「Rubyが押し付ける解釈をプログラマが受け入れれば」という前提条件が隠れているのです。

 Rubyがどのような解釈の押し付けを行っているかを二つの例で具体的に見てみましょう。