2017年4月30日日曜日

桶屋が儲かる (1999-05-01 掲示の再録です)

・1999-05-01 社内情報誌に掲載
・1999-11-15 個人ホームページ(Knuhsの書斎)に掲載
・2017-05-01 一部手直ししてブログ(ドッと混む・Knuhsの書斎)に掲載


── デバッグのやり方

 春一番の吹く季節がやってきた。
 寒い冬が過ぎて春が来るのだから、誰もが心浮き立つような気分になるはずだが、私にとっては一番耐えがたい季節の到来である。それは私が花粉アレルギー症だからである。杉花粉に悩まされているのは私だけではなかろう。毎年の春の行事の一つだと考えてしまえばそれはそれであきらめもつく。薬をのんだりマスクをするなりして自己防衛すれば、杉花粉くらいは何とか乗り切ることもできる。

 しかし五月頃に起こるアレルギー症状には何とも耐えられないものがある。私の場合のアレルゲンは“オオアワガエリ”と呼ばれる道端のどこにでもある雑草なのだ。五月頃になるともう戸外でマスクなどしている人はいないから、自分だけマスクをするのは何となくはばかられて、どうしてもやせ我慢をしてしまう。その結果、呼吸困難になって入院するはめになった年もあるほどなのだ。

 ところで、春の風が吹く季節になると私はいつもある言葉を思い出す。それは「風が吹けば桶屋が儲かる」というあれである。この言葉の意味するところは「思わぬ結果が生じる」あるいは「あてにならぬ期待をする」ことのたとえであると言われている。だが私は、これは我々が携わるソフトウェア開発という仕事、とりわけプログラミングのデバッグ作業と密接に関係している言葉のように思えてならないのである。

 そもそも、なぜに桶屋が儲かったのかというところから問題を掘り下げてみましょう。それはもちろん桶屋の商売が繁盛したからなんです。

 なぜ繁盛したんですか。

桶を買う人が増えたからでしょうね。

 なぜ増えたんですか。

無論、桶がだめになったから買い替えが必要になったんですよ。

 じゃ、なぜ桶がだめになったのか調べないといけませんね。

それは、実は鼠が桶をかじったからであることが分かっています。

 なるほど。じゃ、なぜ鼠が桶をかじったりしたのでしょうか。

それはですね、鼠が異常に増えたからなんです。

 あぁ、なるほどなるほど、そういうことですか。

 感心していてもはじまらない。今度は鼠がなぜ異常に増えたのか、その理由を調べなければいけないですね。

そうです。いろいろ調べてみると鼠が増えた理由は、実は鼠を獲る猫が減ったのが直接の原因であることが分かってきたんです。

 ほ~、それでは、今度はなぜ猫が減ったのかを追求する必要が出てきましたね。

そうなんです。ところが、意外なことにそれは猫を捕獲する人が増えたからだということが分かってきたんですよ。

 へぇ~、そいつは驚いた。なぜに猫を捕獲する人がそんなに増えたんですか。

それそれ、そこが一番調査の難しかったところなんです。実は猫の皮なんですよ、問題は。三味線に張る猫の皮が大量に必要になったんです。

 何と!三味線ねぇ、よくそこまで分かりましたねぇ~。なるほど、なるほど。
 それでは、きっと三味線が大量に売れたんでしょう。

そう、そうなんです。実は眼に障害のある人が増えたので、その結果三味線をひく人が増えたといわれています。

 どうも、昔の話なので現代では到底理解できないことですね。

 それで分かりましたよ、なぜ眼に障害のある人が増えたのか。多分風が吹いて砂ぼこりがまったんでしょう。その結果眼に障害のある人が増えたということでしょう?

