2015年03月13日の日記です


夢の中でデバッグする話  2015-03-13 09:48:41  業界記

先に書いた話題の関連話として。

その昔、「バーチャファイターを創った男たち」という漫画がありました。


この中で、AM2研部長の鈴木裕氏が、仮眠室で寝ている間に(夢の中で)デバッグをしていた、というエピソードがあったと思います。

これ、すごいことのように書かれていたのですが、プログラマなら誰でも経験済みの普通の話。


でも、プログラムしたことのない人には、なかなか理解してもらえない。特殊技能だと思われている。

ちょっと解説してみようと思います。


#これが特殊ではないと、どこまで伝えられるかわかりませんが。




プログラムって、小さな部品を積み上げて、非常に巨大な構造物を作る作業です。

レゴブロックを組んで、部品点数50万個の巨大作品を作る、というのを想像してみると、同じようなものかな。


#50万個だと、実際に動く自動車が作れるそうです。



作る際には特に正解は無く、自分が作りたいように作っていい。

ただ、目的はある程度決まっている。「自動車を作れ」と言われているのに家を作っちゃダメ。


さらに、使えるブロックの数とか完成時の大きさとか色とか、いろんな制約はあって、その制約をどうかいくぐり、目的を達成するかに工夫が必要。



プログラムの場合、時には、作ったプログラムが思い通りに動かないことがあります。

いわゆる「バグ」。


このバグには、2種類あります。

1つは、単純な記述ミスによるもの。

こんなもの、悩むことはありません。大抵すぐ直ります。


もう1つは、アルゴリズムの根本を勘違いしていること。


これが根が深い。

本人にとって、「あたりまえ」だと思っていることが、勘違いだったりするのが主な原因です。


当たり前の部分を全部疑う必要がありますが、そんなこと不可能です。

だって、プログラムって、無数の「当たり前」を集めて作っているのですから。



当たり前を疑わなくてはならない…

使っているブロックは全部レゴだと思っていたら、後から「1つだけニンテンドーブロック(レゴの互換品)だったから外して」と言われたようなもの。


#ニンテンドーブロック、サイズはレゴ互換だけど、当時は特許継続中だった「パイプ」部分を違う構造に変えてあります。

 そのため、ブロック間の保持力が弱いです。巨大構造物に入っていたら、そこが弱くて作品崩壊の恐れ。


50万個のブロックを使った大作から、たった1つのブロックを探し出して除去しないといけないのですが、どれがそうなのか、全くわからないのです。

「あたりまえ」を疑え、と言われてもねぇ。




「アルゴリズム」というのは、動作の手順の意味です。

パソコンに向かって記述している「プログラム」は、そのアルゴリズムを専用の言語で書いたもの。


上に書いたように、バグの原因がアルゴリズムにあるのであれば、プログラムを見ていても解決しません。

ですから、この時点でパソコンに向かっている必要はない、ということになります。


ただ、現実には、勘違いがありそうだと思ったら、実際のプログラムを動作させながら、どこを勘違いしているのか検証する作業を始めるでしょう。


関係ありそうな部分を順次疑い、機能単位でひとつづつ動作を確認していきます。


場合によっては、ここでバグの原因が判明します。



…でも、いくら探しても見当たらない。

いよいよもってわからない。


こうなると、もうパソコンの出番は終わりです。

全ての条件は出尽くしていて、後は自分がその解釈を間違えているだけだ、ということになるから。


自分と向き合い、どこが勘違いなのかをじっくり考えないといけないのです。




ところで、自分の勘違いなら、他人に見てもらうとわかりやすいのではないか? という疑問もあるかもしれません。

実際、人に見せるとたちどころにバグが解消する、という場合もあります。


プログラム中に「常に」勘違いをしていないかチェックする、という、ペアプログラミングと言う技法もあります。

二人でプログラムを考えることで、勘違いの混入を防ぐ技法ね。



でも、大抵はプログラムは一人で組んでいるうえに、非常に複雑に入り組んでいます。

