Upgrade to Pro — share decks privately, control downloads, hide ads and more …

デバッグに関する原則__2_.pdf

smatsuda0620
February 02, 2024
9

 デバッグに関する原則__2_.pdf

smatsuda0620

February 02, 2024
Tweet

Transcript

  1. 失敗を促す - 失敗の手順に多くの手間がかかる場合は、テストなどを書き自動化することが有益 - 飲酒運転の疑いをもう一度ハイウェイを走らせて確かめるようなことはしない。あなたをまっすぐに 歩かせたりして簡易的に確かめるものだ - ただし、メカニズムを変更してはならない - 「新しい問題を生み出す」のではなく「促す」

    - 何かを変更するときも頻度にだけ影響与えるような高いレベルで行う必要がある - 窓の水漏れをテストするために消防用ホースを使い、窓ガラスを粉々にして、「原因は窓ガラスであ る」と言ってはならない - 普通のホースで水をかければよい
  2. 「そんなはずはない」ことが起こることもある - 開発者が「そんなはずはない」と起こったりすることがある - テスト実施者のミスで実際に起きてないかもしれないし - 起こったかもしれない - まずやるべきことは、憶測を取払い開発者の前で再現してみること -

    「そんなこと」を発見するには再現してみてデータをとって状況を確認するしかない - 家族と一緒にある味のアイスクリームを買うとエンジンがかからなくなる - バニラかチョコレートの時は大丈夫で、他の時は帰りのエンジンがかからなくなる
  3. まず「観察する」 - エンジニアは「思想家」 - 考える方が楽しいし、楽。肉体労働よりも楽 - エンジニアにとって「観察する」より「思想する」方が楽 - ただし、問題がおきたいきさつは想像力を超えることがある -

    「観察する」のは難しい - ソフトウェアで「観察する」ということは、ブレークポイントを設定し、デバッグ文を追加し、値を監視す る - 非常に複雑である - へたな推測に根拠がなかったとしても、バグの追跡はし続けなければならない - 時間がただ消費しただけで何も前進していない - なので、まず「観察する」という意識が大事なのである
  4. 問題を直接見る - バグを見つけた時、私たちが見ているのは問題ではなく問題の「結果」である - 電気がつかないという結果には見つけるべき問題がある - 実際に何が起きているかを一部始終を観察しない限り問題は誤解されやすい - これが問題だと見当つけて修正しても、実際には別のところで問題が起きているこ とがある

    - 逆に問題が隠れたり、さらに別の問題を生む可能性もある - サーバが夜中に再起動する問題があった - 毎晩ほぼ同じ時刻に起こるので、ログなど証跡はなかったバッチ処理だと決めつけた - 自動的に動くプロセスを監視してみることにしたが何ヶ月も問題は発見できなかった - 夜中に残ってマシンの様子を眺めていたら掃除のおばちゃんが電源を抜いていた - 通常は近道するより実際に見た方が数倍早い
  5. 詳しく見る - 前例のようにほんのちょっと見たら原因を見つけられることは稀である - 一般的には問題を確かめるために、調査すればしただけ、何が原因なのかがよく 見えてくる - より多くの情報を得るにはどこを探ればよいか判断できるようになる - では、どこまで観察を続けれよいのか?

    - 「システムを理解する」と同じようにここでも経験が役にたつ - 見当違いの推測をして、それを追いかけているうちに、どのような場合にどこまで観察すればよい かわかってくるだろう - そして、デバッグの名手の基準が「どれだけ早く推測できるか」でも「どれだけ素晴 らしい推測が」できるでもなく、「下手な推測に基づいて行動を起こす場合がどれだ け少ないか」にあることを理解するだろう
  6. あくまで検索を絞り込むために推測をする - 「考えをやめて観察する」とは推測を全くしないということではない - 問題の検索を絞り込むため推察する - 推察が全くの的外れになることがある。 - 調査によりその推察に根拠がない場合は最初からやりなおそう -

    ただし、例外がある - ある種の問題は他の問題より発生しやすくかつ修正しやすいので、まずそれをチェックしてみること である - その場合は調査をせずにまず修正してみてもよい
  7. 問題のある方から始める - 多くのシステムでは、本流に流れ込む支流のように、さまざなな流れが1つに合流 する - 上流から検索を始めると見当はずれの支流を調べ時間を無駄にする可能性がある - 悪臭を放つ赤い排水がある悪い方から手をつけて、上流へ向かって作業を進める こと -

    加熱炉が作動しないとしよう。 - 燃料切れはよくあるので、まずそれが原因ではないかとしれないと疑って、タンクがいっぱいかどう かを確認する。次に燃料の注入に問題がないかを確認する。注入が問題がない場合(以下略 - 最終的にスプレーヘッドからオイルが噴出していることに気づくまでには時間がかかる - 問題のある加熱炉から 調査を始めよう
  8. ノイズは先に修正する - 前のルールから「ある種のバグは、ほかのバグの原因になりやすいので、まずそれ らを探して修正すべきである」 - ノイズ信号はなかなか見つけられない断続的な問題全ての原因となりうる - まず他の問題を解決する前にノイズの問題を解決する必要がある - 他の問題は予測するのが難しくても、ノイズを除去する解決することもある

    - ただし、そればかりに没頭してはならない - ノイズの問題を修正することの難しさと、それが実際に何か影響している可能性を比較しよう - 完璧主義になりがち - それらが実際に問題の原因になってないなら、通常はそのままにしておく方がよい だろう
  9. 散弾銃ではなくライフル銃を使う - 変更は一つづつ行おう - 散弾銃のように一度にたくさんやっつける方法は、今すぐ忘れること - 良いライフル銃を手に入れて、一つずつやってけよう - 問題を実際に目撃した場合は、それだけを修正すれば良い -

    ターゲットを撃つのに散弾銃が必要と考えた場合、ターゲットがはっきり見えてない可能性がある - 本当に必要なのは良い照明と良いメガネである - 小学校でよく行っている植物観察では、全く同じ土と全く同じ種で、全く同じタイミン グで水をやり、植物にあたる日光の量だけ調整する - こうすると成長のばらつきは日光の照射時間によるものとなる - あるいは日光の照射時間を同じにし、水の量をかえると成長にばらつきがでる - 成長が悪いのが修正したいバグだとすると、鉢の色と水の量と照射時間全て同時 に変えると鉢の色が関係ないことがわからなくなる
  10. バグの話(ビデオ圧縮チップの話) - ビデオデータを小さなサイズに圧縮して送信する必要がある - テレビ会議システム - ある日、これといった理由もなしに圧縮の速度がかわることがあった - 再起動すると直る -

    チップを緩めたり冷やしたりしても改善しなかった - イライラ - ある時、椅子から立ち上がると突然速度が落ちた(ように見えた) - もしかして寂しがり屋?
  11. 何をどの順番で行い、何が起きたかを記録する - 記録をつけよう - 問題を調査する際には、自分が何をどの順番で行ったのか、そして結果として何が起きたかを記録 しよう。これは毎回行うこと - ハードウェアでもソフトウェアでも同じ - 食物アレルギーの症状が現れると、アレルギー専門医はアレルギー反応とその時

    の食べたものを結びつけることで、アレルギーの原となった食べ物を特定しようとす る - 関連がはっきりせず、より詳しい情報が必要な場合は、食べたもの全てと時間、その時の反応を全 て日記に書くように指示されるだろう - これが「履歴」 - いちごを食べた時に蕁麻疹が出てることの因果関係がわかったとします - そうする医者は対処法を提示することができるので、この「履歴」は大切 - 処方はいちごを食べないこと
  12. 悪魔は細部に宿る - 多くの場合、履歴が大事だと理解されるが、残念なことに本当に必要な詳細な記録 が必ずしもあるわけではない - 単なる「問題がある」「動かない」など - グラフィックが完全に歪んでいるとも、赤い部分が全て緑で表示されているとも、3番目の数字が間 違っているとも書かれない -

    ログがあるが、いつ問題が起きたが分からないレポートが出てくる時がある - アレルギーの場合、食べたものだけ書かれていていつ症状が出たか書かれていない履歴に何の 意味もない - ログには記録されない状況や症状をデバッグトレースやログに注釈として書き込ん でおくこと
  13. 悪魔は細部に宿る - 状況を説明する時には、具体的に、矛盾がないようにする - ビデオ通信では大体システムAとBがあり、それが相互に通信する。そして、「リモー トビデオなし」とバグレポートを受け取ったとしよう - これでは問題はAなのかBなのかわからないし、リモートビデオとはリモート側で表示されるビデオ のことなのか、リモート側から送られてきたビデオのことなのか -

    基本的な症状を理解しないことには問題の解明に着手できない - もう一つ注意しないといけないのは「何が起きた」だけでなく、「どれくらい続いたか」 である - 「ほとんど聞こえないほどのブンブンいう音が 0.5秒続いた」なら問題ないが、「キーンという音が 6秒 続いた」とかなら詳しく調査する必要があるだろう
  14. 自分の憶測を疑う - 自分の憶測を絶対に信じてはいけない - 特に説明のつかない問題に遭遇したとき - 「プラグは差し込まれているか」と自問しよう - 凝ったデジタルチップがなぜ正常に動作しないかを疑問に思い、それでいながら実 際に電源が流れているかどうかは確認しない

    - 実行していると思っているコードは本当に実行しているだろう - 実際には古いコードを読み込みロードしている可能性はないだろうか - トラブルの原因が土台にあることはよくある - この世のものと思えないような問題にぶつかったら、そこで立ち止まり足元を見よう
  15. バグの話 - 築90年の家で突然ボイラーが止まってしまった - 石油で動いていたので給油が間に合ってないと思い、給油の目盛をみたが問題な かった - そこでボイラーの修理屋を呼んだ - 修理屋も真っ先に目盛を見に行った。

    - それは確認したと話したあったのだが、彼が懐中電灯ので目盛をドンっと叩くと、メモリが 0に急降 下した - 修理屋は補充用の石油を給油して、私を都会ズレしたまぬけなやつだと冷たい目 で見て帰っていった
  16. バグのはなし - 引退するまで長年にわたって大きな工場で機械を管理している男がいた - 彼が引退してからしばらくの間、工場は問題なく稼働していた。しかしある日機械が 止まってしまい、新人の整備士のあらゆる努力もむなしく2度と動かなくなった - 工場主は引退した男に電話をかけ、状況を説明し助けてくれるように頼んだ - すると男は修理に1万ドルはかかるだろうと答えた。法外な要求だったが、工場側は切羽詰まって

    いたので、その要求を飲んだ - 男は道具箱を下げて工場にやってくると、機会が設定してあるところに向かった - そして、ハンマーを取り出すと、機械の側面を一回だけ強く叩いた。すると機械が動き出した - 工場主が「ハンマーを一回叩いただけで一万ドルとだと?」と激怒すると「それは違 う。ハンマーで叩くのは10ドル、どこを叩けば良いかを知っていることに9,990ドル だ」と、誤りを正した
  17. 助けはどこからでも得られる - 新しい見識が必要なのか、専門知識が必要なのか、経験が必要なのか、それとも これらの組み合わせが必要なのか。 - 会社の同僚もその一人 - サードパーティーの装置やソフトウェアなら、そのベンダーに聞ける - 問い合わせベンダーがいない場合やいても連絡が取れない場合のアドバイス「もう

    一度マニュアルを読む」だ - 1のルールにしたがっていれば、マニュアルをもう読んでいるはずだから、問題への新たな視点でマ ニュアルをもう一度読んでみよう - あるいは理解できなかったものが理解できるようになっているかもしれない - ツール、プログラミング言語、設計作法、デバッグに関しても、多くの情報源がある - 近所の書店やオンライン書店、関連のある雑誌やニュースレターやリリース、全てが情報源。専門 家は周りに溢れている
  18. プライドを捨てる - 助けを求めることは、無能の証ではない - バグを何とか修正したいという願望の表れである - 新しい見解や専門知識や経験を取り入れ、より素早くバグを改修できる - 援助を選んだあなたの 賢明さを表す

    - 逆もまたしかりで、自分はおろかで、専門家が神であるうなどとは考えないこと - 専門家もミスを犯す。それが自分のミスであると思い込むと泥沼にはまる
  19. バグの話 - B-treeと呼ばれる大きなデータベースのインデックス構造を利用するプログラムを 書いていたときのことである - コンピュータサイエンスに非常に詳しい同僚とコードを書いていた - ある時、自宅でソースコードを見直していると、彼のプログラムに理解できない部分 があると気づいた -

    ある条件が揃うと、ソフトウェアがツリー構造を作り直すときにデータブロックをそっくり破壊している ようなのだ - 自分の考えがどこか間違えているかを突き止めようとして何時間も奮闘した - しかたなく出社して同僚に、なぜここが正しく動作するのかわからないと聞いて - 同僚は「これはバグだね」と言った
  20. 持論ではなく症状を報告する - 新しい見解を持つ誰かに聞くのは自分の理論では結論が出せないからだ - それなのに持論を展開するとせっかくの正しい考えが自分の持論に引きずりこんで しまう - それだけなく先入観は重要な事実を隠してしまうかもしれない - 断固たる態度で望むこと

    - 助けを求める時は下記を説明すること - 何が起きたのか - 何を見たか - 状況を - 腹痛のために訪れた病院で医者が聞きたがっているのは、あなたがインターネット で調べて骨髄癌であると確認していることではなく、どのような痛みかである - ゼネラルモーター社が欲しいのは月曜日に組み立て、二日酔いの組み立て工がフィニアピンをきつ く締めすぎた話ではない。寒い朝にエンジンがかからないことである
  21. バグの話 - ある人が中古車を購入した - 中古車でロサンゼルスを通って北米大陸を横断した。北の丘陵に通じる長く険しい 丘にに来た時、アクセルを目一杯踏んでスピードを維持していたが、丘の頂上にた どり着く前にエンジンが突然止まった - もう一度エンジンをかけてみた、キーを回すとエンジンはすぐにかかった -

    次に丘の頂上に着く時は同じ問題はおきなかった - また別の地域を丘を登っているとまたエンジンが止まってしまった - エンジンをかけなおすとまたかかった - その冬、まったく平坦な道を制限速度で走っている時に、またエンジンが止まってし まった。 - 時速70-80kmを超えると、しばらくして車がエンストすることに気づいた
  22. バグの話 - 修理店や持っていった - 彼らがいうには「電気系統の問題」だそうで、ケーブルを何本か交換してもらい、 75ドルもし払わさ れたからといって、彼らがデバッグの方法を知っているとは限らないことを私は思い知らされた - 一連の出来事は -

    アクセルを目一杯踏んだ時に起こったことだった - エンジンはキャブレターから送り込まれた燃料を燃やすことは知っている - もしかしたらキャブレター内部の燃料が切れた時にエンストしているのでは? - 「8: 新しい視点で物を見る」と言うルールを適用し、職場でコーヒーメーカーの周り にたむろしている人々に「ガソリンタンクからキャブレターへの燃料供給を妨げるも のがあるとすれば何かな?」 - 「燃料フィルタの汚れさ」 - 私は50セントの燃料フィルタを書い、自分で交換し、問題を解決した - 修理店の問題はほんとうに解決されたかどうかの判断はつかなかったはずだ
  23. 本当に自分が解決したかを確認する - 修正した部分を元に戻して問題が再発するか確認しよう - 修正すべき部分だけを修正し、修正された部分を失敗する状態に戻し、さらに再び 失敗された状態に戻す - こうしてはじめて問題が修正されたことが証明される - 理由としてデバッグの最中に、テストの手順やソフトウェアまたはハードウェアの一

    部など正式な「修正」の一部でないものまで変更してしまうことがよくあるから - 変更による影響がなければ良いが、それによって偶然問題が解決される場合や、見えなくなる場合 がある - 変更による影響を受けていない顧客に修正を配布してお、顧客上のシステムでは 相変わらず問題が起きる
  24. 自然になくなることはあり得ない - あなたが修正しない限り、問題は解決しない - バグがなくなったと信じたいのは誰しもが同じだ - ただ、また失敗する - それまで失敗していたシステムが、状況が何か変わったため失敗しなくなった(ある いは頻度が減った)としよう

    - この場合「その2: わざと失敗してみる」に戻って、たましか起きない失敗をもっと頻繁に再現させる 方法を読み返そう - 色々修正してしまっているなら元の状態に戻して、対象のシナリオでテストしよう - 新しいソフトウェアで再現できないとしたら、問題は解決されたのかもしれない、両者の違いを調べ て原因を突き止めよう - 時間がない時もある - その場合は顧客の手元の対象の問題が起きた場合に備えて、情報が記録されるようにしよう - こうすれば、もう一つの利点としてその情報で問題を解決できないとしても、少なくとも顧客には、あ なたが真剣に問題を解決しようとしてるのがわかる
  25. プロセスを修正する - 品質管理プロセスは本章では基本踏み込まないが、システムを修正することと、シ ステムを誤動作させたプロセスを修正することの境界線を見極めることはむずかし - そして、その境界線を超えた方が良い場合もある - 工場の床にオイルがこぼれたいたとする - オイルを拭けば良いが根本の問題は解決されていない

    - 金具の隙間から漏れ出しているから、締めたが止まらない - 振動が激しい機械は 4本ボルトで締めた方が良いところを 2本で締めている - これが主原因 - これも違う。このままでは新しい機械を設置した場合にも同じ問題が発生する - 要件、設計、テスト段階において機械の振動を計算に入れるように、「設計プロセ ス」を修正しなければならない