Play Framework + Scalaの感想

Play Frameworkを使い続けて2週間くらい経ちました。感想などをまとめてみたいと思います。

遍歴

私は学生のころはJavaばっかり打っていました。Javaは私にとってオブジェクト指向を教えてくれた先生であり、C言語やC++でのmalloc/free(new/delete)の苦しみから解放してくれた救世主でもありました。趣味ではPerlを少し触っていた程度です。

会社に入ってから数年はC、C++などをやらなければならなくなり、他人が混入させたメモリリークと戦う毎日が始まりました。それが2年くらい続き、その後の2年くらいはC#によるWindowsアプリを作っていました。WinForms、WPF、Entity Frameworkなどは一通り理解しているつもりです。

その後は突然Webになり、Pythonから始まって次はいきなりnode.js。かと思えば、今度はSeaser2になって、その次はJSF。フロントエンドも当然のようにやらされます。なんだかコロコロやることが変わりすぎて疲れてきました。

Javaはクズ

上記のように色々な言語を経験しましたが、どの言語もそれぞれ良いところがあります。C#のプロパティとLINQ、WPFにおけるData Binding、Pythonにおけるリスト内包表記、充実したライブラリ群。C/C++は苦しいと書きましたが、良くも悪くも低級(ハードウェアに近い)言語なので、パフォーマンスが出せますしOSやハードウェアなどのコア部分まで触るのは他の言語では限界があります。使い方と使うシーンさえ間違えなければ今も昔も優れた言語だと思います。JavaScriptも何だかんだで動的言語なので簡単な処理をさっと書けるから楽で好きですね。

ただし、個人的にはJavaはクソだと思います。型推論が無い。ラムダ式もクロージャも無い。だから高階関数も使えない。関数がオブジェクトじゃない。いちいちインタフェースを実装しなければならない。getter/setterの羅列が美しくない。下記記事に全面的に同意します。

なぜJavaはC#と比べて駄目なのか

Java系のWebフレームワークもうんざりです。Glassfishはメモリ食いすぎでまともに開発もできない。Faceletsが抽象度高すぎで裏で何やっているのか理解するのに時間が掛かる。その割に大して便利でもない。Seaserは幾分か良いな、とは思ったのですが、今時やれて当たり前の事をやっているに過ぎないと思います。(まあ、それは2014年に触っているからそう言えるのですが…。2.4がリリースされたのは2007年です)

結局Javaは保守的すぎたのではないでしょうか。Java言語にクロージャを導入するかどうか長年議論を重ねている間に、他の言語はさっさとクロージャやプロパティを導入しました。だって便利だからです。純粋なオブジェクト指向にクロージャが必要かどうかなんて高尚な議論は実利主義やビジネスの現場では無縁です。Javaは学術的な言語ではなくてビジネスの現場で活躍する言語なのです。さっさと便利な機能は導入すべきだったというのが私の意見です。

C#はJavaに比べれば美しくないのかもしれません。たとえば、async/awaitにおけるTaskクラスに完全に依存した言語仕様などはかなり不気味で気味が悪いように思えます。しかし私は美しさよりも利便性を取ります。ビジネスだけでなく趣味でもそうするでしょう。私にとって言語とは美術品ではなくて実用的な武器です。その意味ではミサイルや小銃と同じです。美的かどうかという観点で現代の正規軍で使用されるミサイルや小銃を設計する人は居ないでしょう。実用性を突き詰めた結果に生ずる機能美というのもありますが、それは美術品とはまったく性質の異なるものだと思います。

話をJavaに戻します。Java8でProject Lambdaが実現されStreamによる操作が可能になりましたが、今さらという一言に尽きます。ピュアなJavaでそれが実装されたところで基幹系システムやWebをやっている人はあまり嬉しいとは思いません。なぜならフレームワークがサポートしなければ意味がないからです。そしてそれは何年後になるのでしょうか。(一応、JSF2.2とJava EE 7の組み合わせで限定的にラムダ式によるフィルタが出来るそうですが)

IBMのdeveloperWorksに秀逸な記事がありました。

多忙な Java 開発者のための Scala ガイド: オブジェクト指向のための関数型プログラミング

Java プログラミング、そしてオブジェクト指向は、多くのプログラマーにとって初恋でした。そして私達はそれを、私が初恋の人 Bindi に対して示すのと同じ敬意と真摯な憧憬をもって扱います。一部の開発者は、メモリー管理と C++ による地獄の業火から Java プログラミングによって救われたと語ります。他の人達は、手続き型による絶望の深みから Java プログラミングによって抜け出すことができたと語ります。(中略)

しかし、すべての初恋は最終的に時間に打ち負かされ、新たな旅立ちの時が訪れます。気持ちは変わり、物語を演じる役者は成熟しています (そして新しい冗談もいくつか学んでいるはずです)。しかしもっと重要なこととして、私達を取り巻く世界が変化を遂げています。多くの Java 開発者は、Java プログラミングを必要としつつも、開発の世界の中での新しい機会を捉え、それをどう利用できるかを考える時が来ていると感じています。

私も同じような気持ちを持っています。Javaは初恋でした。しかし今さら初恋の相手に会ってどうしろと言うのでしょうか。私はJavaを旅立ってJavaには無いいろんな世界を見てきました。Javaと付き合って何万行もコードを書いていた時を思い出して懐かしむことは出来ますが、そのころと同じ気持ちでJavaと付き合い何万行もコードを書くことはもはやできません。お互いもう年を取ったのです。

