Reach One|株式会社ビズリーチ(BizReach)【企業公式ブログ】

株式会社ビズリーチの公式ブログ「Reach One(リーチワン)」です。 Reach Oneでは、ビズリーチのメンバーやプロジェクトの紹介、社内外のイベントレポートなどを通じて、「ビズリーチのイマとこれから」をお伝えします。

REACH ONE

ビズリーチのイマとこれから

世界最大のScalaイベント「Scala Days@CPH」に行ってきた(前編)

f:id:bizreach:20170704173318p:plain

こんにちは。スタンバイ事業部のScalaエンジニア、田所です。
社内ではエモジニアと呼ばれています。

Scala Daysというイベントをご存知でしょうか?
Scala Daysは世界最大のScalaカンファレンスで、2017年で7回目の開催になります。Scalaの作者や著名なScala製 OSSの開発者、Twitter社を始めとしたScala採用企業のエンジニアなど、大変豪華な面々が登壇します。今年はシカゴとコペンハーゲンの2箇所でそれぞれ開催されました。

Scala Days Chicago

Scala Days Copenhagen

今回は、5月30日から6月2日にかけて開催された「Scala Days Copenhagen」に同期のエンジニアと2人で参加してきたので、特に印象的だったセッションを、前編・後編に分けてお伝えしようと思います。

What’s different in Dotty?

f:id:bizreach:20170704173340p:plain

Scalaの作者であるMartin Odersky教授によるDottyについてのキーノートです。DottyはScalaの次世代コンパイラであるdotc、REPLのdoti、ドキュメントツールであるdotdなどからなるツール群です。

Dottyでの変更

  • Union, intersectionの導入による型システムの健全化&シンプル化

  • Traitパラメータの導入

  • 新しいEnum構文の導入

  • Implicits Conversionのルール厳格化による複雑さの軽減

全体的に、Dottyでは型システムなどから複雑になっているものを取り除き、よりパワフルで親しみやすい言語になるように、といった印象を受けました。

特にシンプルなEnum構文の追加は好意的に受け止められているようでした。

いままでは一般的に下記のようにsealedとcaseを使って代数的データ型としてEnumを表現していたものが、

sealed trait Color
case object Red extends Color
case object Blue extends Color
case object Green extends Color

Dottyでは下記のようにシンプルに表現できるようになります。

enum Color {
  case Red, Blue, Green
}

Scalastic Principle

Scalaのprincipleは「型と関数とオブジェクトの調和」であり、「Implicitsによる簡潔さとパワーとユーザビリティの共存」であるとのことです。それをさらに引き出すため、Dottyでは本質的でない周辺的なものを削ぎ落とし、コアの部分を磨いていくとのことでした。

このような言語作者の思想は言語そのものだけでなくライブラリやツールの方向性にも大きく影響を与えますし、いわゆるハウツー的なセッションでは語られないような内容でしたので、今回直接聞くことができたのは良い経験でした。

Dottyに興味のある方には、JSFiddle的なScalaのお試し環境であるScastieがおすすめです。Dottyの機能一覧などを見ながらぜひお試しください。

またMacの場合、brewからインストールしてすぐREPLを試すことができます。

$ brew install lampepfl/brew/dotty
$ doti

Tools for Verified Scala

f:id:bizreach:20170704173417p:plain

コード解析ツールであるStainlessの紹介です。

Scalaの型システムはバグを防ぐ上で大変強力な機構ですが、それでも不完全なパターンマッチングや、ゼロ除算、範囲外の配列インデックスへのアクセスなど、型では防ぎきれないバグも存在します。

そこでStainlessは"Predicate types that refine the function type"という考え方のもと、処理が満たすべき事前条件/事後条件をコード中に定義してチェックを行うというアプローチをとります。

verifyで事前条件を、ensuringで事後条件を記述すると、「すべての入力」に対してチェックを行い、制約を満たさない場合はその値をレポートしてくれるようです。

例えば平均値を求める処理のコードは下記のようになります。

