Home

公開日

コードレビューの生産性向上:リファクタリングを誘発するコメント術

img of コードレビューの生産性向上:リファクタリングを誘発するコメント術

コードレビューは、ソフトウェア開発において、バグの削減やコード品質の向上など、様々なメリットをもたらします。近年では、コードレビューを通じて、リファクタリングを促し、コードの保守性や可読性を高めることへの期待も高まっています。しかし、具体的にどのようなレビューコメントがリファクタリングを効果的に誘発するのか、そのノウハウは十分に共有されているとは言えません。

本記事では、2024年10月に発表された論文「A qualitative study on refactorings induced by code review」(Coelho et al., 2024)に基づき、コードレビューの生産性向上という観点から、リファクタリングを誘発するレビューコメントのガイドラインについて解説します。

コードレビューがリファクタリングを促進するメカニズム

リファクタリングはなぜコードレビューで生まれるのか?

コードレビューは、開発者が作成したコードを、他の開発者がチェックするプロセスです。このプロセスの中で、レビュアーはコードの問題点を指摘し、改善提案を行います。このときの、改善提案が、リファクタリングの実施のきっかけとなるケースが多く報告されています。 実際、本研究によると、分析対象となったPRのうち、実に50%ものPRでコードレビューがリファクタリングを誘発したことが明らかになっています

リファクタリング誘発要因割合
コードレビューのみ50%
作者のみ26.7%
コードレビューと作者23.3%

つまり、コードレビューは、単にバグを発見するだけでなく、コードの品質を高めるためのリファクタリングを促す、強力なメカニズムであると言えるのです。

データで見る!リファクタリングを伴うPRの特徴

このセクションでは、リファクタリングを伴うPRと伴わないPRを比較し、どのような違いがあるのか、データを見ながら明らかにします。リファクタリングを伴うPRの特徴を理解することで、どのようなコードレビューが効果的なのかが見えてきます。

本研究では、リファクタリングを伴うPRと伴わないPRを比較し、興味深い違いを発見しました。

以下の表、リファクタリングを伴うPRは、伴わないPRと比べて、ファイル変更数、追加行数、削除行数が多いことが分かります。

目的サンプルの概要

リファクタリングを誘発するPR数リファクタリングを誘発しないPR数レビューコメント数後続コミット数リファクタリング編集数
10101004066

以下の表にて、リファクタリングを伴うPRと伴わないPRをそれぞれ無作為に10個ずつ抽出して、コードレビューに関する統計情報を比較しました。リファクタリングを伴うPRは、伴わないPRと比べて、ファイル変更数、追加行数、削除行数すべてにおいて、平均値・中央値ともに、大きな値を示しています。 特に、追加行数と削除行数においては、その差が顕著です。

目的サンプルにおける統計概要 平均値(と中央値)

リファクタリングを誘発するPRリファクタリングを誘発しないPR
レビュワー数2.0(2.0)2.0(2.0)
コメント数5.0(5.0)5.0(5.0)
マージまでの日数3.4(1.0)2.5(1.0)
後続コミット数2.3(2.0)1.7(1.5)
ファイル変更数9.1(5.5)3.0(2.0)
追加行数103.9(31.0)21.8(8.5)
削除行数50.5(23.0)14.8(7.5)

これは、リファクタリングが、コードの構造や設計に関わる、比較的大規模な変更を伴うことが多いことを示唆しています。つまり、リファクタリングを多く含むPRは、変更規模が大きいため、より丁寧なレビューと、発な議論が必要となることが推測されます。

経験豊富なレビュアーが果たす役割とは

本研究で、特に注目すべき点は、経験豊富なレビュアーの貢献です。データ分析の結果、リファクタリングを伴うPRでは、経験豊富なレビュアーが、経験の浅いPR作成者に対して、より丁寧かつ具体的なコメントで、リファクタリングを促していることが明らかになりました。

