Scala Conference in Japan 2013 に行ってきました

Scala Conference in Japan 2013に行ってきました。

技術的な話はスキル的にできないので、感想というか印象にのこったことを書きます。


これです。

まさに「10年くらいまえのJavaの熱気」でした。
自分語りみたいになりそうですが、かつて C++を書いていた頃の自分にとっての Javaと、いま Javaを書いている自分にとっての Scala。これらがとてもカブって感じるのです。書籍から引用してこれを代弁してもらいます。

1995 年にJava が現れたとき、Java は、ポインタやメモリ管理、その他の難解な配管工事のような仕事と戦い疲れたC++ プログラマを救済する言語として歓迎されました。Java は、そうしたプログラマの難題を解決してくれました。

しかし、2008 年現在、もはや下位互換性は意味がありません。

Java は、0 で始まる配列のようなC++ 主義や、プリミティブ型とオブジェクトの区別などの 1995 年には意味があったけれども最近の開発者の生産性に役立たないお荷物であふれかえっています。
ThoughtWorksアンソロジー P55

ちなみに 「かつての自分」は’95年じゃないですよ。大体10年くらいまえですね。若い人は最初からJavaだったりrubyだったりしますからオッサンホイホイ的エントリの予感です。

Scalaは Java VMで動作し、既存のJavaのライブラリを利用できますので「Javaな人」向けの Better Javaという位置にいます。カンファレンスで発表された竹添さんも、既存の資産を利用したいので Playは Servletでも動いてほしい、そういうニーズがあるということをおっしゃってましたね。

さて、Javaは次のような戦略をとりました。

しかし、Javaの成功のためには、当時の開発者にとって高位の聖職者ともいえるC++ 開発者にアピールする必要がありました。したがって、Java の設計者が意図的にJava 言語の見た目をC++ に似せたことには意味がありました。もう一度基礎からすべてを学び直さなければならないとしたら、開発者を新しい言語に引きつけることはできませんから。
ThoughtWorksアンソロジー P55

(当時 CっぽいC++を量産していた自分は聖職者ではありませんでしたが。)

それからJavaの父、James Gosling氏も言ってますね。

Javaと Javaの ASCIIコードレベルの構文は、Cプログラマや C++プログラマが簡単に使えるように設計されています。実際、とてもうまくいっています。ほとんどの Cプログラマや C++プログラマは Javaコードを少し眺めてこう考えます。「うん、これはわかる。」ってね。

「我こそが考えうる最高のプログラミング言語だ」と自負している理論的な世界の場合は、相互移行性は現実の目標にはなりません。

もしも私がJava を離れて自分専用のプログラミング言語を設計したとしたら、きっとほとんどの人は怒り心頭でしょうね
言語設計者たちが考えること P306

つまりJavaの言語仕様は、理想形を目指したわけではなく最初からマーケティング的な割り切りがあったわけです。やはり企業生まれですし。
自分も、C++ → Javaの時と同じように、Javaの延長線上に Scalaが居ることをある程度期待しているのかな、と、気づきというかあらためて認識しました。
一方、Scalaは Better Javaだけでなく、関数型プログラミングという Javaにはないパラダイムも同時に実現しようとしています。なので、確かにJavaっぽく書けますが、Javaっぽくない(関数型っぽい)書き方もできます。その他にも強力な機能があって(理解していない機能も まだまだいっぱいあるし)、そういう Scalaコードだと自分にはまだ読めません。わかってしまえば簡単なのかもしれませんが、自分にとってはまだ謎コードも多いです。もちろん読めるようになりたいんですけど、演算子とか記号はググりにくいんですよね。

ところで先日、周りのJavaな人たちに自分のこのScala熱を浴びせてみたのですが、better Java以外のところについては、あまり反応がよくありませんでした。それで、Better Javaだけならば Groovyを使うという選択もありえますし、Java 8で型推論とラムダ式がサポートされたら Scalaに近いBetterが達成できるじゃないか、と。いや、自分がうまくそれ以外のところを説明できてないことによるものですが。

ということで、Scalaを推すときは、Better Javaだけでなく、関数型プログラミングとか、(カンファレンスで望月さんが発表された)Betterオブジェクト指向プログラミングとか、Javaよりもっと強力だってことをうまく説明できるようになりたいですね。スキル尚早だったかも。初心者の自分でも思いつくのは、trait, case class, Option, 代数的データ型、パターンマッチ、Javaより強力なジェネリクスやcollection framework。それから、関数型プログラミングの考え方、immutable, 抽象化, データ構造, 再起(書き方というより、再帰的な性質を見つける考え方とか)全然網羅的ではなく思いつくまま書いてますが、こまかくたくさんありますよね。
それから伝わらないかもしれませんが、プログラミング=処理を書くもの。という考え方から、プログラミング=問題解決。という考え方になってきた気がします。(少し大げさに言ってます:-p)
挙げればいくつもあるんですが、その素晴らしさをうまく言語化できると良いのですが…
なので、もっとまともに説明できるように勉強しないと、という話になって残念エントリになってしまいますね。。。
まぁ懐疑的な人も食わず嫌いせずに少し何かScalaで書いてみたら、日本語で説明されなくても、良さが分かるってこともあると思いますよ。

最後に

Scalaの普及には、それ自体の良さだけでなくてマーケティングはある程度必要なのかなぁと勝手に思ってます。
でも Scalaが必要以上に Javaユーザに媚びるようなこともして欲しくないし、ましてや 一時期の Agileのような、例えば「WFは悪!あいつらはいつも分厚い紙束のドキュメントを持ち寄って何時間も会議してる」みたいな煽りで「ああAgileはドキュメント書かなくていいのかー」みたいな誤解でもって広まったりもしてほしくないです。そういうのは、てっとり早く広まるかもしれないけど Agileの人たちはそんな誤解を解くコストを後から結構払ったわけで(でもだいぶそういう極端な誤解はなくなりましたけどね。煽ってた人とは別の人たちがずいぶんがんばったのではないでしょうか。)
もちろん、Scalaが普及してほしいんですけども。簡単にあーすればよいとか言えないですね。

Scalaのマーケティングとかどうこう言える立場でもないですが、そんなことを思ったのでした。