[[📒Productivityを上げるために大切な100のこと]] No21. 🥈
---
近年は[[モブプログラミング]]が脚光を浴びている。
一見効率が悪そうに見えるこの開発手法は、想像もできないほど生産性を上げてくれる。ただし、それは==チームメンバー皆が真剣に問題と向かい合った場合==の話だ。
## [[ドライバー]]と[[ナビゲーター]]
[[モブプログラミング]]にはいくつかの役割がある。その数、[[MOB PROGRAMMING THE ROLE PLAYING GAME]]では10以上にもなるが、代表的な役割は[[ドライバー]]と[[ナビゲーター]]だ。
1人で開発する場合と異なり、[[ドライバー]]と[[ナビゲーター]]に分かれるというのは**考える人と手を動かす人が別になる**ということだ。この連携のスムーズさが[[モブプログラミング]]の生産性に大きく左右する。
## 抽象的な指示を即座に実行する
[[ドライバー]]は機械ではない。そのため、[[ナビゲーター]]の指示は抽象的になることが望ましい。例を挙げてみよう。
```python
def main():
x = 1
y = 2
print(3)
hoge()
return
```
[[ナビゲーター]]は関数`hoge`が何をしているのか気になっている。だから[[ドライバー]]に伝える。
『hogeって何している?』
抽象的な指示を即座に実行できる[[ドライバー]]なら1秒も経たないうちに`hoge`にカーソルを当てて、関数の実装に移動するコマンドを実行するだろう。これはお互い気持ちがいい。
## 抽象的な指示を実行できない場合
抽象的な指示を実行できない場合、[[ナビゲーター]]と[[ドライバー]]の双方でフラストレーションが溜まる。[[ナビゲーター]]は自分1人でやった方が速いと思うし、[[ドライバー]]は落ち着いた環境でやりたいと思うだろう。
### 役割と指示を認識していない場合
- 『わかりません』
- 『(記憶を頼りに)確かあれは...』
これは[[ドライバー]]が[[ナビゲーター]]の指示を指示と解釈していない場合だ。クイズを出しているわけでも貴方の考えを聞いているわけでもなく、操作をして事実を確かめてほしいことを伝えよう。操作は[[ドライバー]]の特権なのだ。
### 関数の実装に移動する機能を知らない場合
関数の実装に移動する機能を知らない人は以下のようなアクションをとるだろう。
- [[ドライバー]]が無言で別ファイルを開いて`hoge`の出現箇所を目視で探し始める
- [[ドライバー]]がプロジェクト内全文検索を使って`hoge`を探し始める
何をしようとしているのか? を確認したうえで、そのような機能があることを教えてあげよう。[[ドライバー]]が新たな機能やショートカットキーを知ることは、[[モブプログラミング]]における大切な目的の1つだ。
### ファイル内のhogeを認識していない場合
関数の実装に移動する機能は知っていても、呼び出し箇所を上手く探せないケースがある。その場合は事細かな指示が必要になる。
- 『7行目に移動して、関数の実装に移動するコマンドを実行して』
- 『マウスを画面1/3くらい右に移動すれば`hoge`があるので、関数の実装に移動するコマンドを実行して』
できれば『`Ctrl + F`で検索した方が早いですよ』などと教えてあげたほうがいい。2秒以内に見つけられない場合の目視は基本的に非効率だ。
## 抽象的な指示を指先で覚える
抽象的な指示を即座に実行することは決して簡単ではない。普段からそのような動きができるように鍛錬する必要がある。
たとえば[[IDE]]を操作するなら実用的な機能、利用シーン、ショートカットキーを覚えよう。==暗記するのではなく何百回と使うことで指先に覚えさせるのだ==。
個人的に[[モブプログラミング]]をするにあたり、[[ドライバー]]に是非覚えてほしいショートカットキーを[[JetBrains IDEで使ってほしいショートカットキー]]にまとめた。
![[Pasted image 20210625174511.png]]
ブログ記事では以下をセットで紹介している。具体的なシチュエーションについては是非参考にしてほしい。
- **[[モブプログラミング]]実施時の具体的なシチュエーション**
- 私が設定しているショートカットキー
- 機能
- 操作[[GIF]]
また、この記事では[[JetBrains IDE]]を取り上げているが、どのツールを使う場合も本質は一緒だ。**[[ナビゲーター]]の発話と[[ドライバー]]の操作がシンクロしたとき、[[モブプログラミング]]がもたらす生産性に驚くはずだ**。