😇

レビューBotでレビュー効率を改善した話

2023/01/23に公開

プロダクト開発部バックエンド開発グループでエンジニアをしてます、ゆうまです。
今回はココナラのバックエンド開発グループでレビュー開始までの時間を改善し、開発速度を改善した事例を紹介します。

改善前のレビュー

改善前のココナラのバックエンド開発グループのレビューを紹介します。

GitHubでのレビュー

レビュー対象は主にコードやSQLです。それらのレビューのやりとりは主にGitHub内で行われます。
そして、バックエンド開発グループ内でGitHubの機能のapproveでコメントにLGTMが2件あれば、レビューは通ったことになります。

また、ココナラではapproveが2件以上ないものに関してはdevelopブランチやmaster、mainブランチにはマージしないようにしています。

レビューの依頼方法

レビューの依頼はslackのレビュー専門チャンネルで行います。
バックエンド開発グループ内ではグループのメンションをつけるようにしています。
ただし、他部署に関係するプルリクに関しては、他部署のメンションをつけたり、メンションに関しては柔軟にしています。

ただ、グループのメンションだとレビューを行うのが自分だという意識がどうしても希薄になるので、グループのメンションに気づいた人で余裕のある人がレビューを行うようになっていました。
過去のレビュー依頼

課題

以前のレビューの課題は主に2点ありました。

  • レビュワーの偏り
  • レビューまでの時間が長い

バックエンド開発グループには、入社、退社、異動による変動はあれど、平均で10名程度が在籍しております。
しかし、各々が異なるプロジェクトの開発をしていることもあり、他プロジェクトで開発されたコードのレビューには意識が向かいづらいところがありました。
また、別プロジェクトの仕様を知らないためレビューはむずかしいという意識や、
自分がしなくてももっと詳しい人がやってくれるだろうという雰囲気がありました。

その結果、レビューがボトルネックとなり、早期にリリースが必要なコードもなかなかリリースできないということがよくありました。

れびゅーくん爆誕

課題を解決するために『れびゅーくん』を開発しました。
(通称れびゅーくんは社内ではむーさん(本物)というアプリ名です)

れびゅーくんとはBoltで作成されたレビュワーをrandomに振り分けるためのSlackBotです。
レビュワーはprimaryとsecondaryを選ぶようになっており、2名のレビュワーを選出し、メンションします。
選出基準はslackがactiveになっているバックエンド開発グループから選んでいます。
れびゅーくんが反応する条件は『BEレビュー』+『GitHubのURL』としています。

また、れびゅーくんは長時間労働を推奨していないので、19時以降は退勤をし、レビュワーをメンションしません。

れびゅーくんを用いてのレビュー依頼

れびゅーくんの運用

2022年8月1日以降、バックエンド開発グループではレビュー依頼時には、れびゅーくんを通してレビューを依頼するようになりました。
しかしながら、れびゅーくんにメンションされた2名は意識してレビューをしてくださいという程度の運用で、レビューをする義務はありません。
プロジェクトの状況やレビューの時間がとれないなど本人の事情により、できないケースもあるので緩やかな運用をしています。

実際に運用しているコードとは少し違いますが、れびゅーくんが呼び出されたときの実装は大枠は下記のようなコードです。

// "BEレビュー" を含むメッセージをリッスンします
app.message('BEレビュー', async ({ message, say }) => {
  try {
    let currentHour =  new Date(Date.now() + ((new Date().getTimezoneOffset() + (9 * 60)) * 60 * 1000)).getHours();
    if (currentHour > 6 && currentHour < 19) {
      if (message.text.indexOf('https://github.com/') !== -1) {
        let reviewers = beReviewers.concat(); // バックエンド開発グループのレビュワー一覧

        const messageUser = reviewers.indexOf(message.user) // メッセージ投稿者は除外
        await reviewers.splice(messageUser, 1)
        const firstReviewer = await reviewer(reviewers) // レビュワー選出
        const secondReviewer = await reviewer(reviewers) // レビュワー選出
        if (secondReviewer != 'undefined' || secondReviewer != undefined) {
          await say({text: `レビュー頼むぅ。 first: <@${firstReviewer}>, second: <@${secondReviewer}>!`, thread_ts: message.ts});
        }
      }
    } else {
      await say({text: `今日はもう退勤したむぅ~`, thread_ts: message.ts})
    }
  }

  catch (error) {
    await say({text: `エラーが発生したむぅ: ${error}`, thread_ts: message.ts})
  }
});

