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

PRを小さくする勉強会

 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