ダクトテーププログラマ
From The Joel on Software Translation Project
Joel Spolsky/青木靖 訳
2009年9月23日 水曜
ジェイミー・ザウィンスキーは私が「ダクトテーププログラマ」と呼ぶ人間だ。私は大いなる敬意をもってそう呼んでいる。彼は未来を作るために熱心に働き、みんなの役に立つものを生み出す。ゴーカートを作る開発チームには是非欲しい人間だ。彼のお気に入りの道具はダクトテープとWE-40で、時速100キロで丘をガタガタ駆け下りている真っ最中にそれを見事に使いこなす。同じ頃他のプログラマたちはと言えば、まだスタートラインにいて、チタンにしようか、それともボーイング787ドリームライナーで使われている宇宙時代の超合金にしようかと議論している。
彼の作るゴーカートは継ぎ接ぎに見えるかもしれないが、しかしそれは間違いなく動くだろう。
私は今ピーター・サイベルの本Coders at Workでジェイミーのインタビューを読んだところだ。すぐ買いに行くといい。この本はピーター・ノーヴィグ、ガイ・スティール、ドナルド・クヌースをはじめとする偉大なプログラマたちの素晴らしいインタビュー集になっている。あまりに面白くて読みやめることができず、いつもは30分のランニングマシーンを昨日は60分もやってしまった。だからすぐ買いに行くことだ。
ほら! 待ってるから。
私がダクトテーププログラマを好きな理由を説明しよう。チームで仕事していると、忙しくコードを書いているときに、誰かがコーヒーマグ片手にやってくることがある。そしてマルチスレッドCOMアパートメントを使えばプログラムのキラメキ度が34%上がるみたいなことを言う。……なに、そんなに難しくはないよ、テンプレートをたくさん書いてあるので、平均で4個の引数を取るテンプレートを17個多重継承してやるだけでよく、関数の本体なんてほとんど書く必要もない。いろいろなクラスを多重継承する大きなリストだけで、ほら、マルチアパートメントスレッドモデルCOMのできあがりだ……。あなたは目がくらくらして、そのクソッタレがどんなクソッタレな話をしているのか見当もつかないが、いっこうに出て行こうとはしないし、行くとしても、自分の部屋に帰って関数本体の実装なしにテンプレートの多重継承だけから構築されるクレバーなクラスをもっと書くだけのこと。そいつが見事にクラッシュしてくれて真夜中に呼び出され、何が悪いのかを調べるはめになるのだが、それというのもその男の方はどっかの「デザインパターン」会合に出かけていて捕まりやしないからだ。ダクトテーププログラマであれば「多重継承は最低だ。変なもの使うな。やめとけ」と言うのを躊躇しない。
他の人たちは、多重継承やテンプレートやCOMやマルチスレッドなんかを動かすために必要なものを頭に入れておくことができないマヌケに見られるのを怖れて何も言えずにいる。それでアーキテクチャ宇宙飛行士たちが繰り出してくるイカレタ流行りものには何でもおとなしくつきあうことになる。アーキテクチャ宇宙飛行士というのはカンファレンスで講演し、本や雑誌記事を書き、すごく頭が良いのだが、自分たちの紹介しているものがみんなには難しすぎることに気付いてもいない。
ザウィンスキーはNetscapeでのことをこう話している。「製品を予定通りにリリースすることを可能にしたのは、C++やマルチスレッドを使わないという決断だった」
その後彼はNetscapeのメールクライアントを作ったのだが、メッセージ表示部分を担当していたチームがそのコンポーネントを完成することはなかった。「ウィンドウの真ん中には大きな空白の箱があり、プレーンテキストしか表示できなかった。連中はプロジェクトに対して極端にアカデミックに取り組んでいて、DOM/DTDという方面からアプローチしようとしていた。『我々がしなければならないのは、ここに抽象レイヤをもう1つ追加し、このデリゲートに対するデリゲートに対するデリゲートを作ることだけだ。そうすればそのうち画面に文字が表示される』ってね」
ピーターはザウィンスキーに聞いた。「過剰なエンジニアリングというのには我慢ならないようだね」
それに対してザウィンスキーは答えている。「ああ、リリースできなきゃ意味がない! 後で書き直してコードをきれいにすりゃいいんだよ。3度目にはすっかりきれいになっているだろう。でもそれは肝心なところじゃない。我々がそこにいるのはコードを書くためではなく、製品を世に出すためなんだ」彼は私のヒーローだ。
ザウィンスキーはユニットテストをあまりしなかった。「原理的には結構だよ。十分な時間があるときにはまさにやるべきことだろうと思う。しかし『ゼロから始めて6週間で完成』させる必要があるというときには、何かをカットしなきゃならない。じゃあ何をカットするかとなれば、絶対的に重要ではない部分だ。そしてユニットテストは絶対的に重要なものじゃない。ユニットテストがなかったとしてもユーザは文句を言わないからね」
怒り出す前に思い出してほしいのは、ザウィンスキーはNetscapeが世界を変えていたとき、そこにいたということだ。彼らは数ヶ月より長くかかれば他の連中においしいところを持っていかれると考えていた。重要なソフトウェアというのはそういうものだ。
ダクトテーププログラマは現実的だ。ザウィンスキーはリチャード・ガブリエルの“Worse is Better”(悪い方がよい)という考えを世に広めた。みんなが手にしている50%の出来の解法は、ラボの中でいつまでも磨きをかけられていてみんなの手に届くことのない99%の出来の解法よりも、多くの問題を解き生き長らえることになる。実際にリリースされるということは機能なのだ。これは非常に重要な機能であり、あなたの製品はこの機能を備えている必要がある。
ダクトテーププログラマがよく理解している1つの原理は、少しでも話を複雑にするようなコーディングテクニックは何であれ、製品に災厄をもたらすということだ。ダクトテーププログラマが一般に避けるのは、C++、テンプレート、多重継承、マルチスレッド、COM、CORBA、そのほか、十分長く熱心に考えれば至極理にかなっているのかもしれないが、率直に言って人類の脳みそにはちと難しすぎるようなテクノロジーだ。
WindowsでCOMを使ったマルチスレッドのコードをC++で書くことには何も悪いことはない。しかしそれは困難なバグを生みやすい。非常に特殊なタイミングの組み合わせの元でのみ起きるようなバグだ。正直なところ我々の頭はそういったコードを完璧に書けるほど良くはない。凡庸なプログラマがこのことで受け身なのは、その超込み入ったコードを書けないと言いたくないためで、チームのいじめっ子たちが邪悪なるC++テンプレートアーキテクチャをばらまくに任せているのだが、それはそうしないと、そのスポックならOKかもしれないプログラミングテクニックを使えるほど自分は頭が良くないことを認めなければならないからだ。ダクトテーププログラマであればどう思われるかなんてこれっぽっちも気にかけない。彼らは基本的でシンプルな簡単に使えるツールにこだわり、余った脳力はユーザにとって有用な機能をもっと作るために使う。
ひとつ注意しなければならないのは、ダクトテーププログラマというのがソフトウェアの世界におけるイケメンだということだ……息を飲むほどいかした若者で、ベッドから起き出すと、髭も剃らず、髪もとかさず、歯も磨かずに、昨日と同じ汚れた服のまま地下鉄に乗り、それでいて美しい。それが彼らの地なのだ。しかし友よ、我々はといえば髪をとかさずには表にも出られない。子供たちが怖がるだろうから。彼らのように美しくはないのだ。ダクトテーププログラマはあの芸当をやってのけるための才能をたんと持ち合わせている必要がある。製品をリリースできる優れたプログラマだから、我々は彼らがユニットテストを書かないことも大目に見る。あるいは彼らが32ビット節約するためにリンクリストのnextポインタとprevポインタをxorして1つのDWORDに格納しようとも。彼らは十分美しく、十分頭が良く、それをやってのけられるのだから。
えっ、Coders at Workをまだ買ってないの? ほら行った、行った! これはまだ最初の1章の話でしかないんだから!
(オリジナル: The Duct Tape Programmer)