ペアプログラミングの5つのいいこと

だから、難しくてもやりがいがある!

Ichizo Umehara
Product Run
10 min readOct 18, 2018

--

エンジニアの間ではそこそこ知られていて、なんらかの形で実践したことのある人も少なくはないけれど、フルタイムで導入しているチームの少ないペアプログラミング。他社のエンジニアの友人の間でも賛否両論色々な意見を聞きます。失敗例も少なくないので、導入ミスやペアプログラミングの本質に関する思いこみなどでマイナス・イメージになることを避けたいと思って、Pivotal Labs Tokyoで毎日ペアプログラミングをしているエンジニアとしての考えをまとめてみました。(この記事では私が実感した5つの良いポイントを紹介しますが、Pivotal Labsの他のエンジニアに聞くと他にもいっぱい出てくると思います😀)

今回はペアプログラミングのメリットについて、次回はペアプログラミングの導入にあたって考慮すべきポイントについて書きます。

※やっと「ペアプログラミングを導入するなら、まずはこう準備しよう!」をかけました😉

ペアプログラミングの良いところとは?

新しい技術や開発パターンを効率的に身につけられる

エンジニアとしてペアプログラミングの一番の魅力は、毎日新しい発見があり、常にエンジニアとしてスキルを伸ばしている実感ができることです。

ディスカッションをしながら実装できるので、疑問点も晴れて新しいスキルの習得が早い!

似たスキルセットを持つ2人のエンジニアでも、互いに知らないノウハウは必ずあるのでペアリングをすることで考え方やスキルを共有する機会が増えます。共有する側は説明することで自分の理解を再確認できますし、ペアの質問や閃きから新しい学びを得ることも多々あります。共有される側は、本やセミナーなどの一方通行の学び方とは違い、実際のプロダクトを実装しながら スキルを習得できるので、より実践的なスキルを効率的に身につけることができます。

また、スキルセットがあまり交差しないエンジニアがペアを組むと、互いのスキルや考え方を学び合いながらより開発範囲の広いフルスタックのエンジニアになれます。バックエンド専門とWeb専門の2人のエンジニアの場合、ペアリングすることで徐々に不得意な(あるいは専門外の)知識を身につけ、コードベースのどこにでも貢献できるフルスタックのエンジニアに成長できます。

ペアのスキルセットが違えば違うほど、様々なスキルが幅広くチームに分散されます。エンジニア個人にとっても良いことですし、チームにとっても大きなプラスになります。

ちょうどいい緊張感がコードの質も生産性も上げてくれる

私はペアを組むと、1人でコードを書く時より集中できます。ちょっとしたことで詰まった時に簡単に話し合える仲間がいた方が気が楽ですし、「なんとなく集中できないからとりあえずメールをチェックしよう病」にもかかりにくくなります。集中できる分、リファクタリングにも専念できますし、チームで決めたパターンやスタイルも保ちやすくなります。

共同でコードを実装するので、チームに絶賛されるような発見があった時にはその喜びをペアと共有できますし、バグが発見された時には1人だけで責任を負わなくてよくなります。ペアのエンジニアのサポートがある分自信がつきますし、チーム意識が高まり、より質の高いコードが書けます。

バス係数が上がり、神デベロッパーに依存しなくてよくなる

プログラミングでの「神クラス」への依存同様、開発チームの「神デベロッパー」への依存は危険です。どのチームにも優秀なエンジニアは欲しいものですが、コードベースとプロダクトに関する知識がチームの全員に分散されていないと、依存しているエンジニアがチームから離れた時に開発に支障が生じてしまいます。

全てのノウハウを握っているあの人がバスにはねられたら、開発はどうなる?

ちょっと残酷な例えですが、この計測にバス係数という例えがよく使われます。チームメンバーが何人バスにはねられたらプロダクトが失敗に終わってしまうかを表す数値です。開発を進める為に決まったチームメンバーに頼らなくてはならない知識やスキルが一つでもあれば、バス係数が1といえます。(そのチームメンバーがプロジェクトから離れたら開発が止まってしまうので。)

1人のチームメンバーにしか分からない、プロダクトの成功に不可欠な知識やスキルがある場合は、他のチームメンバーに分散させながらバス係数を高めることが重要です。バス係数は高ければ高いほどチームが柔軟だと言えます。バス係数の数だけメンバー変更や休暇が入っても、チームが問題なく継続できるということになります。

2ペア(4人のエンジニア)以上のチーム構成であれば、毎日ペアのメンバーを入れ替えることで全てのエンジニアとペアリングでき、コードベース全体に触れることができます。プロダクトの全ての機能の実装に関わることができるので、全ての開発タスクの楽しみ(また、内容によっては面倒臭さ)をチームで共有できます。その結果、コードベースを網羅的に理解しているメンバーが増え、バス係数も自然と上がります。

masterブランチでの開発からの即デプロイが可能になる

ペアプログラミングではペアで同じコードを議論しながら開発するので、常時コードレビューをしている状況と言えます。その結果、プルリクエストをせずに、コミットごとにmasterブランチをrebaseしてpushすることができます。頻繁にリファクタリングを行い、最小単位でのコミットをすることでプルリクエストやコードレビューの時間を削減できる上、複雑な大規模mergeも避けることができます。

