MOBILUS TECH BLOG

モビルスのプロダクト開発を支えるメンバーが 日々の開発現場の情報を発信します。

ScalaMatsuri 2024 に参加しました!

こんにちは。SaaS Product Divisionの若杉です。

MOBI AGENTのバックエンドエンジニアとして1年ほど開発に従事しています。

今回は2024年6月8日〜9日にわたって開催された、Scalaのカンファレンス「ScalaMatsuri 2024」に参加してきましたので、そのうちのセッションをいくつかレポートしたいと思います。

MOBI AGENTのバックエンドはScalaで構成されています。私自身は前職から業務でScalaを扱うようになって経験年数は3年ほどと、まだまだ未熟者ではありますが、今回初めてScalaMatsuriに参加してみて本当にたくさんの良い刺激を得られたので、この場を借りて共有できればと思います。

ScalaMatsuriとは?

ScalaMatsuriとはアジア最大級のScalaのカンファレンスで、2013年開催初年度は「Scala Conference in Japan 2013」という名称で始まり、2014年開催から「ScalaMatsuri」という名称になりました。そこから大体1年に1度の頻度で開催されています。

ここ数年はコロナの影響もあり、オンラインでの開催でしたが、今回5年ぶりにオフラインでの開催となりました。

会場である東京国際交流館にはたくさんのScalaエンジニアが集まり、外国籍の方も多くいらっしゃっていて、非常にグローバルなイベントとなっていました。

ScalaMatsuriの特徴は、応募すれば誰でもセッションの登壇者として発表ができる点と、さらに事前応募ではなく当日の飛び入りセッションも設けている点です。カンファレンスは2日間にわたって開催されましたが、2日間ともいくつか飛び入りセッションが開催されていて、通常のセッションよりもっと砕けた雰囲気で、誰でも自由に発言できるような開かれたセッションとなっていました。

それでは、私が参加したセッションのうち、2つをピックアップして共有したいと思います。

ピックアップセッション①【PHPからScalaへ:私の経験】

こちらは、イタリア出身のKristian Lentinoさんによる発表で、Scala初学者やScalaをあまり知らない人にもわかりやすい内容となっていました。

余談ですが、今回のカンファレンスは英語での発表が全体の半数以上を占めていましたが、会場に通訳の方がいらっしゃり、その同時通訳をレシーバーで受信して聞くことができるという素晴らしい環境が整備されていて、私のような英語弱者でも内容をしっかり理解して聞くことができました。プログラミング用語が飛び交うセッションを通訳することは非常に困難なことだったと予想されますが、通訳の方には本当に感謝しかありません。

ということで、セッションのレポートに戻りましょう。

Kristian LentinoさんはもともとPHPを業務で扱っていましたが、転職の際にScalaを学ぶ必要があり、そこからScalaを始めた、ということでした。

セッションの前半部分はどのようにScalaを学んだか、ということで、おすすめのリソースが紹介されていました。Scalaに興味はあるけれど、何から初めて良いかわからない、という方はぜひ参考にしてみてはいかがでしょう?

https://github.com/KristianLentino99/ScalaMatsuri2024

そして、Scalaを学んで知った数々の素晴らしい点について語られていました。普段Scalaを触っていると当たり前に感じていることも、「やっぱりScalaって便利だよね!」ということを再確認できてとても良かったです。私はプログラミングを始めて最初に業務で扱ったのがScalaだったので、比較ができるほど他言語の知見がないのですが、PHP経験者からも「やっぱりScalaって良いよね」と言ってもらえたことはなんだか嬉しかったです。

紹介されていたScalaの素晴らしい点を一緒に見てみましょう。

Option型

Option型はScalaで非常によく使われる型です。PHPではこのような概念はなく、値の有無を安全に処理することができる点で優れている、と紹介されていました。nullを扱う必要がなく、とても便利で安全な型だと思います。

パターンマッチ

こちらは、Kristian Lentinoさんが一目惚れした、ということで紹介されていました。パターンマッチは可読性が高く、自動でenumの網羅性チェックもしてくれます。コードの例を見てみましょう。

val x: Int = Random.nextInt(10)

x match {

  case 0 => "zero"

  case 1 => "one"

  case 2 => "two"

  case _ => "other"

}

非常にシンプルでわかりやすく、何をやっているのか、プログラミングを学んだことがない人でもなんとなく理解できるのではないでしょうか。else ifを続ける記法よりもコード量も少なく、見た目にも美しいので私もお気に入りの記法です。

発表では漫画「ONE PIECE」のキャラクターを例に作成されたサンプルコードも用いられていて、ユニークで分かりやすい内容となっていました。

少ないコード量

Scalaの大きな魅力の一つが、コード量の少なさです。発表ではPHPでは3行で書くけるコードが、Scalaでは1行で書けることの共有がありました。

PHPのコード

$numbers = range(1, 100);

$even_numbers = array_filter($numbers, function($num) {return $num % 2 === 0;});

$sum = array_sum($even_numbers);

Scalaのコード

(1 to 100).filter(_ % 2 == 0).sum

この例が出た時に、私は思わず「おぉ〜」と声が出てしまいました。コード量を3分の1に減らせるとすれば、保守性もかなり上がるのではないかと思います。

implicit

implicitはScalaの暗黙的な値です(Scala3ではgiven)

implicitは様々な使用方法があり、そのどれもが「暗黙的に何かしてくれる」というものです。予期しない動作に繋がる危険性もあるので使いすぎるのはよくないけれど、使いこなせれば美しいコードが書ける、とのことでした。

