静的解析ツールはプログラミングにおけるGrammarlyか？

コードリーディングが必要となるシチュエーションの一つにコードレビューがあります。コードレビューは、一般にコミット前にコーディングの誤りをチェックする目的で行われますが、これはコードリーディングによって人力で静的解析を行っているとも言えます。それならば **静的解析ツールを使ってコードリーディングの負担を減らし、さらにコードレビューを省略することはできないのでしょうか？**

例えば、英語の文章を書く際の文法チェックに[Grammarly](https://www.grammarly.com/)のようなサービスが使われます。かんたんなメールや添付資料の英語だけなら、Grammarlyでチェックして問題箇所が修正でき次第、送信してもいいと考える人が多いのではないでしょうか。ソフトウェア開発に置き換えれば、静的解析ツールでコードの文法チェックができ次第、コードレビューは省略してコミットしても良いような気もします。

今回はコードリーディングを助けてくれるツールという観点で、静的解析ツールがコードレビューの助けになるのか？はたまたコードレビュー自体を廃止できるような存在であるのか？について考えていきます。

## 静的解析とは？
プログラムを実行して動作を確認し、エラーやワーニングの発生を検証する解析手法は、動的解析と言われます。テストコードを書いてテストを実行することも動的解析です。一方で**静的解析は、プログラムの実行を伴わない解析手法であり、主にソースコードを自動または人力でチェックして間違いを検出する手法**です。

## 静的解析ツールでできること
代表的な静的解析ツールであるESLint、Rubocopを例にとって、コードレビューに相当する作業のうち何ができるのかを調べてみました。

### ESLint
- リンティング（タイプミス、文法誤り等の問題箇所の検出）
- 問題箇所の自動修正
- コーディングスタイルチェック

### Rubocop
- リンティング（タイプミス、文法誤り等の問題箇所の検出）
- 問題箇所の自動修正
- コーディングスタイルチェック
- コードフォーマット

両ツールとも多機能であり、さまざまなカスタマイズにも対応されていますが、コードレビューに相当するような作業としては上記の通りの機能が挙げられます。

これらの機能は[ECMAScript](https://262.ecma-international.org/)や[Ruby Style Guide](https://rubystyle.guide/)に則った解析に限定されるます。文法やコーディングスタイルは間違っていないものの、処理が遅くなるコード、煩雑で読みにくいコード、冗長な手順となっているコードなどは検出されません。静的解析ツールはあくまでタイプミスや文法誤りに相当する初歩的なケアレスミスを、テストや動作確認のような動的解析もしくはコードレビューの前にさっと改善するためのものと言えるでしょう。そういった意味では、**静的解析ツールはコードレビューの負担を軽減してくれる存在**となっています。

## Grammarlyは何をやってくれているか？
冒頭で静的解析ツールと似たような存在として英語の文法チェックに使われるGrammarlyを例に挙げました。せっかくなのでGrammarlyが英文のチェックの際にどんなことをやってくれるのか調べてみました。

- タイプミスの検出
- 文法誤りの検出
- 混乱しやすい単語の検出
- 文章のトーン統一のための代替表現の提案
- わかりにくい表現の代替提案
- カスタムガイドラインを適用したチェック

単純なタイプミス、文法誤りの検出だけでなく、文章のトーンを統一したり、わかりやすい表現へ置き換えたりするための提案機能（有料）も特徴となっています。またカスタムガイドラインだけでなく、論文のような文書での盗用箇所の検出もできるようです。

しかし、内容まで踏み込んで判断してくれるわけではないため、論旨の破綻、冗長すぎる回りくどい表現などは検出されません。

## ESLint/Rubocop/Grammarlyの比較
ESLint、Rubocop、Grammarlyの機能を比較するために表にまとめてみました。

| 機能                           | ESLint | Rubocop | Grammarly |
| ------------------------------ |:------:|:-------:|:---------:|
| タイプミス検出                 |   ○    |    ○    |     ○     |
| 文法誤り検出                   |   ○    |    ○    |     ○     |
| スタイル・ガイドラインチェック |   ○    |    ○    |     ○     |
| コードフォーマット             |        |    ○    |     -     |
| 文章のトーン統一の代替提案     |        |         |     ○     |
| わかりにくい表現への代替提案   |        |         |     ○     |

プログラムと英語という対象の違いはあるものの、静的解析ツールとGrammarlyには似たような機能があることがわかります。表記ゆれや文章のトーンの違いを修正して統一するための代替提案やわかりやすい表現への書き換え提案などはGrammarlyのほうが優位な機能となっています。

また上記表はできることを中心に記載しましたが、ESLint、Rubocop、Grammarlyはいずれも処理の遅さや論旨の破綻のような内容に関する指摘や代替提案には対応していません。あくまで機械的に指摘できるような範囲内での自動チェックツールです。静的解析ツールもGrammarlyも非常に便利なツールですが、**内容に関するレビューや査読は別途必要となりそう**です。もちろん求められる品質にも依ります。

## ESLintやRubocopにない代替提案の機能を補うことができないか？
さきほどの比較表から、静的解析ツールにはGrammarlyのような代替提案機能がないことがわかりました。この代替提案機能を補うツールとして、GitHub CopilotのようなAIペアプログラミングサービスは活用できないでしょうか？そこで[GitHub Copilot](https://github.com/features/copilot)も調べてみました。

主な機能は以下の2つ。

- コメントを入力すると、その内容を汲み取ってコードを提案してくれる
- 書いたコードの内容を汲み取って代替提案してくれる（変数名やオブジェクトのデータ形式なども）

一見良さそうに思えたのですが、提案するコードの質は完全には保証されておらず、動かないケースもある[^1]とのことなので品質問題があるようです。結局提案されたコードを読んで理解しなければならないという意味で、コードリーディングを増やしてしまう厄介な存在かもしれません。GitHub Copilotのコードレビューを日常的にやらされる羽目になるので、期待したものとは真逆の存在でした。

## まとめ
コードレビュー時のコードリーディングを助けてくれるツールとして、静的解析ツールの機能の調査や類似サービスであるGrammarlyとの比較を行いました。静的解析ツールは、完全にコードレビューをなくしてくれるほど万能ではありませんが、コードレビュー時の負担を軽減してくれるツールとして非常に有用だと言えます。

英文のチェックに使うGrammarlyとの比較という新しい視点を取り入れてみたことにより、静的解析ツールやテストとコードレビューとの役割分担がわかり、コードレビューの存在価値も理解できたように思います。ツールで補うことが難しい、内容に関するチェックは、引き続き人力静的解析ことコードレビューがカバーしていくことになるでしょう。

[^1]: https://github.com/features/copilot (FAQの"Does GitHub Copilot write perfect code?"の回答に記載)