ソフトウェアの法則
(37)

ソフトウェアとドッグフード


── デバッグの難しさについて

◆スーパーマーケットでの驚き
 それを最初に見たとき、私にはそれがどういう食べ物であるかよく分からなかった。売り場の一角に大量に積み上げられていて、しかもどの製品にも必ず犬の絵や写真が付いているのだった。これは一体何だろう。パッケージの外装を見ると大層うまそうに見えるが、まさか犬の肉で作った肉団子なぞある訳がないと一瞬思ったのである。ん? いやいや、これはどうやら犬の餌らしいぞ。アメリカでは、犬の餌までこうやってスーパーマーケットで売られている。しかも実にうまそうに見えるものばかりだ。何と進んだ国であることか。

 30年程前初めてアメリカを訪れ、初めてスーパーマーケットなる所へ行って買い物をしていたときのことである。当時の日本では、いわゆる“ドッグフード”に類するような犬のための餌などは売られていなかったと記憶している。したがってそれを初めて見たとき、一瞬ではあったが、私はそれが人間様のための食べものであると信じて疑わなかったのだ(わが名誉のために重ねて言うが、そう思ったのはほんの一瞬の間だけのことである)。

 日本にはまだスーパーマーケットなど滅多になかった時代であるからして、私にはすべてが驚きの連続であった。アメリカのスーパーマーケットは、すべてが大きく通路などもすべてが広い。商品ケースの大きいこと。しかも照明はあくまでも明るく店の隅々まで照らしていて、およそ影というものが存在しないのであった。置いてある商品も多種多様で、実際に買わなくても見ているだけで時間の経つのを忘れる程楽しいのだ。

 当時はまだ私も独身だったので、料理などには全く関心がなく(結婚後の今も、関心などないけれど)、したがって買い物などにはなおさら関心がなかった方である。しかしアメリカのスーパーマーケットでの買い物の楽しさを知った私は、日本にいる母親や妹に同じ経験をさせてあげたいと心底思ったものだ。

 たとえば、アメリカの牛乳パックは、約2リッター(ハーフガロン)は入ろうかというとてつもなく大きなものばかりであった。これを冷蔵庫に入れておき、たとえば1週間分として飲むのであろう。日本に帰ってから日本の牛乳パックの小さいのにびっくりしたものだが、これは1回飲んで終わりという発想でしか作られていない(最近は少し大き目のものが出ているが、それでも1リッター程度である)。アメリカでの買い物は、1週間単位でまとめて買う習慣になっているのであろう。そのためか、アメリカのものは何でも大型なのだ。野菜や果物までも大ぶりである。玉葱は日本の2〜3倍はある。茄子などは実に3倍はある。キュウリなどは大き過ぎてまずそうにすら見える。西瓜は少し長円形になるが日本産の1.5〜2倍はある。缶詰めや瓶詰め製品までもすべて大型なのである。

 ピクルスなどのいわゆる西洋漬物の瓶も実に実に大型で、多種多様なものが売られていた。これに挑戦するには大変な勇気がいったものである。日本人の味覚からすると、何とも理解に苦しむような変てこりんな味のものが結構多いので、間違って変なものを買い込んでしまったりすると、後は自分で最後まで責任をとらなければならない羽目に陥る。まずいからと捨てるには、余りに一瓶の量が多すぎるのだ。

 我々日本人が初めてコーラなるものを飲んだとき、誰もがあの薬臭いまか不思議な味に驚いたものである。何でこんな味のものがアメリカで売れるのだろうかと。しかしふと気が付くと、いつの間にかその味に慣れてしまって何時も飲んでいる自分を発見する。このように最初は変な味だと思っても、慣れると結構アメリカにもうまいものがあることは経験的に分かっていたから色々と挑戦してうまいものを発掘しなければ損だと思ったのである。

 しかしこういう時、男というのは想像力に欠け、からきし意気地がないものである。普段、料理をしていないので良い素材があっても料理の方法が分からないから無理からぬことではあろうが。後年、妻と一緒に海外で生活することになったとき、つくづくとそう思った。女性は何にでも果敢に挑戦する。その結果として、しばしば珍しい食べ物を発掘してきたりする。

 珍しいものに挑戦するのは、食べ物の場合だけではない。たとえば、スーパーの肉売り場の商品ケースに不思議な棒があった。ケースの向こう側は別室で肉の解体などをやる場所になっているのだが、そこの区切りになっているガラス窓の下の壁から、50cmばかりの細長い棒が目の前の空間に突き出ているのだ。これが何か、私には長らく謎であった。

 妻は、これに挑戦したのである。この前で、窓の向こう側にいる肉屋の主人と何やら話し合っている婦人がいたのを見た妻は、これは肉屋の主人を呼び出すボタンだと解釈したのである。そこで、妻はこの棒の先に付いているボタンらしきものをグイと押してみた。はたせるかな主人がやってきて注文を聞いてくれたというわけである。ケースに並べられている物とは違った特別な注文があれば、適宜応じてくれるのだ。挽き肉の細かさなどをいろいろと注文している妻を見て、なるほどこれはかなわんわいと思ったものである。

 このようにスーパーの中には興味の尽きないものが沢山あり見てまわるだけでも楽しい。大袈裟に言えばアメリカの最先端の文化生活に触れることができるのであった。たとえば、ここで私は世界で一番安いものを発見した。かつてこれ程安いものは見たことがないし、これからも絶対にこれ以上のものにはお目にかかれないであろう。それは野菜売り場の一角に置いてあるパセリの葉で、その値段を示す札には 00$ 00¢と表示されていたのである。

 そうやって、いろいろな商品が置かれているコーナーをキャリヤーを押しながら探検して歩いているとき、その売り場コーナーへ偶然と出たのであった。そこは、犬や猫のための餌を売っている所でドッグフードやキャットフードの専用コーナーになっていた。色とりどりのそういった製品を見ていると、どれも人間が食べても確かにうまそうに見えるものばかりなのだ。アメリカの犬や猫は日本の犬猫に比べて何と幸せであることか。毎日こういったうまいものばかりを食べているのであろう。

