Webを支える技術読み始めた

どうもこんばんは、south37です。

突然ですが、「Webとは何か」と聞かれて、自信を持って答えられますか?

僕自信、何となくは分かってるつもりでいながら割とふわふわしていたんですが、「Webを支える技術」という本を読み始めてはっきりとしたイメージを持てる様になってきました。

1. Webとは何か?

そもそもWebとは何なんでしょうか?

「Webを支える技術」においては、Webは次の3つの技術の組み合わせによって構成されるものだと説明されています。

  • HTTP(Hypertext Transfer Protocol): Webにおいて情報をやり取りする為に使われるプロトコルGET,PUTなどのメソッドステータスコード
  • URI(Uniform Resource Identifier): 情報を指し示す識別子。URLはURIの一種。URIを使えば、ショッピングサイトの商品でも学術論文でも動画サイト上の動画でも、世界中のあらゆる情報を指し示す事が出来る。
  • HTML(Hypertext Markup Language): 情報を表現する文書フォーマット。

これらはどれもシンプルな技術ですが、そのシンプルさによって、Webは様々な応用(Webサイトとしての利用、UIとしての利用、Web APIとしての利用)が可能になります。

情報システムとして見たWeb

Web全体を一つの情報システムとして見ると、Webは ハイパーメディアシステム分散システム という2つの側面を持つ事が分かります。

ハイパーメディアシステム とは、テキストや画像、音声、映像等様々なメディアをハイパーリンクで結びつけて構成したシステムです。書籍や映画等、線形的に先頭から順にコンテンツを消費するメディアとは違い、ハイパーメディアでは非線形的にユーザが自分でリンクを選択して情報を取得します。

分散システム とは、一つの中央コンピュータがすべてを処理する「集中システム」の対になるような概念で、複数のコンピュータを組み合わせて処理を分散させる形式の事を指します。Webは世界中に配置されたサーバやPCがお互いに情報をやり取りして一つのシステムを作り出しており、超巨大な分散システムであると考える事が出来ます。

Webという情報システムの巨大さ、シンプルなプロトコル故の応用性なんかは、考えるだけでワクワクしてきますね!!

2. Webの歴史

インターネット上での情報のやり取りというと、今でこそ当たり前のようにWebを用いたものを思い浮かべますが、インターネットの登場初期においてはWebは存在しませんでした。 (ちなみに、Webはインターネットの存在を前提にしてはいますが、インターネットとは別物です。インターネットとは、光ファイバー等のインフラとTCP/IP等の低レイヤーの技術が組み合わせされて構築されたネットワークであり、インターネットを介してやり取りされる情報の一種としてWebが存在します。インターネット上でやり取りされる情報の形態としては、Webの外にもTelnetFTP, SMTP等が存在します)。

「Webを支える技術」ではWebが普及するまでの歴史や普及後の標準化の歴史なんかが語られているのですが、様々なドラマがあったようでとても面白かったです。

Webのアーキテクチャをめぐっては、大手ベンダーが普及させようとしてた「SOAP」と一人の大学院生が博士論文で提案した「REST」の間で激しい論争があったらしいですが、最終的にはRESTの圧倒的な有用性によって時代の勝者になりました。こういう話はかっこいいですね。

3. WebのアーキテクチャスタイルであるREST

RESTとは、Webのアーキテクチャスタイルです。言葉自体は、「RESTfulなAPI」みたいな形で何となく聞いた事があるんじゃ無いでしょうか?ここで、RESTについて簡単にまとめてみたいと思います。

リソース

RESTにおける重要な概念の一つとして、「リソース」というものが存在します。

リソースとは、 Web上における一意な名前(URI)を持った情報 の事を意味します。

例えば、ある著名人のツイートの一つ、気象庁が発表した今日の天気予報、Facebook上の写真、はてなユーザAさんのブログ記事等はみな「リソース」となります。一意な名前というのはURI(URL)の事を意味していて、URLを指定する事で特定の情報へと世界中のどこからでもアクセスする事が出来ます。

Webにおいては、リソースの表現(データ)をサーバ/クライアント間でやり取りするんだというのがRESTの考え方です。

RESTを構成する要素

RESTは、次の6つのアーキテクチャスタイルを組み合わせたアーキテクチャスタイルです。

  • クライアント/サーバ: クライアントがリクエストを送り、サーバがレスポンスを返す。UIの処理はクライアント側で行い、サーバはデータストレージとしての役割に専念する。
  • ステートレスサーバ: サーバ側では、アプリケーションの状態を持たない。一意なリクエストに対して、一意なレスポンスを返す。
  • キャッシュ: クライアントが一度取得したリソースを使い回す事で、サーバとの通信回数を減らす。
  • 統一インターフェース: URIで指し示したリソースに対する操作を、統一した限定的なインターフェースで行う。例えば、HTTPにおいてはGET,POST等の8つの限られたメソッドのみ使用可能としている。
  • 階層化: 統一インターフェースを持つ事で、システムを階層化出来る。ロードバランサやProxyを設置したり、何らかのシステムのインターフェースとしてWebサーバを建てたり出来る。
  • コードオンデマンド: プログラムをクライアントにダウンロードして実行する。

Webにおいて、多くの場合にRESTに基づいた設計がなされているのが分かるかと思います。現実においては、ステートフルなアーキテクチャスタイルが必要とされる場合も多い(ユーザ認証を必要とする場合等)ですが、基盤はRESTとなっています。

ハイパーメディア、及び分散システムというWebの特性とRESTとの関係

Webの特性とRESTの関係を見てみましょう。

ハイパーメディアとREST

ハイパーメディアの基本機能である「リンク」によって、リソースは別のリソースから簡単にアクセスしたり再利用したり出来ます。リソースをリンクで接続する事で1つのアプリケーションを構成するという考え方は、RESTの根幹を成す思想と言えます。この考え方は、「接続性」とも呼ばれます。

一連のリンクを辿る事で一つのアプリケーションとして機能するWebアプリなんかが、イメージしやすい例だと思います。

分散システムとREST

リソースはそれ自体で意味を持つひとかたまりのデータである為、粒度が大きい為にオーバーヘッドによるコスト(ネットワークを通る事で多大な待ち時間が発生したり通信失敗したりするコスト)を小さく出来ます。また、統一インターフェースによってインターフェースが固定されている為、互換性の問題も置きません。

まとめ

Webは、HTTPというプロトコルに基づいて情報をやり取りし、URIという一意な識別子を用いて特定の情報へとアクセスし、HTMLやXMLJSONなどの標準化されたフォーマットを用いて情報を表現する巨大な情報システムです。 その背後にはRESTというアーキテクチャスタイルが存在し、情報はリソースと呼ばれ、リソースがリンクで繋がる事によってアプリケーションを形作ります。

Webは、シンプルで統一された技術に基づいているおかげで応用性が高まり、多くの人に使われる様になりました。その巨大さ、可能性の大きさみたいなものはやっぱりすごいと思います。

何と言うかこう、テンション上がりますね!!!

以下、どうでも良い話

  • 「Webを支える技術」は、パラ見してたら思いの外面白そうで衝動買い
  • ついでに、「エリック・エヴァンスドメイン駆動設計」も衝動買い
  • 最近お金がどんどん無くなってて大変つらい