2012年 04月 02日

なぜ CoffeeScript がダメか

自分は CoffeeScript が好きではない。個人的に書き捨てるコードを書くときには良いだろうけれど、継続的にメンテナンスが必要なコードに、この言語は絶対に採用してはならないと考えている。

CoffeeScript のメリット

CoffeeScript を採用することで発生するメリットについて、僕の認識を書く。当然、CoffeeScript というのが存在するためには、それ相応のメリットがあるはずだし、メリットの説明なしにデメリットとの差 (つまり採用すべきかを判定する基準) は導けないからだ。

箇条書きで

  • タイプ数が減る
    • function が -> になるのでカッコいい
    • 括弧を書かなくてよいのでシンプル
  • グローバル変数を使いにくくなるのでバグが出にくい
  • == と != が使えないのでバグが出にくい

CoffeeScript のデメリット

  • 単純な JS へのトランスレータ (革新的な機能は特にない)
  • デバッグが難しくなる (ブラウザのサポートが必要)
  • JS の知識がないと書けない

CoffeeScript は基本的には、シンプルに書きやすくすることにフォーカスされていて、例えば非同期処理が劇的に読みやすくなるとか、そういうことはない。function を -> って書けるとか、記号的な文法は書きやすくはなっても、そんなに読みやすくはならない。

確かに、CoffeeScript の導入によって、書きやすくなるコードは大変に多い。「JSではなぜこれができないんだ!」と思ったことが解消されて、かゆいところに手が届く。

しかし、継続的にメンテナンスが必要なコード (OSSとか、ウェブサービスのコードとか) というのは、書いている時間よりも、読む時間・読まれる時間のほうが多い。書くのは一人でも、読むのは複数人いるし、しばらく触っていないコードは、例えそれが自分で書いたコードであったとしても、また読解する必要がある。

CoffeeScript を読む場合、読む人には CoffeeScript の知識と、JavaScript の知識、どちらも必要だ。むしろ JavaScript を詳しく知っていなければ、CoffeeScript のメリットは理解できない。前述の通り、読む人は書く人よりも多い。書く人がいくら楽になっても、読む人にとって、CoffeeScript で書かれていることは単に学習コストの増大であり、メリットではない。

逆に、読む人にとってメリットがあれば、それは書く人にとってのメリットの何倍も嬉しいことになる。では CoffeeScript で書くことによって、JavaScript より読みやすくなるか、というと、そうでもない、と自分は思っている。function が -> になることで読みやすくなるか? 括弧を書かないと読みやすいのか? タブによるインデントの強制は読みやすさに貢献するかもしれないが、これは単にコーディングルールの問題だ。

バグが起きにくい仕組みは大変素晴しいものだけれど、残念ながらそれは、CoffeeScript を採用することで読む人にかける負担 (これは場合によって何倍にもなる) を上回らないと考えている。むしろそこは、JSLint などで、書く人が気をつける、すなわち負担をうけて解決すべきだと考える。

まとめ

将来 CoffeeScript に、使うと超読みやすくなるよマジやばい!!! っていう機能が入るといいと思いますが、そうでないなら、絶対に OSS とかをこれで書くのはおすすめできない。

CoffeeScript が現状のままだと、こんな未来が想像できます。

 「うわ、これおれが CoffeeScript 期に書いたやつかよ。この言語オワコンって言われてから何年経ってんだ…… もう文法覚えてねーな。あ〜終わりゆく言語の文法を学びなおすのか……まじめげるな……」