仕様書にオッカムの剃刀を振るう
システムの仕様書はシンプルであるほうが良いのでしょうか。
オッカムの剃刀とは、Wikipediaによれば
「ある事柄を説明するためには、必要以上に多くの実体を仮定するべきでない」( Entities should not be multiplied beyond necessity )という指針
との事です。また、はてなダイアリーでは
直訳すると「必要もなく多数化するな」
もう少し砕いて書くと「同じ事を説明するやり方が2つあるなら、シンプルな方にしとけ」
とのことです。滅多に使う言葉ではありませんが、たまに「同じ事を説明するやり方が2つあるなら、シンプルな方にしとけ」というような意味の格言として思い出すことがあります。タイミングは仕様書作りの時です。
例えば「Aという画面ではBという処理をするためにCというボタンを表示する」という内容があったとします。私の個人的な好みからしたら、
- Aという画面にはCというボタンを設置する
- CというボタンはBという処理を起動する
というように2つの文章に表記するほうが好きです。その理由は、仮にBという処理がシステム要件の変更と供にXという処理に変更になった場合、
- Aという画面にはCというボタンを設置する ⇒ A画面に対する改修は不要
- CというボタンはBという処理を起動する ⇒ Cボタンに対してB処理をX処理にする改修が必要
という判断がし易いからです。「Aという画面ではBという処理をするためにCというボタンを表示する」とあると、頭の中で分解していかなくてはなりません。ですので、できるだけ1つの文章では1つの事実だけを含むように心がけています。
そのルールからすれば、「Aという画面ではPというプログラムにQというデータを渡すためのBという処理を起動するため、Cというボタンを表示する」という表記は好きではありません。コーディングする側からすれば、『PというプログラムにQというデータを渡すための』という文章は余計です。A画面を作ってCボタンを設置し、押下時にB処理を起動するようにするだけで良いはずだからです。
しかしながらこういった文章のほうが適した場合もあります。それは開発メンバーに業務仕様を理解してもらうように説明するようなケースです。そのような場合、「Aという画面ではPというプログラムにQというデータを渡すためのBという処理をするため、Cというボタンを表示する」というほうがストーリー性があって理解しやすいため、こちらの表現を好むという方もおられると思います。
確かに箇条書き状態になった仕様書からでも、機械的にコーディングしていくことは可能です。むしろテストなどを考えるとそのほうが効率が良いかもしれません。しかしながら自分が書いているプログラムの存在意義が把握しにくくなりますし、機械的にコーディングしていけるほど完璧な仕様書というのを作るにはそれなりのマンパワーが必要です。
そのためついつい『PというプログラムにQというデータを渡すための』というような表現が出てきてしまい、「後々、Pというプログラムに渡すんだから、細かなところは作り手さんの裁量でよろしくお願いね。」というコーディング担当者に甘えた姿勢になることもあり得ます。(もちろん良くないことです。ただしコーディング担当者は自分の裁量が大きいほうがモチベーションが上がる性質があるように思います。)
そのような状況下では、担当者の親切によりドキュメント化されていない”仕様”がソースに反映されてしまいます。もしくはその仕様をドキュメントに反映し直すことが想定されます。そうした後で『PというプログラムがRというデータを渡す』というような変更が発生した場合には、Pというプログラムの仕様書は正しく変更がされるでしょうが、その修正の担当者はA画面の仕様書内にも『PというプログラムにQというデータを渡す』という表記が生まれていた事に気付かないかもしれません。
そのような状態が放置されつつ別の要件でA画面に改修が発生した場合、古い仕様である『Qというデータを渡す』という前提で改修を進めてしまう可能性が考えられるでしょう。これは正規化されていない関係データベースの更新異常にも似た現象です。
このような事態を想定すると恐ろしいものがあります。ここのところはやはり上に書いたとおりに
- Aという画面にはCというボタンを設置する
- CというボタンはBという処理を起動する
とだけ表記し、もしA画面内でBという処理をするために何らかの処理を加える必要があるのであれば
- B処理を起動する前に、状態Sであった場合はB処理を起動しない
というような詳細な仕様までドキュメントに記載するのが良いでしょう。こういった事例を考えると、オッカムの剃刀という言葉のニュアンスを借りてきてそれを心がけにする事は意味があることのように思います。