ペアプログラミング再考 1 | 本郷ではたらく社長のブログ

ペアプログラミング再考 1

naoyaさんのエントリ でも紹介していただいているように、PFIでは、開発手法としてペアプログラミングを非常に重要視しています。

ICPCに参加していたころは、ペアプログラミングの重要性などはいろいろなところでお話させていただいたのですが、会社をやっていく中でも考えがいろいろリファインされていったので、今一度ペアプログラミングについて議論してみることにします。

取り上げるテーマとしては、2つあります。1つは、「ペアプログラミングによってどのようなメリットがあるのか」。もう一つは、「ペアプログラミングを成功させるためにはどうしたらよいのか」ということです。特に、後者については、ペアプロしたくてもどうやったらよいのか(たとえばどうやってペアプロの相手を探す?)というところで、難しい問題があります。今までの経験を元に、参考になればと思ってエントリを書きます。

まず、ペアプロのメリットですが、僕は次のようなメリットが特に重要だと考えています。
・お互いのモチベーションを保ち続け、生産性を最大化する。
・一人がコーディング、もう一人がコードの内容やアルゴリズムの内容を俯瞰して、コードの質を高める。
ということです。コードの質が高まるということはもう広く知られていますが、モチベーションを高めるということもものすごい重要です。

複雑なプログラムというのは、緻密に設計された建築物と似ています。ただしく動かすためには、考えなければいけないことが非常に多い。抽象化という手段で、設計の複雑さを軽減することはできます。ただ、それを持ってしてもまだ考えなければいけないことが多いということはよくあります。特に、マルチスレッドプログラミングやシステムプログラミングにおいては、モジュールが同時並行的に複数動作するわけですから、お互いが干渉しあうパターンにも非常に多くのパターンがあります。こういった複雑さは、よく抽象化されたプログラムにおいても、複雑さがなお残ることは多々生じます。

基本的に人間は、パラレルにものを考えるのはそれほど得意ではないと思います。中には100個ぐらいのものごとを同時に考えられる人もいると思いますが、それは稀です。となると、複雑なプログラミングにおいては、脳を非常に活性化させてあげる必要がでてきます。精神的に非常にタフさを要求してきます。そのような状況においては、モチベーションの維持はとても重要な問題になってきます。自分自身の経験として、ペアプロをすることによって、モチベーションを維持できる時間は1人でコードを組む時の3倍以上の時間モチベーションを保てます。

会社ですから、何も一人でコードを組む必要はありません。もちろんシチュエーションによっては、1人で組んだ方が生産性が高まることはあります。ただ、複雑なプログラムになればなるほど、知識も要求されれば、思考も要求される。そのような状況では、2人で補完しあいながらコードを構成していくほうが、モチベーションの維持ができ、また、結果としてコードの質も高まります。

コードを書いている間というのは、どのような実装を行うかを考えなければいけない。それに加えて、コードをコンピュータに向かって打ち込まなければいけない。そして、他のモジュールに影響を与える実装が、システムとして正しく動くかどうかを考えなければいけない。おおまかにこの3つが必要になるわけですが、ペアプロによって、1・2番目と、3番目を切り分けることができます。システムの一部の実装に注力する人と、システムの全体を俯瞰し正しく動作するかを把握する人の2人に分けることができます。これは、精神的にはかなり負荷が軽減されます。

それによって、自分自身の役割に集中することができ、結果として質の高いコードになります。

また、難しいアルゴリズムなどを実装するときは、どんなにがんばっても最初の段階で設計を完璧になせないこともあります。実装をしながら見えてくる点というのはどうしてもあります。そのようなシチュエーションにおいても、役割をうまく分担することにより、その時において最適な設計をしやすくなります。フレキシビリティーを向上させることができます。

プログラミングにおいて、メンタルな面でのケアというのは実際非常に重要です。それは、プログラミングコンテストへの参加でも痛いほど思い知りました。ちょっと精神的に負荷がかかるだけで、普段なら当たり前のように気づくバグにも気付かないこともあります。チームとして、ペアとして、いかにメンタル面をケアしていくのか。その解決策としても、ペアプログラミングは非常に重要であると考えています。

TODOリストを作れば、予定を頭に置いておく必要がなくなるので、確実にスケジュールを管理しつつ、精神的にも楽になります。それと同じで、ペアプロでも、考えなければいけない範囲を狭めることによって、精神的にも負荷を軽減させるということです。

では、どのようにしてペアプロを実際進めていくのか。これは、簡単なようで難しい問題です。そもそもペアとなる人がいないとだめです。でも、ペアがいるからといって必ずしもうまくいくというわけでもありません。自分の、プログラマー・エンジニアとしての能力を正確に把握して、自分が自信を持って担当できる範囲を見極める。それが重要になってきます。明日は、自分の能力を正確に把握し、どのようにペアやチームを作っていくかということについて書きたいと思います。