本記事では、メンバ育成を目的とした「モブプログラミング」を実施した感想やコツについて紹介します。
モブプログラミングとは
モブプログラミングとは、チーム皆で一緒にコードを実装するプログラミング手法です。
メンバの一人がドライバーとなり、キーボードを持ちます。
他のメンバはナビゲーターと呼ばれ、ドライバーの実装をアシストします。
モブプログラミングの書籍は少ないですが、
「モブプログラミング・ベストプラクティス ソフトウェアの品質と生産性をチームで高める、日経BP」
がおすすめです。
また動画ですと、以下が有名です。モボプロの様子を3分ほどの動画で紹介しています。
私たちのチームでは、
新メンバーが複数名加わり、新たなプロダクトを開発することになったので、スクラム開発の初期フェイズ(約1カ月)は、教育・育成の目的でモブプロを実施しました。
この教育・育成目的のモブプロを、私が勝手に「育成モブプロ」と呼んでいます。
本記事の内容は次の通りです。
- 育成モブプロで開発対象とする範囲
- 育成モブプロの期間
- 育成モブプロの効果
- 育成モブプロの具体的な手順
- 育成モブプロのコツ、注意している点
育成モブプロをやってみた実感について、乱筆とはなりますが、記載いたします。
育成モブプロで開発対象とする範囲
アジャイル・スクラムでのプロダクト開発の初期では、はじめに「プロダクトの骨子、背骨となる部分」を作ります。
(このあたりの進め方は、書籍「カイゼン・ジャーニー」などで有名な市谷さんの書籍「正しいものを正しくつくる プロダクトをつくるとはどういうことなのか、あるいはアジャイルのその先について」が詳しいです)
「プロダクトの背骨部分」は、「プロダクト開発フェイズ」に先行する「研究開発フェイズ」にて、
「そもそもそのプロダクトを作る価値があるのか?」
を確かめるために、MVPとして作っているケースが多いです。
(PSF:プロブレム・ソリューション・フィット、をMVPを作って実際に確かめる)
ゆえに開発の初期スプリントの背骨部分構築は、MVPの再構築やリファクタリング的な要素にもなります。
そのためメンバは、
- 研究開発フェイズを担当したメンバは、ある程度の教師役
- プロダクトの本番開発フェイズからジョインしたメンバは、学ぶ側
となる、「育成モブプロ」となります。
育成モブプロの期間
現在の開発では週の3日間を開発に充てており、アジャイル開発スペースにメンバが全員集まって開発しています(SIerなので、各メンバはそれぞれ、製品開発以外にも各自が顧客案件など多々を同時に行っています)。
今回スプリントは1週間単位でとっており、1カ月≒4スプリントを「育成モブプロ」にしています。
正確には4週間という期間で縛るというより、 「プロダクトの背骨部分」を作るのにかかる期間をすべてモブプロにしています(それがだいたい1カ月です)。
その間は全員で一つのスクリーンに向かい、ドライバーを代わる代わるして、実装します。
(実施手法の詳細は記事後半にて)
ずっと育成モブプロやっていると開発速度が遅いので、1カ月ほど実施したあとは、チームからペアへ移行し、ペアプロ体制にしています。
育成モブプロの効果
育成モブプロの効果ですが、大きくは4つを実感しています。
【1】レベル感がそろう(ボトムライン)
最初に教師役が実装を見せて、育成メンバはそれを学び、質問しながら、進めます。
その後、実装を見せたのと似たような部分を、学ぶ側メンバが実装し、教師役は静かに見守り、聞かれたときだけ答えます。
チームのベロシティは下がるのですが、学習したメンバが1か月後には各自で安定して動けるようになるので、最終的にチームのトータルでの成果は大きくなります。
【2】レビューが楽になる
育成モブプロのあと、各メンバが実装する際にはある程度、育成モボプロで実施したコードや手法に沿うので、プルリクエストのレビューが楽になります。
むちゃくちゃな実装がとんでくることがほぼなくなります。
コードレビューが楽になるのは、想像以上にチームとしてのメリットが大きいです。
【3】教師側もスキルアップになる
MVPを先行して実装した教師側も、教えながらコードを書いていると、「あれ、ここはなぜこうするのだっけ?」と思ったり、質問を受けたりして、学びが深まります。
またMVPで実装したプロダクトの背骨部分のリファクタリングも兼ねており、教師役も複数名(今回のプロジェクトだと2名)いるので、教師役のメンバのスキルアップにもなります。
【4】みなで作っている感が楽しい
何より、みなで一つのモノを創る達成感が良いです。動いたときは、「皆でやっほーい!!」って感じです。
仕事は楽しいことが大切(だと私は思っている)ので、育成モブプロはチームプレイとしてとても楽しいです。
育成モブプロの具体的な手順
-
朝会(デイリースタンドアップ)
朝会は各自がやることや問題を述べるのではなく、リーダー的な私(スクラムに開発リーダーというものはないですが、まあリードする人は自然といるでしょう・・・)から、「今日は●●と●●をモブプロします。」と本日の内容を案内して開始します。
また、最初に各自がどうしても抜ける時間を確認し、ホワイトボードに記載しておきます。
昼休みと休憩時間も記載しておきます。 -
モブプロの設備
モニターは会議用の大きな電子モニターを使用しています。
場所はアジャイル開発専用スペースを作成し、そこを占有して使用します。
時間は何曜日の何時から何時と固定しておきます。
(例えば、今回のプロジェクトは火曜日から木曜日の朝9:30~17:30) -
ドライバーの選定
最初は教師役のメンバが実装します。そのときに別の教師役メンバからはリファクタリングやもっとこうした方が良い、という意見を投げかけ、ドライバとコミュニケーションして実装します。
もくもくコーディングしているというよりは、コミュニケーションしてはその通り実装し、の繰り返しです。
学習メンバは適宜、よく分からない場所を質問したりします。
1度教師役メンバが実装したのと似た部分については学習メンバがドライバを担います。ドライバの選定は私が「ここはAさんかBさん、やりたい方がお願いします」とふんわり指定します。 -
キーボードなど
キーボードなどは各自のノートPCや各自のものを利用します。そのためドライバーが代わる際にはGitにコミット&プッシュして、運転交代します。
ですので、ドライバーが代わると、各自自分のPCを大型ディスプレイに接続します。ちなみに私だけThinkPadで、他メンバはMacBook Proです・・・ -
エディターと開発環境
各自のPCを使用するので、エディターや開発環境は重要です。
今回はたまたま全員がVScodeを使用していたので、VScodeで統一という形になりました。ドライバは表示フォントサイズを大きくして、皆に見やすいようにします
ドライバが代わるたびにVScodeの設定が代わると面倒なので、プロジェクトリポジトリにVScodeの設定(各種linterやコードフォーマッタ)を入れておき、VScodeの設定は開発メンバで共通させておきます。
(工事中)[チーム開発時にVScodeのlinterコードフォーマッタを統一する方法]
また、Docker-Composeを利用したマルチコンテナ環境で開発実装するようにし、システムの動作がそれぞれのPCで変わらないようにしています。 -
ドライビング
ドライバーには「これから●●を□□しながら△△して、実装します」と宣言してから、実装してもらいます。これからやることをきちんと頭で整理してもらうとともに、ナビゲーター側も何をやるつもりなのかを把握しておきたいからです。
1ドライバーの持ち時間はあまり決めていません。時間制限ではなく、機能単位であり、Gitでコミットする粒度くらいです。15分や10分の場合もあれば、1時間くらいの場合もあります。
ただ、もくもくとコーディングしているというよりは、間間で再度「これから●●を□□しながら△△して、実装します」と宣言し、教師役メンバなどのナビゲータが違和感を覚えれば、そこで手を止めてディスカッションします。 -
休憩時間
モブプロは想像以上に疲れるので、休憩時間を予め固定して入れます。
9:30開始で11:30から固定ランチ休憩です。固定ランチ休憩までの間に1回軽く休憩を入れます。
午後は12:30開始で15:00に固定休憩です。固定休憩までの間に1回軽く休憩を入れます。
最後は15:20から17:00まで実施して、終了です。
17:00から17:30は1on1や、各自振り返りの時間にしています。 -
振り返り手法
1スプリントが3日という短さなので、各スプリントの終わりに、振り返りをします。
振り返りはKPTではなく、YWTを実施します。
私は育成目的のときにはKPTよりYWTの方が、うまく振り返りを実行して成長を生み出しやすいと感じています。
Y(やったこと)は、毎日私がチーム日誌として詳細に記載しているので(チケットとは別に)、メンバはそれを見て、今スプリントを思い出し、自分がW(分かったこと)を振り返ります。このWを各自が5~10分程度で文字にお越し、Teamsに投稿します。最後に投稿内容を軽く補足しながら、各自が順番に振り返りを述べます。
育成モブプロの間は、上記の感じで、だいたい、25分程度をスプリントの開発メンバの振り返り(レトロスペクティブ)としています。
振り返りの際に各自がWを一度書き出し投稿することで、1カ月単位の振り返り時に、自分の毎週のWを確認できるようにしています。
育成モブプロのコツ、注意している点
-
ドライバを焦らさない
ドライバ役はどうしても、後ろからあーだこーだ言われると焦ります。それでなくても緊張するものです。
とくにスプリント1週目は緊張が強いです。だいたい2スプリント目になると慣れてきます。
ナビゲータの皆が焦り、あーだーこーだ言い出して、ドライバが大変になりそうになったら、私や誰かが、仙道になり、皆を落ち着かせます。
-
しつこいくらいに各自振り返りの時間を確保
モブプロなので、チームのペースで進みます。
そのため、2週に1度は必ず午後一杯は各自が各自のペースでこれまでのチームの実装を振り返り、疑問点を質問したり、調べる時間を確保します。 -
チームビルディング
チームで実装するので、「自分がバカだと思われたら困るから質問できない」、「自分は実装が遅いから不安でドライバはやりたくない」だと機能しません。心理的安全性というのでしょうか。。。
アジャイル開発の日は毎日ランチはメンバで食べます。
同じ釜の飯を食うのが大切だと思っています。
また私は開発メンバをいつも、関連学会には全員連れていくように心がけています(可能であれば半年に1回、少なくとも年1回)。
昨年の新潟の人工知能学会もそうしましたが、メンバ全員で行き、できるだけ広い部屋をとり、皆で雑魚寝できるようにします。そして、学会で発表を聞いたあとは毎晩皆で買い出しに行き、酒を飲みながら、その日各自が聞いた発表の内容や今後のチームのあり方などを皆で語る合宿にしています。
(寝るときは一人が良いというメンバには当然一人部屋も用意します) -
1on1
できるだけざっくばらんにモブプロができる雰囲気、チームビルディングを頑張ってもやはり個々に悩みや不安はあります。なので、1on1は欠かさず、毎日私は開発メンバの誰かと17:00-17:30は1on1の時間をとります。
各メンバにとっては2-3週間に1度は1on1を実施する状態にしています。
当然、それ以外でも適宜相談には乗るのですが、確実に時間を確保しておくようにしています。
1on1といってもOKRやなんや、かっこいい感じではないです。
「最近どう?不安に思っていることはある?自分の上長に現在の開発工数や取り組みについては理解がちゃんと得られている?他の業務との兼ね合いでの直近の忙しさはどう?体調に変化は?楽しい?」くらいを聞き、あとは本人が話したいことを話してもらいます。
私の気分的には、実家に帰ったときに弟たちに「最近どないや?困ってないか?」と聞いたり、子供に「最近学校は面白い?」と聞いている感じです(私は子供はいませんが、気分としては)。 -
開発リードの気持ち
育成モブプロを実施する開発リード側の気持ちとしては、山本五十六の有名な3章の言葉を意識しています。
やってみせ、言って聞かせて、させてみせ、ほめてやらねば、人は動かじ。
話し合い、耳を傾け、承認し、任せてやらねば、人は育たず。
やっている、姿を感謝で見守って、信頼せねば、人は実らず。
です。 -
やり方よりあり方
モブプロにせよ、スクラムにせよ、型(カタ)となるやり方があります。そのカタをまずは忠実に守り、だんだん工夫を入れていく(守破離)の精神も大事です。
ですが、そもそもどんなやり方をしようとも、それが「心のあり方」から生まれない手法論は破綻しますし、チームメンバからは「メンバのことは大切にしないけど、リーダーとして成果は出さないといけないから、今どき方法論でやるんですね」と思われてしまいます。
どこで聞いた言葉か忘れましたが、私が意識しているのは、
「あなたに大切にされていることをその人が知るまで、あなたが持つ知識・スキル・アドバイスに、人は何も興味を示さない」
という意識です。
やり方に走るのではなく、あり方からくるやり方になれるように、頑張っています(まだまだ完璧からは程遠いですが・・・)
さいごに
育成目的でのモブプロをやってみた際の体験談をいろいろ書きました。
意識していることなども書いてみましたが、とはいえ、私も偉そうにちゃんとできているわけではないです。
また育成でのモブプロに正解も存在しません。
インセプションデッキに「夜も眠れなくなるような問題は何だろう?」とありますが、私にとってのそのひとつは、
「開発メンバのひとりひとりが、本当に最高に楽しく、最高に成長しながら、最高のものを作れる環境とふれあいを実現できているであろうか?」
という悩みです(とはいえ、夜グッスリ寝ていますが・・・)
そこに答えなんてないので、どうするかというと、自分がいろいろ学ぶこともそうですが、
やっぱり1on1で、メンバに聞くしかないない、メンバひとりひとりと丁寧に向き合うしかない、と思っています。
以上、乱筆となりましたが、育成モブプロについてでした。
やってみると想像以上に良かったので、宜しければぜひ試してみてください。
ご一読いただき、ありがとうございます。
【著者】電通国際情報サービス(ISID):AIテクノロジー部
小川 雄太郎(著書「つくりながら学ぶ! PyTorchによる発展ディープラーニング」 、その他「aboutme」)
【免責】本記事は著者の意見/発信であり、著者が属する企業等の公式見解ではございません