【97】優れたソフトウェアは構築されるのではなく、成長する
アーキテクトは、ソフトウェアシステムの初期構造や配置を用意しなければなりませんが、システムは時間とともに成長、変化します。そのため、作り直したり、他のシステムとのやり取りを追加したりしなければならなくなりますが、ほとんどの場合、これらの変化はあなたや利害関係者が予測していない方向に進みます。私たちはアーキテクトと呼ばれ、建築や工学のメタファーの多くを借りてきていますが、偉大なソフトウェアは構築されるわけではありません。成長していくのです。
ソフトウェアが失敗する唯一最大の兆候は規模です。よく考えれば、最初から大規模なシステムを設計することにほとんどメリットはありません。にもかかわらず、アーキテクトは誰しも最初から大きなシステムを設計したくなるものです。最初から大規模なシステムを設計すると、付随的な複雑さや惰性の仕事を招きやすいばかりでなく、プロジェクトが大規模になります。しかし、大きなプロジェクトは失敗しやすく、テストできなくなる危険も高く、もろくなりやすく、不要で使われない部品が作り込まれやすく、高くつきやすく、政治的に不都合なものになりやすいのです。
ですから、いかに魅力的に感じたとしても、すでにわかっている要件やユーザーが希望している特性以上に大規模なシステムを設計するのは避けましょう。大きな設計ではなく、大きなビジョンを持つのです。状況や要件が避け難く変化していくのに合わせて、あなたとシステムを適応させていくことが大切です。
ではどうすればよいのでしょうか。ソフトウェアシステムに成長の余地を残すためには最初から成長し、適応していくように作るのが一番です。システムを発展に導くには、小規模で実際に動くシステムからスタートするのです。これは予定しているアーキテクチャーの動くサブセットであり、機能するものとしてはもっともシンプルなものです。
この初期システムは、よい特性をいくつも持っており、大規模システムのアーキテクチャーやドキュメントの塊よりも多くのことを教えてくれます。あなたは、実装により深く関与できますし、化粧っ気がない分テストしやすく、密結合に陥りにくくなります。小さなチームで作れますし、その分プロジェクトの調整コストが下がります。性質が観察しやすく、配備が容易です。もっとも早い段階で、あなたとあなたのチームは何が動いて何が動かないかを学ぶことができます。システムが簡単に発展していかないところ、固定化していくところ、もろくて壊れやすいいところも教えてくれます。何よりも大切なのは、最初の段階からシステムが利害関係者にとってはっきりと理解、把握できるものになり、彼らも設計全体に一体化できるようになることでしょう。
できる限り小規模なシステムを設計し、その実現を助け、大きいビジョンに向かってシステムを成長させましょう。これでは、管理を放棄したような、責任を回避したような感じがするかもしれませんが、利害関係者たちはいずれあなたに感謝するはずです。要件を投げ出したり、ゴミのようなシステムを作ったりすることと発展的なアプローチを混同してはなりません。