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

PRを小さくする勉強会

Avatar for Takegata Takegata
October 13, 2025

 PRを小さくする勉強会

PRを小さくする勉強会
分割統治で開発を制する

Avatar for Takegata

Takegata

October 13, 2025
Tweet

More Decks by Takegata

Other Decks in Programming

Transcript

  1. 今日のアジェンダ 1. 導入(10分) - なぜPRを小さくするのか? 2. 分割統治(10分) - 分ける観点の全体像 3.

    各観点の実践(25分) - 具体的にそれぞれの分け方を紹介する 4. ケーススタディ・討論(15分) - 実践に向けて PRを小さくする勉強会 分割統治で開発を制する 5
  2. PRを小さくする理由 観点 問題 小さくすることで得られる効果 ① 認知負荷の観点(レビューの しやすさ) 大きいPRはレビュアーが理解しきれず、 表層確認に終わる 小さいPRは1回の集中で理解可能

    → 指摘が深く、品質向上 ② フィードバックループの観点 (リードタイムの短縮) 大きいPRほどレビュー待機・修正・再レ ビューで遅延 小さく分ければ部分ごとに並列処 理・早期マージが可能 ③ リスク制御の観点(変更影 響・障害対応) 変更範囲が広いとCI失敗・リリース後のバ グ特定・ロールバックが難しい 狭い変更は原因が特定しやすく、 rollbackも容易 → "速度・品質・安全性" の3軸すべてに直結する。 PRを小さくする勉強会 分割統治で開発を制する 7
  3. PRを小さくすることの期待効果 1. レビュー着手の改善 小さなPRは「すぐ終わる」認識で優先されやすい 2. レビューサイクルの効率化 指摘減少、影響範囲明確で修正・再レビュー時間短縮 小さな変更範囲 → レビュアーが集中しやすい

    → 見落とし減少 3. レビュー品質の向上 理解しやすい → より深いレビューが可能 バグの早期発見 → 後工程での修正コスト削減 4. マージプロセスの効率化 既存影響なしでオートマージ設定も可能になりうる → 各段階で20-30%の効率化ができれば、大幅なリードタイム短縮が期待できる PRを小さくする勉強会 分割統治で開発を制する 9
  4. 分割の観点 PRを分割するときの観点について考えてみる 観点 典型的な分割単位 メッセージ ①関心の分離で分ける 機能 vs リファクタ vs

    設定変更 1PR=1関心事 ②構造で分ける モジュール、レイヤー、DB変更段階 レイヤーやデータの境界で分ける ③ 状態・リスクで分ける 段階的実装、段階的マージ、Feature Flag 動く途中段階でもマージできるように ④ 制約で分ける マージ=リリース、有無・バージョニング制約 環境制約に合わせた安全な切り方 ⑤ チームで分ける チーム規模・レビュー体制・テスト責任 組織・運用単位で分ける PRを小さくする勉強会 分割統治で開発を制する 16
  5. ②構造で分ける モジュールや層・データ構造単位で分ける bad ユーザー登録APIを実装するときに、DB定義、データアクセス、ユースケース、コントローラーをまとめて実装して動くものを1つのPRにする good 各レイヤーを別のPRとして分割する 例:ユーザー登録機能の場合 1. PR1: User

    entityとDB migration追加 2. PR2: UserRepository実装 + ユニットテスト 3. PR3: RegisterUserUseCase実装 + ユニットテスト 4. PR4: POST /users エンドポイント実装 + テスト 各レイヤーの動作はユニットテストで担保し、統合テストは最終段階で実施 PRを小さくする勉強会 分割統治で開発を制する 20
  6. 例1. ダウンタイムなしのDB変更 既存カラムを変更したいが、サービス停止できない制約がある場合 安全な変更順序: 1. PR1: 新カラム追加(NULL許可) 2. PR2: アプリケーション側で新カラムに書き込み開始

    3. PR3: 既存データを新カラムへ移行 4. PR4: 新カラムにNOT NULL制約追加 5. PR5: 古いカラム削除 各PRは本番環境で動作しながら段階的に進められる PRを小さくする勉強会 分割統治で開発を制する 25
  7. 例3. マージとリリースの関係の影響 原則:Feature Flag必須/未使用コードOK/UI非表示 “検証を切る”設計:if flag: 新ルート else: 旧ルート を先に入れる

    本番影響を切る:ダークローンチ(裏で処理、ユーザー未露出) マージ=リリースの場合 より慎重にPRを分割する必要 feature flagが必須 不完全な状態でもマージ可能にする設計 マージ≠リリースの場合 より大胆にPRを分割できる developブランチで統合テスト リリース時にまとめて有効化 PRを小さくする勉強会 分割統治で開発を制する 27
  8. 学んだ観点を使ってみよう ①関心の分離 / ②構造 / ③状態・リスク / ④制約 / ⑤プロセス

    実践では複数の観点を組み合わせることが多い 例:構造で分けつつ、状態・リスクにも配慮する PRを小さくする勉強会 分割統治で開発を制する 33
  9. ケーススタディ1: ユーザー認証機能の追加 従来のアプローチ 「ユーザー認証機能」で1PR 分割案(②構造 + ③状態・リスク) 1. 認証用データベーステーブル追加 ②構造(DB層)

    2. JWTライブラリ導入と基本設定 ①関心の分離(設定) 3. ログインAPI実装(未接続状態) ③状態・リスク(段階的実装) 4. 認証ミドルウェア実装 ②構造(ミドルウェア層) 5. 既存エンドポイントに認証適用 ②構造(既存への適用) 6. フロントエンド側のログイン画面 ②構造(UI層) PRを小さくする勉強会 分割統治で開発を制する 34
  10. ケーススタディ2: 既存APIの仕様変更 課題 レスポンス形式を変更したいが、APIバージョニングなし 分割案(④制約 + ③状態・リスク) 1. 新しいオプショナルフィールド追加 ④制約(後方互換性維持)

    2. クライアント側で新フィールド対応 ②構造(クライアント側) 3. 古いフィールドを非推奨マーク ③状態・リスク(段階的移行) 4. 古いフィールド削除 ③状態・リスク(段階的移行) PRを小さくする勉強会 分割統治で開発を制する 35
  11. 主な変更内容 1. 基盤整備(format、lint設定) 2. Machine entity削除(別タスク?) 3. Site entity修正 4.

    SiteRepository実装 + テスト(589行) 5. SiteUseCase実装 6. APIルート + バリデーション + テスト(215行) 7. ドキュメント更新 PRを小さくする勉強会 分割統治で開発を制する 37
  12. 分割案(どの観点を使ったか) 使用した観点: ①関心の分離 + ②構造 PR 内容 行数 観点 1

    基盤整備 50-100行 ①関心の分離 2 Machine entity削除 100-200行 ①関心の分離 3 Site entity修正 100-200行 ②構造(Entity層) 4 SiteRepository実装 + テスト 300-400行 ②構造(Repository層) 5 SiteUseCase実装 50-100行 ②構造(UseCase層) 6 APIルート実装 + テスト 200-300行 ②構造(API層) 7 ドキュメント更新 50-100行 ①関心の分離 PRを小さくする勉強会 分割統治で開発を制する 38
  13. レイヤー分割の順番 トップダウン(API → UseCase → Repository) メリット: API仕様が先に決まる、フロント並行作業可能 デメリット: 下層の実装で仕様変更リスク

    ボトムアップ(Repository → UseCase → API) メリット: データ層の制約を先に理解、確実に積み上げ デメリット: 全体像が見えにくい PRを小さくする勉強会 分割統治で開発を制する 39