Upgrade to Pro — share decks privately, control downloads, hide ads and more …

放置PRを許さない、 レビューを加速させるアプリの 実装と設計の道のり

Avatar for haruotsu haruotsu
September 16, 2025
71

放置PRを許さない、 レビューを加速させるアプリの 実装と設計の道のり

放置PRを許さない、
レビューを加速させるアプリの
実装と設計の道のり

ペパボ & GO 〜 夏のGo祭り2025、あの夏〜
での登壇資料です
https://pepabo.connpass.com/event/363869/

Avatar for haruotsu

haruotsu

September 16, 2025
Tweet

Transcript

  1. 2 ⾃⼰紹介 ロリポップ‧ムームードメイン事業部ムームードメイングループ 横⼭ 遥⼄ はるおつ • GMOペパボ新卒2年⽬エンジニア • @haruotsu_hy/@haruotsu •

    三度の飯よりゾウが好き • Go、Rubyをよく触ります。 • SQL芸⼈ • 呼吸をするようにドメインを買っています。
  2. ⼀⽅でこんなことはありませんか? 5 • このPR誰かレビューしてください! • だれも引き受けてくれない‧‧‧!? • (2時間後...) 〇〇さん可能であれば‧‧‧! •

    修正 → レビューのサイクルが遅くて全然merge できない‧‧‧ • 私ばかりレビューしているな‧‧‧ ⼀⽅でこんなことはありませんか?
  3. 実際 6 実際 コードを書く テストする レビューする 開発生産性が上がりめっちゃ早くなった 大AI時代、超高速な仮説検証 を行う上で、 レビューがボトルネック

    になっていた。 遅い! 超少人数のチームや、距離感の近いチームの方が、 PR作成からデプロイまでのリードタイムが早かった (Forkeys)
  4. slack-review-notify 8 • GitHubにラベルが付くと通知 • レビュワーのランダムアサイン • スレッドで定期リマインド • レビュワー変更

    • レビュー後⾃動通知 • 定期リマインド • 営業時間考慮 • スラッシュコマンドでの設定変更 slack-review-notify https://github.com/haruotsu/slack-review-notify
  5. 技術スタック • Go ◦ 定期実⾏easy! • Gin ◦ ルーティングeasy! •

    SQLite + GORM ◦ 外部DBいらない ◦ ⾃動マイグレーション最⾼! ◦ インデックス&ユニーク制約easy! • Slack API • GitHub Webhooks 11 技術スタック 単一バイナリでデプロイ楽ちん 外部DB不要 超シンプルイベント駆動
  6. 定期実⾏処理 定期実⾏処理 15 他の処理に関係なく、正確な時間間隔を図るために backgroundで処理する必要がある → Tickerによるgoroutine処理 • goroutineを起動する、Ticker構造体のインスタンス返却 type

    Ticker struct { C <-chan Time // 受信専用チャネル // ... } go func() { for { time.Sleep(duration) // 60秒待機 select { case ticker.C <- time.Now(): // チャネルに現在時刻を送信 default: // チャネルがフルなら送信しない } } }() case <-taskTicker.C: // チャネルから時刻を受信 • goroutineを起動する、Ticker構造体のインスタンス返却 cronなど外部依存なしで、リマインドを定期的に送信したい • チャネルでselect (他非同期処理と競合しない )
  7. DB設計 DB設計 20 第1世代: 1チャンネル1設定 • エンジニアはhoge-devチャンネル、 デザイナーはhoge-designチャンネルにい る想定 •

    タスクごとにチャンネルを分けている想定 • 同じ名前のラベルを識別するためにチャン ネルをキーにする 実際に運用してみたら・・・
  8. DB設計 DB設計 21 第1世代: 1チャンネル1設定 • エンジニアはhoge-devチャンネル、 デザイナーはhoge-designチャンネルにい る想定 •

    タスクごとにチャンネルを分けている想定 • 同じ名前のラベルを識別するためにチャン ネルをキーにする うちのチャンネル、デザイナーもエンジニアもいるのですが ... needs-reviewだけでなく、bugなどで人によって分けたいのですが ...
  9. DB設計 DB⼤改変の決意 22 第2世代: 複合ユニーク制約で柔軟性と制約のバランスを取る • チャンネルとラベルで一意性を担保 • 過度な正規化はしない •

    GORMでピッとgorm: “index”を貼るだけ • GORMのAutoMigrateで対応 db.AutoMigrate(&models.ChannelConfig{}, &models.ReviewTask{})
  10. レビューサイクルの改善 レビューサイクルの改善 25 時期 平均対応時間 中央値 導入前 10時間54分 9時間22分 導入後

    1時間51分 25分 とあるチーム • レビューせずに1日放置することが なくなった • だれがレビューするかに迷いが 生じない お客様の声 爆爆爆改善!