これは SmartHR Advent Calender 2020 13日目のエントリです。
こんにちは、Webアプリケーションエンジニアの yono です。今回はSmartHR社内でRails勉強会を開催した話をします。
前提
Rails勉強会についてお話する前に、前提についてお話します。
SmartHRというプロダクトは人事データベースの役割を持つ「SmartHR本体」とそのデータを活用するアプリケーション郡である「プラスアプリ」で構成されています。
本体はRailsによるMPA(Multi Page Application)として構成されており、バックエンドエンジニアだけでなくフロントエンドエンジニアにも一定のRailsの知識が求められます。
開催した経緯
CTOから以下のような問題提起があったのが発端です。
「本体の開発チームにRuby/Rails未経験のエンジニアが増えてきた。通常の開発タスクを通して覚えてもらおうと思っていたが、Ruby/Railsについて学べるようなちょうどいいものが意外に少ない。この機会に、Ruby/Railsに関する勉強会を実施して彼らのキャッチアップを支援しつつ、今後入社してくる同様のエンジニア向けの教材として資産化できないだろうか。ぴえん。」
また、本体の開発チーム以外のチームやQAエンジニアなどの他職種からもRailsについてキャッチアップしたいというニーズがあることがわかりました。
そこで、主にRuby/Rails未経験者をターゲットとして、社内有志でRails勉強会を開催する運びとなりました。
開催スタイル
開催する前に、社内のエンジニアにRailsを習得するにあたってつまづいた点などをヒアリングしました。その結果Railsよりも先にRubyについて深く理解してもらう必要があることがわかってきました。
Rubyを理解しないままRailsで書かれたコードを読んでも、今読んでいる箇所がRuby由来なのかRails由来なのか切り分けが難しいからです。
そこで、勉強会をRuby編とRails編の大きく二部構成に分け、まずはRubyについての理解を深めてもらうことにしました。
Ruby編
Ruby編は座学形式でRuby特有の機能や構文について絞って解説することにしました。主なターゲットがプログラミング経験者であったため、基礎的な内容や他の言語とも共通する概念については解説せずとも習得可能であろうという判断です。
以前社内で開催したメタプログラミングRuby読書会の例に倣い、参加者には以下の形式でコーディング問題を解いてもらいました。
- 「このような仕様を満たすクラスを作成してほしい」という日本語の仕様とそれをチェックするテストコードを準備する
- 各参加者にはそのテストが通るようにクラスを実装してもらう
例として、Rubyの特徴的な機能の一つである symbol を解説した回の問題を見てみましょう。
問題文は Ruby のファイルにコメント形式で記載されています。参加者はこのファイルに直接クラス定義を記述していくことになります。
# 次の要件を満たすクラス、SymbolManipulatorを作成してください # # 1. # クラスメソッド `hash_key_switcher` を持ち、引数を一つ受け取ります # 引数がハッシュのオブジェクトではない場合、何もせずオブジェクトをそのまま返します # # 2. # `hash_key_switcher` は、引数のハッシュに次の操作をして、新しいハッシュを返します # a. 引数のハッシュのキーのうち、全てのStringオブジェクトをSymbolオブジェクトに変換し、バリューはそのまま保持します # b. 引数のハッシュのキーのうち、全てのSymbolオブジェクトをStringオブジェクトに変換し、バリューはそのまま保持します # b. 引数のハッシュのキーのうち、SymbolでもStringでもないものをSymbolオブジェクトに変換し、バリューはそのまま保持します # すなわち、次の入力のときには、このような戻り値を期待します # > input # { hoge: "foo", "piyo" => :boom, 1 => "one" } # < output # { "hoge" => "foo", :piyo => :boom, :"1" => "one" }
それに対応する形で、以下のようなテストコードが用意されています。参加者は先程の問題文に記載された仕様をすべて満たすクラスを実装することで、このテストを通すことができます。
require 'test_helper' require 'symbol' class TestSymbolManipulator < MiniTest::Test def test_return_unless_hash_given assert_equal "string", SymbolManipulator.hash_key_switcher("string") end def test_switch_sym_to_s target = { hoge: "foo", piyo: :boom } expects = { "hoge" => "foo", "piyo" => :boom } assert_equal expects, SymbolManipulator.hash_key_switcher(target) end def test_switch_s_to_sym target = { "hoge" => "foo", "piyo" => :boom } expects = { hoge: "foo", piyo: :boom } assert_equal expects, SymbolManipulator.hash_key_switcher(target) end def test_switch_each target = { hoge: "foo", "piyo" => :boom } expects = { "hoge" => "foo", piyo: :boom } assert_equal expects, SymbolManipulator.hash_key_switcher(target) end def test_convert_to_sym_other_values target = { 1 => "one", 1.5 => "one point half" } expects = { :"1" => "one", :"1.5" => "one point half" } assert_equal expects, SymbolManipulator.hash_key_switcher(target) end end
参加者全員がテストをパスした後は、問題の解説と参考実装の紹介がありました。もちろん参加者全員が全く同じ実装にはならないため、各自の実装の比較や「このケースだとRubyではどのように実装するのが一般的なのか」といった議論が行われました。
Ruby編の参考書籍としてはかんたんRubyを採用しました。解説する内容が網羅されておりわかりやすかったこと、弊社社員でもある著者(sugamasao)が勉強会の講師側として参加していたため、即座に質問できたのが採用理由です。
Rails編
Rails編は現場Railsこと現場で使える Ruby on Rails 5速習実践ガイドを教材としました。参加者には各自書籍を進めてもらうこととし、勉強会では書籍の内容についての講師側からの補足や気になったことについての質疑応答や議論を行う、という形式で進めました。
例として、現場Railsの「Chapter 4 現実の複雑さに対応する」を題材としたときの流れについて説明します。
参加者には事前にこのChapterをひと通り読み進めておいてもらいます。講師側もあらかじめ読み進めておき、補足して解説したい内容やRails6での変更点などを事前に資料としてまとめておきます。
https://github.com/kufu/yay/tree/48b1d51b4061d154e76dd9405dbecfb365e76fa8/02_rails/02_genjitsu
勉強会当日は補足事項の解説をし、その後に参加者からこのChapterを進めた上で気になった点やより深堀りしたい内容について聞いた上で質疑応答や議論を進めていきました。Chapter4にはDB制約やバリデーション、scopeなど多彩な内容が盛り込まれているのですが、この回では主にバリデーションやコールバックについての深堀りが行われました。
※ sugamasaoがいるなら教材はパRailsでもよかったのでは?という疑問がある方もいらっしゃるかもしれませんが、当時は以下のような状況でした
自社でRuby/Rails未経験の人向けの勉強会を開催していて、成果物は👇ですが、なぜRailsパートで現場Railsを使っているかと言うと、この企画が始まった時にパRailsは発売してなかったからです(なおRuby編が終わる頃には発売した模様😇)(本はすでに買っちゃったから、、、) https://t.co/NjMAZ8DxsF
— sugamasao (@sugamasao) 2020年10月27日
参加者からの声
本記事を執筆するにあたって、改めて参加者に勉強会の感想を聞いてみました。
Webアプリケーションエンジニアの k-myst です。
入社前にRuby/Railsの勉強をしてたものの、実際のプロダクションのコードを見て面食らったのが記憶に新しいです。
勉強会では、業務に活かせるところを中心に要点を絞って説明してもらえたので、コードリーディングしていく中でも活用できるポイントが多かったように感じます。
また講義内容に関わらず、実務の中で感じてた疑問点を解決する場としてカジュアルに話せたのも良かったです。
業務の合間に準備・運営していただいた講師の方々には超絶感謝です、ありがとうございました!
Webアプリケーションエンジニアの shooen です。
私自身は Ruby on Rails を使い始めて2年弱、それなりに開発できるようになってきましたが、今回改めて体系的に学ぶことで良い復習にもなりましたし自分の理解が及んでいない点を見つける機会にもなりました。
講師の方々が事前に要点をピックアップしてくれたり課題を用意してくれたりと、優先的に吸収すべきことがコンパクトにまとめられており、社内勉強会とは思えないクオリティだったと思います。
教材に関してだけでなく、これまでの開発経験から得た知見を聞いたり参加者との意見交換をカジュアルにできることも非常に刺激的でした。
講師の方々に圧倒的感謝です!
本勉強会の目的の一つである「キャッチアップの支援」に一役買えたのではないかと思います。
成果物
勉強会用に作成した資料をGitHubにて公開しています。
また、一般公開はしていませんが、勉強会の様子を録画した動画もあります。
おわりに
社内で開催したRails勉強会と、その成果物について紹介させていただきました。
今回わたしは講師側として勉強会に参加しましたが、勉強会内での議論から新たに知ることも多く、個人的にも非常に有意義な勉強会になったと感じています。
We are Hiring!
SmartHRでは、Ruby/Rails大好きなエンジニアを募集しています!Ruby/Rails未経験という方もすぐにキャッチアップできるコンテンツを今回ご用意しましたので安心してご応募ください!
https://hello-world.smarthr.co.jp/
選考フローも全てオンラインに対応されていますので、安心してご応募いただければと思います。