PullRequestを分析してみよう

![READYFORアドベントカレンダー2024　PullRequestを分析してみよう](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15064/bf0b87fd-f1ab-8197-dd3b-f3edada6d164.png)

本記事は READYFOR 株式会社の [READYFOR Advent Calendar 2024](https://qiita.com/advent-calendar/2024) の4日目です。
昨日は @makkinry222 の 「[施策効果の可視化に挑むPMの試行錯誤 12選](https://zenn.dev/readyfor_blog/articles/ef8b41aa652fec)」 でした。

## この記事の3行まとめ
- READYFORでは、GitHubのPullRequestからFourKeysの「デプロイ頻度」「リードタイム」を計測・活用し、開発生産性向上を目指してきました
- 実際にGitHub GraphQL APIを利用してPullRequestデータを多角的に分析する方法を簡単に説明します
- 分析の結果とそれがどう役立つのか、考えてみたことを共有します

## はじめに
こんにちは！READYFORでエンジニアリングマネージャーをやっておりますtoyocです。
今年は「開発生産性」が話題にあがることの多い年だったような気がしていますが皆さんの周りはいかがでしたでしょうか？
弊社では[3年前](https://qiita.com/KUMAN/items/8cee8e33628850fd4e29)からFourKeys（特に「デプロイ頻度」と「リードタイム」）の測定を行っており、開発生産性向上の取り組みの主要指標としてきました。
これらの測定はGithubのPullRequestを分析して行っているのですが、この記事ではどうやって計測しているのかを簡単に説明して、いろんな切り口で分析を試みようと思います。

## PullRequestを分析できる様にするまで
### 1. GitHubのAPIから情報取得
今回は「[GitHub GraphQL API](https://docs.github.com/ja/graphql)」からデータを取得しました。（APIの叩き方は[公式ドキュメント](https://docs.github.com/ja/graphql/guides/forming-calls-with-graphql)を見ていただくのが正確だと思うので割愛します。）
呼び出しに使うクエリーは[search](https://docs.github.com/ja/graphql/reference/queries#search) です。こちらを利用することでリポジトリを跨いだ検索ができ、その検索クエリは[GitHubサイト上の検索と同じ構文](https://docs.github.com/ja/search-github/getting-started-with-searching-on-github/understanding-the-search-syntax)が利用できるため、確認しやすいという利点があります。
具体的にPullRequestのどんな情報が取得できるかは[PullRequestオブジェクトの説明](https://docs.github.com/ja/graphql/reference/objects#pullrequest)を見ていただくと概ね理解できるかと思います。自分がどんな分析をしたいか、どんな情報を取得したいか、こちらのドキュメントを眺めながら考えていただいてもいいかもしれません。

### 2. データの精査と加工
APIから取得した情報をそのまま格納すると場合によってはとても膨大で扱いづらいものになるかもしれません。
保存する前に前処理としてAPIクエリーで絞りきれなかったものの除去と、分析しやすい形への加工を行いました。
例えば自分の場合は、PullRequestのレビュアーからbotユーザーを取り除いたり、変更ファイルを変更ディレクトリにまとめなおしました。

### 3. データの保存と可視化
2で調整したデータを実際に保存し、表やグラフで確認します。弊社ではBigQueryに保存してRedashで可視化しています。（他の方法として、Googleの環境であればSpreadSheetに保存してLooker Studioで可視化する方法も試したのですが、データ量が多くてロードに時間がかかってしまい諦めました）

## いろんな切り口で分析してみる
そんなこんなで分析の準備が整ったらいろんな観点で分析してみます。ここではREADYFORのPullRequestを分析してみた例をペタペタ貼りつつそこから何がわかりそうかを紹介します。（数字やリポジトリ名など出せない情報があるため雰囲気になってしまいますが…）

### リポジトリごと
#### リポジトリごとのPR数
![リポジトリごとのPR数のグラフ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15064/439353dd-b2bf-010e-c19a-0cd7fee351a9.png)
その時々の施策や方針によってどのリポジトリの変更が活発なのかの変遷を見ることができます。保守が全くされてないリポジトリの存在に気づけるかもしれませんね。

#### AuthorごとのPR数の標準偏差
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15064/31b5230f-6f66-8cb6-28b3-d6d8a4793bec.png)
PullRequestのAuthorごとの標準偏差を見ることで、あるリポジトリを変更する人が一部に偏っているか、あるいはさまざまな人の手が入っているのか、属人性の有無が確認できます。

### ドメインごと
#### ドメインごとのPR数
![リポジトリごとのPR数のグラフ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15064/4080aa31-71c9-545c-7376-523cf42fd221.png)
弊社のバックエンドではビジネスロジックやドメイン知識をドメインごとに切ったディレクトリ内へ分けて管理しています。（詳しく書くとそれで1記事書けてしまうので別の機会に🙏）
そのディレクトリ内の変更差分があるPR数を集計しています。どのドメインに注力していたのか振り返るのに役立ちそうです。Authorと組み合わせると誰がどのドメインに詳しいか、というような属人性も見られるかもしれません。

### ロールごと
#### 各ロールごとの平均PR数
![リポジトリごとのPR数のグラフ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15064/1bda96ce-4e11-7a3e-6fe6-73f11dcacf85.png)
人をロールごとにまとめて平均PR数を集計しています。役割によってどれだけアウトプットに違いが出ているか全体像を把握できるかもしれません。
（READYFORでは複数の開発チームの中にそれぞれチームリードとメンバーがおり、それとは別に横断的に技術的なリーダーシップも担う役割としてテックリードがおります）

### リードタイム
#### 初回レビューリードタイム
![初回レビューリードタイムのグラフ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15064/e9f10023-7aea-e190-c082-c25f0a605e45.png)
PRをPublishしてから最初にレビューされるまでの時間になります。[最初](#はじめに)に触れたFourKeysでも「リードタイム」を測定していますが、こちらはPRを作成してからマージするまでの時間になります。この「リードタイム」の改善を考えるときに「初回レビューリードタイム」を測定しておくと問題の切り分けや改善策の考案に役立ちそうです。

## まとめ
PullRequestを分析してみようと手を出してみたら色々な観点で分析できて~~沼にハマりましたが~~楽しかったです。比較的簡単に組織全体の開発の傾向やコンディションを測ることができたので、ぜひ皆さんも自分の組織やリポジトリのPRを分析してみてはいかがでしょうか。

明日は[READYFOR Advent Calendar 2024](https://qiita.com/advent-calendar/2024)
の5日目、 @omnis さんによる記事です。お楽しみに！