フォトシンス エンジニアブログ

株式会社Photosynth のテックブログです

コードレビューの本質: 可読性のさきにあるもの

この記事は Akerun Advent Calendar 2024 - Qiita の10日目の記事です。

こんにちは。@ps-tsh です。バックエンドシステムの開発を担当しています。最近はエンジニアのマネジメントやプロダクトの仕様策定にも携わっており、自分でコードを書くよりもレビューの時間が多くなってきました。本当は一人で全部書きたいのですが、仕事を進める上でそういう我儘はいったん傍に置くことになります。というわけで、今回はコードレビューの話をしてみようと思います。

コードレビューは、ソフトウェア開発の現場で欠かせないプロセスの一つです。品質向上はもちろん、チーム全体の理解を深める絶好の機会でもあります。しかし、効果的なレビューを行うには「どこに時間をかけるべきか」を明確にすることが大切です。レビューアがすべての細部に同じ熱量で向き合うと、時間ばかりかかり、本当に重要な部分を見落としかねません。

今回は、コードレビューで「労力をかけるべき部分」と「自動化できる部分」を整理しつつ、レビューの本質的な目的に迫ります。また、コードの「読みやすさ」を客観的に高めるためのポイントと、長期的な視点での「メンテナンス性」の重要性についても掘り下げます。

労力をかけるべき部分、かけるべきでない部分

コードレビューでは、ついつい細かいスタイルやフォーマットの違いに目が向いてしまうことがあります。例えば、インデントが2スペースか4スペースか、あるいはコメントの位置が揃っているかどうかなど。しかし、こうしたスタイルのチェックは、自動化ツールに任せれば十分です。たとえば、Rubyのrubocopのようなツールを使えば、フォーマットの問題は機械的に検出・修正できます。人間が労力を費やすべきではありません。

一方で、人間が集中すべきなのは、「このコードは正しく動くだけでなく、将来にわたって読みやすく、変更しやすいか」という設計や構造の部分です。これこそ、機械では判断できない部分であり、レビューアの知見が生かされる領域です。

可読性の議論を超える:「認知負荷」を下げることが重要

コードレビューではよく「可読性が低い」「もっと読みやすくしてほしい」といったフィードバックが出ます。しかし、「可読性が高い」とは具体的にどういう状態を指すのか、人によって解釈が異なります。こうした主観的な指摘は、レビューの議論を迷走させがちです。

そこで注目したいのが、『A Philosophy of Software Design』という書籍で述べられている「認知負荷」という概念です。認知負荷とは、コードを理解するために頭を使う度合いのことです。この負荷が高いと、コードの全体像を把握するのに時間がかかり、バグや設計ミスが生まれやすくなります。逆に、認知負荷を下げる工夫をすれば、コードの意図が直感的に伝わり、レビューの質も向上します。

認知負荷を下げるための3つのアプローチ

適切なネーミング

まず、認知負荷を下げるために最も効果的な手段の一つが「適切なネーミング」です。関数や変数、クラスの名前がその役割や意図を的確に伝えていれば、コードを読んだ瞬間に「何をしているのか」が理解できます。一方、曖昧な名前や抽象的すぎる表現は、読み手の負担を増やします。

良いネーミングには、技術的な語彙力と一般的な表現力が求められます。日々のコミュニケーションやドキュメントの作成を通じて、適切な言葉を選ぶ練習をすることが大切です。

短く・少なく書く

コードを短く、少なく書くことも、認知負荷を下げる効果的な方法です。読む量が少なければ、それだけ全体を把握しやすくなります。同じロジックを繰り返し書かない、責務を明確に分けることでコードの凝集度を高めるといった工夫が重要です。

たとえば、一つの関数が複数の役割を持つと、その挙動を理解するために多くの前提知識が必要になります。凝集度を高めることで、各部分が独立して意味を成し、理解がスムーズになります。

予測可能性を高める

コードをすべて読まなくても全体像を把握できるようにするには、予測可能性を高めることが効果的です。法則性や対称性を意識して書かれたコードは、「こう書いてあれば、この部分もこうなっているはずだ」と予測できるため、読解にかかる時間を大幅に削減できます。

例えば、同じシステム内で同じ処理を行う箇所は、同じ書き方に統一することが大切です。また、広く使われているOSSライブラリを活用することで、「見慣れた設計」を取り入れるのも有効です。新しい独自の書き方を導入することは時に必要ですが、既知の方法を使える場面では、それを積極的に活用しましょう。

メンテナンス性を意識する

認知負荷を下げることに加え、コードレビューで忘れてはならないのが「メンテナンス性」です。書籍『Googleのソフトウェアエンジニアリング』には、「ソフトウェアエンジニアリングとは時間で積分したプログラミングである」との言葉があります。これは、コードの価値がその作成時点だけでなく、運用や保守の過程を通じて積み上がるという考え方を示しています。

自社サービスの開発では、リリースはゴールではなく、あくまで通過点です。リリース前のテスト通過は最低限の品質保証に過ぎず、本質的なコードの価値はその後の運用コストや変更容易性によって評価されます。コードがわかりやすく、柔軟であるほど、メンテナンスにかかるコストは下がります。

例えば、複雑に絡み合ったモジュールや、変更が広範囲に影響するような設計は、短期的には動作するかもしれませんが、長期的には大きな負債となります。レビューでは、コードが将来の変更や拡張に耐えられる設計になっているかを確認し、必要に応じて修正を提案することが重要です。

まとめ:レビューを通じて持続可能なコードを目指そう

コードレビューは、単に「動く」コードをチェックする場ではありません。そのコードが、チーム全体で理解しやすく、長期にわたって持続可能であるかを評価し、改善する場です。認知負荷を下げるための工夫、予測可能性を高めるための設計、そしてメンテナンス性を意識したレビューができれば、コードの価値を長く保つことができます。

運用コストを抑えつつ、チーム全体の生産性を高めるコードレビューを実践していきましょう。その先には、より良いプロダクトと、成長する開発チームが待っています。


株式会社フォトシンスでは、一緒にプロダクトを成長させる様々なレイヤのエンジニアを募集しています。 photosynth.co.jp

Akerunにご興味のある方はこちらから akerun.com