奇特なブログ

「殊勝に値する行いや心掛け」を意味する、奇特な人になる為のブログです

「一生」Webの技術者を「楽に」続ける為の方法

今回は、まず書籍のご紹介をして、その後に筆者の意見を書きたいと思います。
まずは、以下の書籍のご紹介です。

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか
(2010/04/10)
小森 裕介

商品詳細を見る
「基本的には」良い書籍だと思いますので、お薦めします。
「一生」Webの技術者を、「楽に」続ける為のヒントを与えてくれると思います。
しかし、かなり厳しい見方で恐縮ですが、幾つか「注意点」があるとは思いました。
まず、掲載されているソースコードには「セキュリティ上の脆弱性」があります。
htmlspecialcharsに第2引数を指定しないと、以下のリンク先の様な問題が発生しますが、
上記書籍では第1引数しか指定されていませんでした。

HTMLエスケープ方法を見直そう htmlspecialcharsとhtmlentities

また、セキュリティの部分は、「攻撃方法は良いが、対策方法が不適切」と感じました。
理由は、本文内に、

Strutsをはじめとするたいていのプレゼンテーションフレームワークでは、このような入力チェックを自動的に行う「バリデーション(Validation)」機能が提供されているので、これらを利用することで簡単にSQLインジェクションを防ぐことができます。
や、
iBATISのようなO/Rマッピングフレームワークは、たいていの場合、内部でプリペアード・ステートメントを利用していますので、O/Rマッピングフレームワークを利用するのもSQLインジェクションの防止につながります。
と書かれてありますが。
ValidationやO/Rマッピングフレームワークが導入された「背景」には、
SQLインジェクションを防ぐ為」といったものは含まれていないかと思うのですが。
Validationは、「アプリ固有ではなく、汎用的な部分のチェックを行う為」に導入されたし、
O/Rマッピングフレームワークは、「オブジェクト指向RDBMSの相性の悪さを緩和する為」に導入されたと、
筆者は思っているのですが。
あと、「たいていの」と書いてあるのが気になります。
プレゼンテーションフレームワークO/Rマッピングフレームワークは、
SQLインジェクション対策が「含まれていない」場合もあるので、そう書いたかと思うのですが。
しかし、ここは単純に、
SQLインジェクション対策としては、入力時のValidationは不要。
SQLに外部パラメータを埋め込む時点で適切にエスケープすれば良い」
と「だけ」、書いておけば良かったのではないかと思います。
あと、SQLインジェクション対策として、入力時のチェックが何故不要なのかは、
以下のリンク先の様な事をしてしまう方がいらっしゃると思うからです。

http://d.hatena.ne.jp/gallu/20080702/p2

以上が、上記書籍の中で「注意すべき点」だと感じた部分でした。
以下からは、良い点です。
最も良かった点を引用させて頂きますが。

技術はすべて私たち人間が生み出したものですから、それが必要になった背景があります。ある背景から問題意識が生まれ、それを解決するために新たな技術が生み出される。さらにその技術を利用する上で別の問題が生じ、それを解決するために新たな技術が生まれる・・・。その繰り返しの上に成り立っているのが、いま私たちが利用している技術だといえます。つまり、その技術が生まれた背景を理解することで、その技術をどのように利用すればよいかがわかります。そして、今までの背景を押さえておけば、また新しい技術が登場したときに、より早く理解できるのではないでしょうか。
WebアプリケーションフレームワークもテンプレートエンジンもO/Rマッピングフレームワークも、
それが生まれた「背景」があります。
詳細は書籍に書いてありますが、
その背景を知らずして、それら技術を上手に使いこなせるとは思えません。
例えば、テンプレートエンジンが生まれた背景には、
「デザイナーとプログラマーの役割分担を明確にする」
といったものが有ったのではありませんか?
そういった背景から考えると、
JSPやHTMLに書くロジックは必要最小限にする」
となるのではないでしょうか?
しかし、現実は・・・省略します(苦笑)

また、言語を問わず、Webの技術は進化が早いです。
そして、よく「最新技術についていくのが大変だ」という声を聞きますが、
筆者はあまりそうは感じません。
例えば、以下の様なカスタムタグがありますが、
ブラウザの「ソースを表示」機能で確認すれば分かる通り、
HTMLとして展開されれば、
HTTPリクエストについては、覚える事は何も無いと思うのですが。

1.Strutsの<html:>や<bean:>など
2.JSTLの<c:set>や<c:remove>など
3.Smartyの{html_options}や{html_radios}など
4.ASP.NETの<asp:Button>や<asp:TextBox>など

HTTPリクエストで送られる内容は、
「カスタムタグの内容が展開された後の、"純粋な"HTMLの内容」
なのですから。
以前にも書きましたが、
「Webの"基礎技術"」を習得する事が、
「一生」Webの技術者を「楽に」続ける為の最適解だと思います。
Webに限らず、「基礎技術」を習得するのは勿論大変ですが、
でも、その努力に見合ったリターンは「想像以上に大きい」と思います。
筆者も、実力はまだまだですが、
Webとプログラミングに関しては、
「基礎技術」も「若干」は身に付いてきたという実感があります。
そして、実際に「楽」になってきました。

業界歴1〜2年の新人さんはともかく、
それ以上の経歴の方なら、是非とも「基礎技術」を学習した方が良いと思います。
上記書籍を読む以外の基礎技術の学習方法としては、
フレームワークやライブラリを"一切"使わずに、プログラムを書いてみる」
事だと思います。
筆者は、ココに掲載している自作のMVCフレームワーク以外だと、
「ライブラリを使わないSMTP(メール送信)プログラム」もPHPで書いています。
これも、「SMTPプロトコル」に基づいて動くものなので、
言語やライブラリの差異は、動きとは関係有りません。
もしかしたら、今後掲載するかもしれません。

これからだって、新しい技術はどんどん出てくるのでしょうから、
「応用が利く基礎技術」を、頑張って学習してみましょう。