公開: 2021年7月25日
更新: 2021年9月7日
100行のプログラムを誤りなく作ることは簡単です。しかし、10万行のソフトウェアを何人かで、誤りなく作ることは容易ではありません。さらに、100万行の規模のソフトウェアを、何十人、何百人の人で、数年間で、誤りなく作ることは、実際にはできません。もちろん、誤りが残っていて良いのであれば、話は別です。規模の大きなソフトウェアを、「誤りなく作る」ことは、それほど難しいのです。
それは、100万行の書きものを、誤字や脱字なしに書き、印刷して、出版するのと似ています。100万行の書きものは、大体、28,600ベージの書きものです。それは、300ページの本にしても、約95冊分の量です。私たちが書く、200ページ程度の本にも、普通、数十の誤字・脱字が残ります。もちろん、出版社は、誤字・脱字をできるだけなくそうと、著者や編集者などが、最低でも2回は読み直します。それでも間違いはなくなりません。
仮に、そのような『校正』という手続きを通して、1冊300ページの本で、100冊に1冊だけ「誤りのない」本を作ることができるとしましょう。その確率は、300ページの本の場合、「100分の1」です。そのような本が95冊あるのですから、95冊の本、全てに「誤りがない」という例が起こるのは、0.01の95乗に等しくなります。つまり、0.0....01の小数点の次の0と、最後の1の前の0との間に、180個以上の0が続く数字です。これは、私たちが生きている間には見ることがない現象と言えます。
さらに、ソフトウェアを作る時に入る「誤り」には、本の誤字・脱字よりも、もっと複雑な間違いがあります。特に、ソフトウェアを作る作業に関わる人の数が増えることで、ある人が「伝えたい」と思ったことと、別の人が、それを聞いて「分かった」と思うことが同じではないことがあるからです。これは、話した人の「言い間違い」や、聞いた人の「聞き間違い」などだけでなく、その二人の間にある、「言われなかったこと」や「聞いていないこと」についての理解の違いがあるからです。
すでに説明した様に、コンピュータが動いているからと言って、コンピュータが計算した結果が正しいか、または、コンピュータやその上で動いているソフトウェアが、作った人々が思っていたような結果を出しているかどうかは、はっきりとは分かりません。コンピュータが出した答えが正しいと言えるのは、コンピュータが正しく動き、かつ、その上で動いたソフトウェア、つまり動いたたくさんのプログラムのどこにも、誤りがなかった場合に限られます。1秒間に何百万回と計算をしているコンピュータですから、コンピュータの計算が正しい計算をしないことが、1千万回の計算で1回起こるだけであっても、10秒間には、1回程度の間違いが起こる計算になります。
コンピュータの計算が間違っていても、それをプログラムで確認して、間違っていた可能性がありそうな場合には、もう一度、計算をやり直すプログラムを組んでおくことはできます。その場合、計算を確認するプログラムを動かしている間に、コンピュータが計算を間違えなければ、コンピュータの間違いは、結果的になくすことができます。とは言っても、1千万回に1回起こるコンピュータの誤りは、1千万分の1の確率で起きるわけで、それが2重に起きる可能性は、1千万分の1の2乗の確率になるので、ゼロにはなりません。長い時間、コンピュータを使い続ければ、コンピュータの誤りは、いつかは発生します。
さらに、コンピュータが動いている時、その計算は、プログラムの指示で行われています。ですから、動いているプログラムに誤りが残っていれば、たとえコンピュータが正しく動いていたとしても、コンピュータが行う計算は間違っていることになります。それでは、プログラムに残っている誤りとは、どのようなものなのでしょうか。既に説明したように、プログラムは、どのような条件が成り立っている時、記憶装置のどの部分に蓄えられている計算の途中結果の値を、どのように計算して、計算結果を記憶装置のどの部分に蓄えるのかを指定します。この条件の確認の仕方、記憶装置のどの部分に蓄えられた値を使うか、どのように計算をするのか、計算結果を記憶装置のどこにしまうのかの指定を、どれか1つでも間違えると、プログラムの計算は、それを作成した人が考えていたものとは違ってきます。
最近の、巨大なコンピュータを使うソフトウェアでは、その数多くのプログラムで指定されている大量の計算は、この条件の指定、記憶装置の場所から値を呼び出す指定、計算方法の指定、そして計算結果を蓄える記憶装置の場所の指定、などを1行で指定していると言えます。ソフトウェア全体では、書かれているそれらの指定の行数は、数百万行から、数千万行になることが分かっています。その数百万行から数千万行の書きものを、全く間違いなしに書き終えることは、理論的には可能かもしれませんが、実際にはできません。プログラムを書くのは人間です。実際にプログラムを書く人々は、1,000行のプログラムを書くと、数十行を間違えることも分かっています。
そのような間違いには、指定する条件が正しくないもの、計算に利用する途中結果を蓄えている記憶装置の場所の指定を間違えるもの、計算方法そのものに誤りがあるもの、計算結果を蓄える記憶装置の場所の指定を間違えるもの、などが代表的です。さらに、それらの誤りには、単なる書き間違いのようなもの、プログラム作成者の記憶に間違いあったことが原因であるもの、ユーザからの説明を間違って理解したことによるもの、プログラム作成者同士の会議で決めた約束事を間違えて理解してしまったことによるもの、などがあります。
さらに同時に複数のプログラムが実行される可能性がある場合、記憶装置の場所を求める時に使う場所の計算方法を間違えたり、記憶装置の場所を求めるときに参考にする基本的な値を、それぞれの場合の条件に合わせて設定できるように、先に入力された値の計算中に、後に入力された値の計算を始めても、後の入力の受け取りを行ってから、先に入力された値の処理に戻れるようにするときのやり方をしっかりと行うことなどが、必要になります。このような処理は、複数のプログラムが同時に実行される場合には、必ず必要になるので、経験のあるプログラム作成者には当たり前のことですが、経験が不足しているプログラム作成は、時々、忘れる傾向があります。
数万行を超えるソフトウェアを作る時、一定の時間内に作り上げるために、数人から10人ぐらいのチームで、手分けをして作ります。一人一人の人が作るプログラムは、数百行から数千行です。それでも、最初に書かれたプログラムには、全体で500から1,000の誤りが含まれているでしょう。それらの誤りの多くは、プログラムを釣った人、本人が確認をして、見つけられ、取り除かれます。しかし、数十から100ぐらいの誤りは、取り除かれずに残ります。そのため、普通の場合、作ったプログラムをコンピュータ上で動かし、入力に対して、期待しているような出力が得られるかどうかを確認します。
この確認は、全ての場合を網羅するように行うべきなのですが、プログラムを作成した人は、「自分が間違っているかもしれない」とは考えないので、自分に自信がない部分に注意をして、プログラムの動きを確認することがしばしばです。しかし、多くの場合、後で見つけにくい間違いの多くは、プログラムの作成者が予想もしなかった部分に残ることが多いのです。このため、最近では、プログラムを作成した本人だけでなく、周囲の人々も作成されたプログラムを読んで確認する例が増えてきています。こうすることで、プログラム作成者の思い込みによる間違いを発見できる場合があります。
このようなプログラム作成者以外の人を巻き込んだ、「プログラムの読み合わせ」は、読み合わせに参加する人々が、どれだけ真剣に取り組むかで、残っている間違いをしっかりと発見できるかが決まります。他人が書いたプログラムを読む作業は、退屈で、一字一字、真剣に確認していないと、プログラムに残っている間違いを見逃します。特に、プログラムの書き方は、「あることをしようとする」時、ただ一つの書き方に決まるわけではなく、数多くの書き方が考えられます。このため、プログラムを読み合わせる人は、「このプログラムは、正しいか」を問題にするよりも、「このプログラむには、もっと良い書き方はないのか」を考え、「どのようなプログラムを書くのが良いのか」をプログラムを作成した人と、読み合わせをする人々との間で議論することが大切です。
プログラムのこのような読み合わせは、数学の論文を作成した人と、その論文を読んで、内容に問題がないことを言う人たちとの間で行われる議論に似ています。そのような議論を通して、読みやすく、間違いが少ない論文に仕上げることができるからです。読みにくい論文は、誤りが残っていても、それを見つけ出すことが難しく、誤りである可能性は高くなります。このことは、プログラムの読み合わせでも当てはまります。しかし、現在、社会の中で、仕事としてプログラムを作成している人々の多くは、「プログラムの読み合わせが、数学の論文の確認作業が似ている」と考えている人はあまりいません。
確かに、かつての社会では、それほど大きなプログラムを作ることはありませんでした。数万行のソフトウェアは、大規模なソフウェアでした。最近では、数百万行のソフトウェアも、極端に大規模なソフトウェアとは言われなくなっています。例えば、自動車を動かしている部品の中に組み込まれているコンピュータのために書かれたプログラムを合わせると、数千万行になると言われています。これは、1ページに45行を印刷した本にすると、約45万ページの本になります。それは、1冊当り350ページの本にすると、1,280冊になります。これまで、歴史的に書かれた本でも、それほどの大部に渡る書きものはありません。
それだけの大部の本を、その作成に携わる全ての作業者が、1つの方針のもとに、その企画から、原稿作成、原稿の内容確認、印刷、製本までを、しっかりと行うことは、ほとんど不可能なことでしょう。本の場合であれば、それを読むのは人間です。それを書くのは、日本語などの言葉です。ですから、作られた本の中に、文字の間違いがあっても、それに気づく人は、ほとんどいないでしょう。つまり、誤字・脱字のような間違いは、あったとしても、ほとんど問題は起きないのです。これに対して、プログラムでは、それを動かすのはコンピュータです。プログラムに間違いがあれば、それによって起こることは、間違った結果が出力されることになります。
このようなことを考えると、ソフトウェアは、小説などを印刷した本よりも、憲法や法律を印刷した、六法全書のような書物に近いことが分かります。六法全書には、印刷上の間違いも残っていますが、そこに書かれた法律そのものの問題も残っています。法律そのものの問題は、国会で議論され、法律の改正などによって、後日、修正されます。ソフトウェアについても、プログラムの誤りは、後日、誤りが発見された後に、プログラムの修正が行われます。