結論から言う。
何か世の中の物事を証明するには
「演繹法(えんえきほう)」
「帰納法(きのうほう)」
この2つしか方法はない。
演繹法とは
演繹法とは、以下のような方法だ。
★既に正しいと分かっていることを基にして、論理的に結論を導き出す
例えば、以下のようなことを証明したいとする。
嗣永桃子はNo.1アイドルである
既に分かっていることは、以下だ
- ハロー!プロジェクトはアイドル界トップのアイドル集団である
- 嗣永桃子は、ハロー!プロジェクト内トップのアイドルである
ハロプロはアイドル界トップ
→嗣永桃子はハロプロトップ
∴嗣永桃子はNo.1アイドルである
以上、証明終了!
これが演繹法による証明だ。
帰納法とは
帰納法とは、以下のような方法だ。
★複数の事象を基に1つの結論を導き出す
この帰納法で重要なのは、「複数の事象」が多ければ多いほど結論はもっともらしいが
完全な証明をするためには「全ての事象」を検証しなければいけないところだ。
例えば、以下のようなことを証明したいとする。
嗣永桃子はNo.1アイドルである
世の中にいるアイドルを全て調べ上げ、1人1人と嗣永桃子を比較する。
「1人目よりももちの方がすごい、
2人目よりももちの方がすごい、
3人目よりももちの方がすごい、・・・・最後の人よりももちの方がすごい」
ももちよりすごいアイドルはこの世に1人もいなかった。
∴嗣永桃子はNo.1アイドルである
以上証明終了!
これが帰納法による証明だ。
悪魔の証明
~ももちは現役時代、一度もトイレに行かなかった~
これを証明するにはどうしたらいいだろか!?
逆に、トイレに行っていたことを証明することは難しくない。
一度でもももちがすっきりした顔でトイレから出てくる現場を押さえればいいのだ。
しかし、トイレに一度も行かなかったことを証明するのは、現実的には困難だ。
何故なら、24時間365日監視して、本当に1度もトイレに行かなかったのか見張っておかなければならないからである。
もちろん、そんなアイドルのプライバシーを損害するようなことはできない。
「無いことの証明は非常に困難」ということで「悪魔の証明」と呼ばれる。
しかしこれは「帰納法」に限った話なのだ。
これを読んだ諸君は、「無いことの証明はできない!悪魔の証明だ!」
なんて詭弁をのたまわずに、論理的に無いことを証明できるか(演繹法)
諦めずに考えてほしい。
システム開発において
では、システム開発において「作成したプログラムが正しく動作すること」
を証明するにはどうすればよいか?
演繹法と帰納法、それぞれの観点で証明するとしよう。
ソースコードレビュー = 演繹法
ここのロジックがこうなっていて、ここのロジックがこう・・・
設計書に書かれている通りに実装されていて、設計書にも論理的間違いがなく、コーディングミスもない。
このプログラムは正しいといえる!
的な感じで言い張るのが演繹法でのプログラムの正当性の証明である。
これはすなわちソースコードレビューだ。
テスト = 帰納法
Aのパターンでプログラムを動作させたら想定通り動いた、
Bのパターンでプログラムを動作させたら想定通り動いた、
・・・
考えうる全てのパターンで動作させたら想定どおり動いた。
このプログラムは正しいといえる!
的な感じで言い張るのが帰納法でのプログラムの正当性の証明である。
これはすなわちテストだ。
どっちも大事
ソースコードレビューは目視確認なので、どうしても人為的ミスがあるかもしれない。よってソースコードレビュー(=演繹法)だけで100%正しいことを担保するのは難しい。
一方、テストはどうだろう。仮に考えうる全てのパターンでテストができれば、そのプログラムは100%絶対に正しいと言えるだろう。
しかし現実的に全てのパターンでテストすることは難しい。分岐網羅で全パターンテストしようとすると、IF文の分だけ掛け算でテストケースが増えてしまって、莫大なテストパターンをこなさなければいけなくなるからだ。
結論としては、両方を上手に組み合わせて、より効率的にバグをつぶすということが大事ってことなんだなあ。
最近のコメント