2016年08月29日
バグのないプログラムはない、ということについて
ソフトウェア業界では「バグのないプログラムはない」ということがまことしやかに語られる。
実際、ソフトウェア開発の最終段階では、「バグ出し」と言って、バグの数の目標値を設定して、決められた期間内にその目標の数のバグを見つける、ということをする。
ここでの目標値とは、プログラムの行数から、「何行あたりバグ1件」というような計算で求め、その目標の数だけバグを見つけるまでテストを行う。
たとえば、そのバグ出し期間が2週間で、バグの目標値が100件とする。バグ出しが1週間経ったところで、20件しかバグが見つかっていなければ、スケジュールが遅れている、と見なされるのだ。
これは何かおかしくないか?
実際、ソフトウェア開発の最終段階では、「バグ出し」と言って、バグの数の目標値を設定して、決められた期間内にその目標の数のバグを見つける、ということをする。
ここでの目標値とは、プログラムの行数から、「何行あたりバグ1件」というような計算で求め、その目標の数だけバグを見つけるまでテストを行う。
たとえば、そのバグ出し期間が2週間で、バグの目標値が100件とする。バグ出しが1週間経ったところで、20件しかバグが見つかっていなければ、スケジュールが遅れている、と見なされるのだ。
これは何かおかしくないか?
普通の考え方では、100件あると予測されているバグが20件しかなかったら、それは優秀なプログラムである。
ところがソフトウェア業界での常識とされている「バグのないプログラムはない」という観点では、100件あるはずのバグの内、20件しか見つかっていない、という考え方になる。
オブジェクト指向は、オブジェクト内で完結するように設計をする。
これにより、プログラムは「全知全能の神」であることを逃れることができる。このことは、プログラムにバグが入り込むことをかなり少なくできる、ということである。
一度プログラムされたオブジェクトは再利用ができ、また微妙に異なるが似ているようなオブジェクトはその差異だけを新たにプログラムして、元のものを再利用する、というようなことができるので、そのオブジェクトはどんどん洗練されていく。(これを「枯れる」と呼ぶ)
オブジェクトの再利用を目論むのであれば、そのオブジェクトはプリミティヴなものであるほど再利用しやすい。
これを文章を書くことに例えるなら、ある文章を書く時に、前に書いた別の文章の文をまるまる再利用する、ということはあまりない。その文章が前回のものと異なるトピックであればなおさらだ。
だが、その文章の中には同じ名称や単語は出てくることがあるだろう。これを「再利用」と呼ぶのかどうかは別として。
さらには文字単位で考えると、同じ言語で文章を書いているのであれば、別の文章で同じ文字が何度も登場するということは当たり前のことだ。
これと同じようなことをオブジェクト設計で考えるということである。
オブジェクト指向ではない設計、あるいはオブジェクトの抽象度が低い、つまり「一文まるまる」のようなオブジェクトでできた設計というものは、再利用性が低く、バグが入り込みやすい。
逆に、オブジェクトの抽象度が高い、つまりできる限りプリミティヴな単位にまで抽象化されたオブジェクトからなる設計は、再利用性が高く、そのため「枯れ」やすい。また、そのプリミティヴなオブジェクト内でのロジックは、必然的にシンプルなものになるので、バグが入り込みにくい。
プリミティヴなオブジェクトを積み重ねて複雑なものを作り上げていくこと。
これは低級言語を土台として高級言語が作られていくことに似ている。
あるいはこの世界を理解しようとする時に、自明の瑣末なことをとりあえずxとして考える、ということにも似ている。
バグがない、という確信が持てるプリミティヴで枯れたオブジェクトをとりあえずxとして、より高次の問題を扱うプログラムを組み上げていく、ということで、バグは限りなく0に近づけることができるはずである。
ところがソフトウェア業界での常識とされている「バグのないプログラムはない」という観点では、100件あるはずのバグの内、20件しか見つかっていない、という考え方になる。
オブジェクト指向は、オブジェクト内で完結するように設計をする。
これにより、プログラムは「全知全能の神」であることを逃れることができる。このことは、プログラムにバグが入り込むことをかなり少なくできる、ということである。
一度プログラムされたオブジェクトは再利用ができ、また微妙に異なるが似ているようなオブジェクトはその差異だけを新たにプログラムして、元のものを再利用する、というようなことができるので、そのオブジェクトはどんどん洗練されていく。(これを「枯れる」と呼ぶ)
オブジェクトの再利用を目論むのであれば、そのオブジェクトはプリミティヴなものであるほど再利用しやすい。
これを文章を書くことに例えるなら、ある文章を書く時に、前に書いた別の文章の文をまるまる再利用する、ということはあまりない。その文章が前回のものと異なるトピックであればなおさらだ。
だが、その文章の中には同じ名称や単語は出てくることがあるだろう。これを「再利用」と呼ぶのかどうかは別として。
さらには文字単位で考えると、同じ言語で文章を書いているのであれば、別の文章で同じ文字が何度も登場するということは当たり前のことだ。
これと同じようなことをオブジェクト設計で考えるということである。
オブジェクト指向ではない設計、あるいはオブジェクトの抽象度が低い、つまり「一文まるまる」のようなオブジェクトでできた設計というものは、再利用性が低く、バグが入り込みやすい。
逆に、オブジェクトの抽象度が高い、つまりできる限りプリミティヴな単位にまで抽象化されたオブジェクトからなる設計は、再利用性が高く、そのため「枯れ」やすい。また、そのプリミティヴなオブジェクト内でのロジックは、必然的にシンプルなものになるので、バグが入り込みにくい。
プリミティヴなオブジェクトを積み重ねて複雑なものを作り上げていくこと。
これは低級言語を土台として高級言語が作られていくことに似ている。
あるいはこの世界を理解しようとする時に、自明の瑣末なことをとりあえずxとして考える、ということにも似ている。
バグがない、という確信が持てるプリミティヴで枯れたオブジェクトをとりあえずxとして、より高次の問題を扱うプログラムを組み上げていく、ということで、バグは限りなく0に近づけることができるはずである。