川村渇真の「知性の泉」

浮遊思考記録−2002年05月


●2002年5月30日

仕様として正確に記述することの難しさ

 何かの演習課題を与える場合には、課題の内容を正確に説明する必要がある。しかし、説明する対象が複雑になるほど、作業の難しさも増す。
 たとえば、新入社員向けのプログラミング実習を考えてみよう。何かのゲームを課題として与え、それを実現するためのプログラムを作ってもらう状況だ。これを行うためには、ゲームの内容を正確に説明しなければならない。
 ゲーム内でどんな道具を用い、どんな手順でゲームが進み、どのように点数を計算し、どうなったら勝負が決まるのかなど、基本的な要素を説明する。また、どのような例外があるのか、どんな禁止事項があるのかなども、考えられる限り説明しなければならない。プログラムとして実現するので、疑問が生じない形での説明が求められる。
 実際に作ってみると分かるが、正確に説明するのは非常に難しい。そのため、多くの説明者は、文章による説明を大まかな内容で済ませ、ゲームの実行例を何個か示す方法で補う。こうした方法だと、記述内容が不完全になりやすく、説明を読んだ人から質問が続出する。後で出る質問が多いほど、説明の失敗は大きい。

 では、正確に説明するためには、どのような能力が必要だろうか。真っ先に思い付くのは、作文技術だ。自分で考えたことを文章として書く能力は、絶対に欠かせない。内容を正しく書くことが重要なので、分かりやすく伝える書き方だけでなく、論理的に書ける能力が求められる。
 内容が簡単ではない場合(そういう場合が実際に多いのだが)、内容を整理する能力も必要となる。単に分類するような整理ではなく、含まれる要素を上手に構成する能力である。できるだけ体系的に構成し、説明内容の全体像が正しく伝わりやすい形にまとめ上げる能力だ。
 このような説明には、文章以外の要素が欠かせない。全体像を分かりやすく示すなら、含まれる要素と関連性を図として描く方法が役立つ。また、全部のルールを分類して整理するとか、適用状況の種類を分類するときは、表の形で示した方が正確に表現できる。こうした表現方法を上手に使える能力もあるとよい。

 正確に説明するのが一番難しいものの1つに、何かの規格の記述がある。その中でも、ソフトウェアに関する規格は、中身の複雑さでトップに立つ。そうした内容を正確に記述するのに、文章や図だけでは不十分だ。要素の種類が多いため、それらが許される組み合わせや並び順などが、どんなルールになっているのか、正確に記述するのが難しくなる。
 こうした点を解消するために、専用の言語を使っている場合が多い。たとえば、XMLの仕様書では、EBNF表記法が使われている。このような表記方法を用いると、かなり複雑なルールや要素構造でも、極めて正確に表現できる。もちろん、採用した表記方法の説明も必要だが、既存の表記方法であれば、新たに説明を作成する必要はない。
 では、このような表記方法を用いるだけで十分だろうか。実は、そう単純ではない。こうした表記方法で説明できるのは、説明内容の本体部分だけであって、他の部分に関しては、別に説明する必要がある。その場合も同様に考え、他の部分の要素に適した表記方法を用いることになる。
 ここで重要なのは、説明内容の本体部分の他に、どんな要素を加えるべきかだ。思い付くものをいくつか挙げてみよう。分かりにくい機能や要素が含まれているなら、その目的(付けた理由)や使い方も必要になるだろう。本体部分を利用するときに、どのような手順が必要だとか、一緒に使用できないといった制限なども、あれば加える必要がある。また、仕様どおりでないデータが来たとき、どのように処理すべきかも、示した方がよいなら記述する。さらに、ルールを守っているかどうかの検査方法も考えられる。他にも、いろいろとあるだろう。
 どんな要素を追加するかは、それが示されなかった場合に、余計な混乱が生じるかどうかで選ぶ。通常は、説明内容の中心部分が利用される状況を考えると、気付きやすい。実際に使う状況を思い浮かべながら、どんな点が不明だと困るのか、どんな点に疑問を持つか考えて求める。

 複雑な内容を正確に記述するのは、慣れてないと相当に難しいし、書く時間も長くなる。IBMのdeveloperWorksの某記事でも、仕様を正確に記述することは高いコストが伴うと書かれている。実際、現状ではそのとおりだ。
 しかし、記述の正確性が低いほど、それを利用する側のコストが高くなる。利用側の合計コストは、書く際に節約しようとしたコストに比べると、何万倍とか何億倍という桁になる。社会全体のコストを考えたら、最初の段階で多少のコストがかかっても、可能な限り正確に記述することは非常に重要なのだ。
 正確な記述にコストがかかる主な原因は、仕様レベルの記述方法が、体系化された形で作られてないことにある。同様に、規格として適切に設計する方法も、体系化された形で用意されていない。こうした設計方法や記述方法を独立した技術として確立し、誰もが習得できる形で残せば、現状ほど高いコストをかけずに、仕様の正確な記述が実現できる。当然、社会全体での無駄なコストを大幅に削減できる。そんな点に気付かないと、いつまで経っても、余計なコストを負担し続けなければならない。
 体系化や規格化に使う技術は、私の研究テーマでもある。優先度が低いために時間を割り当てていないが、そのうちに大枠だけでも公表したいと考えている。いつになるのか確約はできないが……。

 それまでの間は、ここで説明した内容を参考にして、自分で次のように考えて作業するとよいだろう。
 仕様として記述するのは難しいので、いつもよりは真剣に頭を使う。そのうえで、説明内容を整理してみる。読み手の視点で考えるのが基本だ。全体の構造や構成がどのようになっているのか、主な要素には何があり、どんな関係を持っているのかなどを求める。さらに、それを利用する際に困らないためには、何が必要なのかも考える。こうした視点で考えれば、説明内容に含むべき要素が明らかになりやすい。
 最初のうちは、記述内容を誰かに見せて、疑問点を指摘してもらう方法が役立つ。指摘された部分は、記述が漏れていたり、分かりにくかったりする箇所だからだ。こうした作業を繰り返すと、少しずつ上手になっていくだろう。
 仕様の形で正確に記述する能力は、物事を正しく把握する基礎にもなる。つまり、物事の良し悪しなどを見分ける能力も同時に高まるわけだ。そういった気持ちで活動すれば、多少の苦労も少しは我慢できるのではないだろうか。


下の飾り