『達人プログラマー』『プログラミングRuby』などの著書で知られるDave Thomas氏との対談。今回はその中編です。
原則」はいかに生まれたか
弾:『達人プログラマー』にはいろいろな普遍的な原則が出てきますが、それらの原則はどこから得たのでしょう?
Dave:失敗から(笑)。いろんな痛い目に遭ってきました。我々としてはこういうことは繰り返したくない。だから、新しいことは書いてないけれども、そういった知見を結晶化させてみたわけです。
弾:ちなみに、『達人プログラマー』の共著者でもあるAndy Huntさんと仕事上の役割分担はどうされているんですか?
Dave:それはもう状況によって違います(笑)。どちらかというと自分がシステムのバックエンドや、Webサイトのことをやって、Andyがプロダクションのほうをやっているんですけども、私はだから、これ専用というのは特に持ってない。あまりに長い間一緒に働いているので夫婦みたいな関係です。
直交性とDRY
弾:『達人プログラマー』で解説されている直交性[1]という言葉はどういう意味があるのか、あらためて聞かせてください。基本的なことなんだけど、あらためて。それがプログラムに関してどうして重要なのかっていうところも。
Dave:直交性というのは数学的な考えで、たとえばグラフを見ると、X軸とY軸が互いに直交しています。ある変数が別の変数に対して影響を及ぼさないことを直交性といいます。X軸をY軸に対して平行に動かしても、グラフ全体の形は変わらないというのが直交性なんです。プログラムにおいては、あるプログラムモジュールが別のプログラムモジュールに対して影響を及ぼさないというのが直交性。1つや2つ直交していないことがあっても、それはたいした問題にならないですけど、実際の仕事においては、プログラムというのは50も100もあるわけです。だから、直交的に書かないと、プログラムを2つ書くというのも、プログラムを2つ書くことじゃなくて、プログラムを1つ書いたら前からあるプログラムを直すことになってしまう。これはDRY[2]でない。だからDRYであるために、直交性というのは大事なのです。
直交性というのはインタフェースのことで、互いにリソースのモジュールをいかに接触面積を小さくするようなものが直交性なのに対して、DRYというのは、あることをやるのであれば、それは一ヵ所でやるということ。ときには直交性を確保するためにDRYの原則を破るということはあります。たとえば、データベースの実装というのがそういう風になっています。
弾:DRYと直交性は直交しますか?
Dave:直交します。
「アジャイル道」
弾:『達人プログラマー』が刊行されてしばらく経っていますが、もし手直しをするとしたらどこを?
Dave:「アジャイル」についてです。アジャイルという考えは書いてあったんだけど、もちろんアジャイルという言葉も使ってないですし、その辺はもっとはっきりと書いておきたい。だから「アジャイル道」という項目を付け加えられたらなぁと思います。
弾:「アジャイル道」という言葉が出ましたが、じゃあCode Kataとは、いったいなんですか?
Dave:武道では、いろいろな「型」を練習します。同じことを稽古してやり方を身体で覚えて身に付けて本番に備えるわけですけども、実際のコーディングにおいては、いきなり本番に出るようなことばかりです。何の練習もなしに1万人の聴衆の前でコンサートやるようなことを我々はしょっちゅうやってるんです。それはやっぱり問題があるのではないか。武術でいう稽古みたいなことはできないのか?というのが、Code Kataというものを考えた理由です。
弾:ちょっといじわるな質問ですが、Code KataというのはDRY原則に反するのでは?
Dave:それは違います。まったく同じ仕事にまったく同じコードを書くというのは馬鹿げているけども、少しずつ違う仕事から少しずつ違う知見を得ないというのも、馬鹿げている。だから、実はDRYとCode Kataというのは矛盾する考えではないんです。
Rubyとアジャイルと日本
弾:「アジャイル道」とか「Code Kata」とか、日本語由来の考えがいっぱい出てきてるんですけど、それは日本を知っていたからそういうのを見つけたのですか?
Dave:そうではなくて、Rubyとアジャイルを見つけたところで、日本に対する興味が俄然沸いてきたんです。
弾:すごいおもしろいケースですね。日本の文化がRubyに与えた影響って、どうですか?
Dave:(じっと考えたあげく)西洋的な考えでは、物事というのは名前をつけた上で細分化します。JavaとかC#のクラスのあり方がそうですけども、でもRuby的なあるいは日本的な考えというのは、あいまいさを許しているし、あいまいさを非常に上手に利用している。
弾:自分自身でも考えていることなんですけど、適切な言語の複雑さってどんな感じでしょう?
Dave:その言語がいつまでもエキサイティングである程度には複雑であってほしい。少なくとも、簡単にしくみがわかってしまうものとかだと、やっぱりすぐ飽きてしまう。いまだにRubyで未発見なことを見つけられる、そういったことは非常に大事です。