ペアプログラミング/モブプログラミングについて
エクストリーム・プログラミング(XP)で提唱されたソフトウェア開発プラクティスであるペアプログラミング(以下ペアプロ)は、2人で1つのPCを用いてプログラミングを行うというものである。近年では3人以上で行うモブプログラミング(以下モブプロ)の話もウェブ上でよく目にするようになった。
ペアプロ/モブプロといえば、よく単純な分業と比較しての開発効率の低下が懸念として挙げられる。その一方で、暗黙知の共有や不具合埋め込み率の低下、実証実験の結果から開発効率はむしろ向上するというメリットが主張されている。
キャッシュミス率からペアプロ/モブプロの効率性を考える
ここでは、キャッシュミス率からペアプロ/モブプロの効率性を考えてみよう。
例えば1行平均30文字で100行のコードを書く事を考えてみる。そして、コードの内容はすべて頭に入っていて、あとは手を動かすだけという状態を考える。文字数にしてみればせいぜい3000文字であり、ゆっくり目のタイピング速度 3文字/秒 だとすれば、最短 1000秒 ≒ 17分 でコードを書き上げられることになる。しかし、現実的にはこのような最短時間でコーディングできることはまず無い。何故か?
その理由は、自分の脳内に無い情報を調査したり検討したりする必要があるからだ。具体的には:
- プログラミング言語の文法を調べる
- 既存のライブラリがないか調べる
- ライブラリの仕様を調べる
- 既存コードの設計方針を調べる
- 自分の書こうとしている関数仕様の細かい部分を調べ直す
- より良い設計はないかと調査したり検討する
などが挙げられる。このような、自分の脳内にない情報が必要になることを、ここではCPUのキャッシュミスに例えることにしよう。
問題設定
キャッシュミス率からペアプロ/モブプロの効率性を単純分業時と比較するために、以下の設定を考える。
$T$件のタスクを$N$人で処理するリードタイムを計算する。キャッシュミスが起こらなければ、タスクは $X$ 分/件で実行できるが、キャッシュミスが起こると $L$ 分のロスが発生するとし、一人の開発者は、1件のタスクに付き $p \in [0, 1]$ の確率で独立にキャッシュミスを起こすとする。
この時、完全分業した場合のタスク完了までのリードタイム $Time_{分業}$は、キャッシュミスを考慮するとタスク一件あたり $(X + Lp)$ 分 かかり、T件をN人で分担するので、
$Time_{分業} = (X + L p) T / N$
と計算できる。
一方、モブプロでのリードタイム $Time_{モブプロ}$ は、N人全員がキャッシュミスを起こした時のみロスが発生するという事にすると、キャッシュミスが起こる確率は $p^N$ に低下するため、タスク一件あたり 平均 $(X + Lp^N)$ 分かかり、T件をN人全員で直列に作業するので、
$Time_{モブプロ} = (X + Lp^N) T$
となる。
具体例1: ペアプロ
ペアプロの場合について、実際に計算してみよう。
タスク件数はとりあえず $T = 10$、ペアプロなので $N=2$、タスク粒度は $X = 1$ として、キャッシュミス率は $p = 0.1$ とし、ロスも $L = 10$ 程度とする。
この時、
$Time_{分業} = (1 + 10 * 0.1) * 10 / 2 = 10$
$Time_{モブプロ} = (1 + 10 * 0.1^2) * 10 = 11$
となり、モブプロは若干非効率という結果になってしまった。しかし、その差は10%程度であり、キャッシュミス率の低下により、2人で作業してもそこまで時間はかからないことが分かる。
具体例2: モブプロ
ペアプロの条件で人数を $N = 3$に増やしてみると、
$Time_{分業} = (1 + 10 * 0.1) * 10 / 3 ≒ 6.67$
$Time_{モブプロ} = (1 + 10 * 0.1^3) * 10 = 10.1$
となり、若干差が開いてしまった。
具体例3: 不慣れなタスクでのモブプロ
今度は、不慣れなタスクでのモブプロを想定してみよう。
上記モブプロの条件から、不慣れなタスクであるためにキャッシュミス率が$p= 0.5$まで上昇し、また、調査工数であるロスも$L = 100$ まで増加すると考えると、
$Time_{分業} = (1 + 100 * 0.5) * 10 / 3 ≒ 170$
$Time_{モブプロ} = (1 + 100 * 0.5^3) * 10 = 135$
となり、モブプロでの大幅な効率改善が得られた。
まとめ
ペアプロ/モブプロがキャッシュミス率の低減に寄与するとして、リードタイムの短縮につながるかを非常に単純化したモデルで検討してみた。
- 十分にキャッシュミス率が低いか、キャッシュミスが起こってもロスが少ない場合は分業の方が効率的
- 逆に、不慣れなタスクや、新人が既存コードの構造を知らないなど、キャッシュミスが多発したり、ロスが大きいような状況では、ペアプロ/モブプロによりキャッシュミス率を低下させることが有効である。
上記の結果は、不確実な要求や環境の変化に対応するためのアジャイル開発手法においてペアプロ/モブプロがフィットする理由として考えられるのではないだろうか。
また、上のモデルでは表せていないが、ペアプロ/モブプロによって暗黙知が共有され、個々人のキャッシュミス率の低下も期待できると考えられる。
結局ソフトウェア開発でどこに時間がかかるかといえば、キャッシュミス時の調査工数であり、これらを効率的に削減する手法の一つとしてペアプロ/モブプロは積極的に実施していくのが良いのではないだろうか。