パターン別でみるペアプロの効果

現在関わっている案件で初めてペアプロ（ペアプログラミング）を経験しました。
ペアプロで開発をするのは１人で開発を進めるのに比べて色々とメリットがありますが、ペアの組み合わせによって効果の大きさに差が出るなと感じたので、その辺りの所感をまとめます。
ペアプロをやったことがないが興味を持っている人、ペアプロをやっているが効果が実感できないという人の参考になればと思います。

## そもそもペアプロとは

ペアプロをあまり知らない、あるいは単語自体は知っているがやったことがない人向けの簡易的な説明になります。
ペアプロはペアプログラミングのことで、その名の通り2人1組でペアを組んでプログラミングを進めていく開発手法。
アジャイル開発の文脈で登場することの多い開発手法の1つ。
一般には片方がドライバー、もう片方がナビゲーターとなって作業を進めます。
ドライバーはキーボードを持ってコーディングなどの実際の作業を行う人のこと。
ナビゲーターはドライバーの作業やコードをレビューしながら必要に応じてフィードバックをする人のこと。
ドライバーとナビゲーターは定期的に役割を交換しながら作業を進めます。

ペアプロで作業を進めると基本的にコードや作業内容が常にレビューされる状態になるため、1人で作業を進めるのに比べてミスを減らすことができ、効率よく作業を進められたりバグを減らすことにつながる。また、設計方針や実装方針についてはいつでもお互いに意見を出して議論しながら進めることができるため、1人で進めるよりもより良い方法で実現できる可能性が高まる。
結果として、1人で作業するよりもプログラムの品質を高めることが期待できる。
そして、常にレビューする（される）状態で即座にフィードバックができるため、お互いに新しい気づきを得やすく、成長につながりやすいというメリットもある。

というのが一般的なペアプロの特徴。
しかしながらプログラムの品質への効果とお互いの成長への効果の高さは、ペアの組み合わせ次第で大きく上下します。
ということでここからは組み合わせ別の効果の高さの話。

## パターン１：上級者A × 上級者B（スキルの重複少なめ）

### AさんとBさんのスキル領域

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497228/c9e57b0a-8dab-f0bb-1a70-8da64a3a6902.png)


### 効果

* 品質への貢献：高
* 成長への貢献：高

### 補足

ここで言うスキルは、プログラミングに関する知識やシステム特有のドメイン知識、問題解決力やコミュニケーション力など、システム開発をする上で必要になる諸々のスキルを指すと考えてください。スキル領域の重なりが少ない場合は、お互いが相手にはない知識やスキルを多く持っていることを意味します。

個人的にはこの組み合わせがペアプロをする上でのベストな組み合わせだと思います。
それなりの開発スキルを持つ上級者同士がペアになり、かつお互いが持つ知識やスキルで重ならない範囲が多い状態。
そもそも上級者が1人いることで一定の品質を担保できる可能性が高いですが、2人いることによりミスやバグなどを減らせる可能性が高まります。お互いに持っている知識が異なるため、別の角度からの視点で確認が入り、ミスを減らせる可能性もかなり高くなるでしょう。異なる視点で意見を出し合いながら、より良い設計や実装案に辿り着く可能性も高まります。
そして互いの知識範囲が異なることから、お互い開発をする中で新たは発見があって成長にとってもプラスになる影響を与えられる可能性が高いです。

ここでの例は上級者としていますが、中級者でも同じことが言えます。
上級者同士に比べると品質が劣ることになるかもしれませんが、お互いに良い影響を与えることができるでしょう。

## パターン２：上級者A × 上級者B（スキルの重複多め）

### AさんとBさんのスキル領域

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497228/6c4ede05-260c-8e48-7680-9c24751f8720.png)


### 効果

* 品質への貢献：低
* 成長への貢献：低

### 補足

こちらは上級者同士でも持っている知識がほとんど同じになっている場合の組み合わせ。
このような組み合わせはあまり多くはないかと思いますが、例えば入社してから10年間ずっと同じ現場で働き続けてきた同期なんかがいる場合は保持しているスキルは似たような状態になっているかもしれません。
このような組み合わせの場合、2人とも上級者であることから品質が極端に低くなることは考えにくいですが、ペアプロをすることによるメリットは低いです。

まず、2人の持っているスキルが共通の場合、自分にはない発想の意見が出る機会が少なく、結果として1人で作業しているのと変わらない出来になる可能性があります。
また、持っている知識が同じだと互いに成長を促す気づきを与える場面も少なくなります。
これは上級者同士のペアに限った話ではありませんが、持っているスキル領域の多くが重複している人でペアを組むと、ペアプロとしての効果は低くなる可能性が高いです。
これも中級者同士でも同じことが言えます。

## パターン３：初心者A × 初心者B

### 効果

* 品質への貢献：低
* 成長への貢献：低

### 補足

ここは図を省略します。
初心者同士のペアの場合、互いに持っている開発スキルが少ないため、スキル領域がどうであれペアプロによる効果は低いです。
開発スキルが少ない場合、議論しあっても良いアイデアが出る可能性は低く、互いに成長を与える影響も少なくなります。

## パターン４：上級者A × 中級者B（重複少なめ）

### AさんとBさんのスキル領域

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497228/2a692171-dbcd-b6cd-89e3-621d8b60bcd8.png)

### 効果

* 品質への貢献：中
* 成長への貢献：中

### 補足

