Javaの資産を活かし、移行が容易な「Scala」は、試す価値あり!
続いて新田氏は、JavaからScalaに移行するにあたってのポイントについて紹介した。静的型付け言語であるScalaは、Javaのライブラリなどをそのまま活用でき、修飾子や演算子なども似ている。簡潔なコード記述や型変換なども明示的、暗黙的にできる。新田氏はコードの例を示し、その簡潔さ、Javaとの類似性などを紹介した。
ただし、意識するべき基本ポイントとして、イミュータブルな値(val)を徹底すること、関数型を意識すること、Javaのライブラリの使用時にはラッパーを使うことなどが必要だという。さらにnullは使わず、Optionを使い、import時のJavaとの違いには注意が必要となる。また、最も留意すべきなのは「implicit」の機能であり、これがJavaエンジニアの第一の障壁になる。その理由として、Javaに比べてIDEが助けてくれないこと、「モナド」を考え出すと急に難易度が上がる、完全に関数型寄りでは簡便性が利点のScalaの価値が下がるなどをあげた。「implicitは、十分なScalaの知識のレベルに達していなければ“黒魔術化”のように何が起こっているかを把握できなくなり、フルでScala機能を使うとメンバーが参加しにくくなるのが難点」と新田氏は指摘する。
それでもこうしたことに留意すれば、経験のないメンバーであってもScalaをすぐに使いこなし、十分プロジェクトを進めることが可能だという。そうしたことを踏まえ、新田氏は過去のコードについて「今見れば直したい」と笑うが、「それ以上にプロジェクトの進め方や仕様確認のほうが重要だった」と振り返る。そして、「ファーストトライとしては上々。しかし、ファーストクラス関数の使いこなし、implicitやモナドが使えるようになることで、Scalaの利用価値も上がる」とし、スキル向上のためにコミュニティ活用や勉強会の有効性について語った。
最後に、新田氏は「エンジニアにとってScalaは『やってみたい』技術のはず。ぜひ挑戦してほしい」と語り、「Scalaを導入する上でJavaに対するメリットを組織に対してしっかりと訴求できることが大切であり、エンジニアとして信頼されていることが重要」と導入についての心構えを語った。
代表的なモナドを使ったコードで紹介、Javaとの違いを提示
続いて登壇した韓氏は、スマートフォン広告配信システム「Dynalyst」立ち上げにあたり、「Scala」を活用してきた。もともと米国サイバーエージェントで業務にあたっていた際に、「Twitterが業務改善にScalaを活用し、その88%を占める」というニュースに触れ、機会があれば使ってみたいと考えていたという。そして実際に「Dynalyst」の開発においても、現在は約9割がScalaを用いており、最近はさらに増える傾向にあるという。
前に登壇した新田氏も指摘するように、Scalaの活用ポイントの1つとして「モナド」が上げられる。「モナド」は値に効果を与え、与えられたものを関数でシーケンシャルに評価していくというのが基本的な考え方だ。
韓氏はモナドについて、「どのクラスでもオブジェクトであるため、コンストラクタがあり、値や関数を渡してインスタンスをつくることができる。もしくは、このクラスのコンテナオブジェクトにアプライというコードを用意しておいて、そこで値があるものに効果を与えることができる」と説明する。つまり、関数をフラクタルに引き継いで行くことができるというわけだ。
韓氏はさらにSimple User DAOについてJavaのサンプルコードを提示。しかし、Javaのドキュメントがない場合、Nullの対応については不明となる。通常こうしたわかりにくいインタフェイスの場合、ドキュメントでこれまでは解決を行なってきたが、モナドを使えば、リターンタイプをわかりやすくすることができる。
韓氏はJavaのコードと、モナドを使ったScalaのコードを見せながら、その違いや価値について語った。例として示されたのは、Nullの可能性がある値に効果を与える「Option」、例外的な処理に効果を与える「Try」、ブロックの処理に効果を与える「Future」、繰り返しに効果を与える「List」の4つ。それによって簡素化され、不明部分をドキュメントで補う必要がなくなった様子を示してみせた。
なお、自分でモナドを作成することもできるが、その際には「モナド則」と呼ばれるルールに従う必要がある。すなわち、左単位元(Left Identity)、右単位元(Right Identity)、結合律(Associativity)の三則であり、これらを証明する必要がある。さらに値を取り出すときにも注意が必要だ。たとえば、NoneやBehaviourから値をとれば例外が飛んでしまう。そこで「Helper Functions」や「Pattern Match」などを使って取り出すことが望ましい。またAkka、Sprayなど3rd Party Libraryのモナドを使うのもよいだろう。
韓氏は最後にモナドの利点として、「コードがきれいになること」「読みやすくなること」「メンテナンスしやすくなること」そして、何より「バグがかなりなくなること」の4点を上げ、最後に「ぜひScalaに興味を持ってもらいたい。そして、そんな仲間と共に仕事をしたい」と語った。