こんにちは、SaaS Productチームの比嘉です。
私たちSaaS Product チームは常日頃からペアプログラミングを行っています。
チームペアプロの細かい流れは過去に鈴木さんが紹介しています。
そんな中、あるときエンジニアの友人から質問されました。
「ペアプログラミングではいつコードレビューするの?」
話を聞いてみると、その会社ではペアプロを導入し始めたのですが、従来から行なっているコードレビューと役割が重複していることに気づいたそうです。
そこで今回はペアプログラミングとコードレビュー*1について書いてみようと思います。
なぜコードレビューを行うのか?
なぜコードレビューを行うのでしょうか?
Wikipediaによると、コードレビューには次の効果が期待できるとされています。
- レビューで発見された同様・類似バグについてレビュー参加者内で共通認識を図ることができる。
- バグの隠蔽を減少させることが期待できる。
- レビューを行うことへの意識により、人に見せるコードを書くようになるため可読性が向上する。
- コーディング規約等に対する各自の認識のずれを修正することができる。
またきのこ14では次のように述べられています。
コードレビューの目的は、ただコードの誤りを修正するだけではありません。重要なのは、チーム全員に同じ知識を共有させること、またコーディングにおいて全員が守るべきガイドラインを確立することです。
つまり、コードレビューにはコードに問題について指摘したりチーム内で知識を共有したりする目的があるということです。
ペアプロはいつコードレビューしている?
ペアプロでは常にコードレビューを行っています。ペアプロはドライバー(キーボードを使う人)とナビゲーター(キーボードを使わない人)をお互いに交換して作業を行います。このナビゲーターがコードレビューをしているのです!
ナビゲーターがいると、コードを書いているそばから問題点をつかんで対処することができます。また、ドライバーは書いているコードをナビゲーターに見せることになるため、可読性を考慮してコードを書くことになります。
チームでペアプロを行えば、定期的にペアを交換することになります。ペアを交換することで同じコードを複数人が触ることになります。複数人で触ることできのこ14「チーム全員に同じ知識を共有させること」が可能になります。
ペアプロでコードレビューできてる?
ちょっと待って!ペアプロで行われているコードレビューは信頼しても良いのでしょうか? チームメンバーを集めてじっくりコードレビューした方がいいじゃないでしょうか?
調べてみると、ペアプロをしつつもコードレビューをする現場*2もあるようです。コードレビューの時間を作ることには、ペアを交代した時に抜け落ちた知識(やるはずだったリファクタリングや仕様の抜け漏れ)を集めたり、できるだけコードに関わっていない開発者のレビューを取り入れる意図があるようです。
一緒にコードを書くことによってレビューの視点に偏りを持ってしまうことは確かにありそうです。また、知識の断片化についてはどう対処していけばいいのでしょうか?
SaaS Product チームの場合
冒頭の繰り返しですが、Productチームではチームでペアプログラミングを採用しています。目的はシンプルに生産性をあげるためです。また、特別に時間をとってコードレビューはしていません。すべてはペアプロの中で行われています。コードレビューをしない代わりに仕組みや文化が補っています。
その1つがテスト駆動開発です。私たちはドキュメントを作成していません(一部、手順書などはあります)。仕様はE2Eテストに書いています。ペアが交代したときに今のコードに何が足りないのか、これから何をすべきかはテストが通っているかどうかで判断することができます。
また「人に聞く」ことを推奨しています。仕様の抜け漏れの確認や、コードを書く上で決断に悩んでいる場合はより詳しい他の人に聞いています。たとえば、テストが仕様を満たせているのかをテストエンジニアに相談したり、クラスの責務分けをベテランエンジニアに相談したりしています。Productチームでは頻繁にチームメンバーが入れ替わります。もしかしたら他のチームに情報を持っている人がいるかもしれません。その時は個々のチームを越えて話にいくことも日常茶飯事です*3。
まとめ
今回は「ペアプログラミングではいつコードレビューするの?」について答えてみました。 ペアプログラミングでは常にコードレビューをしています。そしてそれにはメリット・デメリットがありました。
SaaS Productチームでは生産性をあげるためにペアプロをしています。メリットを享受しつつも、デメリットを補う文化があることを紹介しました。
この記事がペアプロで悩んでいる方の一助になれれば幸いです。
*1:この記事にあるコードレビューは、プルリクエストやマージリクエストなどであげられたコードをチェックして指摘したり承認したりする行為を指します。