巨大なビルディングブロックになったシステム
巨大なビルディングブロック
21世紀の最初の10年間に構築される平均的なシステムは、その裏側には何も優雅さがない、あってもわずかしかない巨大なゴミの山のようなものです。そのようなシステムを構築する主な動機は、常に最小限の努力で成し遂げることです。そのために、エンジニアリングチームは、既存のソフトウェアフレームワークが必要以上に重量級であっても再利用しようとします。
無知への合理的な取り組み
最近、私はサーバに動的なウェブページを追加する必要がありました。私には2つの選択肢がありました。1つは、どれかのポートでソケットをオープンし、接続してきたコネクションからデータを読み、何らかのデータを返すということです。もう1つは、既存の技術からシステムを組み立てるということです。私は、両方を行ってみました。
「一から書いてみる」やり方は、うまくいきました。HTTPの仕様書を読み、送られてくるヘッダーを解析し、出力を書き出したのです。それは、比較的少ない量のコードでしたし、多少デバッグした後にうまく動作しました。しかし、その後に、ページをセキュアにしたりPOSTリクエストを処理したりなどの新たな機能を追加する必要がありました。RFCドキュメントを読んで同じように実装することもできました。しかし、それは、費やしたい時間を越えた作業量だと分かりました。
それが、私が「組み立てる」方法をやってみた理由です。Tomcatウェブサーバを利用して、1つのサーブレットを書き、設定ファイルのプロパティを少し調整したら、出来上がりました。すべてが機能しましたが、1つだけ難点がありました。50KBのコードではなく、突然、1MBを越えたのです。
今日のシステムは、巨大なビルディングブロックで構成されています。技術を全部1人で作成する人はいません。代わりに、信頼できる安価なオペレーティングシステムをインストールするでしょう。それから、その上に、広く使用されているウェブサーバをインストールして、データベースを追加します。これら数メガバイトのインストールでもって、HTMLページを生成するなどの基本的な問題を解決する準備が整います。この時点で、HTMLページを生成するのは簡単です。しかし、誰もシステム全体が単純であると主張することはできません。実際、かなり複雑であり、すべてを理解できる人は地球上に誰もいません。これは、無知の完璧な例です。プログラマは、システム全体の最低限の理解だけで、HTMLページの作成を行うのです。
私には、この取り組み方法全体が、ブルドーザでのコーディングをイメージさせます。すなわち、データベースが必要であれば、力を使ってシステムにデータベースサーバを入れているようなものです。あるいは、もっと信頼できる実行環境が必要ならJavaとアプリケーションサーバをインストールするようです。これらのフレームワークがどれだけ重量級であるのかに関係なく、ゴミの山、すなわち、アプリケーションにそれらを積み上げることができる十分に大きなブルドーザを常に見つけることができます。アプリケーションがあまりに多くのメモリを消費し始めたら、合理的な視点からアプリケーションを最適化することを検討するかもしれません。しかし、ブルドーザがあるのであれば、すべての問題は同じように見えて、単にあと数ギガバイトのメモリを購入するだけです。システムがそれでも遅いのであれば、クラスタや何らかの仮想化に投資するかもしれません。そして、アプリケーションの山は単に大きくなって、決して小さくなることはありません。
問題は、ブルドーザによるコーディングのやり方が悪いか否かです。実際、効率的ですが見つけるのに時間を要してしまうヴィルトの「単純で、優雅な解法」を探すよりは、より生産的でしょう。ウェブを見渡せば、ブルドーザのような方法を使用して書かれたかなり優れたアプリケーションやサーバを見つけることができます。Amazon、Yahoo!などは巨大なサイトであり、うまく機能しており、致命的な問題は抱えていません。そのため、ブルドーザ方式は、今日のソフトウェアシステムを設計してコーディングするための実行可能な方法であることを示しているように思えます。私達全員が持てる驚くべきコンピュータの性能により、ソフトウェアシステムは力ずくでの計算へかなり傾いています。
この記事のもとになった書籍 | |
---|---|
Jaroslav Tulach 著/柴田 芳樹 訳 |
APIデザインの極意 Java/NetBeansアーキテクト探究ノートなぜ、設計の良くないAPIを持つソフトウェアが量産されるのでしょう。エンジニアが良いAPI・悪いAPIについて分かっていない、あるいは、適切なレビューを受けていないからかもしれません。本書では、NetBeansアーキテクトの著者が遭遇してきた様々な誤りを解説し、APIの発展を考慮した設計について詳しく説明。あまり語られることがなかったAPI設計について、貴重な10年間の経験をベースに幅広くノウハウを披露。API設計の技術や知見の水平線を押し広げることができる稀有な一冊です。 |