◆ドッグフードを食べる
 それにしても、このドッグフードという製品の外装はどういう意図でデザインされているのだろう。犬が見たらうまそうだと思うようにデザインされているのだろうか。でも、買うのは犬ではなく人間である。さすれば、人間が、もし自分が犬だったらこれを見てさぞうまかろうと思うように、人間にアピールすることを目的としてデザインされていなければならないことになる。これではややこしいから、人間が見てさぞうまかろうと思うようにデザインしたというのが恐らく正解ではないかと思う。しかし、これは本当に人間がたべてもうまいものなのだろうか。

 アメリカのテレビのコマーシャルを見ていると、中年の男性が出てきて大きなケーキをいかにもうまそうに食べる場面がある。それを毎日見ていた甘いもの好きの私は、ある日とうとう我慢できなくなってそれを買ってきて食してみたことがあった。しかしこれが信じられないほど甘いのだ。日本人の感覚では甘すぎて、とてものことでは食えないような代物であった。コマーシャルの言葉とか、いかにもうまそうな外装の写真などにだまされてはいけないということである。これは、私が何度も苦い(甘い?)目に合ってのち習得した、貴重な経験に裏打ちされた結論である。我々は何事につけ、外見や見てくれにだまされないよう注意しなければならない。

 人伝に聞いたことなので正確ではないが、同じ日本からの出張者仲間の一人が、このドッグフードのうまそうな外装にひかれて試食してみたことがあるという。まあまあ食べられる味だったという噂もあるし、あるいはひどい味だったという話も伝わってくる。どちらが正しいのか私は今もって知らない。そもそも、私はドッグフードなぞ一度も口にしたことはないし、これからだってその積もりだ。したがって、うまいかまずいかを正確に結論付けることはできない。

 しかし、その後日本で飼った我が愛犬の評によれば、「あんなまずいものはない」のだそうである。もちろん我が愛犬に与えたのは日本製のドッグフードであるが、総じて食べ物はアメリカより日本の方がうまい傾向があるからして、彼のこの判断は多分間違ってはいないと思う。私の経験では、犬にドッグフードを食わすならそれ以外のものは一切食わせない習慣にしておかないといけない。残りごはんに味噌汁をかけて、という純日本風の餌を一度でも経験してしまうと、お犬様は決してドッグフードなどに見向きもしてくれなくなるものなのだ。

 その点では、我が家では犬の育て方を完全に間違えたと反省している。以前、犬を連れて多摩川の河原へ弁当持参でハイキングしたことがあった。河原で弁当をひろげたとき、何気なく弁当のいなり寿司をまるごと一つ奮発して犬に与えたのである。すると彼はそのうまさに驚嘆し、直ぐには食べないで手近な地面に穴を掘って埋めてしまった。後で掘り出して食べるつもりだったのであろう。私は慌てて掘り出して、直ぐに食べろと命じたが無残にも泥の付いたいなり寿司を犬はまたもや隠そうとするのであった。腹がくちていたのかもしれないが、愚かなことである。犬は一度でもこういううまいものの存在を知ってしまうと、決してドッグフードなど食べてはくれない。

 我が愛犬はこのように愚かではあったが、我々人間の持つ味覚をかなり忠実に理解していた。その彼が「ドッグフードなぞうまくはない」と言うのだから、それは確かであろう。当然、その意見を尊重すべきだと思う。要するにドッグフードに関する私の最終的判断は、外見はうまそうに見えるが決してうまいものではないということである。これを食してみようなぞという気は、決して起こさぬがよろしかろう。

 
 さて、私がなぜこのようにドッグフードのうまさに関してこだわるのかと言うと、それはソフトウェアの分野でもドッグフードを食することがあるからである。ソフトウェアの分野では、開発中の物件を自ら開発の道具として使うことを「ドッグフードを食べる」という<*1>。昔はこんなえげつない表現はしなかったものだが、これは多分マイクロソフト社のプログラマ達が創造した表現法ではないかと思う。このことは、彼等の中にドッグフードを実際に食したことのあるプログラマがいるに違いないことを示している。何故なら、開発中の物件を自らの開発の道具として使うということは極めて危険なことなので、誰もやりたがらないことだからである。痛い目に会うのが目に見えているので自らモルモットになることを希望する人など居はしない。最新のものが使えるというのは、何等特権的なことではないのである。
