🌟

2026 年初頭における Scala オンボーディングのリアル

に公開

はじめに

2022/07から株式会社 FOLIO で働いている田口と申します。

私が所属しているチームは、4RAP というプロダクト(金融機関の「投資一任サービス」を実現する SaaS 型プラットフォーム)において、金融機関とのデータのやり取りを行うインターフェイス部分の開発・運用を担当しています。

プログラミング言語は Scala を使っており Cats(Cats Effect) という関数型ライブラリを中心に Doobie, Circe, FS2, Refined といったライブラリを主に使っています。

弊チームのオンボーディングの初期に newbie というリポジトリでライブラリの練習してもらうフェーズがあることは、以前書かせていただきました。

https://zenn.dev/folio_sec/articles/c3fd36dfc69797

基本的にはメンターと一緒にペアでオンボーディングプランを進めていくのですが、Scala 初学者に対しては言語自体のフォローアップを別途行う必要性を感じており、2026年に入社(弊チームへの参画)した方々と一緒に新しい試みをいくつか行いました。

本記事では、その新しい試みについて詳しく書いていこうと思います。

Scala(Cats)習熟までのざっくりとした道筋

私自身は Java -> Scala(Cats) というバックグラウンドを持っているのですが、思い返すと以下のステップが Scala 習熟のための勉強として効果的だったかなと感じております。

  1. scala_text を読む
  2. 競プロの簡単な問題をなるべくイミュータブルに解く
  3. 初学者向けの本を読む。以下のいずれか
    2. Scalaスケーラブルプログラミング(通称 コップ本)
    3. なっとく関数型プログラミング
  4. 関数型自体の理解に向けた読み物を読む
    2. Scala With Cats
    3. Scala関数型デザイン&プログラミング ―Scalazコントリビューターによる関数型徹底ガイド(いわゆる FP in Scala)
  5. Cats(Cats Effect)の公式ドキュメントを読む
  6. コードをたくさん読む/書く

2026年の1,2月で3名の方が弊チームに配属となりましたが、それぞれ Python, Java, Golang のバックグラウンドをお持ちの方々でしたので、通常のオンボーディングに加えて Scala 習熟のためのフォローアップを行うことに決めて、上記の中からいくつか実施していきました。

競プロの簡単な問題を解く

まず最初のステップとして、競プロの簡単な問題を解くことを行いました。

  • 単純なデータ変換のコードを通して、経験言語 <-> Scala 間の比較を行うことで Scala の標準関数の使い方を学ぶ
  • Scala の標準ライブラリの勉強の仕方を学ぶ
  • (optional) IntelliJ のショートカットを使ったコードリーディングやライティングを学ぶ

このステップでは、ごく単純なプログラミングスキルのコンバートに主眼を置いて進めていきます。

実際にやったこと

今回は AtCoder の灰色問題から Scala の使用頻度が多い標準関数を使って解くことのできる問題を ChatGPT に 10 問弱選んでもらい、実施していきました。

回答のテンプレートとしては以下を使っていただきました。
scala の標準入力が個人的に使いづらく感じるので、Java の Scanner を使う方法で input を受け取るように実装していただきます。

@main def f(): Unit = {
  val sc = new java.util.Scanner(System.in)
}

経験言語 <-> Scala 間の比較

例えば以下の問題を解いていただいた際は、

https://atcoder.jp/contests/abc113/tasks/abc113_b

import heapq

n = int(input())
t, a = map(int, input().split())
sub = []
for i, x in enumerate(map(int, input().split()), 1):
    heapq.heappush(sub, (abs(a - (t - x * 0.006)), i))

print(heapq.heappop(sub)[1])

↑ まず最初に Python での回答をしていただき、
↓ 次に Scala での回答を一緒に進めて...

@main def f(): Unit = {
  val sc = new java.util.Scanner(System.in)
  val n = sc.nextInt()
  val t, a = sc.nextInt()
  val h = Array.fill(n)(sc.nextInt())
  val sub: Array[(Int, Int)] = h.zipWithIndex.sortBy((x, _) => (a - (t - x * 0.006)).abs)
  println(sub.head._2 + 1)
}

と index の与え方や sort の仕方など、命令型と関数型の比較をしながらディスカッションを進めていきました。

「python でソートをする場合、優先度付きキューに push する方法をよく使う」ということで、そのような感じで実装をしていただきました。それを受けて、

「Scala で同じようなことをする場合は TreeMap を使うのかしら?でも わざわざ Map で(無駄な value を設定して)持つの冗長だな」

というように他言語での慣習を知ることができたり、再考する機会にできたり、個人的にも楽しい体験となっています。また、実装について、

  • 実務では NotEmptyList とかでもない限り head を無邪気には使わない
  • すぐ下にある headOption を使って Option として受け取るのが普通
  • head みたいに例外吐く関数はそこそこ珍しくて、Map の get 関数とかを初め、値を受け取れない可能性があるやつは Option[_] 型になっていることがほとんどなので、null のことあんまり気にしないでコーディングできる

みたいな、Scala っぽい話に繋げたりもできるのも、このステップの良いところかなと思います。

Scala の標準ライブラリの勉強の仕方を学ぶ

競プロの簡単な問題を解く時に、例えば String, List などに対してどういう関数が生えているのかを詳しくなることで、より良い解き方が思い浮かんだり、複数の実装方法がパッと浮かぶようになったりすると思うので、これもおすすめしています。

IntelliJ だと(他の VSCode + Metals とかでも多分そう)、サジェストでどんな関数が使えるか示してくれると思います。

この時サジェストされた関数を上から眺めて、知らない関数の使い方を一個ずつ調べて行くのが習熟のための勉強として、個人的には結構良いと思っています。だいぶマッチョな勉強方法ですが、あまり使われな関数とかも含めて網羅できるので、オススメしています。

IntelliJ のショートカットを使ったコードリーディングやライティング

小さいコードの実装なので使うショートカットも限られるのですが、Scala 書き始めて手元がおぼつかないタイミングから、体でショートカットを覚えてもらうと後から生産性の上昇に効いてくると思っており「変数名変える時は、shift + F6!!!コピペで全部直すのだめぇ!!」みたいな感じで、苦しんでもらっています。(語弊がある)

私が HHKB の指で覚えているため、パッとコマンドとして口に出すのが苦手なので、ここに普段使っているショートカットを一覧化しておきます。(きっと思い出せないものも沢山ある)

なお Mac における標準のショートカットになるので環境によっては全然違うかも知れません。

ライティングよりのショートカット
  • 変数名の変更
    • shift + F6
  • 変数化
    • option + command + V
  • 関数化
    • option + command + M
  • 値定義に型アノテーションを追加
    • option + return -> 「値定義に型アノテーションを追加」を選択
  • 新しい行の追加
    • shift + return
  • 矩形選択(説明が難しい...)
    • option 二度押しっぱなしからの ↑ or ↓ with → or ←
    • option + マウスでクリックしながらシュッ
  • 選択範囲の型を確認する
    • control + shift + P
  • 選択範囲拡大
    • option + ↑ を好きなだけ
  • reformat
    • option + command + L
  • import の最適化
    • control + option + O
リーディング寄りのショートカット
  • ポインタをファイルツリーの今開いてる場所に移す
    • option + F1 -> return
  • 定義に飛ぶ / 実装に飛ぶ
    • command + B / option + command + B
  • 履歴戻る / 進む
    • option + command + ← / option + command + →
  • ファイル名検索
    • command + shift + O
  • 複数ファイル内検索
    • command + shift + F
  • パンくずリストにポインタを移す
    • command + ↑
  • 雑になんでも検索
    • shift * 2
  • 使用箇所の検索
    • option + F7
  • なんでもヘルプ
    • 警告やエラーが出ている箇所にカーソルを移動 -> option + return
  • commit の UI 表示
    • command + 0
  • commit 差分のファイルを編集
    • ファイルを選択後、command + ↓
  • プロジェクトの UI 表示
    • command + 1

ここら辺を体で覚えていると、IntelliJ で困ることそんなにない気がしています。

正直にいうと、競プロの問題は実務で行うプログラミングとは全然違うので「やる意味あるのか」と思われなくもないよな、と感じるのですが、元々やっていた言語との違いや特性を理解して「こんな感じかぁ」と自信が付くと感じており、Scala 初学者にとっては有用なステップであると実感しました。

初学者向けの本を読む

さて、細かいロジックを書くことに慣れるのと並行して「命令型 <-> 関数型言語」の違いやクラス設計の考え方の違いなど、を学ぶために Scala 初学者向けの本を読むことを推奨しています。弊社は書籍購入制度という福利厚生があるので、それを使って会社の経費で技術書が読めるよ!と新入社員に宣伝することにしています。

何を題材として選ぶか

