2014/11/15

難しいプログラムでは自分がいままで書いたコードやこれから書くコードが正しく動くと信じて残りのコードを書く必要がある

難しいプログラムでは自分がいままで書いたコードやこれから書くコードが正しく動くと信じて残りのコードを書く必要がある。

単純なプログラムならプログラムの動作を頭のなかで具体的に考えてみることができる。ソースコードの上から下に直線的に実行が進んでいくようなプログラムだと、頭のなかで実行してみるのも難しくはない。

しかしある程度以上にプログラムが複雑になってくると、プログラムの実行状況を想像するのは困難になってくる。特に再帰的なプログラムではそれが顕著だ。例えば入力を再帰的な関数でパーズしている場合、再帰呼び出しの深さがどれくらいになるのかは読み込んでいるデータに依存するので、プログラムを書いている時点で実行状況を完全に想像することはできない。そういうプログラムを頭のなかで無理にトレースしてみようとしても、可能な実行状況は無限にあるので、トレースできない。結果として、そのプログラムはわけがわからないという印象になることがあると思う。

そういうプログラムを書く(あるいは読む)ときにはある種のコツがある。

それが何かというと、関数呼び出しを書いたとき(あるいは見たとき)、その関数は自分が想定しているとおりの仕様に従って結果を返すのだと信じて、それ以上は特に考えないことだ。それだけで問題の半分は解決できたことになる。あとはその条件を満たすようにその関数を書けばよい。そうすると呼び出し側と呼び出される側の条件が完全にマッチして、プログラムは正しく動くようになる。

こういうふうにコードを書くと、自分で書いたのに、なぜ動くのか自分では完全には納得できないプログラムというのができあがってしまう。でもそれを不思議だと感じるかどうかはあくまで主観的な問題だ。関数が正しく実装されていて、 かつ関数呼び出し側の想定が正しいのなら、プログラムは全体として正しく動く。それは間違いない。数学的帰納法みたいなものだ。それでよしとするのがいいと思う。