【注】<*1>闘うプログラマー
     グレッグ・パスカル・ザカリー 日経BP出版センター


 開発中の未完成のソフトウェアを下手に使うと、ファイル破壊などでそれまでの成果がすべて失われることになるかもしれない。そういう危険を犯してまでドッグフードを食べるというのは、その製品の早期安定化と早期出荷という大目標のために自ら犠牲になろうとする献身的な気持ちがなければできないことなのだ。自分の担当の仕事がもう終ってしまっているプログラマなら別であろうが、普通はどんなプログラマでも「ドッグフードを食べる」ことを好まないものである。

 Windows95の最終ベータ版(1)が限定リリースされると聞くと、素人は直ぐそれに飛び付く。最新のシステムを「人に先立って使える」という特権に目が眩むのであろう。しかしプロは(それが仕事でない限り)そのようなはしたないことは絶対しないものである。“最新の”とか“人に先立って”とかいうことはたいして本質的なことではない。プロは、そういった見てくれには絶対にだまされないという知恵を皆持っているからである(しかし本当のところは、内心使いたくてたまらないのだが、こう言って痩せ我慢をしているのである)。

 しかし残念ながらコンパイラ開発者というのは、この「ドッグフードを食べる」機会の最も多い立場にいるのである。ブートストラップの手法<*2>を用いてコンパイラを開発するというのは、まさに「ドッグフードを食べる」行為そのものだからである。ここで断っておくが、私はこの「ドッグフードを食べる」などという下品な表現を普段は用いたことがない。第一、これは犬に対して大変失礼ではないか。ここで使っているのは話の成り行き上からである。
【注】<*2>詳しくは「ソフトウェアと空中浮揚」を参照。


 