例えば、経験豊富なレビュアーは、単に「この部分はリファクタリングが必要です」と指摘するだけでなく、「なぜリファクタリングが必要なのか」という理由を丁寧に説明したり、具体的な改善方法を例示したりすることで、PR作成者の理解を深め、自発的なリファクタリングを促しています。

これは、経験豊富なレビュアーが、コードの品質を高めるための、豊富な知識と、それを効果的に伝える技術を有していることを示しています。つまり、経験豊富なレビュアーの知見を、コードレビューを通じて、チーム全体に共有することが、コードレビューの生産性を高める上で、非常に重要であると言えるでしょう。

リファクタリングを誘発するレビューコメントの特徴

では、具体的にどのようなレビューコメントが、リファクタリングを誘発しやすいのでしょうか?本研究では、リファクタリングを誘発したレビューコメントと、誘発しなかったレビューコメントを比較し、その特徴を分析しています。

具体的かつ丁寧な指摘が開発者を動かす

リファクタリングを誘発するレビューコメントに共通する特徴として、まず挙げられるのは、具体的かつ丁寧な指摘です。

効果的なコメント例

例えば、以下の画像は、 apache/tinkerpop#1110 のPRにおけるレビューコメントの例です。ここでは、RequestOptionsBytecode から抽出することを、非常に具体的かつ丁寧な表現で提案しています。 このようなコメントは、PR作成者にとって、何を、どのように変更すれば良いのかが明確であり、リファクタリングの実施を後押しする効果があります。

具体的な提案を含むレビューコメント例

