Chapter 03

Webアプリケーションとは何か?

Webアプリケーション(あるいはWebサーバー)について調べてみる

さて、私達はこれからWebアプリケーションなるものを作る旅に出るわけですが、そもそもWebアプリケーションとはなんなんでしょうか?

WebアプリケーションについてWikipediaで調べてみると、

ウェブアプリケーション(Web application)は、ウェブ(World Wide Web)技術を基盤としたアプリケーションソフトウェアである。

出典: Wikipedia

と書かれています。

僕が3年目のときは、この説明に出てくる単語の意味はそれぞれ知っているつもりでした。
ウェブも知っているつもりだし、基盤も知っているつもりだし、アプリケーションも知っているつもりだし、ソフトウェアも知っているつもりでした。
でも、それぞれの単語がつながって一行の文章になったとき、その文章全体はふわっとした何かを言っているようで具体的なことは何も言っていないような、つかみどころのない説明文に感じられました。

この後、この言葉を少しだけ掘り下げて説明を試みますが、 「伸び悩んでいる3年目Webエンジニア」 の方々には、やはりつかみどころのないもやもやとした話になるでしょう。

なぜならWebアプリケーションというシロモノは、非常にたくさんの高度に抽象化された技術がぎゅっと詰まっていて、一言二言で説明するのが無理な高度なモノだからです。
これを理解するには、Webアプリケーションを構成する主要な要素を1ステップずつ理解して積み重ねていくしかないのです。

みなさんも、自分の得意なモノゴトを何か思い浮かべてください。
数学でも、美術でも、歴史でも、ゲームでも構いません。
何か自分にとって衝撃的な発見をしたとき、それを他人に「何がすごいのか?」を伝えるのはなかなか難しいんじゃないでしょうか?

数学を苦手な人に二次方程式の解の公式が何かを教えるのは難しいでしょうし、そのゲームをやったことのない人に復刻キャラのステータス上方修正のインパクトを伝えるのは難しいでしょう。
まずは関数を教えるところから、ゲームのルールとこれまでの歴史を教えるところから、順番に積み重ねて説明する以外に方法はないのです。

この本はまさにその説明の積み重ねをして、一冊を通してWebアプリケーションがどのようなものかを理解する、という本なのです。

こんな説明の仕方をすると、学校の難しい勉強を思い出して身構えてしまう人もいるかもしれませんが、心配しないでください。

高度な技術がたくさんつめこまれているといっても、1つ1つの要素を理解するのは実はそれほど難しくありません。
実際のソースコードにしてみたところで、基本的な機能を抑えるだけなら、1年も業務経験がある人であれば十分に理解可能です。

Webアプリケーションとは何か?

改めて、Webアプリケーションに話を戻します。
Wikipediaの説明は非常に正しいのですが、もう少し乱暴に噛み砕いて説明すると、以下のようになります。

Webアプリケーションとは、Webサービスを提供するプログラムである

ちなみに、Webサービスとは大雑把にいうとブラウザを介して利用するサービスのことで、ZennをはじめGmailGithubAWSなどもWebサービスの一つです。

WebアプリケーションWebサービスの違いは、Webアプリケーションは「サービスを提供するプログラムそのもの」であるのに対し、Webサービスは「プログラムが実行されることによって提供される機能」です。
当たり前のことかもしれませんが、Webサービスのユーザーが利用しているのは、皆さんが書いたControllerやServiseなどのソースコードの文字列そのものではなく、それらを解釈して実行した結果実現される機能群(オンラインブックが読めたり、メールを一覧で確認できたり)です。

皆さんはWebアプリケーションのソースコードを書き、それを何か別のプログラム(例えばPHPやPython, Rubyなど)で実行することによって、Webサービスがユーザーへ提供されます。

サーバーとは何か?

サービス(service)という言葉ができたので、一歩すすんで、サーバー(server)についても説明しておきます。

読んで時のごとく、どちらもserveという英語から来ており、

サーバー(server)とは、Serviceを提供する人、モノのこと

です。
Webサーバーなどの文脈などでは、Serviceを提供する プログラム と読み替えてもらって構いません。
なので、WebサーバーはWebサービスを提供するプログラム、ということになります。

WebアプリケーションWebサーバーの違いを説明するのは少し難しいかもしれません。
広義ではこの2つは同じ意味なのですが、多くの場合でWebサーバーはWebアプリケーションの中でも、特にWebサービスを提供する窓口になる部分のプログラムのことだけを指します。

これを理解するためには、例えば、銀行振込というサービスを考えてみてください。
あなたは、ECサイトで何かを購入し、出品者へ銀行振込をしようしています。

振込をしたければ、銀行の窓口で

「○○さんへ振り込みしておいてください」

とお願いすれば銀行振込サービスを受けることができ、自動的に自分の口座からお金を減らし、相手の口座のお金を増やしておいてくれます。

この時、あなたに実際にサービスを提供した人/モノはなんでしょうか?

もちろん銀行という組織全体がサービスを支えているわけですが、「窓口のおねえさんがやっておいてくれた」と答えてもそれほど違和感はないでしょう。

プログラムにおいても同様で、ブラウザからのサービス提供要求(=リクエスト)を受け取りその意味を解釈するプログラムと、サービスのコアとなる作業を行うプログラムは分かれていたりします。
このとき、前者を特にWebサービスを提供するモノ、Webサーバーと呼ぶことがあります。

実は上記のWebサーバーの説明は、とんでもない嘘ではありませんが、正確ではありません。

一昔前まではWebサービスというのは簡素なもので、サービスの数の今ほど多くなかった頃、Webアプリケーションも1種類のプログラムで十分提供可能で、メンテナンス可能なものでした。
そのため、Webサービスを提供するプログラムといえばその1つのプログラムのことを指しており、これをWebサーバーと呼ぶのは自然なことでした。

しかし、Webサービスの数が爆発的に増え、提供する機能もどんどんリッチになっていったため、
「どんなWebサービスでも絶対に必要になる部分(ブラウザからのリクエストを受け付ける部分など)は別のプログラム(=共通プログラム)として切り出して使い回すようにしよう。サービスごとに違う部分だけを別のプログラムとして書くようにして、共通プログラムに繋ぎこむようにしよう」
というふうに考えられるようになりました。

その結果、Webサービスを提供するプログラムは、「今までWebサーバーと呼んでいたもの」+「サービスごとに固有のプログラム」と分裂していきました。
現在でも、前者のプログラムだけを指してWebサーバーと呼ぶこともあり、WebサーバーとWebアプリケーションという言葉は少しずつ意味が乖離してきているのが現在というわけです。

この狭義のWebサーバーの代表例として、nginxやapache、unicornなどがあります。

ここからは少し脱線ですが、みなさんが親しみのある Webフレームワーク についても少し見ておきましょう。

時代はさらに進み、「サービスごとに固有のプログラム」の部分も、よく見れば共通の機能が多く見られ、そういった機能は定番のプログラムとして世の中に出回り、ライブラリとして使い回されるようになっていきます。
そうしてWebアプリケーションは、「Webサーバー」+「Webサーバー以外の共通機能のライブラリ」+「サービスごとに固有のプログラム」という3段構成で提供されるようになります。
この2段目が、皆さんも業務として経験があるであろうWebフレームワークと呼ばれるものです。

Webサーバーと一体化しているフレームワークもありますが、多くはWebサーバーの上に追加で動かすような構成になっており、代表的な例としてLaravelやDjango、Ruby on Rails、Springなどがあります。

コラム: Webサーバー"ではない"もの

本書の本筋から離れた話題、あるいは少し難易度が高い話題については、このような コラム という形でご紹介します。
いずれにせよ、読まなくても本書を問題なく進められる話題のみを掲載しますので、飛ばしてもらってもかまいせん。


あるモノゴトを理解する際にとても有用なのは、そのモノゴト ではない ものについて考えることです。
それも、特にそのモノゴトに「とっても近いが絶対違うもの」について考えると、よく理解できます。

「Webサーバーではないもの」とは例えばなんでしょうか?

例えば、「人間」はWebサーバーではありません。当たり前です。
当たり前すぎてあまり役には立ちません。

ではもう少し近づいて、Webサーバーっぽいけど、Webサーバーじゃないものってなんでしょうか?

Web サーバー と名前がついてるぐらいなので、Webサーバーはサーバーの仲間です。
でもその中でも、特に Web サーバーと名前がついているということは、 Webじゃない サーバーがあるということです。

そのような例として、例えばメールサーバー、ファイルサーバー、データベースサーバーなどがあります。
Webサーバーとこれらのサーバーの違いは何でしょうか?

答えは プロトコル です。
Webサーバーは別名HTTPサーバーといい、クライアントとHTTPで通信を行います
メールサーバーはSMTP/POP/IMAPなどで、ファイルサーバーはFTP、データベースサーバーはデータベースごと(Postgres, MySQLなど)に固有のプロトコルで通信を行います

上級者が、日常の会話の中で、「サーバー」ではなく「Webサーバー」と敢えて言う場合は、それは単なるサーバーではなく「HTTPで通信するサーバー」ということを含意しています。
逆に、「Webサーバー」ではなく「サーバー」といった場合、単に文脈上明らかなので省略した場合か、「通信プロトコルは特に特定せず、とにかくサーバー」ということを意味しています。
サービスの設計段階などであれば、これは暗に「プロトコルはあとで忘れずに決めましょうね」ということを含意していたりします。

言葉一つ一つを正確に使い分けられるか、意味を受け取れるかによって、中級者と上級者の差が出るところです。

興味がある方は、「サーバーっぽいけど、サーバーではないもの」についても考えてみてください。
そうすることで、「サーバーとはなにか」も理解できるかもしれません

まずはWebサーバーを作るところから始める

というわけで、ここまでWebアプリケーションの概要について説明しましたが、どうでしょう、やはり良くわからないのではないでしょうか?

しかし、このもやっと感も、実際にイチから自分でソースコードを書いてみると、腹に落ちてくるものになるでしょう。

まずは実践あるのみ、です。

次章では、まずは一番単純な「Webサーバー1つのみからなるWebアプリケーション」を作成していきます。