こんにちは
サーバーワークスのコーポレートエンジニアリング部にてSalesforceの保守をしている中村です。
サーバーワークスのSalesforceチームは少しずつ人が増えてきて、攻めの活動に時間を割くことが段々とできるようになってきました。 今回、その攻めの活動の一つとしてモブコードリーディングを行い、良い結果を得ることができました。 この記事では、モブコードリーディングを行うに至った経緯、やりかた、得られた結果を紹介します。
背景
サーバーワークスではSalesforceを2012年ころから導入しているため、Salesforce上のオブジェクトやApexコードにはその年数分の歴史が積み重なっています。開発チームに新しいメンバーを迎え入れる際、その方がチームの文化に馴染み、迅速にプロジェクトへの貢献を始めることは、プロジェクトの推力を上げるためには重要です。しかし、既存の大量のコードや歴史の積み重ねをドキュメント・コードから理解していくことは、かなりハードで、時間もかかります。
このハードな工程を少しでも楽にするために、今回はチームで「モブコードリーディング」をやってみました。
モブコードリーディングとは
実はモブコードリーディングには明確な定義はありません。「モブプログラミングのようなスタイルで進めるコードリーディング」として、私がそう勝手に呼んでいます。なお、インターネットで検索すると、似たようなことをしている方がいるようです。
モブプログラミングとは複数人ーが一緒に同じタスクを行う開発手法で、一人がドライバー(キーボードを操作する人)、その他がナビゲーター(ドライバーに指示を出す人)となり、一定間隔で役割を交代しながら進めます。
これに倣い、私たちはモブコードリーディングを「複数人で一つのコード(の流れ)を読み解いていき、一人がドライバー(メインで説明する人)、その他がナビゲーター(質問・補足・口出しする人)となり、一定間隔(7分)で役割を交代しながら進める」といったコードリーディング手法と定義しました。
それでは、次のセクションから進め方、ルールを紹介していきます。
進め方・ルール
お題決め
進めるにあたり、まずはお題を決めることが大切です。 今回のお題は「請求処理の一連の流れを理解すること」としました。
一連の流れとは、以下に記載する請求処理に関する、入力、出力、副作用を理解することです。
- 入力: 請求出力画面で選択する各種パラメーター
- 出力: Salesforce上に生成される請求データ
- 副作用:
- 請求以外のデータに関するSalesforce上のレコード操作
- 後続システムへの連携
ルール決め
次に、進行する上でのルールを決め、メンバーと共有します。私たちのチームでは以下のようなルールとしました。
手段・ツール
- VSCode LiveShareで実施する
- 参加者全員が Live Share Mob Timer をインストールする
- コードリーディング中にコメントの加筆・修正を行うため、ホストは作業用のブランチを切っておく
進め方・注意点
- 話し手(ドライバー)が担当箇所のコードを理解できなければ人(ナビゲーター)に振ってOK
- 聞き手(ナビゲーター)が話し手(ドライバー)の説明理解できなければ進行を止めてOK
- 関数の実装は細かく見過ぎない。その関数の役割、入出力、副作用を理解するまでに留める
- 解説中に時間が来たら、その関数を抜けるまで or キリのいいところまで進めて次の人へバトンタッチする
- 説明しながら or 聞きながらヘッダコメントの過不足を感じたら手を入れてOK。実装は触らない
- 実装を触りたくなったらTODOコメントを残す
- コメントは日本語で書く。既存の英語コメントを日本語に直すのもOK
- ヘッダコメントは丁寧に、インラインコメントはほどほどに
- うんちく、歴史などを語りたくなってしまうかもしれないが、脱線しすぎない
時間配分
- インスト5分
- 7分交代を可能な限り回す
- 交代時に残り時間10分前後であれば、一旦そこでやめて残りは振り返りに充てる
- 全てを読みきれなかった場合は次再開する場所と担当者をコメントで残しておく
後始末
- 全てを読み終わったら、コードリーディング中に書いたコメントを清書してPushし、PullRequestを出す
- 参加者でレビューの上、マージする
結果・得られたもの
上記の進め方で請求処理を一通り読んだところ、3人で5時間程度で完走することができました。 最初は実装を細かく見過ぎてしまって進みが悪いこともありましたが、徐々に関数の中身を見る前に入出力を見る癖が各々についてきたことで、スムーズに進むようになりました。
3人 x 5時間の計15時間は決して少なくない時間ですが、その時間に見合った価値は得られたのではないかと思います。 具体的には、以下のようなものが得られました。
超密度のオンボーディング
これが今回の主目的であり、効果としても大きかったものです。今回のモブコードリーディングのおかげ(?)で、その後の改修にもスムーズに入れていると思います。
会社の歴史・ビジネスドメインに対する共通認識
今回、請求ロジックの流れを追いながら自社の歴史や商材を理解していくことで、コード上の理解だけではなく、会社の歴史・ビジネスドメインに対する共通認識を深めることができました。 また、私自身曖昧な理解となっている部分もありましたが、今回の「他人に説明する」という機会を通して改めて正しく理解し、説明することができました。
今後の新規メンバーのためのコメント・ドキュメント
今回の活動を通して、日本語のコメントを多く追加しました。 これまでは必要最低限のコメントでしたが、日本語で読めるコメントが大幅に増えたことで、今後来るであろう新規メンバーのオンボーディング・コードリーディングも加速するのではないかと思います。
まとめ
今回の記事では、モブコードリーディングの進め方、それによって得られたことを紹介しました。 複数人の時間を使うため一見非効率に見えますが、うまく進めることで消費する時間に負けない価値を生むことができると思います。
特に、寿命の長いプロダクトを保守している方、ぜひ新規メンバー参加の際にお試しください。