Scalaの学習コスト

私が初めてScalaに触れたときに初めて抱いた印象は、難しい、覚えることが多そうだという感じでした。しかし、3日もScalaに触れれば「なんとなく分かってきた」となり、1週間後には「基本的な部分は大体わかる」という自信が付きました。

おそらく、Scalaの学習コストは世間の人々が思っているほど高くは無いと思います。それは、あらゆる言語仕様が人間にとって直感的に分かるようになっているからです。JavaやC#を使っていて「こう省略して書けたら良いな」「こうあるべきだと思うけどこう書かなければならないのは面倒くさいな」と思うことを突き詰めていけばScalaの言語仕様に行きつくような気がします。おそらく、C#やJavaの経験があればあるほどScalaの学習コストも小さくなると思います。

言語なんて何だっていい

よく、言語なんて何でもいいという意見を聞きます。これまでの事と真逆を言うようですが、私もそう思っています。ソフトウェア開発における言語の選択というのは、要求された機能・性能にミートするシステムが容易に作れるかどうかという点を重視して決めればいいと思います。つまり、システムが動作するシーン、目的、機能仕様が提示されれば使用すべき言語はおのずと絞り込まれると思います。それが複数個あった場合はどの言語を選ぼうとどうでも良いです。プログラマに要求される能力の一つは、開発環境が変わってもそれを受け止めることのできる柔軟さとバラエティではないでしょうか。「言語なんて何だっていい」という意味を、私はそう解釈しています。

Play + Scalaが提供してくれること

PlayとScalaを考えるとどうでしょうか。この二つは汎用的で多くのシステムに応用可能だと思います。Java由来のフレームワークで動いているシステムのほぼ全てはPlay + Scalaでリプレース可能でしょう。でも理由が無いのにわざわざ新しい言語を覚え、新しいフレームワークでシステムを構築しようと思う人は居ません。

Play + Scalaを使って何が嬉しいか?と問われれば、私はまず「生産性が高い」という点を挙げます。これはビジネスにおいてとても重要な要素です。二番目に、「型安全である」という事を挙げます。型安全でありながら生産性が高いフレームワークというのは、これまで無かったのではないかと思いますがいかがでしょうか。

当ブログでも何回か引用していますが、以下のような記事があります。

Ruby対Scala

少なくとも巨大なソフトウェア作成では、動的型付言語は使い物にならない。 railsが流行ったのは、単に「簡単に、短い行数で、開発者が一人であっても」所望のプログラム作成ができたからであって、おそらくは、たかだか一万行程度が限界である。これらのスクリプト言語は、この程度の「さっと書いて、使った後は捨ててしまう」といった用途にのみ向いている。 これを超える、複数の人間で作成するような複雑なシステムでは動的言語は明らかに不適当である。これは以下の事実から導かれる。

  • 動的言語では「名前」の同一性が字面からは判断できない。
  • ソフトウェアは機能拡張されるものである。
  • 人間の記憶には限界がある。
  • プログラマは忙しい。
  • 完全なユニットテストを記述することは難しい。

当該記事にはネット上でたくさんの賛否両論の意見があるようですが、少なくとも私は完全にではないものの、大部分は同意します。ちなみに私が静的言語を推す理由として最も大きいのが、「単純なミスをコンパイル時に指摘してくれる」という事につきます。パフォーマンスがどうとか、幸いにもパフォーマンスが要求されるような場面に出くわしていないので個人的にはどうでも良いです。

また、まつもとゆきひろ氏が

特に「開発者が多人数で玉石混交な環境では動的言語でまっとうなソフトを開発できない」という主張を見ると「静的言語でも無理だろ」と突っ込みたくなる。それとも私が知らないだけでJavaとかだとそういう環境でも「良いソフト」が開発できたりするのかな。

私が理解している限り、「良いソフトウェア」を開発するためには「小さいチーム」と「優秀な開発者」が最重要で、それらの欠如をIDEやら静的型言語やらで埋めることはできるというのは幻想。動的型言語は最初からそんな幻想を提供しない

ということをtwitterで述べていますが、これもまあその通りだと思います。優秀な開発者で小さなチームを作り、RoRを使わせれば大抵のものはすぐに出来上がっちゃうでしょう。そういう成功例はごまんとあります。

ですが、優秀な開発者を集めて小さいチームを作ることがどんな会社や組織でも出来るわけではないです。また、玉石混交な環境で大規模ソフトを開発するとき、動的言語を使うのと、静的で型安全な言語を使うのとでは後者の方がマシとまでは(経験的に)言えるとは思います。

玉石混交な環境でPlay + Scalaを使う方が難しいんじゃないかと言われそうですが、いやいや、皆が思っているほど学習コスト高くないですって。というのも今回の主張の一つではあります。

まあ、前述したように「言語なんてどうでも良い」という考えがあるので、たとえば「一人でSNSのようなシステム作れ」とか命令されたら、場合によってはPythonなんかで組んだりすると思います。仕様が実現できるならWordpressをカスタマイズして作りたいくらいです。

まとめ

なんかつらつらと思ったことをそのまま書いたので全然まとまりが無くなってしまいました。今回伝えたかったことは、

  • Play + Scalaは思ったよりも学習コストが小さい
  • Play + Scalaは生産性が高い
  • 型安全(コンパイル言語)は嬉しい
  • 生産性と型安全の両方を実現したWeb開発環境はあまり無い

というあたりです。