開発からデプロイまでの時間を縮めることで、リリースサイクルを極端に短縮することができます。※

プルリクエストをしない、デプロイ用のブランチでの開発を実現するにはペア・プログラミング以外にも前提として信頼度の高いテストがあることと、CI・CD(継続的インテグレーション・デプロイ)を導入することが必要不可欠です。

開発パターンや知識の指数的拡散

ペアプログラミングでは、1人の経験者につき、一度に1人にしか知識を拡散できないので、効率が悪いと思われがちですが、中長期的にはかなり効果的です。

例えとして、会社に30人のエンジニアがいたとします。

そのうち1人だけ特殊な新しいX言語のYプラットフォームの知識を持っているとします。(XYエンジニア合計:1人)

その知識をあと1人に拡散するには少なくても数週間はかかるので、そこまで効率的ではないかもしれません。(XYエンジニア合計:2人)

しかし、その2人目のエンジニアがスキルを身につけた時点で、新しく2人とペアリングを始めるので、また数週するとX言語Yプラットフォームの分かるエンジニアが4人になってます。(XYエンジニア合計:4人)

数週間から数ヶ月で単独のエンジニアに留まっていたノウハウが4人に広まりました。

ここからあと2サイクル(数週間 x 2回)回せば16人、3サイクル回せばチーム30人全員と飛躍的に知識が広がります!

2人が4人に、4人が8人に!

ここまで、ペアプログラミングの良い所について書いてきましたが、実際にはそこまで流行っていないのが現実です。ペアプログラミングに関するマイナス意見に、以下のようなコメントを良く聞きます。

ペアプログラミングが流行らない理由

ペアプログラミング経験者がいないと導入が難しい

ペアプログラミングには様々なスタイル(Driver-Navigator, Ping-Pong)があり、コミュニケーション、実装、考える時間のバランスが崩れると効果が減少してしまいます。よってペア・プログラミング経験者とペアを組むか、できる限りのリサーチをしてからの導入をお勧めします。次回ブログで導入にあたって考慮すべきポイントを紹介します。

慣れるまでは、かなり疲れる

1日中、他人と肩を並べて一緒に考えるのはとても疲れます。私もPivotal Labsに入った当初は優秀なエンジニアと常にペアリングする緊張でストレスさえ感じました。慣れてくると、より集中するべきポイント、サポート役に回るべきタイミング、休憩をとるタイミングが分かってきますが、最初は一時間のペアを組んだだけでもクタクタになってしまいました。

コミュニケーション能力やチームワークに長けていて、最初から違和感なくペアリングできるエンジニアもいれば、メチャクチャ優秀だけど、絶対ペアリングなんかしたくないと言うエンジニアもいます。

ペアプログラミングは必ずしも全てのエンジニアに向いているとは言えません。学習好奇心が高く、チームでの行動ができるエンジニアが必要です。ペアプログラミングのチームを作る時は、上からメンバーをアサインするのではなく、ペアプログラミングに興味のあるメンバーを勧誘することを勧めます。

リモートワークやフレックスタイムが難しい

ペアプログラミングは同じデスクで隣り合ってプログラミングをするのが最も効果的です。場合によってはスクリーンシェアをしながらペアリングすることも可能ですが、十分なペアプログラミングの経験のある、コミュニケーションの良く取れているエンジニア同士のペアでないと、ミスが生じたり、意見が効果的に交換されなかったりするリスクがあります。

リアルタイムでのコミュニケーションが必要なため、どちらかのエンジニアだけが時間帯をずらすこともできません。出勤時間を1、2時間ずらすことができても、朝型と夜型のエンジニアではペアを組むのは難しくなります。

チームを作る際には、同じ開発スペースに、同じ(あるいは近い)通勤スケジュールで通えるメンバーを集める必要があります。

初めて導入する時は、短期的に開発のペースが落ちることも

ペアプログラミングをすることでチームの柔軟性が上がり、常時コードレビューをすることでコードの品質が上がり、コミュニケーションミスも減り、中長期的にはチームの効率が伸びることは間違いないと思います。

その一方、初めてペアプログラミングを試みているチームにとっては、上記ハードルを克服するまでは開発のペースが遅くなることもあります。締め切りの多い短期プロジェクトの時ではなく、継続的に高品質で価値の高いプロダクトを開発しているチームに導入することを勧めます。

最後に

ペアプログラミングに興味を持ってもらえたでしょうか?

「ペアプログラミングの良い所は?」で説明したポイントに関しては、自信を持ってチームのプラスになると言い張れます。ただ、導入が難しく、効果的に取り入れているチームが日本ではまだ少ないのが現状です。

次回、導入に際して考慮するべきポイントを紹介します。

Pivotal Labsでは、定期的にワークショップ型イベントを開いたり、ブログでプロダクト開発やチームビルディングなどについて紹介していきます。

イベントの最新情報:
Meetupグループに参加すると、いち早く案内が届きます😎📩

公式ブログ:
Product Runも是非フォローお願いしますっ🙌🏻🗒

--

--