Web 技術は難しい
はじめて Web でなにかソフトウェアを作ってみようと考えたときに、なにが一番難しいのか…。 たまに Web システム未経験の方にその道しるべを教えることがあって「どこから教えたらいいのか」ということを考えることがあるのですが、いまだにその回答がでていません。
Web に限らずどんなソフトウェアもいっしょなのですが、多くはいくつかの技術の組み合わせになります。 例えば、Windows のアプリケーションをつくろうとおもったら、 C++ 言語だけ知っていてもダメで、Win32 API とか Windows 固有の環境のこととかを知っている必要があります。
でもって Web なんですが、この複合される技術が普通の環境よりもとても多く、ものすごくとっかかりが悪いのです。 処理を記述するための言語(Java とか C# とか PHP とか)、HTML、JavaScript、CSS、SQL、HTTP、UNIX、ネットワーク、Web 特有のセキュリティ技法、Web サーバ、アプリケーションコンテナ、フレームワーク、、等々。(昔は言語覚えるだけで全部できたもんですが…。)
PHP とか Java とかのコンピュータ言語なんかはすぐ覚えられると思うんですが、プログラムを動かすための関連技術の複合を覚えるのが一苦労。
おまけに、もともとシステムをつくる用途で設計されていない HTML / HTTP の仕組みを使って仕組みを構築をしなければならないため、セッション処理等の裏技的手法(だとぼくは思っている)を大量に投入する必要があります。
もちろん最近これらは、アプリケーションコンテナやフレームワークやライブラリでラップしてくれてだいぶ意識しなくてもすむようにはなっているのですが、それらになにかトラブルがあったり規格以上のことをしようとすると、どうしても基本となる知識が必要になってきます。
で、これらを最初から覚えるための順番を考えてみました。 🙂
- HTML を使って画面をだせるようになる。 まだ、ローカルにおいた HTML ファイルのダブルクリック。 ブラウザが HTML と CSS を使って画面をレンダリングする感覚、HTML タグとかファイルのパスのたどり方を覚える。
- よくわからんが Apache の所定の位置に HTML ファイルをおいてみる。 みんなからネットワークごしに見えるようになった!。 ファイルのあたまに http:// とつくのを確認。 Apache のログをみて、、GET ってなに? と HTTP の知識を少し深める。
- 何かしらの言語(たとえば PHP)を使って動的コンテンツをつくってみる。 たとえば、現在時刻を表示。 Web のプログラムは、ブラウザから HTTP のアクセスをもらったタイミングで動くこと、またその時点で終了することを理解する。 Webサーバ(ex. Apache) -> アプリケーション(ex. PHP) と呼ばれるイメージをもつ。 また、結果(値)を HTML で出力すればブラウザにその通り反映されるという仕組みの感覚を身につける。
- じゃー、画面からの入力をプログラムでうけとってみよう、ということで HTML のフォームを覚える。 いろいろフォームコントロールを画面に張ってみて、いかに HTML フォームが貧弱なのかを心得る。
- HTML フォームからの入力をプログラムで受け取ってみて、表示とかしてみる。 HTTP の POST とか GET とかの概念を覚える。 また、POST、GET の入力データがどのようにプログラムに渡されてくるのか理解する。
- ここで、ブラウザを使わずに telnet で自分のアプリケーションに HTTP アクセスしてみて、HTTP ヘッダとかに興味を持つ。 また逆に、アプリケーションにコンテナから渡される変数などを確認する。 RFC(HTTP) などを読んでみる。
- 動作環境の UNIX に興味をもってみて、自分のファイルのありかや、ファイル/ディレクトリの属性、動作しているプロセスなどの理解をする。 OS リソースのプログラムからのアクセスの仕方を覚える。
- ブラウザ上で値チェックしたり小技を使いたくなり JavaScript に手を出す。 ああ、ブラウザだけで動くんだという理解をする。 ちょっと AJAX にも興味を持ってみるが、ソースがよく分からないのであきらめる。 😳
- ログイン画面付の複数画面あるアプリケーションをつくってみる。 Web のプログラムはアクセスされた1画面で終了してしまうので、情報をさらに次の画面に保持するのはとても難しいことに気がつく。 セッションを維持するためにどうすればいいのかを考える。 GET の引数とか、cookie とか hidden とかの存在を知る。
- セッションの維持を意地でやってみる。 :-P
- ここまでくるとだいぶなんたるかが分かってきたので、セキュリティに目を向けてみる。 うわ! JavaScript の記述をフォームに書いたら画面で動いちゃうじゃん、とかセッションID 分かったら他の人もログインできちゃうじゃん、とか。 入力値をサニタイズする必要性や暗号化通信などを覚える。
- 若干ネットワークにも興味を持ち始め、ルータとか DNS とかファイアーウォールとかの知識が増す。
- 自分で実行環境もつくってみたくなり、Apache とかの設定ファイルを読んでみる。 あ~そういうことね~。
- プログラムも自由に作れるようになってきたので、フレームワークに手を出してみる。 うわ、便利じゃん。 MVC とかに興味を持つ。
- アプリケーションコンテナのある環境ならば、環境について理解を深めてみる。
う~ん、やはり動作環境的な部分やそれらの連携部分の説明が難しそうですね。 上から5番目以降がひっかかるところのような気がします。 しかもまだ何かが足りないですね。 SQL とか入っていないし。 😎
もちろん、これらは分業も可能で、HTML/CSS はデザイナーさん、SQL は DB 屋さん、環境は環境屋さん、ネットワークはネットワーク屋さんと多くの現場では分かれています。 だけれども、さすがにそれぞれなんの知識がなのは無理なんです。
ぼくも体系的に覚えたいるわけではないので、なかなかこれらをうまく説明できません。
もうちょっと考えてみよう…。 なにか良い書籍などあったら教えてください。 🙂