Slide 1

Slide 1 text

Scala の好きなところ 難しいところ id:arthur-1 株式会社はてな 2023/10/13 Scala わいわい勉強会 LT 1

Slide 2

Slide 2 text

Arthur と申します 株式会社はてな アプリケーションエンジニア 園遊会の隣で圏遊会が開かれてた 大学を卒業後、2022年新卒入社 𝕏: @Arthur1__ 2

Slide 3

Slide 3 text

Mackerel 作ってます 3

Slide 4

Slide 4 text

Scala で動いてます Web アプリケーションの Backend が Scala で書かれている with Play Framework 4

Slide 5

Slide 5 text

Go も書いてます この辺りのコードは Go : ● クローラーなどのマイクロサービス群 ● mackerel-agent、プラグイン 5

Slide 6

Slide 6 text

TypeScript も使ってます フロントエンドは TypeScript その他にも一部マイクロサービスなどで 採用実績あり 6

Slide 7

Slide 7 text

今日の話 仕事で Scala, Go, TypeScript の 3言語を使っている目線から Scala の好きなところと 難しいところを話します 7

Slide 8

Slide 8 text

好きなところ 8

Slide 9

Slide 9 text

Option, Either 型が native にある 9 型で表現されているのでコンパイル時に検 査できる コードを書いてる時の安心感が違う!!

Slide 10

Slide 10 text

Go の場合 ● nil チェック ● err が nil ならメインの 返り値は not-nil である べきと言う文化 ○ これに頼って nil チェックしないと、ラ イブラリの実装ミスで panic することも item := findById(1) if item == nil { log.Fatal(“unexpected nil”) } 10 item, err := findById(1) if err != nil { log.Fatal(err) } item // これはnilじゃないという期待

Slide 11

Slide 11 text

TypeScript の場合 ● undefined との union 型を使うと null 安全に ● if 文書かざるを得ないこと があって Option より面倒 ○ Optional Chaining も やってきて少し楽に なった const item = “hoge” as string | undefined; item.length; // ‘item’ is possibly ‘undefined’. 11 const item = “hoge” as string | undefined; if (item === undefined) return item.length; // OK! item?.length; // ES2020~ if 不要

Slide 12

Slide 12 text

裏返しとして 型が合うような関数を頑張って探す 12 scala> val results = Seq(Left(1), Right(2)) val results: Seq[scala.util.Either[Int,Int]] = List(Left(1), Right(2)) scala> results.filter(_.isLeft) val res1: Seq[scala.util.Either[Int,Int]] = List(Left(1)) これじゃダメ

Slide 13

Slide 13 text

Seq に生えてる method が強力 Web アプリケーションって、DB に入ってるレコード 群をこねくり回していい感じに返す係(諸説) Enumerable なものを取り扱う道具が built-in で揃っ ていると最高 Ruby もこの辺結構強い気がする 13

Slide 14

Slide 14 text

Go / TypeScript の場合 Go ● 割と素朴 ● Go 1.21 から slices package が登場したものの、もう一声欲 しい ○ uniq, chunk… TypeScript ● map などの高階関数はある ● Go よりは充実してるものの、やはり自作することは間々ある 14

Slide 15

Slide 15 text

他にもいろいろ この辺りが好き: ● case class ○ immutable ○ 比較が楽 ● pattern match ○ 代数的データ型では網羅チェックもしてくれる 15

Slide 16

Slide 16 text

難しいところ 16

Slide 17

Slide 17 text

誰が書いてもコード同じにならない 色々な書き方ができるので、 習熟度が異なるチームメンバーでコードの 雰囲気も変わってくる 17

Slide 18

Slide 18 text

例えばエラー処理 手続き型らしい書き方 ● if 文 ● early return Scala らしい(?)書き方 ● 式で頑張る ● for comprehension で連ねる 18

Slide 19

Slide 19 text

生産性が下がっている? Scala らしい書き方ができない、と手を止めてしまう ムーブを見かける 実際には「関数型らしくない」か? Better Java でも十分便利だし価値がある 19

Slide 20

Slide 20 text

20 Scalable だからね

Slide 21

Slide 21 text

仕組みでは統一しづらい コードベースの雰囲気がバラバラだととっつきにくい とはいえ、lint ツールで特定の書き方を強制するにも 限度あり チームで Scala を育てる必要があると思う 21

Slide 22

Slide 22 text

チームで Scala を育てる はてなの技術組織として ● 螺旋会談 Mackerel 開発チームとして ● サファリツアー Scala 回 開催 ○ ちょうど今日決まった 22

Slide 23

Slide 23 text

他にもいろいろ ● implicit parameter ○ sbt console でコード片をコピペして実行しても まあ動かない ● 足回りが弱い気がする ○ 特にビルドツール ○ Go のエコシステムが便利すぎて比較するとどう しても見劣りしてしまう 23

Slide 24

Slide 24 text

まとめ ビギナーなりに Scala を使っていて、こんな 風に思っていますという話をしました 今日はぜひわいわい勉強させてください! 24

Slide 25

Slide 25 text

hatena.co.jp/recruit 25 25