Appresso Engineer Blog

アプレッソのエンジニアが書く技術ブログです。

そして、ペアプログラミングをもう一度

開発部の野口です。

ここ数日、毎日 2 ~ 3 時間ずつペアプログラミングをしてみています。

アプレッソには昔からペアプログラミングをする文化があり、これまでにも要所要所でペアプログラミングをしたことはありました。
たとえば、

  • 実装が難しいコードについて相談がてらペアプログラミング
  • コミットレビュー*1の修正がてらペアプログラミング
  • 社内勉強会の準備でペアコードリーディング(これも一種のペアプログラミング)

などです。
しかし、毎日決まった時間、必ずペアプログラミングをするというのは、私にとって初めての試みです。

始めてからまだ一週間程度ですが、色々とわかったことがあります。

すごくつかれる

ペアプログラミングは、疲れます。

仮説 : 疲れなければペアプログラミングではない

初日のペアプログラミング終了時に、まず感じたことがこれでした。
むしろ、疲れなければそれはペアプログラミングではないのでは、という感さえあります。

ペアプログラミングでは、たえず同僚の視線にさらされながらプログラミングを行います。

Twitter をチェックする時間は 0.1 秒もないし、いつもならついボーッとしてしまうビルド待ちの時間にも、相手にちょっとした説明をしたり、雑談したりします。
しようとしていることをナビゲーター*2にわかってもらわないと意味がないので、ドライバー*3は常にナビゲーターの理解を確かめ、必要に応じて説明しながらコードを書く必要があります。

見られて恥ずかしくないコードを書く

実は、社外から来ていただいている凄腕エンジニアと組んでやっています。
ドライバーの立場では、見られて恥ずかしくないコードを書かなくては、ナビゲーターの立場では、少しでも鋭い指摘や提案をしなくては、という意識がずっと働いていて、すごく集中します

現在はペア担当者とお互いのタスクを相互に見るようなかたちで進めていて、だいたい 1 時間でタスクを切り替えています。
その 1 時間のなかに休憩をはさむ場合もあれば、1 時間続ける場合もありますが、タスクの切り替えのあいだには 10 分くらいの休憩を取ります。

その 1 時間が終わったときにはヘロヘロになりますし、両方終わったときにはほとんど放心状態になります。

すごくはかどる

さて、そんなに疲れるペアプログラミングは……ご推察の通り、はかどります。

データ : 工数は 15% 増加する

ペアプログラミング』(ピアソン・エデュケーション、2003)の著者らの調査によると、ペアプログラミングでは開発にかかる工数(人時)が 15% 程度増加した、というデータがあります。

つまり、一人でやって 20 時間かかるタスクなら、

  • 二人でやった場合の工数が、20 * 1.15 = 23 時間(人時)
  • 一人あたりにすると 11.5 時間
  • 経過時間(工期)も 11.5 時間

ということになります。

私は現在のタスクをきちんと測定しているわけではないですが、感覚としてこれはおおむね正しい数字だと思います。
一人で作業するときよりは、明らかに速いペースで開発が進んでいますし、かといって 2 倍の速度かというとさすがにそれはないかな、という気がします。

全体としての工数は、増えています。
データでは 15% の増加で、20 時間の作業に対して 3 時間 の増加です。

工期は縮む

しかし、工期は縮んでいます。
始めてから最短で 20 時間後にしか仕上がらなかったはずの作業が、11.5 時間後には仕上がる計算、実に 8.5 時間もの短縮です。

情報共有と品質の向上が圧倒的にはかどる

よってペアプログラミングはいざというときの工期短縮に役立ちます、と言いたいわけではないです。
もちろん、役立つとは思いますが。

むしろ、(一週間やり続けてみた現時点で感じている)ペアプログラミングの真髄は、情報共有品質の向上です。
15% 程度の工数増加で、ものすごい帯域幅で圧倒的にお互いが持つ知識の共有が進み、また、一人でやっていたらきっとここまで丁寧じゃない、というクオリティで成果物が生まれていきます。

