メッセージ一覧表は本当に必要なのか

ふと思い出したので、考えをまとめるために書いてみようと思う。

ソフトウェア開発では、よく「メッセージファイル」なるものを作成する。アプリケーションが使用するメッセージの情報をまとめたもので、その中身はメッセージ文字列とそれに対応するIDである。大抵の場合プロパティファイル形式であったり、最近はXML文書だったりする。

さて、いつのことだったかは忘れたが、メッセージファイルについて先輩エンジニアと意見が衝突したことがある。お題は「メッセージ一覧表を作るべきか」。

先輩が、メッセージの一覧表をメッセージファイルとは別にMS Excelで作成し、それをマスターとすべきだと主張したのに対して、俺はメッセージファイル自体をマスターとすれば良く、いちいち別ファイルを作る必要は無い、と主張した。

結局は、俺が譲ったのを覚えている。簡単な管理対象ファイルが一つ増えるだけだったので、それほど大した問題ではなかったためだ。

しかし、この件についてはいまだに納得いっていない。

大前提として、「二重化は悪である」。同じ情報を複数の場所に書くと、後々変更が入ったときに更新のし忘れが発生して必ず同期が取れなくなる。その結果、それぞれで違うことが書き残され、どれが正しくどれが誤っているのかがわからなくなる。

ところで、設計書とは成果物であるアプリケーションを表現する資料である。また、ソースコードも、成果物であるアプリケーションを表現する資料である。つまり、設計書とソースコードは二重化してしまっている。よって、両方が共に存在してはならない。両者を比較してより重要なのはソースコードである。なぜなら、コンパイルすることで最終成果物を生成できるからだ。よって、設計書は作成してはならない。

・・・そんなことはない。業務経験から考えれば、設計書無しに複雑なアプリケーションを開発するのは至難である。設計書は必要だ。では、先に書いた論理に誤りがあるのであろう。穴はどこにあるのか。

「二重化は悪、よって絶対にそれをすべきではない」という考えが固すぎるのが問題点なのである。例えば、おいそれと停止しては困る基幹システムに冗長系を用意しておいて、いざ障害が発生したときに即座に切り替えることでMTTRを最小にする、というのは優れた戦略である。管理対象が増えることでコストがかさむが、それを補って余りあるメリットがあるので、ここでの二重化は許される。

となると、設計書にも「リスクを補って余りあるメリット」が存在するであろうことがわかる。それは何か?おそらく、「異なる視野・視点を得ることができる」点がそれであろう。複雑なアプリケーションを開発するときは、対象を多面的・多角的に検証しなければならない。ソースコードだけでは得られない角度からの参照を実現するために、設計書はある。

ここから導かれることは、「設計書は必ずソースコードとは違う視点で書かれなければならない」という結論である。同じレベルの内容を別資料に書いてもなんら嬉しくない。

メッセージ一覧表は設計書の一種である(やっと戻ってきたぞ!)。よって、メッセージ一覧表は、ソースの一部であるメッセージファイルとは異なる視点でメッセージというものを表現しなければならない。さて、この両者を比較したとき、本当に異なる視点となっているのだろうか?

メッセージ一覧表

000001 システムエラーです。
000002 リソースファイルを読み込めません。
000003 DBとの接続に失敗しました。

メッセージファイル

000001=システムエラーです。
000002=リソースファイルを読み込めません。
000003=DBとの接続に失敗しました。

・・・同じだろう?間に罫線が這い回っているかどうかという、見た目の違いでしかない。同じである以上、二重化を行うメリットは無く、メッセージ一覧表の存在意義はここに消滅する。

メッセージファイルがXML形式になると、ちょっと見た目が変わって見づらくなるかもしれない。しかし、どうしても格好良くてすばらしく見やすい形式にしたければ、別ファイルに書いたりせずに、HTMLのtable形式にコンバートするためのスタイルシートを書けばよい。いまどき、xsltプロセッサなど珍しくも何ともない。こうしておけば、メッセージの情報自体はメッセージファイルにしか存在しないので、二重化にはならない。

そういうわけで、俺はメッセージ一覧表の存在を認めない。これに限らず、ソースコードレベルで表現できていることを別形式にするだけになっている無駄なコメント、無駄な資料の存在を許さない。手間が増えるだけだ。

むろん、メッセージ一覧をユーザマニュアルに書かねばならない、客が納品物として一覧表を要求してくる、といったような制約がある場合は、この限りではない。ご愁傷様、情報の食い違いに怯えながら二重管理してくれ。まぁPOIみたいなライブラリを利用する方法もあるけどね。

・・・当然の結論に達するために無駄に長く書いたものだが、そんなわけで今後の開発でもこの手の話が上がったらまず反対する所存である。いつも心にゼロベース思考。