web開発の研修を受ける前に知っておきたいこと

# 注意
　このコンテンツは知識ゼロの人が読みやすいように、正確ではない歴史の解説や、悪影響にならないような嘘が混ざっています。
　間違いや嘘が見抜けるクラスの方には不要なコンテンツです。見抜けなくても困ることはないと思います。

# 本文
　こんにちは。ディマージシェアの技術担当です。今回はweb開発系の業務に初めて携わるときに知っておきたい知識をざっくりまとめたいと思います。
　webアプリは、HTTPサーバ、バックエンドプログラム、データベースなど、様々なソフトウェアが連携して動作していることが多いです。例えば、LAMP（Linux, Apache, MySQL, PHP）と呼ばれる構成で動作しているwebアプリはスタンダードな構成の1つとして人気があります。
　web開発の教材をインターネットでいくつか探してみると、おもむろに**環境構築**から始まるものが多いです。確かに、行動としては最初になるのですが、その前に簡単な説明があった方が親切だと思い本記事を作成しました。

# よくあるチュートリアル
　web開発のチュートリアルは、ものすごくざっくり書くと、

「LAMP環境でCRUDを一通り作れるようになって」

という内容のことが多いです。確かにweb開発の仕事をする上で最低限のスキルです。インターネットで情報を検索すれば、上記を達成できるチュートリアルがたくさんあります。幸か不幸かこのチュートリアルを終えれば、できる業務はたくさんあります。
　幸か不幸かという表現を使ったのには理由があり、このチュートリアルにはいくつかの問題があります。
・登場するソフトウェアの関連が見えにくい
・行間を読むのが難しい
などです。
　例えば「LAMP環境で」と書かれても、何故Linux, Apache, MySQL, PHPの取り合わせなのかを知っていないと困る場面は多々あります。行間を読むのが難しい問題は、行間の情報もそこそこ大規模なことが多いのと、チュートリアルの途中に行間を読みに行くと本線のチュートリアルから大きく脱線してしまうことに起因すると思います。

# 知っておきたい歴史
　初期の頃のインターネットで閲覧できるコンテンツは、誰かのPCのインターネット公開用のフォルダの中身でした。Apacheを始め、HTTPサーバプログラムは、セットアップするときに公開するディレクトリをconfigに書きます。HTTPサーバプログラムを起動して、ネットワークに公開したいフォルダを指定することで動いていました。HTTPサーバプログラムを起動しているPCにグローバルIPを割り当てることで、コンテンツをインターネットに公開することができます。ここで使うPCは個人のPCであったり、企業のサーバ室の中のマシンだったり、様々です。OSもWindows, Mac, Linuxなど、バリエーション豊かでしたが、後に、オープンソースのLinuxが主流となりました。ここまでで、LAMP環境のうちL（Linux）とA（Apache）が登場しました。あと2つ足りません。
　少し時間が経つと、CGIと呼ばれる技術が流行り始めました。従来はブラウザに対して特定のフォルダのファイルを公開していたのに対して、ブラウザからのリクエスト内容をプログラムで処理して、その結果をブラウザに返すことができるようになりました。CGIで使われるプログラミング言語の1つがPHPです。CGIが動く仕組みはHTTPサーバの初期の挙動を拡張して作られています。覚えておくべき知識は、

>ブラウザからのリクエストがプログラム以外のファイルのときは、そのファイルをレスポンス、ブラウザからのリクエストがプログラムのときは、そのプログラムを実行した結果をレスポンスする

という挙動です。HTTPサーバの設定を古いままにしておくと、例えばindex.phpのファイルをリクエストしたときに、index.phpのソースコードがそのままレスポンスされてしまう、という現象が起こります。この挙動を解決するためにHTTPサーバの設定を変更したことのあるエンジニアは多いと思います。
　さて、LAMP環境のP（PHP）が出てきましたが、M（MySQL）がまだ出てきていませんね。次にMySQLの紹介をしたいと思います。
　MySQLは有名なRDBMSですが、RDBMSそのものの説明を求めている人はあまりいません。ここでは、何故RDBMSを使うのか、を大切にしたいと思います。
　データを保存しておくため、という理由は多くの人が思いつくと思いますが、データを保存しておきたいだけならば、PHPでファイルに書き込んで保存しておく、という方法でも実現できます。RDBMSを使うメリットを十分に知っていなければ、RDBMSを使う場合と、ファイルに書き込んでおく方法との有意差を説明できません。
　RDBMSを使うメリットで大きなものは、**ファイルを読み書きする仕組みを意識しなくて良い**ことです。例えばPHPで、保存しておきたい情報をファイルに書く、という方法を採ると、どんなフォーマットでファイルに書くかを設計する必要があります。更には、保存しておいた情報を取り出すためのプログラムも作らなければならないのでけっこう大変です。対して、RDBMSとPHPが連携できるならば、かなりの自由度で情報の出し入れが可能になります。RDBMSの基本的な仕組みは単純で、入出力される情報はRDBMS管轄下のファイルに保管されています。PHPでファイルに書いておく方法でも、RDBMSを使う方法でも、**保存しておきたい情報は結局ファイルに書かれる**のです。ところで、保存しておきたい情報をファイルに書くケースは頻繁に目にしているはずです。例えばphp.iniファイル（PHPの設定ファイル）です。php.iniファイルには、PHPの動作の設定を保存しておきます。PHP単独では外部にRDBMSを持っていないので、テキストファイルという見やすい形で決められた場所に設置してあるのです。
　RDBMSは上記の機能の他にも、バックアップや冗長化など、自前で実装するには大変な、有益な機能が備わっていることが多いです。
　業務ではRDBMSを使用することがほとんどだと思いますが、ここに書いた原始的なファイルでの情報管理は非常に軽量なので、データは保存しておきたいけどRDBMSを導入するほどでもない、というケースで選択肢として出てくるようになっていると良いと思います。

# フレームワークの挙動との橋渡し
　業務でwebアプリケーションを開発するときは、大抵は何らかのフレームワークを使います。例えばLaravelを用いる際、今までに紹介した知識がどのように関与してくるのかを紹介します。
　HTTPサーバにApacheを使っている場合は、LaravelのpublicディレクトリをApacheの公開ディレクトリにする設定を書いているハズです。更に、細かい設定として、「URLに対応するファイルがあればレスポンス、なければindex.phpを実行する」という設定も書いてると思います。これらの設定によって、publicディレクトリの中に画像やcssなどを設置すれば、HTTPサーバの基本動作によってブラウザからアクセスできるようになります。重要なポイントは、URLに対応したファイルが存在しない場合のリクエストが来たときの挙動です。このときは、リクエスト内容をindex.phpの引数として渡してindex.phpが実行されます。index.phpの中でLaravelの本体が起動され、Laravelのエリアに設置したソースコードを自由に実行することができるようになっています。

# イマドキの開発の罠
　例えばLaravelでは、Sailという機能を使うとコマンド1発でHTTPサーバ、PHP、MySQL、その他いろいろ、のセットアップが完了します。Laravelの配下で開発を行う、というだけならば5分で環境が手に入ります。従来通りのちょっと手間なLAMP環境の整備をイメージしているエンジニアからすると、「なんだこれ」となるわけです。
　対して、ゼロから勉強してLaravelでアプリ作るぞ！、という方からすれば、一瞬で開発環境が手に入る便利な存在です。ただ、中身を詳しく観察すれば本記事で紹介した内容が自動化されているだけです。日曜日の趣味でアプリを作るだけならとても便利ですが、職業エンジニアになるためには中身もほどほどに理解していないと困る場合があります。

# まとめ
　けっこう長いコンテンツになってしまいました。

「LAMP環境でCRUDを一通り作れる」

というだけでも、行間を埋めていくとけっこうなボリュームがあることがわかりました。ですが、理解が難しい内容なほとんどないと思います。むしろ、目的を達成するためだけに情報が削られたコンテンツの理解に役立つと思います。