Hatena::ブログ(Diary)

やさしいデスマーチ このページをアンテナに追加 RSSフィード

札幌のWebエンジニアの綴る日常と開発の日々。
GoogleAppEngine/slim3/Django/NetBeans/Swing/JavaFXを中心にお届け。

2011-03-25

95-ペアプログラミングと「フロー」

| 01:24 |  95-ペアプログラミングと「フロー」を含むブックマーク

プログラマが知るべき97のこと」の95個目のエピソードは、ペアプログラミングに関する話です。ペアプログラミングとは、文字通り2人1組でプログラミングをする事です。1つの事を2人でやるのですから、倍の時間を費やすことになると感じ、そんな非効率な手法はあり得ないと感じるのは、特別なことではありません。しかし、その理論は1つの暗黙的な了解があるのです。それは、その作業は誰が行っても効率に大きな差がなく、作業手順も決まっており、品質に関しても平準であるという事です。工場のラインであれば同じ作業を2ラインで作業する事は2倍のコストがかかるというのは自然な考えなのです。

ところが、ソフトウェア開発に関して言えば、それらの前提はほぼ当てはまらないと言えます。プログラミングにおいて、作業手順が決まっているケースは多くありません。全て手作業であるため、プログラマによって品質に大きな差が生まれます。知的労働である以上、プログラマの気分や健康状態によって生産性も大きく変わります。工場のラインとして考えたならばありあえない話ですが、プログラマが気分が乗らずに1日に作業がほとんど進まない日もあれば、3日分の作業が効率よく終わる日もあるのです。確かにこの部分がもっと平準化できればいいのですが、ソフトウェアを人が作る以上は解決できない問題でしょう。私はペプログラミングの効能として、上記のような生産性の平準化もあると思います。

実際にペアプログラミングを導入すると、数え切れないメリットがありますが、このエピソードであげられている点は以下の通りです。

・不慮の事態の影響を最小限に抑えることができる

・問題解決が容易

・結合がスムーズ

割り込みの影響を緩和できる

・新人が早くプロジェクトに馴染む

この中でもステークホルダに説得する為に有効なのはリスク回避としてのペアプログラミングでしょう。引き継ぎや不慮の事態を想定したリスク回避としてはドキュメンテーションを整備する事というのがペアプロを導入する前の定石でした。しかし、ドキュメンテーションは正確にやろうとすればするほどコストが級数的にあがるというジレンマがあります。一方で、プログラマの経験や知識として分散していることは、ドキュメンテーションよりも効率的で低コストのリスク回避となります。

そして、新人の教育の点は組織にとって非常に効果の高いペアプログラミングの効能です。プログラマを初めとして職人気質な職種では1人前となるまでに5年10年は当たり前のようにかかります。結局の所、勘と経験がものをいうのです。一方、新人にとって職人の技を間近で見るというのは最も効果的な学習です。職人にとっては面倒で効率の下がる事にも思えますが、新人が自分で考えて動けるようになれば、自分も楽になります。ただし、開発をオフショアにしたり外注や丸投げをしているとしたら全く意味がありません。

また、問題解決について常に議論が行える事は重要です。ペアプログラミングを導入すると、自分の中で理解した仕様や実装方針について、相手に伝えなければなりません。相手が理解できないとしたならば、その理解や方針がなんらかの問題を抱えています。表現することが苦手という人もいますが、それは対象の事象を本当に理解していないというだけです。相手に伝えられない実装方針でコードを書いたとして、後で読む人がその意図をくみ取れるわけがないのです。ペアプログラミングは、相互チェックという意味もありますが、相手に伝える、すなわちコミュニケーションを重視した開発手法なのです。

このようにペアプログラミングを導入することで多くのメリットがあります。このエピソードのタイトルにもある「フロー」状態もその1つです。実際にペアプロをやってみると解りますが、ソロで行うよりも2倍3倍の精神力を消費しています。ペアの相手に伝える事、常にトップギアを維持すること、それらが品質とケアレスミスの軽減に繋がるのです。

ただ、ペアプログラミングに関しては、効果的な実践方法もある一方で、逆に問題もあります。また、こうすればOKという方法論もなく、プロジェクトやチームの性質にあわせて調整しなくてはなりません。例えば、先日リリースしたプロジェクトではペアプログラミングを強く意識して行いました。そして、ペアリングやペア作業の割合について多くのノウハウを得ることが出来ました。例えば、熟練者と新人が組んだ場合とそこそこの人が2人でくんだ場合で、ペア作業をする適切な時間は全く異なります。前者であれば、ペア作業は少な目でソロでやる時間を多く取るのが効果的です。熟練者は初心者に対して1日中教えていては、当然ですがストレスがたまります。おまけに新人は覚えることが多すぎてしまえばパニック状態となってしまいます。したがって、新人が理解し自分のものに出来るレベルで熟練者が教えることが効果的なのです。逆に同じくらいのレベルでペアをくむのであれば、お互いの足りないスキルを補えるため、ペア作業を長く行う方が効果的です。また、毎日ずっと同じ人とコミュニケーションを取ることは、思った以上にストレスになります。適度にソロで行ったり、ペアリングを変える事は健全なペアプログラミングをする中で重要な事です。

ソフトウェアは人が作るものです。どれだけフレームワークやコードの自動生成が発達したとしても、ソフトウェアは人にしか作ることができません。人がソフトウェアを作る以上、コミュニケーションは必要不可欠です。コミュニケーションが必要とされるペアプログラミングは特別なものではなく、むしろ自然な姿なのです。

プログラマが知るべき97のこと

プログラマが知るべき97のこと

トラックバック - http://d.hatena.ne.jp/shuji_w6e/20110325/1301070270