【新人教育】プログラミングスキルを劇的に向上させる最強の方法「ペアプログラミング」のすすめ

# はじめに
この記事は**「経験年数5年目くらいまでの後輩と共に開発を行っている先輩エンジニア」**に特に読んでもらいたいです。
私は今までOJTなどを通して新人や経験年数の少ない人と仕事をしてきました。「新人」と一括りにしてはみても事前知識や理解力、やる気もバラバラです。事前にたっぷりと説明した方が理解できる人、とりあえず手を動かしてもらった方が理解できる人・・・本当に人それぞれです。
色々と試行錯誤を繰り返している中で、万人に効く最強の方法に出会いました。それがこれから紹介する**「ペアプログラミング」**です。

# ペアプログラミングとは？
「ペアプログラミング」をwikipediaで調べてみると
>ペアプログラミング（英: pair programming）はソフトウェア開発の手法の一つで、2人のプログラマが１台のマシンを操作してプログラミングを行う手法。 

と書かれています。
2人のプログラマが共同で一つのプログラムを書いていく開発スタイルです。
「新人×新人」の組み合わせや「ベテラン×ベテラン」の組み合わせもメリットがあるかもしれませんが今回は**「実際に行って効果の高かった方法」**を紹介するため「新人～経験年数5年目くらいまでの後輩×中堅エンジニア」の組み合わせで話を進めます。
以下、「新人～経験年数5年目くらいまでの後輩 ＝ 新人」、「中堅エンジニア ＝ 先輩」とします。



# ペアプログラミング実施方法

##  役割

ペアプログラミングではまず「ドライバー」「ナビゲーター」という役割にわかれます。

- ナビゲーター
  - プログラムの構成を考える
  - ドライバーにコード記述の指示をする
  - ドライバーの疑問に答える
  - ドライバーが書いたプログラムをレビューする

- ドライバー
  - 実装する
  - 指示されたことに疑問があれば質問する

つまりナビゲーターが指示した通りにドライバーがコードを記述していく開発スタイルです。
「新人が先輩に指示を出す」少しハードルが高そうに聞こえますよね。でも大丈夫です。慣れます！

## 交代頻度

このドライバーとナビゲーターは一定時間（数分、30分、1時間など）で交代するのが望ましいとされています。
また、役割だけではなくペア自体も同様に一定期間で交代します。先輩も新人も関係なくそれぞれドライバーとナビゲーターを交互に担当します。
私は実際にやってみて**「30分交代」**に落ち着きました。そのくらいが集中力も維持できると思います。

# 導入によるメリット/デメリット

## メリット

### １.考えの共有
新人、先輩がそれぞれどのような考えでそのコードを書いたのか。完成したコードからでは読み取れない**「考え」**を知ることが出来ます。
特にナビゲーターが先輩の場合、プログラミングをしながら**「考え、コーディングに至る過程」**を教えることになります。可読性や拡張性、セキュアコーディングなど、意識しなくともシステム動きますが**「意識すべきもの」**を今実際に触っていて理解しているコードで教えることが出来ます。
**「出来る新人だと思っていてたが、実はコピペプログラマーだった」**なんてこともペアプログラミングでわかったりします。

### ２.テクニックの共有
コードを早く書くための様々なテクニックを見せながら教えることが出来ます。
私が使っているショートカットキーやテキストエディタの文字ソート、矩形選択などが新人に驚かれたりしました。普段当たり前に使っているので「便利」という意識すら言われるまでなかったです。
さらに（これが一番大事かもしれません）**「書いたソースが思い通りの挙動にならない時に取るアプローチ方法」**など技術書には載っていない情報を伝えられます。私自身忘れていましたが新人のうちは検索の方法すらわからなかったりするんですよね。

### ３.わからないことの共有
当たり前ですがナビゲーターは記載すべきコードとその意味を理解していないと指示が出来ません。
なのでナビゲーターが新人の場合、**「何がわかっていないのか」**を明らかにしながら進めることになります。先輩自身も触っているコードなので何がわからないのか相談されればすぐに理解できます。
わからないこと、躓いていることを都度教えることが出来るので、非常に効率的です。新人が開発中に陥りやすい**「何時間もひとりで悩む」**ということがなくなります。

### ４.コードの共有
通常はコーディングをした人だけがそのコードを完全に理解しています。
しかし、ペアプログラミングでは最低ふたりがそのコードを理解することになります。
コードの属人化を防ぐ意味でも非常にメリットだと思います。

### ５.バグの軽減
常にダブルチェックをしながら実装を進めることが出来るため、ケアレスミスでのバグが少なくなります。
これは実体験として本当にケアレスミスでのバグが減りました。

### ６.レビューの時間減少
常にレビューをしながら作業が進むのでコードレビューの必要がなくなります。
※レビューの進め方はプロジェクト毎で異なると思うので臨機応変に行ってください。

### ７.チームワークの向上
常に相談をしながら協力し合ってプログラミングを行うため、チームワークが向上します。
また、同時に作業を止めて休憩を取ることになるので自然と会話も発生します。

### ８.教える力がつく
「人に教えることが自分の勉強になる」これはペアプログラミングに限らず新人教育を行ったことがある方は感じると思います。
ペアプログラミングの場合、通常のOJTよりも多く会話をしていることになるのでより教える側の力になります。

## デメリット

### １.作業スピードの低下
ペアプログラミングを紹介する様々なサイトでは「作業スピードが向上する」と言われています。
しかし、実際にやってみた結果として慣れるまではそれぞれ個々に実装を行った方が早いです。

### ２.窮屈に感じる時がある
特にベテランの技術者は、コードの全体像を頭の中で描けていて一気に完成させたい時があります。
その際に多少ストレスを感じることになります。

### ３.教える側のクセがうつる可能性がある
例えば先輩がコピペプログラマーだった場合・・・。こんな恐ろしい仮定の話はしたくないのですが**「それでいいのか。そんなもんなんだ。」**とまだ穢れをしらない純粋な新人は思ってしまう可能性があります。
※コピペを否定しているわけではありません。まったく理解していないのにコピペしてしまうことを危険視しています。

# まとめ
実際に導入してみてペアプログラミングはチーム内の技術力の底上げに繋がりました。
先に挙げた「メリット/デメリット」を見てわかるようにデメリットに比べ非常にメリットが多いです。
新人教育の際にプログラミングスキルの底上げに是非導入をご検討ください。


### 参考サイト
[ペアプログラミング『ウィキペディア（Wikipedia）』](https://ja.wikipedia.org/wiki/%E3%83%9A%E3%82%A2%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)
[ペアプログラミングで「強いエンジニアチーム」を作る！ ヤフーが実践する全てペアプロ開発の手法](https://employment.en-japan.com/engineerhub/entry/2019/11/07/103000)
[ペアプログラミングとは？メリットとデメリットをまとめてみた](https://blog.codecamp.jp/programming-pair-advantage-disadvantage)