2010年10月17日

ソフトウェアの肥大化について

肥大化したソフトウェアというとリソース食いでメンテナンスがしづらい厄介ものというイメージがあります。しかし、広く使われているソフトウェアは多かれ少なかれ肥大化しているように思えます。ソフトウェアの肥大化はよくないことなのでしょうか。

 

結論からいえば、必ずしも悪いことではありません。この話題は Joel Spolsky 氏がストラテジー・レターIV:ブロートウェアと80/20の神話で書いています。私が付け加えられることはあまりありませんが、最近、知人との間で話題になったので、少し書いてみたいと思います。

数年前、 Alan Kay 氏の Squaek についての講演を聞きにいったとき、途中でコードのサイズが話題になり、Squeak のコードはこんなに小さい(具体的な数字は忘れました)といって、何千万行もある Windows NT を引き合いに出して、Squaek がいかにシンプルであるか等々と話し始めました。

一瞬、すごい!と思いましたが、よく考えてみると、実際に世の中で使われているのは Windows NT の方なので、実装がシンプルなことはそんなに重要なことなのか、と疑問に感じました。

広く使われるソフトウェアでは、次のようなループが発生します。

ユーザに使われる→もっとよくする→もっと使われる→もっとよくする→...

「もっとよくする」の部分では、機能の追加、互換性の改善、バグ修正、高速化などが行われます。機能の追加でコードが増えるのは当然ですが、その他の変更でもコードはどんどん増えます。たとえばこんな感じでしょうか:
  • Windows XP の SP2 以前のときはXXXというバグがあるので、回避するにはこうする
  • プロセス起動時にオートアップデートが発生するとクラッシュすることが稀にあるのでこうする
  • プロセッサが SSE3 対応のときはこっちの命令の方が速いのでこうする

このような変更の積み重ねによってソフトウェアの完成度は高まり、同時にコードのサイズは増加します。必ずしも広く使われるソフトウェアのすべてが肥大化するわけではありませんが、肥大化するにはもっともな理由があります。

一方で、あまり使われないソフトウェアの場合、上のようなループは発生せず、プロジェクトはすぐに終焉を迎える傾向があります。コードは小さいままです。

あまり使われない→もうやめよう→おわり

ソフトウェアの肥大化に関連する話題として、ソフトウェアのシンプルさとはなんだ、という話があります。ソフトウェアがシンプルと言った場合、使い方がシンプルなのか、実装や設計がシンプルなのか、文脈がないとわかりません。ソフトウェアについての議論において、シンプルという言葉の解釈が異なるために、議論が平行線をたどるということが稀に見受けられます。シンプルという言葉が言い訳に使われるケースもあります。

シンプルで使いやすいソフトウェアの実装はシンプルとは限りません。たとえば、ドラッグアンドドロップを実装するのは、ボタンを追加するより多くのコード必要とします。アニメーションさせようと思ったらもっとコードが増えます。こういった工夫もコードの肥大化を促進します。

プログラマから見れば実装や設計がシンプルなことに越したことはありませんが、ユーザから見ればどうでもいい話です。言ってみれば当たり前の話ですが、コードのことばかり考えていると、つい忘れてしまいがちです。

まとめ
ソフトウェアの肥大化について考察しました。ソフトウェアの肥大化は必ずしも悪いことではなく、広く使われるソフトウェアでは、ほぼ必然的に起こることだと思います。開発者であれば、肥大化を嘆くより、コードが使われていることをありがたく思ったほうが精神衛生上よさそうです。

ちなみに、肥大化と関係する話題で、プログラマがやたらとコードを一から書き直したくなる衝動、を戒める Joel 氏のエッセイThings You Should Never Do, Part Iもおもしろいです。このエッセイの翻訳は Joel on Software の書籍版に「あなたが絶対すべきでないこと PART I」という題で掲載されています。