抽象化と組み合わせができるレイアウト言語があれば、CSSは必要ない

Web上の視覚的なスタイルを指定するCSSは、あまりにも複雑で、恐らく今までに一度も正確に実装されたことはないだろう。それにもかかわらず、バージョンが上がるにつれて、その複雑さは増すばかりだ。一方で、CSSではできることが限られており、初歩的なデザインでさえ不可能であるか、あるいは法外に難しいことも少なくない。加えて状況依存的(または計算的)な側面を持つものは、すべて外部で対応しなければならないという有様だ。その結果、CSSに関するほとんどの手引きでは、希望する外観に何とか近づけたり、非互換性を回避したりするための頼りないハックに多くの労力が費やされている。
Bret Victor

私は近年、クライアントサイドの開発技術を数多く見てきました。そして、その中でも特に興味深いと思ったのがElmです。関数型のプログラミング言語としては、Elmはそれほどワクワクするようなものではありません。では、何に興味を持ったのかというと、HTML+CSSにおける山のようなハックやJavascriptでの明示的なDOM操作とは対照的に、Elmがレイアウトの記述に関して、非常にまともなコンビネータライブラリを提供しているという点についてです。Elmの作者はこれを、バグではなく意図した特性だと述べています。Elmでは、必要に応じて使える非常用手段が提供されているものの、それ自体だけでも、DOMのことを全く意識することなく十分なレイアウトを行うことも可能なのです。

こうした大胆なスタンスを採用した結果、Elmのメーリングリストでは当然の議論が巻き起こりました。それはElmのレイアウトやグラフィックを、どのようにCSSと連携して使うかということについてです。しかし、たいていの場合、本当の意味でのプログラミング言語を使う時は、外部のスタイルシート言語は必要ありません。なぜならプログラムの中で何らかのレイアウトやスタイルを修正したいのであれば、その言語の中にある抽象化や組み合わせの手段を使えるからです。CSSが生み出されたのは抽象化の手段がないHTMLの穴を埋めるという、場当たり的な問題を解決するためであり、それは心もとないWeb技術にすぎなかったということを思い出してください。しかし広く使われるようになるにつれてCSSは数多くの機能を蓄積してきました。その機能とは、CSSやHTMLに抽象化や組み合わせの手段があるとするならばライブラリと呼べるかもしれないものです。話の方向性が見えてきましたか? 抽象化や組み合わせの手段は重要で、場当たり的なハックというものはこれらの手段を適切にサポートすることの代わりにはなりません。ここで私は、どういうわけかC++について表現した“イヌに追加の足をくっつけて作ったタコ”という言葉を思い出しました。

CSSを支持する側の意見としては、“デザイナーが使い慣れている” “巨大なエコシステムがある” “実用的な選択肢だ”などというものがあるでしょうか。そこには完全には明らかにされていない2つの暗黙の了解が存在します。そのうちの1つとして、抽象化は一般に信用されていないということがあります。我々の業界がミームに影響されたのはSpolskyのせいです。ソフトウェアの歴史を少しばかり振り返ることで、複雑なソフトウェアを人々が理解し実現可能にするための基本的な手段が抽象化であることがはっきりするでしょう。だから、私たちはアセンブリ言語から離れ、高水準言語を支持するようになったのです。ソフトウェア技術に抽象化の手段を積極的に取り入れないようにするほど、抽象化への全面的な不信感を持つのは馬鹿げています

もう一方で、さらに深刻なのは、デザイナーはみんな愚かだという暗黙の了解があることです。たとえ新しい言語によってレイアウトコードの検証がはるかに簡単になり、よりシンプルな構文で複雑なレイアウトを組めるとしても、彼らは新しいものを学ぶ気がないのかもしれません。有能なデザイナーであれば、Elmが提供するような一連のレイアウトコンビネータを利用して、すぐに生産性を上げることができるはずだと思います。もちろん初めは時間がかかりますが、合成レイアウトライブラリと抽象化の手段があれば、すぐに遅れを取り戻せます。高水準プログラミング言語がアセンブリ言語に取って代わったのと同じように、抽象化と合成性は長い目で見れば必ず成功を収めます。だから、本当の意味でのプログラミング言語でのレイアウトコンビネータもCSSベースのデザインで多用される場当たり的なハックに最終的には取って代わるでしょう。

レイアウトにElmのような言語を使うと、Stack Overflowで公開されているCSSをよく理解しないままカット&ペーストできなくなるのは確かです。私は、この制限をひとつの特徴と捉えています。プログラマは複雑なものに対処し、重複を除外するためにツールを開発してきました。だから、レイアウトコードも通常のツールで対処できるし、対処すべきです。

この問題について勇気ある立場を示したElmに賞賛を送ります。