【15】コードの論理的検証

イェッチェル・キムチ(Yechiel Kimchi)

 ソフトウェアに誤りがないことを論理的に検証するための「形式的証明(formal proof)」という手法があります。しかし形式的証明を手作業でやろうとすると、コードそのものを書くより手間がかかり、しかもその際にミスが起きる恐れもあります。自動ツールが使えればそのほうが望ましいのは確かですが、いつもそれが可能とは限りません。ここは間を取って、半形式的証明とでも呼べる方法をここでお話ししましょう。

 まずすべきことは、対象となるコードをすべて短いセクション——1 行、ファンクションコール 1 つだけのブロックから 10 行くらいのブロックまで——に分割することです。そうして短く切った上で、個々のセクションが正しいかどうかをチーム内で話し合うのです。その場合、どのセクションについても、メンバーの中で最も懐疑的な態度の人が正しいと納得すれば、一応「正しい」とみなしていいでしょう。

 コードをセクションに分ける際には、まずセクションの終端までの間で、プログラムのステート(プログラムカウンタや、すべての「生きた」オブジェクトの持つ値)が、簡単に説明できるようになっていることが重要です。また、セクションの中での機能(状態変化)は 1 つのタスク(仕事)に絞りこまれていて、これも簡単に説明できることが大切です。このガイドラインを守ると、検証が容易になり、関数の 事前条件事後条件、ループやクラス(のインスタンス)の 不変条件(invariant)といった概念の意味を統一することにもつながります。個々のセクションをできるだけ他から独立させるように努力することも重要です。これも、もちろん検証を容易にすることに役立つわけですが、セクションに変更を加える際に、他への影響を考えずに済むという意味でも、絶対に必要なことと言えます。

 よく知られていて、一般的に良いとされている(しかし実際にはあまり実践されていない)コーディングプラクティスの多くは、コードの論理的検証を容易にする上でもやはり役立ちます。これは逆に言えば、論理的検証を楽にしようと努力するだけで、コードのスタイルや構造の改善につながるということです。実践すべきコーディングプラクティスの例を次にあげておきます。当然のことながら、こうしたプラクティスが守られているか否かは、多くの場合、静的コード解析によって自動的にチェックできます。

 コード正しさを論理的に検証すると同時に、コードの内容についても検証をし、チーム内で話し合うようにすれば、より理解を深めるのに役立ちます。自分が理解したことを互いに伝え合えば、全員にとって利益になるでしょう。