この構造を把握している人…つまりは、自分だけがバグを見つけ出せるのです。


だから、他人は助けにならないのです。




気分転換を図るため、「飯食ってきます」とか言って席を離れるのも良さそうです。

頭の中では問題を考え続けていますが、そんなに簡単に答えは見つかりません。


考え続けているときは、「ここら辺に問題があるはずだ」などの意識があって、他の部分を見てないのですね。


でも、考えているうちに十分に条件が把握できて、確実な部分と不確定な要素が分離出来てくると…

ふと考えるのを辞めた時に、それまで気にしていなかった別の部分が問題なのではないか、など、急にひらめくことがあります。



そして、この「考えるのを辞める」条件には、寝ることも含まれます。

そうした瞬間に、急に何が問題かわかることがある。


これが、「夢の中でデバッグする」と言われる状態です。

ちなみに、飯食ってるとき、トイレ行ってるとき、風呂入ってる時、なども急にひらめきやすいときです。



実は、プログラムに限りません。沈思黙考が大切な職業の人は、かなりこれを経験している。


絵を描く人なら、一旦離れて遠くから見てみることが重要、というかもしれません。

音楽を作る人なら、「アイディアが下りてくる」とか「神が乗り移る」とかいうかもしれません。


風呂場やトイレが一番アイディアが思いつく、とも言われます。

エジソンも、研究室にベッドを置いていたのは有名な話。



プログラムって、パソコンに向かってやる物でしょ? と思っている人に「夢の中でデバッグ」というと、すごい特殊技能のように思われがち。


だけど、実際にはプログラムのほとんどは「沈思黙考」の時間です。

他のクリエイターと同じ。コンピューターなんてなくても大丈夫。




当たり前のことですが、プログラムの中で問題解決している「量」は、パソコンの前に座っている時の方が多いと思います。

でも、どうしてもわからない問題と言うのは、先に書いたようにパソコンを離れた時に解決することが多い。


そのアイディアの99%が勘違いだったとしても、1%は本当に夢の中でデバッグしたことになる。


これは、プログラマにとっても印象深い出来事となるので、後で人に話すことがあります。

すると「すごい特殊技能」のように思われる。


と、こういうカラクリです。

別に特殊技能でもなんでもない。




まぁ、プログラム自体が特殊技能だ、というのはあるとは思います。

だから「プログラマには当然」の話が普通に理解されなくても、そこは仕方ない。


僕から見ると、絵を描ける人や音楽を作れる人のほうがよほど特殊技能の持ち主です。

結局、自分の持ってない技能はなんでも特殊に見えてしまう、というだけの話です。





公開半日後の大幅追記


公開してすぐに「夢の中じゃなくて、布団の中なのではないか」という趣旨のツッコミを頂いたので解説。

ツッコミをくれた方も、寝る前に布団に入っても考えていたら急に気づいた、という経験はあるようです。


上の文章中で、「論理的でない」時になぜデバッグが出来るのか、を書いていたのですが、「寝た」状態での話、および「寝る」ことの定義をしていませんでした。

これがおそらくは、ちゃんと伝わっていなかった原因かと。



僕の場合、と断ったうえでですが、単に布団に入っただけではなくて、就寝後です。

ただ、おそらくは体は寝ているが意識は起きている、半覚醒の状態。


そういう時に見る夢って、特殊です。

「あぁ、これは夢だな」って自分でもわかっていて、コントロール可能な部分もあるのだけど、不可能な部分もある。

いわゆる「明晰夢」というやつです。



だから、「夢の中ではないのではないか」というツッコミは、ある意味正しくて、ある意味違っている。

定義していなかったので申し訳ないのですが。


僕の何度かの経験だと、確かに寝ているし、夢を見ているのだけど、その夢の中で意識ははっきりしています。




ただ、やっぱり夢の中なので、意識ははっきりしていてもおかしなことが起こります。


この「おかしなこと」が…また、妙にリアルなのね。

