見せて貰おうか、Amazon新サービス「CodeGuru Reviewer」の性能とやらを

# はじめに

これは、NTTコミュニケーションズ Advent Calendar 2019 5日目の記事です．関連記事は[目次](https://qiita.com/advent-calendar/2019/nttcom)にまとめられています。前日は[@TAR_O_RIN](https://qiita.com/TAR_O_RIN)さんによる[TektonでCI/CDパイプラインを手の内化しよう - Qiita](https://qiita.com/TAR_O_RIN/items/81a6abf947aea0a8deee)でしたね！

## あなたはだ〜れ？！
昨年書いた[深層学習を利用した食事画像変換で飯テロ - Qiita](https://qiita.com/negi111111/items/6d6f19edc060a91662ec)に既に書いてあるので省略します。好きな言語はObjective-Cです。お世話になった言語もObjective-Cです。嫌いな言語もObjective-Cです。最近はPythonしか書いてないのでマンネリ化が激しいです。最近のマイブームは**夜な夜なサイクリングロード**です。一緒にサイクリングしましょう。

## モチベ
複数人で開発を行う上でコードレビューを行う文化は非常に重要ですよねー。ただ、

- 開発者はコードレビューをする時間を確保する必要がある
- 入念にチェックはしても一部の見逃しは発生する（人間だもの）
- レビュー担当者の技術レベルによってレビュー濃度がまちまち

などなど、他人のコードを読むのは大変勉強になるし、もはやレビューに何も抵抗は無いですが、時間が無い時などは後回しにしがち。ぶっちゃけコードレビューって大変ですよね。自動でコードレビューしてくれたらなあ。。。なんてそんなあなたに、

**[Amazon CodeGuru - Amazon Web Services](https://aws.amazon.com/jp/codeguru/)**

<img width="1640" alt="スクリーンショット 2019-12-05 20.42.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/161d7c67-3766-28b6-7273-3a4b3fa33f5d.png">

## 今北産業（三行まとめ）
- 2019年12月3日（米国時間）に公開された機械学習ベースの自動コードレビュー新サービス[Amazon CodeGuru](https://aws.amazon.com/jp/codeguru/)の**CodeGuru Reviewer**についての検証
- [Amazon CodeGuru](https://aws.amazon.com/jp/codeguru/)の利用方法について**導入方法の解説**
- [Amazon CodeGuru](https://aws.amazon.com/jp/codeguru/)により**自動生成されるレビューコメントへの言及**

## CodeGuruとは
CodeGuru自体の説明は既にいくつかのメディアが取上げているので概要についてはリンク先に委ねようと思います。要は**機械学習ベースの自動コードレビュー（CodeGuru Reviewer）およびプロファイラー（CodeGuru Profiler）**機能を提供するサービスです。CodeGuru Profilerについては[Amazon CodeGuruを試してみた - Qiita](https://qiita.com/kojiisd/items/6feee24dfb563c34d70e)にて記載がありますが、**CodeGuru Reviewer**の方はあまり記載が無かったので前記のブログを補填する内容になっています。

- 英語記事
    - [AWS' CodeGuru Will Point Out What's Wrong with Your Code - The New Stack](https://thenewstack.io/amazon-web-services-codeguru-will-point-out-whats-wrong-with-your-code/)
- 中国語記事
    - [亚马逊推出欺诈检测器和CodeGuru_创视网](http://chuangyi.chuangyetv.com/jxdz/20191204/120420662.html)
    - [codeguru – Gea-Suan Lin's BLOG](https://blog.gslin.org/archives/tag/codeguru/)
- 日本語記事
    - [AWSのCodeGuruは機械学習を応用してコードレビューを自動化 | TechCrunch Japan](https://jp.techcrunch.com/2019/12/04/2019-12-03-aws-codeguru-uses-machine-learning-to-automate-code-reviews/)
    - [AWS、「Amazon CodeGuru」発表　機械学習したコンピュータが自動でコードレビュー、問題あるコードや実行の遅い部分を指摘 - ITmedia NEWS | ニュートピ！ - Twitterで話題のニュースをお届け！](https://newstopics.jp/url/9209790)
    - [あのApple CardもAWSで動いていた。武器は｢AI｣。アマゾンが5G時代の新戦略を公開【re:Invent 2019】 | BUSINESS INSIDER JAPAN](https://www.businessinsider.jp/post-203591)

実際のCodeGuruの基調講演はYouTubeに公式がアップロードしていますので以下のYouTube動画を御覧ください。（Qiitaはインライン表示できないので画像リンクとしています。**01:58:40からAmazon CodeGuruの発表が始まります**。）
[![見せられないよ！！](http://img.youtube.com/vi/7-31KgImGgU/0.jpg)](http://www.youtube.com/watch?v=7-31KgImGgU?controls=0&amp;start=7120")

## 簡単な使用手順
ここでは、[Amazon CodeGuru](https://aws.amazon.com/jp/codeguru/)の利用方法について**導入方法の解説**を行います。

### CodeGuru Reviewer利用の際の下準備編
自動レビュー機能を試す前に**CodeGuru**と自動レビュー対象とするレポジトリの紐付けを行います。Preview版では**GitHub**および**[AWS CodeCommit](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/welcome.html)**をサポートしているようです。今回はGitHubによる検証を行いたいので、GitHubアカウント、GitHubレポジトリとの紐付けを行う想定で記載します。**CodeCommit**との紐付けについては公式ガイド[Getting Started with Amazon CodeGuru Reviewer - Amazon CodeGuru Reviewer User Guide](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/getting-started-with-guru.html)を参照しましょう。

#### 1. AWSマネジメントコンソールからCodeGuruを選択する
AWSにログイン後、 **サービスを検索する** の入力欄に **CodeGuru** と入力して、表示項目をクリック。
<img width="1655" alt="0_選択.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/9bfa369b-fa1b-31ce-d944-b47022249c49.png">

#### 2. リージョンの変更
2019/12/5時点では、サポートリージョンが図中の５リージョンのみなので、もし同じ画面に遷移した場合は、何れかのリージョンを選択。今回は**米国東部（オハイオ）**を選択します。
<img width="1652" alt="1_リージョン変更.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/b95cd4b0-4354-4b12-9f79-9588978812e6.png">

#### 3. Amazon CodeGuruからCodeGuru Reviewerの選択
Amazon CodeGuruのホーム画面です。今回は**CodeGuru Reviewer**によるコードの自動レビュー機能を試すので図中のいずれかをクリックしてレポジトリとの紐付けを行います。
<img width="1651" alt="スクリーンショット 2019-12-05 17.44.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/13ad6564-c55a-5519-6cce-7d78a8ffdfd0.png">

#### 4. CodeGuru ReviewerとGitHubアカウントの紐付け
**CodeGuru Reviewer**による自動レビューの対象とするレポジトリの紐付けを行います。この時、**CodeGuru Reviewer**による自動レビューを行う**専用のGitHubアカウント**を作成することをオススメします。公式ガイド[Getting Started with Amazon CodeGuru Reviewer - Amazon CodeGuru Reviewer User Guide](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/getting-started-with-guru.html)にも記載されていますが、**専用のGitHubアカウント**を介して**CodeGuru Reviewer**によるレビューが行われるので、人手によるレビューなのか自動か否かの混乱を防げます。また、複数のレポジトリを自動レビュー対象にする場合は、レポジトリに新規に作成した**CodeGuru Reviewer専用のGitHubアカウント**をレポジトリにCollaboratorsとして招待すればOKです。※ **GitHubアカウントとの紐付け後に別のGitHubアカウントに変更する場合はブラウザのCookieを削除する必要があります。**
<img width="1653" alt="スクリーンショット 2019-12-05 18.05.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/3981de6e-522f-a081-4fab-f86f6bb88047.png">

#### 5. CodeGuru Reviewerとレビュー対象レポジトリの紐付け
GitHub認証が正常に終了したら**Connect to GitHub**が**Connected**へと変わるはずです。これで**CodeGuru Reviewer**とGitHubとの紐付けが完了します。次に、**Repository location**のリストから自動レビューの対象とするレポジトリを選択して**Associate**ボタンをクリックすれば設定は終了です。（めちゃ楽）※ **CodeGuru Reviewer専用のGitHubアカウントを自動レビュー対象レポジトリへ事前に招待して承認しておけば、勿論プライベートレポジトリも全て表示されます。また、Organizationsについても同様です。**
<img width="1651" alt="スクリーンショット 2019-12-05 18.30.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/f3348a2b-077c-67d4-baf8-f197e64da5e6.png">

#### 6. CodeGuru Reviewer紐付け完了ステータスの確認
**Associate**ボタンをクリック後は以下の画面に遷移します。紐付け直後の**Status**部分は**Associating**と表示されますが、（レポジトリの規模によりますが）数分程度で**Associated**へと切り替わり下準備は完成です。（公式ガイド[Getting Started with Amazon CodeGuru Reviewer - Amazon CodeGuru Reviewer User Guide](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/getting-started-with-guru.html)では数分程度と記載してありますが、空のレポジトリということもあり、今回は数秒でした。）※ **ブラウザの更新か、画面中のAction左にある更新ボタンを押す必要があります。**
<img width="1652" alt="スクリーンショット 2019-12-05 18.42.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/4e1da7e9-0644-4315-3cf8-916e03eba2b1.png">

## 簡単な検証
ここでは、[Amazon CodeGuru](https://aws.amazon.com/jp/codeguru/)から**実際に自動レビューコメントを受けるまでの検証**を行います。※ **ここからは実験みたいなものなので文章の雰囲気が変わるやもしれません。**

### CodeGuru Reviewerによる自動レビューの例その１：まじめなコード編
今回はむかしのむかしに書いたコードをぶっこんで見ることにしましょう。現状は**Javaのみのサポート**のようなのでそれ以外のコードおよび変更点は多分無視されます。**CodeGuru Reviewer**による自動レビューのトリガーは**Pull Request**により作動します。おもむろにPRを出してやりましょう。

![スクリーンショット 2019-12-05 19.08.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/298267f9-5770-855a-5dec-412a047b2477.png)

すると**CodeGuru**の**Dashboard**に変化が見られると思います。色々と実験をしていたので**Lines of code analyzed**が実際と乖離していますが、自分が出したPRと書いたコードの行数が簡易的に表示されます。※ **Reviewer recommendations**はいくら待っても変わりませんでした。バグなのかな？

<img width="1652" alt="スクリーンショット 2019-12-05 19.15.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/d077bf7d-fa00-a0ad-3bf0-89ff2b608136.png">

（数分後…）適当にPR画面を見ていると何やらコメントが11件来てる。。。

![スクリーンショット 2019-12-05 19.23.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/bc9822e9-a858-e0fc-be83-b32321efef29.png)

恐る恐る確認してみると…なんか色々書かれていて、公式ガイド[Recommendations in Amazon CodeGuru Reviewer - Amazon CodeGuru Reviewer User Guide](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/recommendations.html)によると以下5項目の観点からレビューをしているっぽい？**AWS best practices**、**Concurrency**、**Sensitive information leak prevention**については今回のPRには含まれていないはずだからそれっぽいレビューコメントはついていないみたいだ。

>
The following kinds of recommendations are provided:
- AWS best practices
- Concurrency
- Resource leak prevention
- Sensitive information leak prevention
- Common coding best practices


![スクリーンショット 2019-12-05 19.27.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/db6caf27-006d-036c-3f69-5244fe42652f.png)

11件のコメントの中でユニークコメントだったのが以下の3つで残りはほぼ**Resource leak prevention**に関する指摘で全文まったく同じコメントレビューが記載してあった。問題点と解決策、参考リンクなど簡潔なレビューだけどどうやって生成してるんだろう…

![スクリーンショット 2019-12-05 19.41.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/6694bfac-a393-8d2a-73f8-214a440f67a0.png)
![スクリーンショット 2019-12-05 19.39.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/deb629f0-0fc3-829b-8584-d3a9cf6037ce.png)
![スクリーンショット 2019-12-05 19.39.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/ed7e1c08-273a-3b8b-6ee3-935f1f371cb1.png)

### CodeGuru Reviewerによる自動レビューの例その２：ウンコード編
皆さんは[ウンコード・マニア](http://unkode-mania.net/)という神サイトはご存知だろうか？その名の通り**ウンコード撲滅を目論む崇高な神サイト**である。読めば読むほど一度は…と心に刺さるものがあるので是非訪れてほしい。
![スクリーンショット 2019-12-05 19.55.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/584352b2-1a33-121d-184a-3368d69b145c.png)

さて、今回はウンコードを**CodeGuru Reviewer**にレビューしてもらおう。そう君は今日から**UnCodeGuru Reviewer**なのだから。

#### 代表的なウンコード
現状の**CodeGuru Reviewer**はJavaのみのサポートであるので、[Java ウンコード-ウンコード・マニア](http://unkode-mania.net/lang/Java)から引用させてもらおう。有名所で申し訳ないが好きなのはやっぱり**波動拳ネスト型ウンコード**である。（※ 画像は[Indent Hadouken : ProgrammerHumor](https://www.reddit.com/r/ProgrammerHumor/comments/27yykv/indent_hadouken/)から引用。redditで議論されてて楽しい。）

![I1CShqp2wBguKcuv21m6XRnREKuw8kyAoCavCAGJPBI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/7014099e-ac5d-d238-1aea-98e190eda36b.jpeg)

もちろん、ウンコード・マニアも扱っているので、[[Java] フルHD推奨。-ウンコード・マニア](http://unkode-mania.net/view/5040f47b9b6066a52e000003)を引用する。

```java
// [[Java] フルHD推奨。-ウンコード・マニア](http://unkode-mania.net/view/5040f47b9b6066a52e000003)を一部改変。

public class ClassSample {
    public static void main(String args[]) {
        int proc = 0;
        try {
            if ( proc == 0 ){
                // 正常処理
                try {
                    if ( proc == 1 ){
                        // 正常処理
                        try {
                            if ( proc == 2 ){
                                // 正常処理
                                try {
                                    if ( proc == 3 ){
                                        // 正常処理
                                        try {
                                            if ( proc == 4 ){
                                                // 正常処理
                                                if ( proc == 5 ){
                                                    // 正常処理
                                                    // まだまだ続くよ！
                                                } else {
                                                    // 異常処理
                                                }
                                            } else {
                                                // 異常処理
                                            }
                                        } catch(Exception e) {
                                            // 例外処理
                                        }
                                    } else {
                                        // 異常処理
                                    }
                                } catch(Exception e) {
                                    // 例外処理
                                }
                            } else {
                                // 異常処理
                            }
                        } catch(Exception e) {
                            // 例外処理
                        }
                    } else {
                        // 異常処理
                    }
                } catch(Exception e) {
                    // 例外処理
                }
            } else {
                // 異常処理
            }

        } catch(Exception e) {
        // 握りつぶす
        }
        System.out.println("Hello! World!");
    }
}
```

#### ウンコードのPRを同様に出す
さて先程と同様にPRを出して自動レビューのトリガーを引こう。…が待てよ待てとも一向にレビューが来ない…（ここでボロクソにレビュー来たら面白かったんですがね）前述の5項目の観点外だから音沙汰が無いのか、糞すぎるのか何れにしても何らかの反応はほしいですね。。

![スクリーンショット 2019-12-05 20.21.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149625/f2a434d4-91bf-26b5-925f-189c89f15ef2.png)

## まとめ
つい先日公開されました[Amazon CodeGuru - Amazon Web Services](https://aws.amazon.com/jp/codeguru/)の導入方法と実際に生成される自動レビューについて簡単に検証してみました。[【IT】「Amazon CodeGuru」発表。機械学習したコンピュータが自動でコードレビュー](https://egg.5ch.net/test/read.cgi/bizplus/1575455475/-100)は5chスレですが、たしかに自動でコードレビューしてくれても実装難易度爆高な方法を提示されたりなんてことがあったらそれはそれで面白そうです。（囲碁・将棋であったように）実装難易度順に候補複数提示してくれるとかだったら神ですね。

また、今回はまだ試していないマルチスレッディング、AWS API等に関するコードレビューは時間があるときにでも試してみたいです。後、コードレビューの正当性についても言及したい。特にマルチスレッディング系はどんなレビューが生成されるのか気になる。

なにわともあれCodeGuru自体はプレビュー版なのとJavaのみのサポートということもありまだまだ開発途上ではありますが、実際に自動で生成される様を見ると、何やら若干の未来感を感じ心躍る気分になりました。早急にPythonとSwiftに対応してくれ〜〜！使うから！笑


明日は[@jkr4869](https://qiita.com/jkr4869)さんの記事です！！お楽しみに〜〜〜！！！