import stainless.annotation._
import stainless.lang._
object StainlessTest {
  def mean(x: Int, y: Int): Int = {
    require(x <= y && x >= 0 && y >= 0)
    (x + y) / 2
  } ensuring(m => m >= x && m <= y)
}

上記のコードは一見正しく動作するように見えますが、xやyが大きすぎる場合、Intがオーバーフローするためにensuringの制約が破られてしまうと教えてくれます。

セッションではその他にも二分探索木や並列コレクションを構成するデータ型をリファクタする例が挙げられていました。

8 Akka anti-patterns you’d better be aware of

f:id:bizreach:20170704173443p:plain

やってしまいがちなAkkaのアンチパターンの紹介です。Akkaはメッセージ駆動型アプリケーションを構築するためのミドルウェアであり、ビズリーチでも求人検索エンジンのスタンバイや戦略人事クラウドサービスのHRMOSで大々的に利用しています。

バッドパターンとして挙げられていたのは下記でした。

  1. グローバルでmutableな状態を使うこと

  2. 階層のないActor System

  3. 多すぎるActor Systems

  4. 同期的など適切でないロギング

  5. ハードウェアを意識しないこと

  6. ブロッキング

  7. Akka自身でできることの再発明

  8. JavaのSerializationを使うこと

5の「ハードウェアを意識しないこと」では、fork-join executorにてCPUを使い切れない設定などが例に挙げられていました。

ミドルウェアレベルでどのように抽象化がされていようと、その下のレイヤーについてまったく気にしなくて良いというわけではなく、やはりレイヤーをまたいだ学習は必要であるなあと改めて実感させられる大変教育的なセッションでした。

7の「Akka自身でできることの再発明」では、特に再発明されがちなものとしてat-least-once deliveryback-off supervisionmessage prioritizationが挙がっていました。やはりドキュメントをちゃんと読むのは重要ですね。

ScalaQuest: the Scala adventure

f:id:bizreach:20170704173526p:plain

Scala学習ゲームであるScalaQuestのセッションです。

各種コレクションメソッドの問題では、並んだ石をfilterメソッドでフィルタリングしたり、mapで色を塗り替えたりなど、学び方を相当工夫されているようです。

作者である@andanthorさんは高校生の時から教育に携わり、自身もゲームで英語を学んだ経験からこのようなScala学習ゲームを開発するに至ったとのことです。

Scalaはとっつきづらいと言われがちな言語なので、このようにカジュアルに学べるゲームなど学習の選択肢が増えることはとても素晴らしいことだと思います。

ちなみにLightbend社の方にScala初学者向けの教材について尋ねたところ、Scala for Impatientの動画版をオススメしていただきました。言語のエッセンシャルな部分がコンパクトにまとまっているとのことです。

なおビズリーチでもPlay2 + Slick / ScalikeJDBCでのアプリケーション作成を学ぶplay2-hands-onを公開しています。興味があれば是非お試しください。

Event Sourcing and CQRS

f:id:bizreach:20170704173549p:plain

「全ての状態は一連のドメインイベントの結果である」という話から始まり、

アプリケーションモデル/リレーショナルモデル間のインピーダンスミスマッチ解消やスケールアウト、ヒストリーの保存をどのようにESで行うのか、なぜCQRSが必要になるのかを解説するセッションでした。

ES/CQRSとはどんなものなのか?なぜ必要なのか?を丁寧にお話されていたので、事前知識がなくても理解できるセッションだったのではないかと思います。

ビズリーチでは技術イベントの「D3」など、社員が登壇する機会も多いので、プレゼンの仕方なども大変勉強になりました。

d-cube.connpass.com

後編もどうぞお楽しみに!

ビズリーチではScalaエンジニアを募集しています

hrmos.co

f:id:bizreach:20160823213758j:plain

この記事を書いたメンバー

田所 駿佑 / Shunsuke Tadokoro


2015年新卒入社のScalaエンジニア。求人検索エンジン「スタンバイ」のWebクローラー開発を担当。ScalaとClojureとEmacsと絵文字が好き。