以下は、リファクタリングを誘発したレビューコメントの特徴をまとめたものです。このリストからも、コードロジックに関する質問や、具体的な改善提案が、リファクタリングの誘発に繋がっていることが分かります。

  • コードロジックに関する質問
    • TIMEOUT_FILTER_START_TIME という添付ファイルがRPCチェーン全体に渡されてしまうので注意してください。これは RpcContext の欠点です。 ( apache/dubbo#3174 )
    • 任意のバイト列に対して toString をここで呼び出しても安全ですか? ( apache/fluo#837 )
  • コード改善の提案
  • 良い開発プラクティスに関する提案
    • 良くなりましたが、左揃えの中央にできますか?今は左下になっているようです。 ( apache/cloudstack#3454 )
    • private static final は、通常すべて大文字です。 ( apache/brooklyn-server#1049 )
    • 特に複数の列挙型を比較する場合は、 if else の代わりに switch case を使用した方が良いでしょう ( apache/cloudstack#2833 )

避けたいコメント例

一方、下記は、リファクタリングを誘発しなかったレビューコメントの特徴をまとめたものです。このリストを見ると、コードの見た目に関する指摘や、抽象的で意図が伝わりづらいコメントなど、表面的で重要度の低い指摘が多いことが分かります。

  • コードの見た目に関する指摘
    • このセクションのコードフォーマットが異なります(スペースが使用されています) ( apache/cloudstack#3430 )
  • 曖昧なコメント
  • 修正の強要
    • このメソッドは以下のように修正すべきです protected int ... ( apache/dubbo#4870 )

これらのコメントは、コードの品質を本質的に向上させるものではなく、リファクタリングの動機付けとしては弱いと言えます。また、不明瞭な表現を用いたり、修正を強要したりするようなコメントは、PR作成者のモチベーションを下げ、リファクタリングを遠ざける可能性があります。

成功の鍵は「根拠」と「例」にあり

リファクタリングを誘発するレビューコメントの、もう一つの重要な特徴は、 「根拠」と「例」 です。以下の画像は、 apache/brooklyn-server#1049 のPRにおけるレビューコメントの例です。ここでは、定数をすべて大文字で記述するというコーディング規約を根拠として、maxRetryCount のリファクタリングを提案しています。

根拠を添えたレビューコメント例

このように、なぜリファクタリングが必要なのか、その根拠を明確に示すことで、PR作成者は、変更の必要性を納得し、リファクタリングを前向きに捉えることができるようになります。

また、具体的な「例」を示すことも非常に効果的です。例えば、以下の画像は、 apache/kafka#5946 のPRにおけるレビューコメントの例です。ここでは、具体的なコード例を挙げて説明することで、PR作成者は、レビュアーの意図を正確に理解し、よりスムーズにリファクタリングを実行することができます。

具体的なコード例を挙げて説明したレビューコメント例

「直接的な提案」がリファクタリングを後押しする

本研究では、直接的なリファクタリングの提案が、PR作成者に受け入れられやすいことも明らかになっています。以下の画像は apache/dubbo#3299 のPRにおけるレビューコメントの例です。ここでは、“is an array list here a little bit over-kill?” と、ArrayList の使用が過剰ではないかと、型の変更を提案しています。

ArrayListの使用が過剰ではないか指摘するレビューコメント

このように、「~してはどうですか?」と、具体的な変更方法を直接提案することで、PR作成者は、リファクタリングの具体的なイメージを掴みやすくなり、変更への心理的ハードルが下がる効果が期待できます。

レビューコメント作成のための実践的ガイドライン

以上の分析結果を踏まえ、本研究では、リファクタリングを誘発するレビューコメント作成のための、実践的なガイドラインを提案しています。

研究から導き出された5つの指針

  1. 礼儀正しく、前向きな表現を心がける: “can we …?”, “maybe …” のような、丁寧な表現でリファクタリングを提案しましょう。
  2. 具体的かつ明確に指摘する: 抽象的な表現は避け、問題の箇所と、期待する改善後の状態を具体的に記述しましょう。
  3. 根拠や例を示す: なぜ変更が必要なのか、その理由を明確に示すことで、PR作成者の納得感を高めましょう。具体的なコード例を挙げることも効果的です。
  4. 質問を活用する: 一方的な指摘ではなく、質問を投げかけることで、PR作成者に問題点を自ら考えさせることも有効です。
  5. 強制は避ける: 修正を強制するのではなく、あくまで提案としてコメントすることが重要です。特に、埋め込みコードをする場合は、強制するのではなく提案であることを伝えましょう

あなたの現場でのガイドライン活用法

これらのガイドラインは、あくまで一般的な指針です。実際の開発現場では、プロジェクトの性質やチームの文化などに合わせて、適宜修正を加えて活用することが重要です。

例えば、チームメンバー全員が、リファクタリングの重要性を理解し、積極的に実施することに合意しているような、成熟したチームであれば、より簡潔なコメントでも、リファクタリングが促されるかもしれません。一方、経験の浅いメンバーが多いチームでは、より丁寧な説明や、具体的な例示が求められるでしょう。

また、ガイドラインを、チームのルールとして明文化することも効果的です。ルールを明確にすることで、レビューコメントの質のばらつきを抑え、チーム全体で一貫したレビューを行うことができるようになります。 さらに、定期的にガイドラインを見直し、現場の実態に即した、より実効性の高いものに更新していくことも重要です。

結論

本記事では、コードレビューの生産性向上という観点から、リファクタリングを誘発するレビューコメントのガイドラインについて解説しました。コードレビューは、リファクタリングを促進する効果的な手段であり、特に、経験豊富なレビュアーによる、具体的かつ丁寧なコメントが、リファクタリングの誘発に大きく貢献することが分かりました。また、「なぜ変更が必要なのか」という根拠を明確に示すことや、具体的な例を挙げて説明することも、効果的なレビューコメントに共通する特徴です。

これらの知見を、本記事で紹介した 「リファクタリングを誘発するレビューコメントのガイドライン」 として活用することで、より 生産性の高いコードレビュー が実現できるでしょう。その結果、ソフトウェアの品質向上、開発効率の改善、そして、開発者の成長といった、様々な効果が期待できます。


開発生産性やチームビルディングにお困りですか? 弊社のサービス は、開発チームが抱える課題を解決し、生産性と幸福度を向上させるための様々なソリューションを提供しています。ぜひお気軽にご相談ください!

参考資料: