若者にScalaを1ヶ月間試行錯誤しながら教えてみた話
はじめに
私が所属する開発チームでは、メインのプログラミング言語としてScalaを使用しています。小規模なチームでScalaが書けるメンバーは数名程度。それぞれのメンバーは、コードを書きながらインフラをやりながら人によってはプロダクトマネジメントもやるという、小さい組織ならではの「何でも屋さん」な人たちの集まりです。
そんなチームにこの度、新しくメンバーを迎え入れることになりまして、今回はその新しくジョインしてくれた若者(Scala未経験のJavaエンジニア)に試行錯誤しながらScalaを教えた話を書きたいと思います。
どのように教えるか
まず、私のScalaの経験から軽くお話しすると、2009年に初めてこの言語と出会い、1年ほどコップ本で学んだものの、当時は受託開発がメインでしたのでScalaを仕事で使う機会に恵まれず、本格的に実務で使い始めたのはそれから8年後 *1 の2017年1月からです。基本はすべて独学。
そんな私が人にどう教えれば良いかを考える中で、自分自身がこれまでどうやって学んできたのかを振り返りそれをヒントにしてみようと考えました。
私がScalaを学び始めたときは周りに聞ける人はいなかったので、基本は書籍で学び、OSSのソースコードリーディングや勉強会への参加で知識の肉付けをしました。あと先人たちが書き残してくれた記事には何度も助けられましたね。書籍だと、2017年1月に実務で使い始める前の半年間に読んだ本はこの辺です。
- Programming in Scala, Third Edition
- 翻訳版の出版がいつになるのか分からなかったので原著を読みました
- Scalaスケーラブルプログラミング第3版
- 翻訳版が出版されたので改めて読みました
- Scala関数型デザイン&プログラミング ―Scalazコントリビューターによる関数型徹底ガイド
- Scala Design Patterns
- Getting Started with SBT for Scala
- Scala Test-Driven Development
- Learning Akka
- sbt in Action
- Functional and Reactive Domain Modeling
振り返ってみて、本当に遠回りをしたなと。独学というのは非効率なものです。例えばチームに有識者がいて、ちょっと聞けば済むようなことも本をまるまる1冊読まなければ理解できなかったとか。あるいは、色んな本を読んで総合的に考えて一つのことを理解するみたいなプロセスが必要だったとか。
新人さんにはこんな遠回りはして欲しくない。ただ、そう思う一方で、知識を肉付けするための「良い意味」での遠回りは結果として効率的な学習につながるのではとも考えていたりするので、そういった経験はして欲しい。
そこで、このような方針にしてみました。
- 特定の教材に縛られるのではなく、様々な教材のいいとこ取りをして教える
- 理解度に応じて教える内容を柔軟に変えていく
- 様々な情報源(勉強会も含む)から問題解決方法を自発的に調べてもらうことで、Scalaの学び方を体得してもらう
もちろん一冊を通読することも大事なんですが、最初の取っ掛かりとしてはこれで良いのかなと考えました。通読は今後深堀りするときに恐らく通る道なのでそのときで良いのかなと。
教育の進捗をどう把握するか
次に、教育の進捗管理方法を検討しました。
うちのチームでは、普段の開発にかんばんツールの zube.io を使用しています。エピックとそれに紐づくユーザーストーリーを作成し、それを各スプリントで開発を進めていくというスタイルです。
zubeはGitHub連携が可能で、zubeで作成したユーザーストーリーは、そのままGitHubのissueとして登録されます。普段の開発ではこの特性を利用し、開発の意思決定の過程をissueのコメント欄に追記していくことで、後からそれらを追跡しやすくしています。
開発の進捗管理は、このようにzubeのかんばんで視覚的に確認することができますが、教育をそれとは別で管理するのは煩雑だなと思ったので、本来的な使い方とは違いますが、次のようにしました。
- 新人さんの教育そのものをエピックとして管理する
- 講義する内容や提出してもらう課題は、issueとして管理する
- 提出してもらった課題のレビューは、issueのコメントでやり取りをする
- issueに「on-boarding」というラベルを付けて、かんばんで視覚的に見分けできるようにする
これで開発と教育をひとつのかんばんで視覚的に把握することができるようになりました。
実践してみる
それでは、1ヶ月の研修期間 *2 でやってきたことを紹介していきたいと思います。
Week 1
前提知識(講義)
最初は前提となる知識を身に付けてもらうために、以前チームの勉強会用に作成したスライドを使用し、次のような内容を説明しました。
- Scalaの概要
- sbtハンズオン
- 関数型プログラミングの概要
Scala関数型デザイン&プログラミング(課題)
次に課題として、 Scala関数型デザイン&プログラミング の1、2章で関数型プログラミングについての理解を深めてもらうのと再帰処理に慣れてもらいました。第2章のいくつかのEXERCISEは、解いたらそれをissueのコメントに書いてもらい、それを私がレビューするという流れです。
Week 2
Week 2は、当初ドワンゴさんの Scala研修用テキスト を使用することを考えていましたが、入社前に Scalaスケーラブルプログラミング第3版 を一通り読んでいたみたいなので、予定を変更し、実践的な課題ベースで学んでもらうことにしました。
S-99: Ninety-Nine Scala Problems(課題)
予定を変更したので急遽オリジナルの課題や講義内容を考えている間、S-99: Ninety-Nine Scala Problems よりP01からP15までをチャレンジしてもらいました。これはWeek 1で身に付けた再帰処理の応用編ですね。
ファイル操作(課題)
次に、オリジナルの課題としてファイルから読み込んだ情報から計算を行い、別のファイルに書き込むという実装をしてもらいました。この課題の狙いは、
この辺りを調べながら実装してもらいました。
講義
課題とは別で、IntelliJ IDEAのScala Worksheetを使って、私がコードを書きながらの講義をやりました。
- 処理の失敗を型で表現する
- Option、Either、Try、Futureの話
- Tryの使用上の注意とか
- Pattern Matching
- ScalaTestを使用したテストコードの作成
- こちらはハンズオン形式で
Week 3
Week 3も引き続きオリジナルの課題を中心にやってもらいました。(正直なところ「ホントにこれでいいのか?」というのは常に自問自答していました…)
DBアクセス(課題)
ローカルのDocker環境にMySQLを構築し、ScalikeJDBCのQueryDSLを使用して以下の実装をしてもらいました。
- select/insert/update/delete
- transaction
- join
- group by
- 動的WHERE句
講義
Week 3の講義はこの辺をやりました。これもScala Worksheetで私がコードを書きながら講義するというスタイル。この回から既存メンバーの若者にも一緒に聞いてもらいました。せっかくなので。
- Call by value / Call by name
- Collection Hierarchy
- Collection Library (higher-order function)
Week 4
最後の週は総仕上げとして、Akka HTTPを使用したWebAPIの実装をしてもらいました。
Akka HTTPを使ったWebAPIの実装(課題)
講義
Week 4の講義はこの辺り。
- Value Class
- Self Type
- Enrich my library
- Partial Function
おわりに
1ヶ月という研修期間はあっと言う間に終わってしまいました。伝え切れていないことがまだたくさんあるので、今後は一緒に開発しながら少しずつ伝えていこうかなと。研修の内容もまだまだ改善の余地があるので、次の機会のときにはより良いものにしていきたいです。
また、うちのような小規模チームでは、ひとつのかんばんで開発と教育を管理する方法は有効だなと感じました。私の場合だと、開発とマネジメントをやりつつ教育も並行してやっていたので色々捗りました。