この本について
この本のおもなテーマはウェブアプリケーションの設計、つまり、ウェブアプリケーションを構成するソフトウェアシステムおよびハードウェアシステムの設計です。アプリケーションの構造、開発の実際、各種技術、Unicode、インフラストラクチャに関わる作業全般について解説してあります。また、ウェブアプリケーションの開発面にも重点を置いています。つまり、ハードウェアシステムの構築作業の実際と、ソフトウェアシステムの実装の実際です。たしかにアプリケーションの設計理論も大切で、全過程から見れば不可欠な一部ではありますが、大規模なアプリケーションの構築においては「実践」こそが肝心なのであって、その点を設計過程で常に意識する必要があるのです。実際に構築できないようなものの設計を進めたところで、よいものが出来るのかどうか、分かったものではありません。
これはプログラミングの本ではありません。少なくとも、厳密にプログラミングの本だと言い切れる内容の本ではありません。プログラムの書き方について解説するもののではなく、ウェブアプリケーションを構築するための汎用的な技法やアプローチについて解説しています。プログラム例も少しは登場しますが、単なる例にすぎません。この本で使っているプログラム例は、規模の大きめのアプリケーションやインフラストラクチャでとくに役に立つものがほとんどです。
この本では、アプリケーションのアーキテクチャの設計や、アプリケーションのインフラストラクチャの構築に関する事柄を多く扱っています。ウェブアプリケーションの分野では、「インフラストラクチャ」とは、ハードウェアプラットフォームとソフトウェアプラットフォーム、それに保守と開発の実際とを組み合わせたものを意味する場合が多いのです。この本では、以上のすべてを、いかに組み合わせて、大規模なアプリケーションの継ぎ目のないインフラストラクチャを作り上げるかについて考察しています。
この本最大の章(第9章)では、アプリケーションのスケーリングだけに焦点を当てました。つまり、既存のシステムのスケーリングに役立つ技術や手法のほか、スケーリング可能なシステムを設計する際のアーキテクチャ面でのアプローチについても解説しました。この分野全体をわずか1章で解説することなど、とてもできませんが(この本全体で基本的な事柄をかろうじて説明できる程度なのですから)ごく一般的な要件を満たすアプリケーションの設計や構築に非常に役立つアプローチをいくつか選択しました。ただ、この本がスケーリングの完璧な手引きとは言えないこと、また、学ぶべきことがまだ山ほどあることは、心に留めておいてください。スケーラブルなインフラストラクチャの他の局面にも触れている入門書としては、Performance by Design: Computer Capacity Planning by Example(Prentice Hall)をお勧めします。
第10章では、キャパシティ増強計画の作成を目的とした、イベントの監視と長期的な統計情報の追跡を行いながらウェブアプリケーションを運営する方法について解説しました。監視と警告は、アプリケーションを作って、それをどれだけの期間であれ運営したいと考えている人にとっては非常に重要な技術です。複数のカスタムコンポーネントから成るアプリケーションでは(いや、単に多数のコンポーネントから成るアプリケーションであっても)、監視機能の設計と構築はアプリケーション設計者に任されることが多いのです。というのも、そうした設計者こそ、何を追跡調査すべきか、どのような設定・構成の変更が可能かをもっともよく知っているはずだからです。システムのあらゆるコンポーネントについて、動作を確認する方法、ならびに「正しく」機能していることを確認する方法を設計する必要があります。
最終章では、データのフィードとAPIを使って、データを共有したり、他のアプリケーションと我々のアプリケーションとを統合可能にする技術について解説しました。この本では、全編を通してアプリケーションの様々なコンポーネントを取り上げ、解説していく中で、コンポーネントのAPIの設計について解説していますが、最終章ではこうしたインタフェースを安全でアクセス可能な方法で外界に提示する方法を解説しました。また、データの公開や相互運用に関わる最新の標準や、それをアプリケーション内で実現するためのアプローチも紹介しています。
この本を読む上で必要な基礎知識
この本は、動的なウェブサイト作りは初めてという人には向いていません。初心者向けの優れた参考書は数多く出版されていますから、そうした分野はこの本では扱っていません。そのため、動的なウェブサイトやウェブアプリケーションを構築した経験が少しはある方、少なくとも、ウェブページの編集作業をしてデータを公開し、ユーザーのデータを管理した経験が少しでもある方が対象となります。
この本は、開発者だけを対象にしているわけではありませんが、実際的な例を多数載せてあります。こうした例を十分理解するためには、プログラミングの基礎知識が必要です。「コンティニュエーション(continuation)」や引数の「カリー化(currying)」に関する知識は必要ありませんが、一般的な制御構造やフォンノイマン型計算機の基本的な「入力-処理-保存-出力」のモデルに関する知識は必要です。
コード例と並んで、Unixコマンドの例もかなり多く掲載しました。Linuxマシン(またはその他のUnix系のコンピュータ)が使える環境があれば、試しながら読み進められます。コマンドやコードを試せるサーバがあれば、理解も深まり、実践に用いることもできます。この本はすでにコマンド行での作業知識のある方を対象としていますから、シェルの起動、コマンドの実行、プロセスの中止などの方法は説明してありません。コマンド行に関する知識のない方は、ここから先を読む前に、入門書を読んでください。コマンド行についての知識はUnixベースのアプリケーションでは必要不可欠ですし、Windowsベースのアプリケーションでも、その重要性は増してきています。
この本で解説した手法は、数多くの最新技術に対して応用できますが、例や解説では最大規模のアプリケーションの多くを構築する際の基盤として使われている4つの重要なテクノロジーに関連するものを取り上げています。そのうちPHPは、大半のコード例で使われています。PHPを使ったことがなくても、ほかにひとつでも「C系の言語」を使った経験があれば、心配は無用です。C、C++、Java(TM)、JavaScript、Perlのいずれかを使ったことがあれば、PHPもすぐに覚えられるでしょうし、構文も一目瞭然でしょう。
補助的な作業やユーティリティを利用するような作業については、Perlで書かれたコード例もいくつか登場します。Perlは主要なアプリケーション言語として使うこともできますが、コマンド行でのスクリプト記述やデータの簡易処理で最大の威力を発揮しますから、管理用ツールの構築に用いるのが賢い選択である場合が多いのです。しかしここでも、C系の言語を使ったことがある方ならPerlの構文はとても覚えやすいですから、この世界ではとても有名な「表紙にラクダの絵のある本」を買いに走る必要はありません。
データベースについてはMySQLを中心に解説しましたが、それ以外の「ビッグ・スリー」、つまりOracleとSQL ServerとPostgreSQLにも触れました。MySQLはこの方面では必ずしも最良のツールとは言えませんが、「ビッグ・スリー」よりはさまざまな点で優れています。つまり、設定が楽なこと、ほとんどの用途で十分実用になること、そして、おそらくこれが一番重要だと思いますが、無料であること。小規模のアプリケーションを構築したりプロトタイプを作ったりする場合、MySQLは設定も管理も容易ですし、phpMyAdmin(http://sourceforge.net/projects/phpmyadmin/)といったツールも併用できますから、非常に魅力的な選択肢なのです。とはいえ、ほかのデータベース技術に出る幕がないと言っているわけではありません。4つともに広範に使われています。ただし、もうひとつ、MySQLは大きなスケールのアプリケーションにも使えるという点を強調しておきます。インターネットの最大級のアプリケーションの多くでMySQLが使われています。この本を読む際には、SQLとデータベース理論に関する基礎知識が役に立つでしょう。また、PHPスクリプトの例を試したりするのに、MySQLが利用できれば、なおのこと効果的でしょう。
Unix環境での利用を考慮して、どの例でもHTTPサーバとしてApacheを使用していることを前提としています。ある意味では、ここにあげた4つのツールの中で、Apacheはもっとも重要度の低いコンポーネントです。Apacheの構成法や拡張法は、それ自体が本1冊に値する話題ですが、この本ではほとんど説明していません。Apacheを使った経験は、この本を読む際に役立ちはしますが、必要不可欠ではありません。どんなウェブサーバを使った経験でも役に立つでしょう。
しかし、必要なのは、そうしたソフトウェアを実際に使った経験だけではありません。この本を最大限に活用するためには、こうした技術の背後にある理論を応用するための実践的な知識も必要です。この本で取り上げた重要なプロトコルや標準に関しては、どれについても(いささか無味乾燥な)RFCか仕様に言及し、多くの場合、該当分野の主要な参考書もあげておきました。HTTP、TCP/IP、MIME、Unicodeについてはある程度詳しく解説しましたが、その他のプロトコルなどは関連箇所で簡単に説明するだけにとどめました(200以上の「頭字語(acronym)」が登場します)。関連事項を十分理解するためには、こうしたプロトコルや標準に関して必要に応じてインターネットなどで調べることをおすすめします。