この記事はフラー株式会社 Advent Calendar 2023の12日目の記事です。11日目は私の「サーバーサイドのオンボーディング課題と俺たちの果てなき戦いは続く」でした。
前回のおさらい
フラーでは新入社員向けにフラーの利用技術に慣れてもらうためのオンボーディング課題というものを用意しています。 この課題の運用を始めて1年ほど経ち、以下のような課題が出てきた、というのが前回のお話でした。
- インメモリデータストアの実装をみんな自主的にやってしまい、そこにつまづいて時間が溶ける
- net/http パッケージに向き合う前にEchoやGinを利用されてしまう
- MySQLで発生するデータ競合をUPSERTで強行突破されてしまう
課題の改善
これまでの課題・反省点を受け、オンボーディング課題を次のようにアップデートしました。
題材の統一化
前回課題の後半で利用していたNoPasteを廃止し、すべてユーザー情報をやりとりするAPIに題材を統一しました。 その際、ユーザー情報にアカウントIDという新しいメタ情報を付与し、アカウントIDは全ユーザーでユニークであるという制約を設けました。
{ "id": 1, "account_id": "hatenakun", "first_name": "Taro", "last_name": "Hatena", "age": 18 }
NoPasteのときにUPSERTを許容してしまった原因のひとつとして、UPSERTで更新しては困るようなメタデータが存在しなかったというものがありました。今回は異なる氏名や年齢のユーザーが同じアカウントIDを取得しようとするシーンが考えられるため、UPSERTで強行突破することはできません。やったぜ。
また、元々ユーザー情報を扱うAPIからNoPasteに題材が切り替わるところで、課題のテーマに連続性がなくなってしまっているというのも個人的に気になっているポイントでした。 題材を統一することで、ひとつのテーマに対して「HTTPサーバーの基礎」「MySQLとの連携」「Goaによる再実装」というステップを踏めるようになりました。我ながら良いアップデートだったと思っています。
インメモリデータストアに関する明記の追加
ひとつめの課題の制限事項に「リクエストされたデータの登録・更新を保存する必要はありません」という項目を追加しました。課題を解くメンバーが自主的に実装してしまっていたことを受けて、それ今やらなくていいよという出題者の意思を課題に明記した形です。
チャレンジ課題として実装するというのはそのままにしてあります。これにより、本来の課題とチャレンジ課題の切り分けがしっかりできたと思っています。
サードパーティライブラリ利用の禁止
これはEchoやGinのようなWebアプリケーションフレームワークを狙い撃ちして追加した制限事項です。 あと、フラーでは基本的にORMライブラリの類を採用していないので、それらを回避する意図も含まれています。
MySQLのドライバーやGoaも当然サードパーティライブラリになっちゃうんですが、各課題で「許可されたもの以外は使わないでください」という記述をしています。
またも見えてくる課題
この課題で回してみて、また課題が出てきました。出てきた、というか以前からあった課題がより浮き彫りになってきました。
それはGoaの学習コストの高さです。
Goaはとっても多機能で便利なフレームワークなのですが、多機能な分クセが強く、導入コストの高いフレームワークです。 課題の内容は「Goaで実装する」と言ってますが、その具体的な方法やステップは一切提供していませんでした。 「公式サイトにチュートリアルあるから、それ見つつあとはGoDoc読んで学んでくれ!じゃ!」と言って崖から突き落とすストロングスタイルです。 これで解いてたメンバー、なかなかにつらかったんじゃないかなと。ごめんよ。。
また、Goaは結構マイナーなフレームワークであり、インターネットで検索してもあまり情報が出てこないというのも学習コストの高さに拍車をかけています。 以前私のブログでも簡単な紹介記事を書きましたが、実装に困ったメンバーがGoogleで検索してこの記事を引っ掛けてくるぐらいには情報が少ないです。
まとめ
というわけで、最初に作成した課題から大幅なアップデートを実施したものの、未だ課題としてGoaの学習コストの高さが障壁となっています。
……と、いうのが今年の春先ぐらいまでの情報でした。実はここから更にアップデートをかけています。そのお話についてはまた次回。