ご明察! ちょっと論理に飛躍がありますがね。実はそのとおりなんですよ。

 それでやっと分かりましたよ。桶屋が儲かった原因は、風が吹いたことが本当の理由だったんですね。

 ‥‥という訳である。

 プログラム作りのテスト段階で不具合が発生した場合、一般にその原因の究明は大変に難しい(もちろんプログラムの程度にもよるが)。多くのプログラマは、日夜“デバッグ”と呼ばれる困難で孤独な作業に取り組んでいる。そういったデバッグ作業では、不具合の直接の原因Aを見つけてもそれで問題が解決する訳ではない。その直接の原因Aが予想外の現象であるならば、今度は再びそれを引き起こした原因Bを追求しなければならないのである。そして原因Bが見つかったら、今度は(多分また)原因Cを捜すことになるであろう。そのようにして原因D,E,F,‥‥を捜し続けるのである。最終的に原因X(それ以上はさかのぼるべき特別な理由がないもの。大抵は設計のし忘れなど)を見つけるまで。

 つまり、桶屋が儲かったという事象から始めて、風が吹いたという原因にまで逆に(1点の飛躍もなく)一つ一つたどっていくという、いわゆる“推理作業”を行わねばならぬのである。そして、風が吹いたという最終的な原因Xを捜し当てたら、今度は風Xから桶Aに向かってもう一度たどっていく。そして不具合のすべての兆候が、それで完璧に説明がついて初めて(デバッグ作業では特にこれが重要なのである!)その障害の原因が完全に究明されたと断ずることができるのである。

 もちろん、その障害を修復するにはまた別の努力が必要であることは論をまたない。つまり風が吹かないようにするか、あるいは風が吹いても砂ぼこりがたたないようにするか、とにかく何らかの対策が別途立てられなければならない。プログラマとは誠に難儀な商売ではある。

 現在のようにコンピュータ資源が十分でなかった時代には、自分に割り振られたコンピュータ使用時間が来るまで(それも僅かな時間しか割り振られないのだが)机上で上記のような推理を働かせたデバッグ作業を繰り返したものである(これを机上デバッグと称する)。そして時間が来ると、その限られた時間内の実機テストで確認するという手順になっていた。机上デバッグが不十分だと必ず実機テストに失敗し、また出直しとなってコンピュータ時間の確保から始めねばならぬのである。

 最近のプログラマは、コンピュータ資源を豊富に与えられているので何時でも実機テストができる。その結果、十分な推理作業を行わずに絨毯爆撃でいろいろと試しては結果を見るというデバッグ姿勢を取りがちである。桶屋が儲かったのは、多分雨が多かったためではないか、あるいはエルニーニョのせいではないか、‥‥などといろいろとやってみるのである。これだとコンピュータ使用時間がいたずらに増え、結局能率が悪くなってしまう(*)
【注】(*) もっとも、そうやって徹夜をしているプログラマの方が管理者の目には熱心に働いているように見えるのだからソフトウェア稼業というものは実に難しいものである。
絨毯爆撃で運良く解決したように見えても、別のケースで再び問題が顕在化するかもしれない。根本的な解決をはかるには、やはり完全な推理作業に取り組むべきではなかろうか。豊富なコンピュータ資源は、推理作業を助けるデータの収集にこそ向けられるべきであろう。そしてピンポイント爆撃で一発で虫を退治したいものである。

 そういう完璧な推理作業を繰返してプログラマとしての経験を積んで行くと、いつか「桶屋が儲かった」ら即座に「風が吹いた」に違いないとピンとくるようになるのである。こういったベテランの勘は大事にすべきであろう。しかし経験を積んでいない者の勘は、単なる“カン”であって信用するに足らない。

 気象の世界では「風が吹けば桶屋が儲かる」に相当する言葉は「東京で一匹の蝶が羽ばたけば、一ヶ月後にニューヨークに雨が降る」というのだそうである。私は持ち前の好奇心から、どうして東京からニューヨークまでつながっているのか、その流れを追ってみたくなった。そこで、博識をうたわれているお天気キャスターの森田正光氏にTBSラジオ局を通じて質問のメールを送ってみた。しかし数ヶ月過ぎても何の回答も得られない。彼にも分からぬことがあるのであろう(しかし返信なしは気に入らん)。私はこの問題の解明作業を今後も続けようと思っている。ご存知の方は是非ご教示いただきたい。■
【追記】
 この拙文に対しては多くの読者から反響があった。私信なのでそのまま掲示することはできないが、「東京で一匹の蝶が羽ばたけば、一ヶ月後にニューヨークに雨が降る」(これを、一般には「バタフライ効果」というのだが)について、「北京で今日蝶が羽を動かして空気をそよがせたとすると、来月ニューヨークでの嵐の生じ方に変化がおこる」ではないかという指摘があったことだけは報告しておきたい。カオスの話では必ずと言っていいほど引き合いに出される話なのだそうである。しかし、その間のつながりがどうなっているのかは、相変わらず分かっていない。
【追記】2008-5-20
 アメリカのマサチューセッツ工科大学名誉教授のエドワード・ローレンツは、60年代の初めに天候の変化をコンピュータで再現する実験を繰り返していた。あるとき、“0.50612”と打ち込むべきところを、丸め(四捨五入)て“0.506”という数字を使ったところ打ち出されたグラフは数字を丸めなかったときとは大きく異なるものとなった。半端な数を切り捨てるかどうか。それは小さなチョウが舞うか止まるかの違いに似ている。チョウの羽ばたきが地球規模の気象を左右することもある。そんな「バタフライ効果」という言葉が広まったのはこの体験がきっかけであったという。この効果は、物事が複雑に揺れ動く「カオス」と呼ぶ現象のなかで表れる。自然界はそんな複雑さに満ちている。(朝日新聞の記事から引用)

0 件のコメント:

コメントを投稿