さて、前回からの流れで(?)今回はVelocityを紹介する。
Velocityとは簡単に言えば、文書生成テンプレートツールだ。
Jakartaで開発されている。
動的な文書を作成するにはいくつもの方法があるし
その用途も様々だが、今回は一つに絞って紹介しようと思う。
それはずばり、動的HTMLの生成について。
--- 最良の選択肢 ---
JavaでHTMLを生成すると言ったら、誰もが真っ先にJSPを思い浮かべると思う。
僕も以前まではそうだった。
しかし、いつも言っているようにプログラマには常に最良の選択肢を選ぶ権利がある。
JSPの代わりとして今注目しているのが、このVelocityだ。
--- シンプル ---
Velocityの特徴は、そのシンプルさにある。
JSPでは、文書(HTML)とコード(Java)の分離をするのに
結構な手間と技術が要求された。
具体的には、拡張タグライブラリというものを自作しなければならない。
もしくは、Strutsのようなフレームワークを使用する。
JSPファイルがHTMLに変換されるのに、どのような経路を辿っているか
知っている人はいるだろうか。
--- 複雑 ---
JSPファイルは通常のHTMLファイルにタグを埋め込んだ形式になっている。
それをJSPパーサが解析してJavaファイルを自動生成する。
さらに、このJavaファイルをコンパイルして
作成されたclassファイルを「実行」することでようやくHTMLが出力される。
JSPパーサが生成するJavaファイルの内容を見たことがある人は、
そのあまりの汚さに閉口した事だろう。
とはいっても、大抵の人はそれを気にする必要は無い。
JSP→Java→class→HTML
という工程の中で、真ん中の二つは自動的に行われるので
意識する必要が無いからだ。
しかし、開発者はこれを意識する必要がある。
具体的には、デバッグ作業の時だ。
JSPファイル内でエラーが発生した場合、開発者はその汚いJavaコードを
見ながらデバッグしなければならない。
つまり、結局JSPは文書ではなくコードなのだ。
これでは「プログラマとデザイナーを分ける」というMVCモデルを実装できているとは
とても言えないのではないか。
通常のデザイナーではまず間違い無くJSPファイルを修正できない。
ただ単にレイアウトを変更したいだけでも。
ある程度プログラムの事を理解した人でないと、JSPファイルを編集したときに
発生する意味不明なエラー内容に対処できないからだ。
--- ビジネス ---
僕はプログラマだから、今までそういう事をあまり気にする必要は無かった。
コードもデザインも全部一人でやるスタイルだったからね。
でも、このスタイルはビジネスの世界ではおそらく通用しない。
ユーザは見栄えのいいページを望んでいるからだ。
そのためにはデザイナーが必要になる。
今までの開発方式だと、デザイナーがWebツールで作成したHTMLを
プログラマは気が狂う思いをしてJSPに変換しなければならなかった。
もしくは、HTMLタグとJSPタグを理解しているデザイナーが必要だった。
何も知らないデザイナーがこれらを実用的なレベルまで理解するのには
数週間は掛かるだろう。
--- 習得の易しさ ---
それに比べ、Velocityの作者は言う。
「Velocityのテンプレート構文は、2?3時間でマスターできる」
これは大げさな表現ではない。
http://www.jajakarta.org/velocity/velocity-1.3.1/docs-ja/vtl-reference-guide.html
↑このページにある全てが、Velocityのテンプレート構文の全てである。
非常に単純な構文であることが理解できると思う。
単純ではあるが、マクロを使うことで拡張性のある言語にすることが可能だ。
そこら辺は使っていくうちに覚えていくだろうし
マクロを使えないからといってそれほど困ることも無いだろう。
僕の意見からすれば、マクロはプログラマが作成してデザイナーに提供すべきだと思う。
そうすれば、デザイナーはそのマクロの使い方を覚えるだけでいい。
デザイナーには、最初にほんの2?3時間掛けて
テンプレート構文を学んでもらえばいい。
これが2?3週間だったら、おそらく多くのデザイナーはこれを拒否するだろう。
--- 専門化 ---
この業界では、技術の専門化を進めるべきなのだ。
デザイナーがプログラムを覚える必要は無いし
プログラマがデザインを勉強する必要も無い。
そうした方が、より素晴しい物を作り上げる事が出来る。
この二つの能力がどちらも秀でた人など皆無に等しい。
分業なんて、他の分野では当り前のように行われている事なんだから。
だからって、プログラマに「金融」「Web系」などの
ジャンル分けをする必要は無い。そういうのは
企業側が単に即戦力を欲しがる為の言い分に過ぎない。
そこまでジャンルを限定したら、将来他の業務で
使いものにならなくなる恐れがある。
色んな分野に手を出すことは重要だ。
それによって多くの知識が身に付く。
そしてそれは他の分野のプログラムでもきっと役に立つ。
--- 導入のキッカケ ---
僕が今回Velocityに注目したのは、JSPを使っていて
その複雑さに疑問を感じたからだ。
現在公開しているLimywebで、日記のメイン画面を表示させて
その速度を計測していた時のこと。
たかだか30K程度のHTMLを出力するだけなのに
JSPの表示(だけ)に約300msも掛かっている。
これじゃPHPや何かと変わらんレベルだぞ。
おかしいな、と思いJSPから生成されたJavaファイルを見て僕は唖然とした。
そのJavaファイルは何と80K、1500行にも達する巨大ファイルだったのだ。
元のJSPはせいぜい300行程度だ。
しかしその中で多数の拡張JSPタグを使っている。
これが、今回Javaファイルをここまで肥大化させた要因に違いない。
--- 本末転倒 ---
何かの記事で、
「拡張JSPタグをたくさん使うとパフォーマンスが低下する」
と書いてあったが、正にその通りだったのだ。
高速化の為には、JSPタグの使用を控えろともその記事には書いてあった。
何ということでしょう。
これじゃまるで、高速化のために「ポイントを減らし、仮想メソッドは少なく」
という指摘がされている.NETの図式そのままじゃないか。
JSPからJavaコードを排除するために用意された拡張タグを
思うように使えないのでは、結局またJavaコードがJSPファイルに
散りばめられる結果となってしまう。
こんな本末転倒な話があっていいのだろうか。
--- 両立可能 ---
もちろん一般的に、処理速度とコードの綺麗さは
反比例するという事実は否定することが出来ない。
しかし、かつて遅かったJavaが高速化への道を辿ったように
高速化を達成しつつもシンプルなコードというのは
書けるはずなのだ。
それを目指しているのがVelocityだ。
そして素晴らしい事に、Velocityは確かにJSPよりも高速だった。
JSPで300ms掛かっていた処理をVelocity(VTL)で書き直したところ
その表示に掛かった時間は120msにまで短縮された。
もちろん、コード(正確に言えばリソース)は
JSPよりも遥かにシンプルだ。
--- 次回リリース情報 ---
次作のLimywebは全てVTLで書こうと思う。
JSPからVTLへの移行は非常に簡単だ。
ただし、既存のJSPでJavaコードを記述してないという
前提があれば、の話だけど。
簡単なAjaxも導入する予定なので
見た目的にも少し変わって使い勝手も良くするつもり。
完成までもうしばらくお待ちを。
…って、誰も待ってないかもしれないが(笑)。