数十万行のプロジェクトを Scala 2から3に完全移行した
by
kenji yoshida
×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
数十万行のプロジェクトを Scala 2 から3 に完全移行した Scala わいわい勉強会 4 2024-12-13 1 / 30
Slide 2
Slide 2 text
X( 旧twitter) @xuwei_k github @xuwei-k blog https://xuwei-k.hatenablog.com 2 / 30
Slide 3
Slide 3 text
数年前の発表 アルプでのScala 3 移行 ずっと副業で関わってます 3 / 30
Slide 4
Slide 4 text
がくぞ @gakuzzzz·Follow そういえばアルプのプロダクト、しばし前から Scala 3 で 本番環境も動いてましたが、いつでも戻せるように Scala 2.13 でもクロスビルドしてました。 それを先日 2.13ドロップして Scala 3 のみにしたので 諸々便利な機能も使えるようになりましたヤッター 7:34 PM · Oct 31, 2024 30 Reply Copy link Read more on X 4 / 30
Slide 5
Slide 5 text
アルプのScala コード 数十万行 ほぼmonorepo サーバーとフロントは分かれてる 2024 年後半に無事Scala 3 移行完了 5 / 30
Slide 6
Slide 6 text
詳細な時期忘れたけど、既に2022 年時点でScala 3 のTest/compile はほぼ通せていた Apache Spark 部分除く CrossVersion.for3Use2_13 が複数残っていた 状態 その状態が2 年以上?継続 6 / 30
Slide 7
Slide 7 text
残ってた主な課題 Apache Spark 古いsttp akka 関連どうする?pekko 移行? refined のScala 3 対応macro その他独自macro の対応 3 だけtest 落ちる箇所修正 7 / 30
Slide 8
Slide 8 text
Apache Spark これ書いてる2024 年12 月現在でもSpark 公式は Scala 3 非対応 非公式で無理やり頑張るツールはある そもそもAWS のEMR 使っていた影響でSpark 関連部分 のコードだけScala 2.13 ですらなく2.12 だった 8 / 30
Slide 9
Slide 9 text
Apache Spark kory さんが一晩で脱却してくれました 詳細知らないけど、見直したらSpark ではないとダ メな処理ではなかったらしい?ので、別のもので書 き換え 9 / 30
Slide 10
Slide 10 text
古いsttp https://github.com/softwaremill/sttp http client ライブラリ Scala 3 非対応なversion 使ってた 10 / 30
Slide 11
Slide 11 text
sttp メジャーバージョン間で非互換が大量で辛い よほどしっかりテスト書くか動作確認しないと怖い 11 / 30
Slide 12
Slide 12 text
sttp 真面目にやるとライブラリそのもののテストを書く くらいな勢いになってしまう 外部にリクエストするために使うので、それ自体の mock server を実際にhttp 通信する形でテス ト??? 12 / 30
Slide 13
Slide 13 text
sttp kory さんが一晩で最新に上げてくれました 移行途中で少しだけ後から気がついてなかった挙動 の違い見つかったが修正し、最終的にはそこまで大 きな問題なく成功 13 / 30
Slide 14
Slide 14 text
akka どうする? 詳細割愛するが、アルプではakka-http その他割と 多くakka 関連使っていた ライセンス変更で実質有料化 規模によっては、お金免除されるらしいが、脱却し てしまった方が楽 14 / 30
Slide 15
Slide 15 text
akka どうする? 結論としては無事pekko 移行完了 主に自分がやった 実質これに起因するトラブルなし! 15 / 30
Slide 16
Slide 16 text
akka からpekko 基本的に公式ガイド通りにやっただけ config やpackage をakka からpekko にひたすら変 える 万が一の時に戻しやすいように、コンフリクトしな いように、多少工夫したり 書き換えにscalafix 大活躍 16 / 30
Slide 17
Slide 17 text
refined のScala 3 対応macro https://github.com/fthomas/refined Scala 2 なら大きな不満ないが・・・ compile 遅くなる罠はある 公式がScala 3 のmacro ほぼ未対応 そもそも開発活発ではないのでは? 17 / 30
Slide 18
Slide 18 text
refined のScala 3 対応macro 公式とは別に独自に対応してるものが見つかる https://github.com/gemini-hlsw/lucuma- refined 18 / 30
Slide 19
Slide 19 text
refined のScala 3 対応macro gemini-hlsw/lucuma-refined に多少pull req したりしたが、結局完璧でもないし、これを一 部参考にしつつ完全独自対応して組み込んだ 主に自分とkory さん 細かい実装方法の選択肢が色々あって議論したの面 白かったけど今回は割愛 19 / 30
Slide 20
Slide 20 text
refined のScala 3 対応macro compile error のmessage にScala 2 と互換無く なったが基本的に動くので許容範囲なものが完成 まだ中途半端にfthomas/refined に依存したまま だが、今後iron に移行するか、そもそも全部独自に してしまうか何かしたいかも? https://github.com/Iltotore/iron 20 / 30
Slide 21
Slide 21 text
その他独自macro 自分やkory さんなどがScala 3 に慣れていたので、 いくつかあったがあまり大きな問題ではなかった? 細かい実行時の挙動が全く同じになるように工夫す るのに多少は苦労したが 21 / 30
Slide 22
Slide 22 text
Mockito 辛い問題 これ読んで https://xuwei- k.hatenablog.com/entry/2021/06/01/233628 自作のwartremover でほぼ検知出来た https://xuwei- k.hatenablog.com/entry/2023/03/04/114947 22 / 30
Slide 23
Slide 23 text
その他? 細かい何か色々他にもあった気がするが、印象に残 ってないので、自分にとってはあまり大変ではなか ったのかも? 23 / 30
Slide 24
Slide 24 text
Scala 3 移行後 約1 ヶ月でimplicit をほぼ全部消してgiven や using やextension にしたぞ! ほぼ自分がやった 確か元々は数千箇所あったはず ここでもscalafix 大活躍 数十個は書いた 24 / 30
Slide 25
Slide 25 text
Scala 3 移行後 given やusing は出来るだけ明示的に名前をつけな い定義に https://xuwei- k.hatenablog.com/entry/2024/11/16/102039 25 / 30
Slide 26
Slide 26 text
Scala 3 移行後 scalafix だけScala 2 で書かないといけないの で、はやく対応してくれ〜 PolyFunction やexport 使ったりenum に一部書き 換えたり、その他色々やってる最中 26 / 30
Slide 27
Slide 27 text
extension の衝突が辛い問題 implicit class を単純に書き換えるとよく衝突し て、そのままcompile 通らないことが多い 色々と残念な回避策というかコツ?があるが、今回 は割愛? 27 / 30
Slide 28
Slide 28 text
coverage 有効化した場合のバグ 書き方変えることで回避 28 / 30
Slide 29
Slide 29 text
unused import の誤検知がまだ多い 29 / 30
Slide 30
Slide 30 text
おわり 30 / 30