若者はどうやってCSSを覚えたのか

先日、[@Jxck](https://twitter.com/jxck_)さん主催で行われた[次世代Webカンファレンス](http://nextwebconf.connpass.com/event/19699/)でCSSのセッションに登壇させていただきました。（[動画](https://youtu.be/KgytEe1u4wM?list=PLRW5DJ7mngHyY8mjt3o75uoj_Tw3oz01q&t=22000)）

セッション中に[@cssradar](https://twitter.com/cssradar)さんに「morishitterはどうやってCSSを覚えたのか」と聞かれ曖昧にしか答えられなかったので、 **自分が今までどうやってCSSを学んできたのか** を振り返ってみる。


## 黎明期

プログラムを書き始めたのは3年半ぐらい前からだと思う。PHPでWebアプリを書いたのがはじめで、そのときに[Bootstrap v2](http://getbootstrap.com/2.3.2/)をベースに何もわからないまま、雑にCSSを書いた。

BootstrapのようなCSSフレームワークからCSSを始めると、`float`や`position`のようなレイアウトに関わるプロパティがどういうものなのかを知らなくても、何となくでWebアプリのレイアウティングができる。
そしてブラックボックス化されたBootstrapのコードを読もうとしても、プロパティの意味がわからなかった。

このときになって初めて、CSSを勉強を体系的に勉強した。[すべての人に知っておいてほしい スタイルシートデザインの基本原則](http://www.amazon.co.jp/%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E4%BA%BA%E3%81%AB%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%84%E3%81%A6%E3%81%BB%E3%81%97%E3%81%84-%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%82%B7%E3%83%BC%E3%83%88%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E5%9F%BA%E6%9C%AC%E5%8E%9F%E5%89%87-%E7%A7%8B%E8%91%89%E7%A7%80%E6%A8%B9/dp/4844362674/ref=sr_1_1?ie=UTF8&qid=1446170455&sr=8-1&keywords=%E5%85%A8%E3%81%A6%E3%81%AE%E4%BA%BA+%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%82%B7%E3%83%BC%E3%83%88)という本を読んだ。
CSSのボックスモデルや詳細度を初めて知り、自分でCSSを書いてもスタイルが適用されないことがあった原因がわかった。

そしてあるとき、Webアプリを作っているときに2人で3000行ぐらいのCSSを書いたことがあった。ちなみにこの頃はすでに（特に何も考えずに）Sassを使っていた。

全く頭を使うことなく、雑に、片手間に書かれたCSSはスタイルの影響範囲が把握できず、メンテナンス不可能なものになった。初めて「CSSの崩壊」を目の当たりにした瞬間だった。


## CSS設計

CSSは構文が貧弱だ。
セレクタでスタイルを適用させたい要素を指定し、プロパティとその値を並べていく。基本はこれだけで、誰でも簡単に書き始めることができる。

CSSのメンテナンス性を保つために、CSSの設計手法について学ぶ必要がある。これは別にCSSに限ったことではなく、CSSもソフトウェアの一部として保守の対象となるので当然のことだ。もっと早く気づくべきだったと思う。

僕がCSS設計の勉強を始めたときにはすでにOOCSSやSMACSS、BEMといった手法が存在した。これらの既存の設計手法についてネットで手探りで調べていた。

今なら[Web制作者のためのCSS設計の教科書](http://www.amazon.co.jp/Web%E5%88%B6%E4%BD%9C%E8%80%85%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AECSS%E8%A8%AD%E8%A8%88%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E3%83%A2%E3%83%80%E3%83%B3Web%E9%96%8B%E7%99%BA%E3%81%AB%E6%AC%A0%E3%81%8B%E3%81%9B%E3%81%AA%E3%81%84%E3%80%8C%E4%BF%AE%E6%AD%A3%E3%81%97%E3%82%84%E3%81%99%E3%81%84CSS%E3%80%8D%E3%81%AE%E8%A8%AD%E8%A8%88%E6%89%8B%E6%B3%95-%E8%B0%B7-%E6%8B%93%E6%A8%B9/dp/4844336355)という本がとてもよくまとまっていて、体系的に学ぶことができる。

CSSの設計について学んでから、Bootstrap等のCSSフレームワークのコードを読む。すると、実際に **どういった粒度でルールセットを定義すれば** いいのかがよくわかる。
CSSプリプロセッサーを使っているフレームワークのコードを見ると、`@mixin`や`@extend`、変数の管理など、プリプロセッサー上手い使い方を知ることができる。
[Bootstrap v4](https://github.com/twbs/bootstrap/tree/v4-dev/scss)や、[Bourbon NEAT](https://github.com/thoughtbot/neat)はSassで書かれていて、一度コードを読むといいと思う。


## CSSプリプロセッサーへの不満

CSSプリプロセッサーが持つ、変数定義やMixin等の機能は、CSSの問題のひとつである **抽象化と構造化ができない問題** を解決していると思っている。
冗長な記述を減らすことができ、これはメンテナンス性向上に直結する。

しかし、現状のCSSプリプロセッサーは、CSSに便利なシンタックスシュガーを定義したものに過ぎず、 **CSSの設計を良くするものではない** と感じた。

ルールセットのカスケーディングやルールセット継承、再利用する機能に制約を設け、職人化しているCSS設計を誰でもできるようにしたい。
そして、「CSSの設計を本質的によくするため」というコンセプトで、プリプロセッサーを自作した。この辺の考えはブログにも書いている。

- [世の中のCSSプリプロセッサーがどれもクソだから自作したった](http://morishitter.hatenablog.com/entry/2014/04/07/074039)
- [YACP: よりオブジェクト指向なCSS設計のためのプリプロセッサー](http://morishitter.hatenablog.com/entry/2014/12/02/000135)
- [AtCSS: Annotations based CSS Processor](http://morishitter.hatenablog.com/entry/2015/03/16/100122)

プリプロセッサーの構文やその実装について調べる中で、CSSに対して意見を持てるようになってきた。ツールを作ることでCSSの仕様について理解できることもあると思う。


## これからCSSを始める人に向けて

オジサンたちがCSSを始めた頃よりも、今はむしろ勉強しやすい環境にあると思っている。

ブラウザのDeveloper Toolsを使えば、DOMの構造と適用されているスタイルを見ることができる。
また、CSSのフレームワークはよく考えて設計されたものが多く、その良質なコードはほぼ全てGitHubで読むことができる。
issueを読めばどういった経緯や理由でそのような実装になっているのかがわかることもあるし、気に入ったリポジトリはWatchすると素早く情報を得ることができる。

CSSをより深く理解するためには仕様書を読むことからは避けられない。しかし、仕様書を読んで理解することはとても大切だが、初めは書籍を読む方がいいと思っている。
僕は最近になって仕様書を読んで細かい挙動を理解したいと思っているが、これまではわからなかったら調べるぐらいで済んでいた。


## まとめ

- 既存のCSS設計手法を学ぶ
- CSSフレームワークのコードを読む
- GitHubで情報収集
- 仕様書読む

で強くなれます。

---

若者からは以上です！