確かに、implicitの乱用はかなり危険ではありますが、使ってみると便利でコードがスッキリするので、使い所を見極めて使用するのが良いかと思います。セッションでは円周率を暗黙的に渡すサンプルコードが紹介されていました。

私は既存の型を拡張する使い方(implicit class)が便利で好きです。

といった感じで、PHPからScalaへの壮大な旅を語ってくれました。セッションの終わりの方で「PHPの方が優れていて、懐かしいと感じる部分は?」といった質問がありましたが、「そんな部分があれば私はここに立っていない」という力強い回答がありました。

Scalaの魅力を再確認・共有できた素晴らしいセッションだったと思います。

ピックアップセッション②【Property-based testing: テストライブラリ活用方法】

次に紹介するのは、Magda Stozekさんによるテストコードに関するセッションです。プロパティベースの考え方に基づいたテストライブラリの活用についての発表でした。

もちろんScalaのライブラリに関する内容だったのですが、考え方は他の言語にも通ずるところがあるんじゃないかなぁと思ったりもしました。

事例ベースのテスト

まず、テストと聞いて思い浮かべるのは「事例ベースのテスト」ではないかと思います。

発表では、顧客の継続年数によって割引が適用される例を用いて説明されていました。

def calculateDiscount(customer: Customer, now: LocalDate): BigDecimal

case class Customer(

    name: String, 

    joinedAt: LocalDate, 

    dateOfBirth: LocalDate

)

0-1年の継続では0%、1-2年の継続では10%、2年以上の継続では20%、さらに誕生日では30%の割引が適用される場合、「事例ベースのテスト」ではテスト内容は下記のようになります。

it should "calculate 10 percent discount" in {...}

it should "calculate 20 percent discount" in {...}

it should "calculate birthday discount" in {...}

it "should calculate no didcount" in {...}

それぞれの割引率が適用される例を用いて、正しい処理かどうかを判断する。一般的な考え方ですね。

プロパティベースのテスト

では、プロパティベースではどうなるでしょう。

it "should not be lower than 0" in {...}

it "should not be over 30 percent" in {...}

it "should be proportional to membership years" in {...}

it "should not be greater than birthday discount" in {...}


割引の4つのルールに着目して、例で捉えるのではなく、その「性質」をテストするのが「プロパティベースのテスト」の考え方だそうです。

この例では、「割引率は0より小さくはならない」「割引率は30より大きくならない」「割引率は会員年数に比例する」「割引率は誕生日割を超えない」という4つのルールに着目して、それをプロパティとして定義します。

プロパティベースの考え方としては、アルゴリズムの全てを網羅する必要はないんだそうです。ある安全な範囲を指定して、処理の結果がその範囲内に収まっていれば問題ない、というのが考え方のベースとなるそう。

「割引率は30より大きくならない」の定義に対するコードはこんな感じ。

property("Discount should not be over 30 percent") {

  forAll { (customer: Customer, now: LocalDate) =>

    val discount = calculator.calculateDiscount(customer, now)

    discount should be <= BigDecimal(0.3)

  }

}

顧客とローカル日付をランダムにいくつか生み出し、その全てに対してこのテストを満たしているのかを判定してくれるそう。

確かに、ランダムにいくつもの組み合わせをテストしてくれるのはとても便利ですね。例ベースのテストでは、所詮頭の中にある、想定できうる値に対してしかテストができません。このライブラリでは想定していなかったようなトリッキーな値に対してもテスト実行が可能で、有用性があるとのことでした。

プロパティベーステストの課題

プロパティベーステストの課題についても共有されていました。

まずはそもそもの考え方が難しいので、そこで躓いてしまう可能性があること。次に、そのランダム性故に、バグが見つかり切らずに後から見つかってしまう可能性があること。

これらの課題については、まず例ベースのテストを実行すること、その後で重要なコンポーネントにのみ、プロパティベースのテストを実行すると良い、とのことでした。

確かに、事例ベースのテストと併用することで、よりその力を発揮できるように感じました。バランスが大事そうですね。

プロパティベースというテストの新しい視点に気づけた刺激になるセッションでした。

トレーニングDayについて

今回、私は6月8日〜9日のカンファレンスDayに参加しましたが、実はその前日にトレーニングDayも開催されていました。

私は参加していないので詳細は不明ですが、Scala初学者だったり未経験だったりしてもScalaMatsuriが楽しめるように、基礎的なトレーニングが行われたようです。

Scalaに興味はあるけれど、全然知識もないし。。という方はトレーニングDayから参加してみるのも良いかもしれません。

Scalaはよく難しいイメージを持たれて敬遠されがちですが、一度触れてみると「なんだ、こんなものか」となったり、その便利さに虜になると思います。あくまで個人的見解ですが。

ぜひ、たくさんの方にScalaに興味を持って欲しいです。

まとめ

いかがでしたか?ここで紹介したものは本当にほんの一部です。

ScalaMatsuri 2024のセッションの全ては動画としてアーカイブに残っています。ここで紹介したセッションも、その他のセッションも気になる方は是非覗いてみてください!

https://scalamatsuri.org/ja

私は今回、初めてScalaMatsuriに参加しましたが、どれも本当にタメになるセッションで、中には話が難しすぎてほぼ理解できないものもあったりしましたが、それも含めて本当に良い経験になったかと思います。何より、Scalaエンジニアまみれの会場がもう楽しくて楽しくて仕方なかったです。あと、お昼のお弁当がとっても美味しかったです(笑)

来年も開催されるのであれば、ぜひ参加したいです!



モビルスでは、一緒に働く仲間を募集中です!

もちろん、Scalaエンジニアも、Scalaに興味のある方も大歓迎!

興味のある方は、ぜひ採用情報のページをご覧ください!