私の個人的な考えでは、ペアプロで最も効果が高いのはお互いでスキルレベルがある程度同じで、かつ持っているスキル領域が異なる場合だと考えます。
レベルに明らかな差があると、どうしてもレベルの高い人が主導権を握る形になってしまう可能性が高く、双方向でのフィードバックが起きにくくなりがちになるからです。

とはいえ、レベルに差があってもお互いが持つスキルでそれぞれ特化した部分があったり、独自の視点を持っている人であれば1人では思いつかない意見をお互いに出し合うことはできるし、成長の観点から影響を与え合うことも可能だと考えます。

## パターン５：上級者A × 中級者B（包含関係）

### AさんとBさんのスキル領域

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497228/e62ba303-4cf6-63a7-5c1f-7b747b6812fa.png)

### 効果

* 品質への貢献：低
* 成長への貢献：中（低〜高）

### 補足

初心者 × 初心者のパターンに次いで効果が低いとされるパターンです。
片方の開発スキルが、もう片方の開発スキルに包含されてしまうパターンです。
持っている知識やスキルが完全に包含されるという状況は少ないかもしれませんが、特定の案件に必要となる知識に限定した場合はペア同士でスキルが包含関係になることも比較的ありそうです。

このような場合、スキルの高い方（ここではA）を上限とした開発になる可能性が高いため、1人で作業した場合に比べても品質向上の効果は低いです。もちろん、上限となる人のスキルが高ければある程度の品質は保証できますが、ペアプロをしても上級者側の上限を突破できる可能性が低いため、ペアプロをするメリットは低くなります。
成長という観点で見た場合、Bさん側のメリットは大きいものの、Aさん側にはメリットは少ないです。
そのため中間をとって中としました。

ここでは「上級者 × 中級者」というパターンにしましたが、「上級者 × 初心者」、「中級者 × 初心者」の場合でも考え方は同じで、包含関係になっているペアではペアプロの効果は出にくくなります。

## スキルよりも大事なもの

ここまでは単純にスキルのレベルと領域の違いでペアプロの効果を見てきました。
しかし実際にはスキルだけで効果が決まるわけではありません。
仕事へのスタンス、目標設定、学習意欲といったマインドセットがペアプロの効果にかなり影響します。

開発物の品質を上げるためには、ユーザーの視点に立ってユーザーの満足度を上げるための仕組みを考え続ける必要があります。また、バグを少なくして長期的にメンテナンスしていくことを考えて、設計や実装の方針もより良いものを追求していく必要があります。
そして、開発者自身が技術に対して探求し続ける姿勢も重要です。

ペアプロではこのようなシステムや技術に対するモチベーションの高さがある程度同じであることがかなり重要です。
ペアのうち1人のモチベーションが高くても、もう一人のモチベーションが低ければその空気が伝播してペア全体のモチベーションが低くなる恐れがあり、そうなってしまってはもはやペアプロの効果は期待できません。
これはシステムの品質に対しても学習意欲に対しても同様です。
例えパターン１のようなペアであっても、双方にモチベーションがなければうまく機能しない可能性が高いです。

逆にペアとなる2人のモチベーションが共に高ければ、パターン5のような包含関係にあるペアでもある程度の効果が期待できます。
パターン5の場合、包含される側（ここではBさん）の学習意欲が高ければ、Bさんにとってペアプロはメリットの大きいものになります。
その場合Aさんは教える側の立場が多くなりますが、教えることにより自身の理解を深めることに繋がり、かつBさんのモチベーションに感化されて学習意欲が高まる可能性はあります。
そうなれば双方のスキルアップが期待でき、結果として品質の工場にも繋がるかもしれません。

## 定期的にペアを変える

ペアプロをより効果的にするには、一定時間ごとにペアを変えることが大事です。
ペアの間にスキルの差があったとしても、全く同じ経歴・人生経験の人は誰一人としていないので、そういう意味でペアプロを始めた段階ではどんな組み合わせでも学びきっかけとなります。
しかしずっと同じペアで作業をしていると、新しい視点での発想も出にくくなってきます。

定期的にペアチェンジをすることにより、新たな気づきや刺激を得るきっかけが生まれやすくなります。
ペアプロの効果を高めていくには、4人以上でチームを作ってその中でペアを入れ替えていくことが1つのポイントとなります。

## モブプロという選択肢

ペアプロとは別でモブプロ（モブプログラミング）という開発手法もあります。
ペアプロはその名の通り2人1組のペアで開発を行うものですが、モブプロは３〜４人といったペアプロよりもさらに多い人数で同時に1つの画面を共有しながら開発を進める開発手法です。

モブプロは1つの開発で常に3〜4人のリソースを使うため、開発効率という点でデメリットもありますが、人数が多い分うまく実施すれば品質の向上や相互作用という点ではペアプロよりも高い効果が期待できます。

私も現在の案件でペアプロを経験する前に4人でのモブプロを経験しました。
慣れるまではキーボードを奪うタイミングなどが難しいと感じた部分もありますが、知らない知識を学ぶという点では多くの気づきが得られました。
ペアプロをやりたいがメンバーが固定されて効果が低いと感じてきた場合はモブプロを検討しても良いかもしれません。

## まとめ

* ペアプロは以下のメリットがある
    * ミスやバグの減少
    * 品質の向上
    * 互いの成長への促進
* ペアプロはスキルの差によって効果の高さに差がある
    * 互いのスキルレベルが一定以上でスキル領域の重なりが少ないほど効果が高い
    * 初心者同士は効果が低い
    * スキルが包含関係にある場合も効果は低い
* ペア同士でモチベーションの高さが一致していることが大事
* ペアを定期的に入れかると良い
* ペアプロの効果が出にくければモブプロもあり