ひびのログ

日々ではないけどログを出力していくブログ

コードレビューの複雑度を数値化しようとしている

コードレビューをするときに、「これは明らかに一回のコードレビューで見られる量じゃない」という PR が飛んでくることがある。
いい感じに評価できないかと思って、いい感じの計算式を作ってみた。

PR の複雑度を減らしたほうがいい理由

  • レビュワーの負担を可能な限り軽くするほうがいいから
    • コードレビューというのはあくまで割り込み作業
  • レビュープロセスを経ても本番不具合を起こす可能性が高くなるから
    • 複雑な PR はバグを隠してしまう
  • レビュイーの待ち時間が長くなってしまうから
    • コードレビューが終わるまでに時間がかかる

複雑度を減らすには「複雑度」を数値化する必要がある。

評価基準

あくまで仮採用。

因子

  • 変更行数
  • 変更ファイル数
  • 変更する理由の数
  • 確認箇所(影響範囲)

計算式

変更する理由の数 = 1 ならば、
(変更行数 * 変更ファイル数 * √(確認箇所 + 1)) < 200

変更する理由の数 > 1 ならば、
(変更行数 * 変更ファイル数 * √(確認箇所 + 1)) ** (変更する理由の数 * (変更する理由の数 - 1)) < 200

理由や懸念点

  • 変更する理由は 1 つの PR で 1 つにすべき
    • 1 つより多いなら、理由ごとに個別の PR に分けるべきなので、累乗の累乗で計算してみた
  • 変更量は多すぎず少なすぎず、仮に 200 行をボーダーとしてみた
  • とはいえ 10 行の変更を 20 ファイルやられても困るので、確認箇所に応じて補正をかける
    • ファイル数が増えればそれだけ確認箇所も増えるはず、という推測に基づく
    • リニアではない式にしたほうがよかったかも(放物線とか)
      • ファイル数が少ないときは、それほど複雑度は上がらなそう
  • 影響範囲は PR に関係ないかもしれない
    • PR で見るのはコードなので、コードの中で判断できる形式が良さそう
  • package-lock.json など、計算から除外したほうがいいファイルも存在する

今後の進展

しばらく個人で運用して、この計算式で出した数値と自分の感覚が合っているか確認し、調整していく。

適切な評価ができていると判断したら、ツールにして他の人にも使用してもらう。

最終的には自動化して、複雑すぎる PR は警告を出すといったことができると嬉しい。

補足:循環的複雑度について

これは「コードがどれくらい複雑か」を測る指標なので、コードレビューの複雑度を測るには用途が合わなかった。

コードがシンプルだったとしても、変更が 1,000 行あればコードレビューは辛い。
逆に、変更した関数がいくら複雑でも、typo の修正であればコードレビューの複雑度は低い。

参考

Googleのソフトウェアエンジニアリング ―持続可能なプログラミングを支える技術、文化、プロセス 単行本(ソフトカバー) - Amazon アフィリエイトリンク