こんにちは、Cake.jp技術部の中村です。
Cake.jp技術部では、週に2回モブプログラミング(以下、モブプロ)を実施しています。導入してから1年以上経過して、導入してよかったこと、課題について紹介させていただきます。
1. モブプロとは
Cake.jpでは、1つの画面を3人以上のエンジニアで共有し、コーディングを行うことをモブプロとしています。一般的なモブプロと異なり、コーディングを進めていく「ドライバー」とそれを見守り、意見をいう「メンバー」に分かれて行っています。(一般的なモブプログラミングでは、「ナビゲーター」の指示の元「ドライバー」がコーディングを行っていくと思いますが、Cake.jpでは「ナビゲーター」不在で行っています。)
全エンジニアがフルリモートで業務を行っているので、Slackのハドルミーティングを使って画面を共有しています。(ハドルミーティングの画面の拡大/縮小機能、画面共有への手書き機能を駆使して行っています。)
参加者は固定せず、グループ表を作り毎回同じ組み合わせにならないように実施しています。その週に各自が割り当てられたタスクや、設計の議論、プランニングにのらなかった軽微な不具合を修正する場だったりと、そのときどきによって内容を変えながら行っています。
2. Cake.jpでなぜ取り入れたのか
Cake.jpでは大半のメンバーがフルリモートで活動しています。モブプログラミングをとりいれるにあたり、当時抱えていた3つの課題の解決を目標として導入しました。
(1) 技術的な内容を相談する場が不足
開始当初は同期のコミュニケーションが朝会しかなく、朝会が終わると非同期でそれぞれが作業するというスタンスを取っていました。朝会にはエンジニア以外のメンバーも参加していたことや、そもそもの開催時間が短いことから、コードについての相談の場がGitHubのPRでのやり取りでしか生まれ辛い状況でした。
(2) 技術の共有
チームにはCake.jpの在籍年数やエンジニアになってからの年数がまちまちのメンバーがいます。コードレビューの場では納期の観点から細かい部分についての指摘がついつい後回しになってしまったり、指摘をもらってもコードに反映ができないということがよくあり、FBサイクルがうまく働かないときがありました。
(3) プロダクトの仕様の共有
当時のチームは、3人のチームで大きめのプロジェクトが2本走っており、どちらかのプロジェクトを専任している状況でした。そういう状況下において、プロジェクトをまたいだレビューが頻繁に行われていました。そのため、以下2点の課題を感じていました。
・PRでコードはわかるけど、仕様→コードの関連性がわかりづらい。
・ドキュメントに残っていないことがある。
Cake.jpでは開発メンバーの役割として、運用業務も含まれています。障害発生時やお問い合わせへの対応をスムーズにできるようにするため、システム全体やプロジェクトの仕様を把握しておくことが重要でした。
1人1回ドライバーを担当できるように週3回からスタートさせていきました。もともとモブプロとは別でコードリーディング会というものを行っており、プロダクトコードを1つの画面で複数人で同時に読むという文化があったため、スムーズに導入することができたと感じています。
モブプロを通して、IDEの使い方の習熟度が上がったり、プロジェクトで導入した新しい技術(React)についてエンジニアの知見が広がったり、設計思想の共有(DDDを意識した設計に取り組んでいる)ができたりしていることを実感しました。
組織変更に伴いチームが合併した際に、モブプロはチームの取り組みからエンジニア全体の取り組みとして活用しています。
3. 現状出ている効果と課題
2であげた3点の課題は、一定達成されたと感じています。
(1) 朝会以外でもコミュニケーションを取ることができ、他エンジニアとの接触頻度が上がった。
(2) 技術面では、ツールの使い方を習熟したり、単体テストを書けるようになったりと効果がありました。週に一度行われているチームの振り返りでは、モブプロを行ったことにより、よりよいコーディングを行うことができた。などの意見も出ています。
自身が習得した新たな技術のよい実験場として利用されることがあり、ほかメンバーの学びにもつながりました。
(3) プロダクトの仕様共有では、仕様に精通しているメンバーと進めることでタスクの理解がより進んだ例がありました。(未然に不具合を防げているのがかなり大きいです。)
一方で会を続けていくうちにわかった課題として、
(1) 自分が持っているタスクの進行状況によって、モブプロへのタスクの持ち込みができず、ドライバーになれないエンジニアがいた。
(2) 持ち込むタスクによっては、ただ作業を見守るだけのモブプロが発生した。
これらの課題を解消するために、軽微な不具合修正タスクをストックして、持ち込みタスクがないメンバーでもドライバーができるように体制を整えました。
不具合修正のタスクはただ直すだけではなく、「生まれた背景」「原因」「修正方法」の議論を行っております。議論を通して、「コミュニケーション」・「技術の共有」・「仕様の共有」ができており、単なる不具合修正以上の効果が生まれていると感じています。
今後も継続して活動を続け、エンジニア全員で学習を続けていきたいと思っています。