「Scalaは生産性が低い」という記事の内容が的確

タイトルのようなことを思いましたので書いてみます。元記事は以下から。

Using Scala Will Make You Less Productive

元記事では良い点と悪い点を紹介しています。ここでは悪い点のみをピックアップしたいと思います。悪い点として紹介しているのは以下。

  • コンパイル時間
  • IDEサポートが貧弱
  • 演算子オーバーロードを使いすぎ
  • 暗黙的な宣言
  • Shallow EndとDeep End

コンパイル時間

遅いです。おっそいです。Scalaのコンパイラは高度な事をやっているので仕方がないらしいです。メモリを増やすよりもCPUを新しいものに変えたほうがコンパイル時間には効いてくるらしいです。また、SBTの差分コンパイルの性能も向上しているとか。

Playframework2でコンパイル速度を向上させるには?

私が普段使っているマシンはCore 2 Duo、メモリは4GBなのでいい加減新調したいものです。

IDEサポートが貧弱

貧弱ですね。Eclipseのプラグインとして動作するScala IDEを使っていますが、Playが動作しているときにデバッガでアタッチすることすらできません。いや、ポートを指定したりなんだりして頑張れば出来るのかもしれないけど。ただ公式ロードマップには「年末にPlayの起動とデバッグをサポート」と書いてあるので現時点では諦めてます。試してすらいません。

また、Playのビューをコンパイルしてくれないのも不満ですね。エラー表示がしょっちゅう残っていて嫌な感じです。

私はもう「型がアンマッチなのを教えてくれるエディタ」として割り切って使っています。もともと、ScalaはIDEによるサポートが無くてもサクサク書けてしまうような言語なので、現状これでなんとかなっています。

ここはもうScala IDEが良くなってくれることを期待するしかないですね。

演算子オーバーロードを使いすぎ

細かいことを言うと、演算子オーバーロードっていうか、単に関数の名前が+だったりするという表現が正しいです。

それはさておき、そう思うことは有ります。APIマニュアル片手でないとコーディングできないですね。たとえばリストだと、「::」はAdds an element at the beginning of this list.で、「:::」はAdds the elements of a given list in front of this list.だとか。「:-|」とか「<:<」とか「&~」とか「???」とか、初めて見た人にはもう笑えてくるレベルですよね。こっちが「???」となります。私も初学者なので笑ってます。

覚えることが多いけど簡単に書けるのが良いのか、覚えることは少ないけど毎回書くのが面倒なのか、どちらが良いかというのは人それぞれでしょう。私は前者の方が良いですね。考古学者になって昔の古文書を解読してる気分でむしろ面白いです。

暗黙的な宣言

これも最初は意味不明でした。まるで魔法をかけられているかのように感じました。書いてないはずの変数にアクセスできたりコンパイルが通るはずのない箇所で勝手に型がうまいこと変換されたりするのですから。

これを多用すれば確実にコードの可読性は落ちます。その危険は確かにあるでしょう。でも、私は危ないからと包丁を取り上げられるよりは、危ないから気を付けてと包丁を渡される方を望みます。たとえそれで指を切っても、です。それでも万人が怪我をしないことの方が重要という考えの人はそもそもScalaを使う事を検討しないのではないかという気がします。

そういえばC#もそんな面がありますね。たとえばimplicitな型変換というのを利用できます。このおかげでXPathを書くときにわざわざインスタンスを書かなくて嬉しかった。この機能が無かったら大変な思いをしたでしょう。反対に、implicitな型変換が悪さをして困ったという経験はありません。間違いなくこの言語機能は導入して正解だと思います。

反対の例は同じような時期に同じように発展してきたJavaでしょう。Javaはとにかく保守的でC#ほど真新しい機能を取り入れることをしませんでした。それが悪いと言うつもりはありませんが、結果として現在あるC#とJavaを比べたとき、私はC#のほうが100倍くらい好きです。愛してる。

Shallow EndとDeep End

これ、何のことか意味不明だったのですが、調べてみると英語圏ではプログラムを議論する題材としてよく用いられているようです。Shallow EndとDeep Endはプールの深いところと浅いところという意味ですね。浅いところは初学者のエリア、深いところは熟練者のエリア。

ScalaはJava風な書き方もできます。Javaのライブラリも利用できます。それを根拠として「初学者でもとりあえず使用でき、徐々にディープな機能を使っていくこともできる」ということをメリットとして主張している人もいるようです。これに対して、紹介した記事では、「結局ライブラリは全部ディープなんだからメリットにならないよ」と主張しています。

これもその通りだと思います。Scalaを使うならScalaの作法を早く覚える必要があると思います。ScalaでJavaと同じようなコードを書くならJavaを使った方がマシです。ScalaやPlayの標準ライブラリでも先に述べたような簡潔だけど動作が想像しにくいメソッド名、暗黙的な変数/型変換の宣言などがよく用いられます。

ただ、私が思うのはShallow EndとDeep Endにはそれほど格差が無いということです。ラムダ式やクロージャが分かればそれなりのコードは打てちゃうんじゃないですかね。少なくとも私はScalaを初めて1週間くらいで思い通りにコードが打てるようになりました。Scalaの作法に従っているかどうかは分かりませんが。

まとめ

指摘されているScalaの短所はいずれもその通りだと思います。が、それを補って余りある魅力がScalaにはあります。Scalaで新しいことを覚えるたび、過去に悩んだ問題が解決される喜びを味わうことができます。これほど使っていて楽しい言語は私は他にありませんでした。

タイトルの「生産性が低い」という点に関しては、上記で挙げたデメリットが生産性にダイレクトに効いてくるかと言われればちょっと根拠に乏しいと思うのですがいかがでしょうか。