[XP]ペアプログラミングの定義と運用事例(2024 Advent Calendar 12日目)
この記事は私をシニアエンジニアにしてくれた「真のアジャイル開発」体験記の12日目の記事です。このアドベントカレンダーは「ある機能開発チームでスクラム, XP, DevOps を一度に実践したら真のアジャイル開発ができた」という内容です。執筆者は全てプログラミングをするパンダです。
ペアプログラミング
本記事ではXPのペアプログラミングの定義と自分たちのプロジェクトでの運用を紹介します。
ペアプログラミングの定義
ペアプログラミングとは、一つのマシンの前に二人のプログラマが並んでコードを書く開発手法の一つです。このプラクティスは、元々Wikiの考案者であるWard Cunningham氏とKent Beck氏が一緒に行っていたエピソードで知られています。このときの様子は、Kent Beck氏の記事にわかりやすく記述されていますので、以下に引用します。
最初は、Wardがプログラミングして、私はそれを見ていました。数日後、彼が気づく前に、私はタイポを発見しました。数週間後、私は名前付けと設計の矛盾点を見つけました。それがシンプルにするきっかけとなりました。 プロセスが進むにつれて、私たちはキーボードとマウスを交換していることに気づきました。ゾーンに入っているときは、ひとりがキーボードを操作して、もうひとりがマウスを操作していました。最終的なコードには一貫性があり、どちらがどの部分を書いたのかわからないほどでした。 どのように書くべきか意見が分かれるたびに私たちは手を止めて、問題について議論していました。 「エンジニアのコーチング」 Kent Beck(太字は筆者)
このようにペアプログラミングでは二人一組のペアとなり、一つの対象に対して分析や設計、テスト、リファクタリングを行います。自分たちのチームでもペアプログラミングを推奨していますが、必須にはしていません。一人で作業を進める方がいいのであれば、そのメンバーを尊重して任せています。特に調査や設計といった作業は一人で集中して取り組みたいと考えるプログラマが多いです。
ただし、調査結果や設計案をペア相手に共有することですぐにフィードバックが得られます。これにより、実装後に「設計を見直した方がいいですね」という手戻りが発生するのを防ぐことができるのです。
ペアプログラミングの紹介
ペアプログラミングを行うツールとして、音声通話にはGather、コード編集にはPhpStormのCode With Meを使用しています。仮にVSCodeを使用していればLive Shareを利用していたでしょう。また、XP本には「相手のパーソナルスペースを考慮する」「強い香水をつけない」「風邪を移さないために病気の時は休む」などの配慮が記されていますが、リモートでペアプログラミングを行う場合はこれらをあまり気にする必要がありません。筆者としてもリモート環境の方が心理的にペアプログラミングを実施しやすいと感じています。
最初の頃はペアがほぼ固定されていたため、ペアを組み替える目的でSlackのワークフローを作成しました。このワークフローは「今から⚪︎⚪︎しようとしています。誰か一緒にやりませんか?」と人を募る投稿をするものでした。
ドライバーとナビゲーターの役割は明確には分けていませんでしたが、通常はCode With Meのホストがドライバーとなり、コードを書いてコミットしています。XP本には数時間ごとにペアを交代することが推奨されていますが、自分たちのチームでは厳密には運用していません。
ホストがコミットしたブランチをナビゲーターがプルして開発し、また交代するというのが大変だったからです。この煩雑さを軽減するペアプロ用のツールがあるのは調べて知りましたが、結局導入せずでした。なのでかなりの時間ホストがコードを書き続けることもあります。
また、3人でのモブプログラミングも試してみました。しかし、レトロスペクティブで「2人が話したりコードを書いている間、3人目が貢献できていないと感じる」といった課題が挙がりました。そのため、このチームではモブプログラミングをやめてペアプログラミングに専念することにしました。
ペアプログラミングの利点としては、リアルタイムのコードレビューと仕様の抜け漏れチェックが挙げられます。また知識の伝達の場にもなるため、互いに知識不足を補い合うことができます。意思決定が必要な場面ではペア内で議論を行い、トレードオフを考慮したうえで二人が納得できるアイデアを採用します。このプロセスを経ることでコードの品質が向上するのです。
ただし、ペアプログラミングでは考えていることを常に相手に伝える必要があるためかなり疲れます。コードを書いている側は喋り続けなければならないからです。
自分たちのチームでは、朝の11時から11時45分までと、昼休憩後の14時から夕会前の18時45分までペアプログラミングを行っています。ペアプロは午後に5~6時間も続けると頭が回らなくなり、言い間違いや些細なリファクタリングにすら取り組む気力がなくなることがあります。
そうなる前に仕事を切り上げてリフレッシュし、翌日に続きをするのが良いと考えています。このように「余裕を持って仕事をする」ことが、長期的に見ると重要です。これがXPのプラクティスである「いきいきした仕事」や「ゆとり」に繋がります。
なお、日中に1on1やミーティングが予定されている場合には、作業を一時中断するか、一人でできる部分まで進め、相手が戻ってきた際に困っている点を相談する形で進めています。
次回は同期レビューの定義と運用を紹介します。
Happy Coding 🎉