現実に起こっていたバグではないのだけど、変なバグが起きて悩んでいたりする。


そして、夢の中でもデバッグしているから、このおかしな現象は何だろうと考える。


そうすると、「あぁ、この関数が特殊状況下であぁなって、このバグが起きるのか」とか、ちゃんと論理性のある答えを導いてしまう。



で、起きてソースリストを確認してみると、実際にそうなっていたりするわけです。

現実的には起きていなかったバグが、夢の中では起きていて、確認すると潜在的なバグがあったりする。


さらに、この「潜在バグ」こそが、実際に悩んでいたバグの原因だっりする。



こういうのが、「夢の中でデバッグする」と書いた現象になります。




改めて先に書いたことに当てはめれば、頭の中に「主要な関数の動作」は全部叩きこんであって、それが特殊状況下で動かないことに気付いていないだけなのです。


気付いてないのは、「ここは一度チェックしたから動くはずだ」という先入観があるから。

特殊状況で動かないとしても、動くものだと思ってそれ以降のチェックを行わなくなってしまう。



ところが、夢の中では「ここ、最近チェックしてないけど本当に大丈夫?」と教えてくれるらしい。

心のどこかに、「チェックしたけど、本当に大丈夫なのかな」という不安感があって、夢に出てくるのでしょうね。


論理性は頭の中に叩きこんであるから、「そこがもしおかしいと、こんなことになるよ」と、変なバグの夢を見せてくれる。


で、今まで調べてなかった「特殊状況」のチェックをしてみると、バグが見つかるという寸法です。



夢の中では「不安感」が顕在化しただけで、厳密性は無いのに注意。

この「不安感」が必ず的中する、ということはありません。


起きて見直したけど、やっぱあってた、というパターンの方が多い。

先に書いた「99%は勘違い」というのは、そういうことを言っていたつもりでした。




補足しておくと、多くの人が「特殊技能」だと感じているのは、これが「夢の中」だからというよりは、「パソコンが無いのにプログラムしている」行為なのではないかと思っています。


だから、追記する前の文章では、バグの原因の大半がロジック部分にあり、コードではないことを書いていました。

コードはパソコンが無いと確認できないけど、ロジックはパソコンなしにデバッグできる。



そして、ツッコミをくれた方は「布団に入って考えていたら気づく」という経験をお持ちなので、プログラマーでない人から見たら同じ特殊技能の持ち主ではないかと思います。


実際寝てしまった後なのか、寝る直前なのかはあまり問題ではない、五十歩百歩の部分です。




余談ですが、明晰夢って、訓練すると当たり前にみられるようになります。


大学時代に、ちょっと「夢診断」に興味を持った時があって、朝目覚めて夢を覚えていたら、忘れないうちに書き留めるようにしていました。


そしたら、夢を覚えていることが多くなりました。

やがて、明晰夢を見ることが増えました。


…これ、「デバッグ時」と同じで、面白いから夢を覚えておこう、書き留めておこう、と強く思っているから、寝ても覚えておけるように半覚醒状態になっているのです。


最初の頃は、夢の荒唐無稽さが面白くて書き留めていたのですが、明晰夢を見るようになったら理性が働いて変な夢を見なくなったので、つまらなくなってやめました。



もしかしたら、「夢の中でデバッグする」経験も、この際の「夢を覚える訓練」の延長上にあるかもしれません。

(入社間もなくの頃に僕も経験しているので、「夢を記録する」訓練を…望まずに…やってしまってから、数年後です)




同じテーマの日記(最近の一覧)

業界記

関連ページ

ENIAC公開日(1946)【日記 15/02/14】

別年同日の日記

03年 いるかのすまし

06年 確定申告終了

11年 遠足とキャンプ

17年 江の島再発見

19年 デヴィッド・カトラー誕生日(1942)


申し訳ありませんが、現在意見投稿をできない状態にしています


戻る
トップページへ

-- share --

2000

-- follow --




- Reverse Link -