HTML + CSS + JavaScript を組み合わせる難しさ
私の基本的な主張は「JavaScript は難しくない」だ。ただ、HTML + CSS は難しいと思っていて、それと組み合わせる JavaScript をちゃんと書いたり、書いてもらおうとすると困難は多い。
クロスブラウザ
JavaScript についてよくふれられるクロスブラウザの問題、こまかな差異のあるホスト間で動作するプログラムをどう書くか、という問題は「ソフトウェアの移植性」としてそれなりに歴史のある問題だと思う。JavaScript で「良い」とされる書き方は、たとえば C + UNIX みたいな環境で「良い」とされる書き方と似ていることがある。
例えば、ほとんどのブラウザにある便利な関数が、特定のブラウザにだけ無いときに
if (! Array.prototype.forEach) { Array.prototype.forEach = function () { ... }; }
みたいなものを書くのと ruby (MRI) の missing/ にあるファイル群は同じことをしている。
また、Object Detection と呼ばれる「User-Agent ではなくクラス/メソッド/関数の有無をみろ」という原則も autoconfぼくらの約束 にある
#ifdef __FreeBSD__を書いて「移植性が高いぜ」とか いばってるのはもう恥ずかしい。未知のOSでも動くように、autoconfで調べて#ifdef HAVE_HOGE しましょう。
と同じことだと思う。
Progressive Enhancement
難しいと思うのは Progressive Enhancement, 段階的な機能強化だ。
これは「MMX 命令がある CPU だったらそれを使う」みたいな実行時間効率を一次元で強化するのとは違っている。HTML は文章の構造を、CSS はその見た目を、そして JavaScript はそれにふるまいを与える、という分担は独特で、しかも、その分担がそろわない場合を常に考慮する、というのはわりと酷なはなしだと思う。
「ユーザー体験という観点から見れば一次元だ」みたいなものは単なる言葉遊びで難しさを緩和しないし、3つの分担と「段階的」が理想主義すぎるといわれると確かにそんな気もする。Yahoo! の Nicole Sullivan さんの Object Oriented CSS なんかをみると、JavaScript を足さなくとも、HTML + CSS ですらずいぶん大変なことになっていると思う。
あきらめるひともいる。Cappuccino と Objective-J で 280 Slides を作り上げた 280 North の人々は「Cappuccino は Progressive Enhancement / Graceful Degradation にはできていない」という。
Cappuccino represents a significant shift in attitudes toward web application development. It was designed specifically and exclusively for writing web programs. None of Cappuccino will work in an environment without Javascript. After all, what use would a program like 280 Slides be without its interactive behavior? The program itself doesn’t have any data to display, so there is nothing to degrade to.
Objective-J なんて無理するから…。あー、いや、これはこれで現実的な判断だと思います。ただ、彼らのいう “Web Program” にまで達しているソフトウェアはそんなに無いので、万能ないいわけではない。
まとめ
結論はとくにないです。
- JavaScript は難しくない。HTML とあわせるのが難しい。
- クロスブラウザは移植性の話で、わりと解かれた問題だ。既存の JavaScript 以外で書かれたソフトウェアにも似たようなものはある。
- Progressive Enhancement は新しくて難しい問題で、知っていて解くことをあきらめる人々もいる。
私は HTML 4 や XHTML がわりと好き (HTML 5 は微妙) で、CSS, JavaScript との分担もきれいだとは思う。難しさは一段上の成果物を作ろうとしているのだからしょうがない。ただ、その「上」さをだれがどのくらい評価するかは気にかかる。
私が well-formed, valid な HTML とか、microformats や RDFa みたいな目に見えないものに肩入れしがちなのは、それが自分以外の開発者にバトンを置いておくことだというのがあるけど、そういうことを、例えば 美人時計 を hCard に対応させて顧客の前で説明する自信は無い。あるいは、アクセシビリティで障害者が、みたいな話をするにもそんなに詳しくなく、知りもしない集団を都合良く被害者あつかいするのもどうかと思う。
高い目標とそれを実現するための教育、ってのが王道なんだろうけどね。後者が欠けたときの失敗がこわいというか。いろいろあきらめすぎなのかなあ。
追記
JavaScript自体は難しくないのは同意。加えてHTML、CSSも単体では難しくないと思う。それぞれを組み合わせ、クロスブラウザにしようとすると途端に職人芸の世界に。ところでif (Array.prototype.forEach)は!が抜けてる
ありがとうございます、直しました。単体では難しくないというのは同意します。クロスブラウザは、JavaScript なら既存のライブラリを使えば「職人芸」ほど酷くはないかなあ。職人芸というかバッドノウハウだと思っているので JavaScriptは悪くない で主張されていたライブラリに対する姿勢にはあんまり同意できないです。