モブプログラミング雑記(リモート)

# これは何か
コロナ禍により筆者も4月からほぼリモート勤務となった(業務都合で出社する日もあったが)。その際に、初めてモブプログラミング(以下、モブプロ)に取り組んだのだが個人的には非常に良い経験となったので、備忘録としてここに諸々記していく。

## 1. モブプロとは
- 複数人で一緒にプログラミングを行う(自分の場合は４名前後で実施していた)
- チームで一つのアウトプットを作っていく
- ペアプロの複数人バージョン
- オンサイトでの実施の場合は、1つの画面を皆で見ながら実施
- リモートの場合は画面共有(後述)しながら実施

## 2. 役割
- Driver
    - 実際にコードを書く人
    - Driverは時間で区切って交代していく(全員が1回は経験する)
    - Controllerの指示を聞き、実装する
    - 理解できないときは必ず質問する
    - 基本的にControllerの指示に指摘などははせず、Controller側に回った時にするらしい
    - ただ個人的には後で指摘するくらいなら、Driverの時にしてもいいんじゃないかと思っている
- Controller
    - 基本的にコードは書かない
    - コーディング中の問題を解決するために指示を出す or 調査する
    - 改善すべき点が見つかれば、指摘する
    - コーディング内容が理解できない場合は、必ず質問する
    - 他のControllerの指示が理解できない場合は、必ず質問する

## 3. ルール
- 一定時間ごとにDriverは交代しながら進めていく(10〜20分程度)
- 1時間〜2時間に1回は休憩を入れる(意外と疲れる)(目安はDriverを1巡した時とか？)
- Controller側で実装方針に基づいて、具体的な実装内容を決める。それをDriverに伝える
- 伝えるときは可能な限り具体的に(例: `pd.read_csvでhoge.csv`を読み込む)
- つまり、Driver側は基本的に文字を打ち込むスタンスでよい
- Controller側が指示したこと以外は実装しない
- モブプロが終了したタイミングで振り返り会を実施し、次回に活かしていく

## 4. 参加者の姿勢
- モブプロやりたくない人を無理やり参加させない
- 全員が納得を得ながら進めていく(わからない時はとことん質問する)
- 分からないことは恥ではない、しかし分からないままにすることは恥である
- 和を乱す発言はしない(例: 何でそんなこともわからないのか)

## 5. メリット
- 属人化を防ぐ
    - 全員で取り組むので、1人のスペシャリストが生まれなくなり、メンバーが欠けた時の影響が低い
    - コーディング記法、細かい変数名を揃えられる
    - 新メンバーのシステムへの理解も早くなる
    - ドキュメントは最低限のもので済むようになる
    - チーム内のコミュニケーションが活発になる
- チーム全体の技術力工場、共有
    - 全員で取り組むので、スキルや知見を共有し合う機会が多く、各個人のスキルアップにつながりやすい
    - 問題に詰まってしまう可能性が低い
    - 詰まっても皆で調べるので、すぐに解決できることが多い
- 成果物の品質工場
    - 全員で取り組むので、ミスや見落としなどが減り、成果物の欠陥が減る
    - 細かい仕様は皆で合意を取っていくので手戻りも少ない

## 6. 注意点
- 事前にやっておくといいこと
    - 実装方針程度は事前に決めておく(例: この役割を持ったクラスを作るとか) ※詳細な部分はモブプロ中に決めれば良い
    - 実装方針だけである程度雛形が作れるなら事前に作っておくのもあり(クラス、関数が決まっているなら宣言だけ記述しておくとか)
    - 誰か1人担当を決めて、開発環境を用意しておく
- 全員知らない、分からないことに遭遇した時
    - 皆で時間を決めて調査する
    - それでも分からない場合はissueとして飛ばして、一旦先に進める(モブプロ後に調査する)
    - そこが分からないと先に進めないなら、必死に調べるか代替案を用意する
- 新メンバー参入時
    - なるべくDriverを新メンバーにやってもらう(実際に書くことで理解を深める、手を止めて質問しやすい)
- ベテランの人ばかり発言してしまう
    - ベテランの方には、メンバーに質問や発言を促したり(誰々さんはどう思う？、ここの実装は皆理解できてる？)、理解できていない箇所のフォローに回るなどのサポート役として参加してもらう

## 7. リモート時のモブプロ実施方法
オンサイトの時は1つの大きなディスプレイを用意して、そこにコードを映せばよい(近くにホワイトボードがあると話し合いがしやすいので尚良い)が、リモート時は画面共有が必要になる。zoomなどでも画面共有は可能だが、共同編集ができた方が便利なので、その方法を2つほど下記に記載しておく。

- [Visual Studio Live Share](https://visualstudio.microsoft.com/ja/services/live-share/)
    - Visual Studio Codeでファイルの共同編集ができるようになる
    - MSアカウントかGitHubアカウントがあればすぐできる
    - 使い方は[こちら](https://qiita.com/mh4gf/items/8f072b2faabba90937d3)に詳しく載っている
- [Google Colab](https://colab.research.google.com/notebooks/intro.ipynb)
    - jupyter notebook形式
    - GPUとかTPUが無料で利用できる
    - 画面右上の共有ボタンにあるリンクを共有すれば、共同編集ができるようになる
    - 使い方は[こちら](https://www.tdi.co.jp/miso/google-colaboratory-gpu)とかに詳しく載っている

## 参考
- [モブプロにやりづらさを感じて改善した話](https://buildersbox.corp-sansan.com/entry/2019/06/12/112227)
- [モブプロのススメ](https://note.com/erukiti/n/n25c5a4f0bce7)
- [モブプロのやり方](https://note.com/erukiti/n/nd14df57c4312)
- [モブプログラミング・ベストプラクティス」読んだのでモブプロの魅力と始め方をまとめる](https://aloerina01.github.io/blog/2019-03-12-1)
- [モブプログラミング・ベストプラクティス](https://www.amazon.co.jp/%E3%83%A2%E3%83%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E5%93%81%E8%B3%AA%E3%81%A8%E7%94%9F%E7%94%A3%E6%80%A7%E3%82%92%E3%83%81%E3%83%BC%E3%83%A0%E3%81%A7%E9%AB%98%E3%82%81%E3%82%8B-%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%BB%E3%83%91%E3%83%BC%E3%83%AB-ebook/dp/B07NW2S2XV/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%83%A2%E3%83%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9&qid=1599189271&s=digital-text&sr=1-1)