れびゅーくんの構成

Boltの選定

社内ではレビュー依頼などをslackを通じて行うので、既存のレビュー依頼のフローは変えずに改善をしようと思いました。
そのため、slackアプリを使用することが一番近道ではないかということでslackアプリでれびゅーくんを作成することになりました。
slackアプリを作成するにあたり、手軽に作成できる方法としてslack公式のフレームワーク、Boltを使用することにしました。
そこまで凝ったものや構成にする必要はないので手軽なものを選定しました。
また、運用コストもかけたくないため、lambdaに配置することのできるBoltは最適でした。

管理方法

れびゅーくんのアプリケーションはGitHubでバージョン管理されており、
CircleCIでmainブランチに変更がpushされるタイミングでlambdaにServerless Applicationを使用してデプロイされるようになっています。

れびゅーくんアーキテクチャ

れびゅーくんを導入して

レビュワーの偏り

れびゅーくんを導入した目的の一つとしてレビュワーの偏りの問題がありましたが、導入後ある程度時間がたったので改善されたかを調査しました。
下記の表はFindy Teamsで取得したデータを元にして作成しました。
月間の一人あたりレビュー数を、レビュー総数が100として調整し、それを3ヶ月間にまとめて標準偏差を求めました。
つまり、レビュー総数300件を"所属しているバックエンドエンジニア×3"人で求めたものになります。
結果として、れびゅーくんの導入月の8月から標準偏差が小さくなっており、れびゅーくんには一定の成果があったと言えそうです。
レビュー数の標準偏差

レビューまでの時間が長い

レビューまでの時間の改善についてはFindy Teamsから分析できるのでデータを確認しました。
8月からレビュー開始までの時間は低水準になっていることがグラフからわかりました。
バックエンド開発グループでレビューの意識が高まっているという結果になりました。
レビュー依頼からレビューまでの平均時間

今後の課題

れびゅーくんのおかげでレビューの偏り改善や時間の短縮につながることに成功しました。
しかしながら、ココナラも規模が大きく、システムの全容を把握している人はおらず、
異なるプロジェクトのメンバーにレビューを依頼してもドメイン知識が乏しく、適切なレビューになっているとは言い難いです。
また、エンジニアのスキルによってレビューの質もまちまちになってしまうので、今後は品質の高いレビューを実現するにはどのようにすればよいのかが課題になります。

れびゅーくんのよもやま話

れびゅーくんの画像って誰?

Slackアプリを作成するにあたり、アプリの画像を決める必要がありました。
これはBoltを使って開発するよりも難しい問題でした。なぜなら、れびゅーくんは今後バックエンド開発グループがよく目にするBotになるので
誰がみても受け入れられやすく、親しみがあるものにしなければなりませんでした。
画像選定に悩んでいたところ、他のメンバーから『むぅさん(ココナラ開発役員)が良いのでは?』という提案があり、
まさしく条件に合致していたのでスムーズにむぅさんの画像に決まりました。
また、愛着を持たせるため、語尾は『むぅ』とつけるように一手間加えました。

補足ですが、むぅさんも笑って導入を受け入れてくれました。

れびゅーくんの現在

直近ではれびゅーくんは自我をもたせるようにしました。
自我をもたせた方法としてはChatGPTのAPIを利用しました。

例えば、『教えてむぅ』とコメントにいれることで、れびゅーくんが返答してくれるようになります。下記の画像ではRubyについての質問の返答をしてくれています。

教えてむぅ

今後はレビュー機能に留まらず、ChatOpsで開発生産性をあげられるように新規機能を追加していく予定です。

さいごに

ココナラでは、新規機能の開発以外にも開発環境の改善などの取り組みにも積極的に取り組んでいます。

バックエンド開発グループ以外も部署ごとに環境の改善など取り組んでいますので、もし興味を持たれましたらカジュアル面談にお越しください。
https://open.talentio.com/r/1/c/coconala/pages/70417

募集求人については下記のリンクからご確認ください。
https://coconala.co.jp/recruit/engineer

Discussion