2004-11-26

_よくあるソフトウェアのデザイン不良

最近 ZSQLCatalog を改良してるんですが、 新しい機能を追加するのが当初の目標だったのが、 後半は構造を修正する作業に。 大して時間はかからなかったので、 元からそう悪い設計ではなかったんでしょうけれど、 よく考えておけばもっと楽だったんじゃないかと考えてます。

それで、ソフトウェアで、 時には全面的書き直しが必要になるほど、 デザインがまずい例はどういうのがあるだろうと考えてみました。 すると、私が今まで味わってきたミスデザインの大部分は

複数あり得るものを一つしかないと思い込んだ

ということに尽きるのではないか、という印象を持っています。 これは必ずしも同じタイプのオブジェクトが複数というだけでなく、 さまざまなものがたくさんというケースも含まれます。

グローバル変数なんてのはまさにこれの代表例で、 一個しかないと考えているから、 プログラム中全体で同じものを扱ってしまう訳です。 (グローバル変数も階層化すれば大丈夫ですが。)

GRUB legacyの失敗(私の失敗ではないけれど)もこれ。 ほどほどには仮想化している部分もありますが、 ファイルが一個しか同時に開けないのはとんでもない失敗です。 最初機能が少ない頃はそれでいいと思ったんでしょう。

結構考えたつもりで作ったGRUB 2でさえ、 最近Hollisがパーティション・マップのモジュール化の必要性を指摘し、 Marcoがパッチを作ってくれたりしました。 完璧に考え抜くのはかなり大変です。

ZSQLCatalogも基本的には同じで、 元々カタログ(インデックス)は一つだけで良いと思ったのでしょう。 というか、複数持つというアイデア自体想像しなかったでしょう。 私も昔だったら、それで何が嬉しいのか、簡単には理解できなかっただろうし。 でも必要な機能が出てきて、 それで初めて複数持つことの意義が理解できたのです。

こういうレベルで初めから設計するのって、 多分無理、人間の限界なんじゃないかと思います。 だから、

何が嬉しいか分からなくてもいいから、全部複数あるものとして扱え

という強引なルールで設計する方がいいのかもしれませんね。

[]