私にとっては毎日が発見の連続であり、またペア担当者も熟練者ながらに、色々と新しいものを見つけてくれているようです。
私たちが開発している DataSpider Servista の開発者としてはまだそれほどの経験がない、ということも大きいのかもしれません。

クオリティについては、一人でやっていても最終的にはそのレベルまで上げるのですが、開発の後半で品質を上げることには大きな労力(とつらさ)を伴います。
ペアプログラミングをしていると、作業中の成果物の品質が常に高いレベルに保たれて、早期に品質を作りこんでいる状態になるので、後顧の憂いなく、ずんずん進んでいけます。

すごくたのしい

そんなわけで、ペアプログラミングは何よりも、たのしいです。

自信を持って作業を進めることはたのしい

ペアプログラミングはたのしいんです!

大事なことなので二回言いました。

おそらく多くのプログラマはそうだと思うのですが、私は、役に立って、高品質なソフトウェアを、すばやく開発したいと思っています。
そして、簡単に言うと、ペアプログラミングによってそれが実現されます。(少なくとも、大きく推進されます)

いいものを作りたい、と思います。
しかし、一人でプログラミングをしていると、コードを書く、仕様上・設計上の判断をするその瞬間瞬間に、ほんとうにいいことをしているかどうかチェックできるのも、気づくことができるのも、軌道修正できるのも、ただ一人、自分だけです。

ペアで作業をしていると、常にもう一人の開発者がほんとうにいいことをしているかチェックしてくれます。していなければ、違う、と言ってくれます。
これは大きな喜びです。そして、自信を持って作業を進めることができます。プログラミングに限らず、後顧の憂いがない、ということは人間の喜びにとって重要な要素ではないでしょうか。

そして、ペアプログラミングをもう一度

少し熱くなりすぎました。

ペアプログラミングが終わる日

実は、このエントリは以下のエントリをもとに書き始めました。

アプレッソで、およそ 9 年前にも、ペアプログラミングを集中的に行ったことがあった、ということの記録です。
ペアプログラミングを絶賛する論調ですが、はっきり言って、今の私は、これらの記述に深くうなずきます。その通りだ、と思います。*4

しかし、事実として、現在のアプレッソではペアプログラミングをほとんど行っていません。
最初に書いたように補助的には行っていて、平均して勤務時間の 5% くらいはペアプログラミングしている気がしますが、9 年前のエントリの論調から考えると、いかにも隔たりを感じます。

私が今行っているペアプログラミングはとてもうまくいっていますが、続けていくと、色々と課題が噴出するものなのかもしれません。
前出の『ペアプログラミング』にも、「すべての人がペアプログラミングに向いているわけではない」とはっきりと、また、繰り返し書かれています。

おそらく、今のアプレッソにも、ペアプログラミングを好まない人や、ペアプログラミングをうまくできない人というのはいるのだろうと思います。
それは、悪いことではありません。

そして、ペアプログラミングをもう一度

それでも、やはり、ペアプログラミングがたのしく、開発をぐんぐん進捗させるものであることは事実です。
少なくとも、事実となる場合があります。

「すべての人がペアプログラミングに向いているわけではない」ということも念頭に置き、ペアプログラミングをしない人の居心地が悪くならないように気をつけつつ、9 年ぶり(?)に再開したペアプログラミングを続けて、アプレッソをよりたのしく、効率的に開発できる組織にしていけたら、と思っています。

関連エントリ

それから 1 年後の記事です。

appresso.hatenablog.com

*1:アプレッソでは 1 年くらい前までコミット時に必ず対面でのレビューを行っていました。現在は Github:Enterprise 上での Pull Request に置き換えられています

*2:ペアプログラミング用語で、キーボードを持つ人をドライバー、見て意見を出す人をナビゲーターといいます

*3:前注を参照

*4:なお突っ込まれないように予め言っておくと、「すべての勤務時間をペアプログラミングする」というのはさすがになかなか大変そうだ、とも思います。前出の通り、疲れるので。