Scala の技術書、色々ありますよね。

  • 実践Scala入門
  • Scalaスケーラブルプログラミング
    • 通称、コップ本
  • Scala関数型デザイン&プログラミング―Scalazコントリビューターによる関数型徹底ガイド
    • いわゆる、fp in scala

などなど。

そんな中で、最近は「なっとく!関数型プログラミング」をお勧めすることにしています。

https://www.shoeisha.co.jp/book/detail/9784798179803

  • 「命令型 -> 関数型」について、入り口(Part1)で丁寧に書かれていること
  • 関数型に焦点が当たっている他の書籍(fp in scala)ほど難しくないこと

という点について、初学者の題材として良いのではないかと感じています。

1,2月に入社したお三方はみなさん購入していただいて活発にディスカッションしてらっしゃって、とても良いなと思っています。

Scala With Cats を読む

じっくりと「なっとく!関数型プログラミング」を読めば、Scala のオンボーディングは概ね完了したと言えるでしょう。

ですが、Scala を関数型言語として捉えたときの源流である Monoid, Semigroup, Functor, Applicative, Monad などのキーワードを中心とした抽象的な概念を勉強しておくことは、Scala エンジニア(関数型プログラマー)を名乗るならば避けて通れないものだと個人的には感じています。

実務的には何らかの関数型ライブラリと併用することが多いので、Cats, Cats Effect の習熟を持って「Scala エンジニアとしてのポータブルなスキルが身についた」と言えるかも知れません。

特段知らなくても、Cats(Cats Effect)を使ったリポジトリのコードの改修などはできると思うのですが、勉強しておいて損はないかなと思っています。

Scala with Cats とは

Underscore という Scala に強みのあるコンサルティング会社がイギリスにかつて存在し、良質な学習リソースの提供元として、Scala 界隈でブイブイ言わせていたものです。その会社がいくつか作った良質な学習リソースのうちの一つが Scala with Cats で、Cats を勉強する人が目を通す最初の資料と言っても過言ではないと思います。

ただし

  • 英語(日本語で読めない)
  • 現状、別の資料として錬成される途中のあんまりメンテされてないリソースになっちゃってる

みたいな辛みはいくつかあります。それでも、読む価値はあると思っています。

勉強会の進め方

オンボーディングメンバーも含めて、今年3月から Scala With Cats の勉強会開催を予定しています。

  • 2020年前後に初めて読んだときは、英語のままで頑張って読んで、google 翻訳にちょこちょこ投げ込みながら読み進めた
  • 2021年に勉強会を主催してやったときは、deepL とかに突っ込んで訳してもらった

という思い出があるのですが、2026年にもなると、いろんな勉強の方法がありそうです。

"identity element"(単位元)を訳すと「恒等式の要素」みたいに訳されたりとかしたもんじゃが(おじいちゃんの遠い目)、google 翻訳の精度もだいぶ上がっていて多分単位元ってちゃんと言ってくれるようになってると思います。

今回は NotebookLM に html 版の URL をリソースとして渡して、章ごとに要約してもらったものを資料としています。分からない概念やディスカッションに煮詰まった時に、NotebookLM に聞いてみるという手段ができたのも、2026年初頭っぽい勉強会の進め方だなと感じます。

Scala With Cats は長いので、丁寧にやったら一年くらいかかりそうだなと感じでゾッとしておりますが、頑張ってみんなで読んでいこうな!という気持ちでやって行きます。

おわりに

Scala メインでやっている会社は、皆等しく Scala エンジニアの採用ではなく、他言語からのコンバートを前提にエンジニアの採用を進めているところがほとんどかと思います。(Scala エンジニアの人口が少なかったり、流入ってほとんどないですよね。)

弊社もたぶんに漏れずに、他言語からのスキルコンバートを前提にしたオンボーディングを実施していますが、2026年現在は、

  • 競プロ、簡単なやつ解いてみる
  • なっとく!関数型プログラミング、をじっくり読んでもらう
  • Scala With Cats の輪読会やってみる

という三本立てで、AI をうまいこと学習に使いながら、やっているよというのを紹介しました。

これを読んでいる非 Scala エンジニアの方にとって「それだったら FOLIO 入るの心強いな」と感じていただいたり、これを読んでいる、Scala を使っている会社の人からは「真似してみようかな」「むしろ俺たちの方が上手くやってるぜ」などのご意見いただけると、嬉しいです。

是非 DM 等お気軽に。 https://x.com/nozomitaguchi

Discussion