Subscribeビル・ゲイツの面接試験-クイズ編ビル・ゲイツの面接試験-クイズ編・模範解答Ajaxの本質、「非同期メッセージ型ウェブ・アプリケーション」のススメ2005.06.06最近、「これからのウェブ・アプリケーションはAjaxだ」という声を良く聞く。ソフトウェアを生業としているエンジニアとしては、この手の「流行もの(hype)」に触れた時には、表面的なものに踊らされずに、その本質を自分なりにしっかりと捕らえて消化・吸収して自分のものにしなければいけない。今までも、「オブジェクト指向」、「マルチ・ティアー・アーキテクチャー」、などの言葉が一人歩きするたびに、「これからは○○だ」とか「○○の時代は終わった」などと、過激なことを言って読者の目を引こうとだけするマスコミや企業のマーケティング戦略に数多くの人が踊らされてきた。そんなノイズだらけのメッセージに混乱させられた結果、「Cではオブジェクト指向のプログラミングは出来ない」と信じているエンジニアがいまだに沢山いることは全く嘆かわしいことだ。「オブジェクト指向のプログラミング」は、設計姿勢・プログラミングスタイルに関わることであり、C++やJavaと言った言語に依存しなければ出来ないものではない。Cでろうとアセンブラーであろうと、「オブジェクト指向のプログラミング」は可能なのだ。関わらず、組み込み系のプロジェクトで、Cコンパイラーしかない環境でプログラムを書かせようとすると、「C++で書かないとコードがスパゲッティ状態になってしまいます」などと甘ったれたことを言うエンジニアが多いので困ったものだ。Ajaxに関しても、全く同じ誤解が生じそうなので、ここで一言書いておく。Googleなどが進めている第二世代のウェブ・アプリケーションのアーキテクチャーの本質は、XHTMLやXMLやJavascriptにあるのではない。その本質は、(1)アプリケーションの明示的なインストールが必要ない。(2)サーバーとの通信を非同期に実行することにより、通信遅延によりUIをブロックしない。(3)サーバーとのやり取りは、RPCではなく、メッセージで行う。(4)データ・バインディングはサーバー側ではなく、クライアント側で行う。(5)UIにインテリジェンスがあり、ある程度はサーバーに戻らずにユーザーとやり取りをする。この5点さえしっかりと守れば、開発言語はJavaであろうとFlashであろうとも良いし、サーバーとのメッセージにXMLを使わなくともかまわない。その意味で言うと、Ajaxという名前(J=Javascript、x=XML)がそもそもふさわしくしくないとも言える。Application)」と呼ぶ方がずっと明確だし、特定の言語にしばられなくて済む。これらの5つの点については、自明だとは思うが、学生や初心者のために付け加えておく。(1)アプリケーションの明示的なインストールが必要ない。なければ、ウェブ・アプリケーションとは呼べない。(2)サーバーとの通信を非同期に実行することにより、通信遅延によるUIのブロッキングを避ける。第一世代のウェブ・アプリケーションがリッチ・クライアント・アプリケーションと比べて圧倒的に使い勝手が悪くなるのは、、ハイパーリンクをクリックするたびにユーザーを待たせるためである。通信を非同期にして、ネットワーク遅延をユーザーからできるかぎり隠し、ストレスの少ないユーザー・インターフェイスを提供する点が第二世代のウェブ・アプリケーションだ。(3)サーバーとのやり取りは、RPCではなく、メッセージで行う。Call)と非同期メッセージングの二通りがある。RPCのそもそもの利点は、「あたかも呼び先の関数がローカルで実装されているかのようにシームレスにプログラムが書ける」点であることに注意すれば、どちらを使えば良いかは自明である。ローカルの関数呼び出しとリモートな関数呼び出しのスピードの開きが1000倍にもなる今の環境では、プログラマーにシームレスにプログラムを組まれては困るのである。その意味で言って、メッセージを使ったプログラミングスタイルでは、プログラマーはネットワーク遅延を強く意識しながら作るので、結果として使い勝手の良いアプリケーションができる。(4)データ・バインディングはサーバー側ではなく、クライアント側で行う。第一世代のウェブ・アプリケーションは、データとビューのバインディングをサーバー側で行っていたため、新しいデータが必要になるたびに、UI(HTMLページ)全てを再度サーバーに取りに行き、再構築していた。第二世代のウェブ・アプリケーションは、まずビューをクライアントに取り込み、次にデータをメッセージの形でサーバーから取ってくる仕組みであるため、データだけを変更する場合の使い勝手は格段に向上する。(5)UIにインテリジェンスがあり、ある程度はサーバーに戻らずにユーザーとやり取りをする。ユーザーの入力に対して、クライアント側でレスポンスが可能なものに関しては、それを処理するようなインテリジェンスをUI自身(上で述べたビュー)に持たせておき、サーバーとのやり取りなしで処理してしまう。最後にもう一度繰り返すが、オブジェクト指向のプログラミングに必ずしもC++やJavaが必要ないのと全く同じ理由で、「非同期メッセージ型ウェブ・アプリケーション」のプログラミングには必ずしもHTML、Javascriopt、XMLは必要ないことを覚えておいて欲しい。「ブラウザー上でプラグインなしで動かしたいからHTML+Javascriptを使う」とか、「ウェブ・サービスとの連携にHTTPを介してXMLをやり取りする」などの理由はもっともなので、それを否定するつもりは全くないので誤解しないで欲しい。HTTP"を使うことには私も大賛成だが、その議論と「非同期メッセージ型ウェブ・アプリケーション」の議論とは全く独立したものである。言い換えれば、Ajaxの提唱者たちは、「非同期メッセージ型ウェブ・アプリケーションを作ろう」という主張と、「HTML+Jascript+XMLを使ってウェブ・アプリケーションを作ろう」という主張を一緒くたにして発信しているだけなのである。受け取る側としては、それが二つの独立した主張が混ざったものであることをきちんと理解した上で、消化・吸収することが大切である。読者の一人に「ここに書かれている考えはどこから来ているのですか?」と聞かれたので、お答えします。一緒に開発していた仲です。機能を初めて導入したブラウザーです。あの当時から、彼らとは「次世代ウェブ・アプリケーション」の話ばかりしていました。話はその時に始まった話です。私も、10年近く同じことを言い続けているわけですね。行くと言ったときに、あやしいと思ったのですが、案の定あんなことが始まってしまいました。私も人のことを言える立場ではありませんが(笑)。[お願い]ソシアル・ブックマーク・サービスをお使いの方がこの記事をブックマークするさいには、何か一言コメントを添えていただけると助かります。ブックマーク・コメントに関しては、恋はブックマークをご覧ください。|Commentsはじめまして。大変興味を持っている者です。プログラミングは門外漢なので、この5つのポイントについて「理解した」などとは口が裂けても言えないのですが、本質を捉えることが重要だということはよくわかったように思います。追記の「10年前から・・・」というお話もおもしろかったです。技術って、水面下で醸成されていたものが、ある日突然のように表舞台に出てくることってあるんですよね。01:08すみません。こちらでエントリを書いたのですが、なぜかTrackbackがうまくできないので、URLを書かせて頂きます。02:12梅田さんのところからやって参りました。どれもこれも、大変興味深い記事で、ワクワクしております。梅田さんが一押しするのも、超納得です。^^;ひとまず、御礼申し上げます。ありがとうございます。17:44イプログダイレクトの店長さん、コメントありがとうございます。このブログも書き始めて、もう二年になります。好き勝手なうんちくばかり書いているのですが、こうやって励ましのお言葉をいただけると、「これからも書き続けよう」と元気が出ます。私的には(擬似)サーバープッシュと見ています。後は、特性がマッチする処にうまく使えば良いかな、と。06:36とても参考になりました。06:26正に正論だと思います。(といってもこの記事は3年前に書かれたものだったのですね・・・・)。私的にはつきつめると「ユーザーが必要とする情報を事前にクライアントへロードしておく」ってのがAJAXが流行ったコアな部分かと思います。(=ユーザーが必要ない情報を非同期通信やPreLoadしても意味ないので。)そういう意味も込めて、以下のURLのサイトを作っています。検索キーワードを入れて、Google、Yahoo、Technoratiを同時に検索して、かつ検索結果のページを事前にロードしておくというのは、まさにAjax的。(私の場合はたまたまJavascriptを使いましたがこれは必須じゃないですね。20:49オブジェクト指向を学んでいるうちに、「プログラミングには向いていない・・・」と学生の頃感じたものです。ご説明がシンプルで感銘を受けました。1990年代後半にオブジェクト指向を大学でチョコチョコやっていましたが、その頃から書籍でも「CではOOAは無理。C++で!」みたいなこと書いていましたが、実際、C++でならできるというわけでもなくあくまでアプローチであることを感じた覚えがあります。ITの営業職である私には全くわかりませんが・・・。09:58勝手ながら、生まれて初めて書いたBLOG記事に引用させて頂きました。TypepadTop。