◆デバッグの難しさ
 コンパイラ開発でブートストラップ手法を用いる場合、最初にベースとなるコンパイラ()があって、それを用いてツールコンパイラ()を作り、それを道具(ツール)として最終的な製品コンパイラ()を作るという手順をとる。このを用いてを作る作業が、まさにドッグフードを食べていることになるのである。

      ⇒  ⇒ 

 一般にコンパイラの引き起こすトラブルには、ソースプログラムをコンパイル中にクラッシュ(2)したりアボート(3)したりする類いのトラブルもあるが、普通は翻訳ミスで間違ったコードを生成してしまうことであろう。したがって、コンパイルして出来たコードを実行したら、うまく動作しなかったという形でトラブルは発生する。普通これを“バッドオブジェクト”と呼んでいる。バッドオブジェクトが発生すると、そのコード生成に関連するところを調べて原因の追及を行うのであるが、ドッグフードを食べている場合にはそれ程単純な話では済まなくなる。そのコード生成に関連する部分の記述をいくら調べても原因が分からないことがあるからだ。それは、ツールコンパイラが生成したコードにバッドオブジェクトがあって、それがコンパイラにおける先のコード生成部分に影響しているかもしれないからである。つまり高水準言語で記述されたコードそのものは正しいのに、そのオブジェクトコードが間違っている可能性があるのだ。

 こうなるとコンパイラの機械語コードの方を調べなければならなくなる。そして間違いが発見されると、遡ってツールコンパイラのコード生成を手直ししなければならなくなる。一度そういう手直しが入ると、を作り直すと同時にもすべてコンパイルし直さなければならないことになる。一つの虫の発見によって、ここまで遡って全体の作り直しを行わなければならないのであるから大変である。場合によってはツールコンパイラにバッドオブジェクトが含まれていたということも起こり得る。その場合はベースコンパイラの手直しまで遡ることはせず(普通、これは自分の守備範囲ではないから放っておく)、ツールコンパイラの記述方法の変更で逃げるのが無難な方法であろう。要するにブートストラップ手法を用いても、理論通りにきれいにはいかないのである。まずコンパイラが完成し、しかる後にコンパイラが完成するというようなきれいな流れには決してならないのだ。を作り、それを用いてを作る。またの手直しに戻り、を作り直す、という手順の繰り返しになるのである。

 このように、ドッグフードを食べながらのコンパイラ作りというのは、実に実に時間と根気のいる作業なのである。しかし、そういったコンパイラ屋にも楽しみはあった。私にとっての夢は、自分で作ったコンパイラを用いて複雑な数値計算をしたり、あるいはまだ証明されていない数学上の有名な難問を、コンピュータを用いて反例的に証明したりすることであった。コンパイラのテストという大義名分さえあれば、そういったことに貴重な計算機時間を使うことが許されていたのである(あまり大きな声(字)では言えない(書けない)けれど)。

 現在のように、パソコンやワークステーションを自由に使える時代にあっては、この気持ちを理解してもらうのは難しいことであろう。当時は、使用料が1分間数百万円もする高価なメインフレームを、このように私的に利用することなどもってのほかで、普通の手段では全くといっていい程不可能なことだったからである。

 ところでコンパイラが組み上がったときに、最初のプログラムを入力し最初のコンパイル試験を行えるのは、コンパイラ屋だけに与えられた特権であった。たった今ビルドされたばかりのコンパイラを初めて使うというのは、それはそれは気分の良いもので、この気持ちばかりは経験者でないと分からないものであろうと思う。最初のテストプログラムは、“proc end;”だけの最も簡単なものしか動かないが、その内に大きな複雑なプログラムでもそれこそ「ビュンビュン」とコンパイルできるようになってくる。それが、また気持ちよいのである。

 そういう特権を行使できる機会は、ツールコンパイラが出来たときと、製品コンパイラが出来たときの2回である。製品コンパイラが初めて動き出すときもなかなか大変で、最初は“proc end;”だけの簡単なプログラムも動かないような状態から「ビュンビュン」とコンパイルできるようになってくるのである。最後に駄目押しとして、コンパイラから同じコンパイラが生成できるかどうかもテストするとすれば、3度目のコンパイルテストまで経験できることになるのであるから、これはやめられない。このように、ドッグフードを食べると「1粒で2度美味しい」あるい「3度美味しい」という経験ができるのであった。ドッグフードもうまく作れば、人間にとってもうまいと思える場合があるものなのだ。だから私は「ドッグフードを食べる」という表現は相応しくないと思うのである。

 しかし最近はコンパイラ屋稼業も卒業したので、ドッグフードを食べる機会は全くと言ってもいい程ない。そうかといって、Windows95<*3>の最終ベータ版という名のドッグフードは当面食う気が起こらない。正式リリースされて人間様向けのものになれば、そのときはいずれ食さねばならぬと考えているが。■
【注】<*3>Windows 95(英語版)の正式版は 1995-8-24 に全世界で同時にリリースされた。日本語版は3か月遅れで11月23日にリリースされた。


【デバッグ上の問題点】
◆ボスに対し、デバッグの難しさを理解してもらおうと努力しても何の意味もない。
 ボスに理解してもらいたいのは、デバッグには十分な時間と金が必要であるという点だけである。

【用語解説】
(1)ベータ版
 出荷直前のテストバージョン
(2)クラッシュ
 動作異常を起こし、システムの動作回復ができなくなった状態
(3)アボート
 動作異常を起こし、該当するジョブの実行を強制的に中断させること(システムは動作している)


(1995-10-16:掲示、1998-5-1:削除、2007-2-1:再掲示)