GITHUB OPERATIONS — ISSUE / PR / DoD

communicationの質が上がると
品質が上がり、工数も削減できる
というお話

― Issue / PR / RCA / DoD / 用語定義で「認識のズレ」を潰す

同僚向け勉強会 / GitHub運用の話

このトークの背景

「実装は終わっていたのですが、認識が違っていて…」

開発現場で、本当によく聞く言葉。しかも厄介なのは、技術力不足だけで起きる問題ではないこと。

  • 優秀なエンジニアがいる
  • レビュー文化もある
  • 実装速度も速い

それでも、なぜか手戻りが多いチームは普通に存在する。

理由はシンプル。問題は「実装力」ではなく「認識のズレ」だから。

今日話すこと

「コミュニケーション品質」を、実務目線で整理します。

  • 1 なぜコミュニケーション品質が 開発速度 に直結するのか
  • 2 なぜ強いチームほど Issue / PR を丁寧に書くのか
  • 3 なぜ Definition of Done(DoD) が重要なのか
  • 4 なぜ 用語定義 を揃える必要があるのか
  • 5 AI時代に、なぜ 認識合わせ がさらに重要になったのか

目次

  1. 本当に工数を溶かしているもの
  2. 雑なIssueは「推測」を強いる
  3. 良いIssueは「認識合わせの土台」
  4. 不具合Issueは「再現できること」が命
  5. 「Issueを書けば伝わる」は危険
  6. 強いチームほど「途中確認」を惜しまない
  7. 良いIssueがあると「会話の質」が変わる
  8. PRは「レビューしやすさ」まで設計する
  9. 良いPRは「チームの共通理解装置」
  10. bug修正PRでは RCA が重要
  11. before / after があるPRは強い
  12. DoDが曖昧だとチームは不安定になる
  13. 用語定義を揃えないと後半で事故る
  14. AI時代だからこそ「認識」が重要
  15. 結局、強いチームは「認識ズレ」を潰している

本当に工数を溶かしているもの

開発というと「コードを書くこと」が一番大変に見える。でも実際に工数を溶かしているのは、むしろこっち。

  • 認識ズレ
  • 仕様確認
  • レビュー往復
  • QA差し戻し
  • 「そういう意味ではなかった」
  • Businessとの期待値不一致
  • 再実装
  • release直前の炎上

つまり、ソフトウェア開発の工数の多くは 「不確実性」
そして、この不確実性は コミュニケーション品質でかなり削減できる

だから強いチームほど、丁寧に扱う

「認識ズレによる無駄な工数」を減らすために。

Issue

何を・なぜ作るか

Pull Request

何を・なぜ変えたか

Definition of Done

何をもって完了か

用語定義

同じ言葉=同じ意味

テスト観点

何を確認するか

レビュー観点

どこを見るか

雑なIssueは、実装者に「推測」を強いる

例えば、こんなIssue。


検索UIを改善する

- レイアウト修正
- バグ対応
      

これだと、実装者はまず 推測 から始めないといけない。

  • 何が問題なのか
  • 誰が困っているのか
  • どこまで対応するのか
  • 何をもって完了なのか
  • 既存仕様への影響はあるのか

人間は、空白があると勝手に脳内補完する。そして、その補完はかなり高確率でズレる。

良いIssueは、「認識合わせの土台」になっている

強いIssueは、単なるタスク管理ではない。
「実装者が最短で正しく理解するためのドキュメント」 になっている。

次の3枚で、記事のサンプルをそのまま見てみる。

良いIssue 例 ①GOOD


# Background
営業側では価格を500万円単位で扱っているが、
検索UIでは細かい数値入力ができてしまう。

そのため、
営業資料と検索条件にズレが発生している。

# Problem
1200万円で検索した場合、
営業資料上は1000万円帯として扱われるが、
検索条件は1200万円のまま保持されてしまう。

# User Story
ユーザーとして、
営業資料と同じ粒度で価格検索したい。

なぜなら、
営業担当と同じ条件で物件を探したいから。
      

→ なぜやるのか / 何が問題か / 誰のための機能か が冒頭で揃う

良いIssue 例 ②GOOD


# Acceptance Criteria
- 入力値を500万円単位へ丸める
- 1200 → 1000
- 1499 → 1500
- slider操作時も適用
- SP/PC両対応
- URL query parameterも同様に丸め込み

# Reproduction
1. 検索画面を開く
2. 価格に「1200」を入力
3. 検索条件を確認
4. 1200万円として保持される

# Expected
1000万円へ丸め込まれること
      

→ 完了条件が数値で決まっている / 再現と期待結果が明記されている

良いIssue 例 ③GOOD


# Possible Cause
price normalization処理が
manual input時のみ未適用の可能性あり

# Test Cases
- manual input
- slider input
- query parameter復元
- 検索条件再表示
- SP/PCレイアウト崩れ確認

# Out of Scope
- API変更
- DB変更
- 検索ロジック変更
      

→ どこから見ればよいか / 何をテストすべきか / どこまでやるか まで揃う

これだけで、かなり明確になる

  • なぜやるのか
  • 何が問題なのか
  • どこを見れば良さそうか
  • 何が完了条件なのか
  • どこまでやるのか
  • 何をテストすべきか
良いIssueは「実装が始まる前」に、認識のほとんどを揃えている。

不具合Issueで重要なのは、「再現できること」

特に不具合対応では、この3つがかなり重要。再現方法がないIssueは、調査コストが一気に上がる。

再現手順

どうやったら起きるか

期待結果

本当はどうなるべきか

実際の挙動

いま何が起きているか

さらに、原因の目星 まであるとかなり強い。


# Possible Cause
manual input側のみ normalize utilityが適用されていない可能性あり
      

予想が外れることもある。でも「どこから見ればよいか」の初動速度が大きく変わる。Issue段階のテスト観点は、実装者自身の確認漏れ防止にも効く。

「Issueを書けば伝わる」は普通に危険

どれだけ丁寧にIssueを書いても、認識ズレは普通に起きる。むしろ危険なのは——

「Issueを書いたから認識は揃っている」と思ってしまうこと。

ソフトウェア開発は複雑。これらは普通に発生する:

  • 実装して初めて見える問題
  • 実際に触って気づくUX違和感
  • 会話しないと分からない仕様解釈

重要なのは「Issueを完璧にすること」ではなく、認識合わせを始めやすい状態にすること

強いチームほど、「途中確認」を惜しまない

優秀なチームほど、こういう動きがかなり多い。

  • 不明点をすぐ聞く
  • 軽く同期する
  • 実装途中で相談する
  • 「この理解で合っていますか?」を頻繁に確認する

一見、コミュニケーションコストが高そうに見える。でも実際は逆。

後半で爆発する手戻りを、序盤で潰しているだけ。

良いIssueがあると、「会話の質」が変わる

Issueが雑だと、会話も雑になる。前提が揃っていないから。逆に Background / Problem / Acceptance Criteria / Out of Scope / Test Cases が整理されていると——

こんな議論ができる

  • 「このケースはACに含みますか?」
  • 「Out of Scopeですが将来影響ありそうです」
  • 「このUXの方がUser Storyに近そうです」
良いIssueは、コミュニケーションを減らすためではなく、コミュニケーションの質を上げるために存在する。

PRは「レビューしやすさ」まで設計されているべき

雑なPRもかなり多い。


バグ修正しました。
確認お願いします。
      

これだけ粒度が粗いと、Reviewerからすると「何を?」となる。

  • なぜ変更したのか
  • どこを見れば良いのか
  • 何を確認すべきか
  • テスト観点は何か

全部コードを読んで推測しないといけない。これは普通に高コスト。

良いPRは、「チームの共通理解装置」になっている

強いPRは、Reviewerだけを見ていない。

BUSINESS QA REVIEWER 将来の自分

全員に向けて書かれている。次の3枚で、記事のサンプルをそのまま見てみる。

良いPR 例 ①GOOD


# Summary
価格検索入力を500万円単位へ統一

# Background
営業資料と検索条件の価格単位に差異があり、
ユーザー混乱が発生していたため。

# RCA

## Root Cause
manual input時のみ price normalization処理が適用されていなかった。
slider側には既存実装が存在したが、input側で同じutilityを利用していなかった。

## Why Not Detected
slider操作中心で確認されており、manual inputの確認が漏れていた。
また、price normalizationに対する unit testも存在していなかった。
      

→ Summary で要点 / Background で動機 / RCA で「なぜ起きた・なぜ気づけなかった」

良いPR 例 ②GOOD


# Changes
- manual input時の丸め込み追加
- slider操作時も共通utilityへ統一
- URL query parameter復元時にも適用
- unit test追加

# Before
- 1200 → 1200のまま検索
- sliderとmanual inputで挙動差異あり

# After
- 1200 → 1000へ丸め込み
- 全入力経路で同一仕様へ統一

# Main Changes
- src/features/search/PriceFilter.tsx
- src/utils/price.ts
- tests/price-filter.test.ts
      

→ 変更点 / Before・After / 主要ファイル が一目で分かる

良いPR 例 ③GOOD


# Test

## Manual
- 1200 → 1000
- 1499 → 1500
- slider操作確認
- query parameter復元確認
- SP/PC確認

## Regression
- 他検索条件との組み合わせ
- 検索結果件数変化確認

# Review Focus
- 丸め込み仕様違和感ないか
- 共通utility化による副作用ないか
- 既存検索条件への影響ないか
      

→ 何をどう確認したか / レビューで特に見てほしい場所、まで書いてある

ここまで整理されていると

BUSINESS
変更意図を理解できる
QA
テスト観点を流用できる
REVIEWER
見るべき場所が分かる
FUTURE
将来の自分も追いやすい
PRは「マージするための作業」ではなく、「チームに残す共有知」。

bug修正PRでは、RCA がかなり重要

強いチームほど、「バグを直す」だけで終わらない。RCA(Root Cause Analysis)を共有知に変える。

なぜ起きたのか

なぜ検知できなかったのか

今回の修正で何を防げるのか

これがあると → 再発防止 / レビュー品質向上 / テスト不足の発見 / 設計負債の把握 につながる。

逆にRCAがないと「直ったけど、なぜ起きたかは曖昧」な状態に。これは将来的な再発リスク。

before / after があるPRは、圧倒的に分かりやすい

PRで特に効果が大きいのが Before / After を書くこと。レビュー時の認識コストがかなり下がる。

また、「テストしました」だけでは弱い。

何を」「どう確認したか」まで書かれていると、かなりレビューしやすい。

少なくとも「エンジニアがどう確認すればよいか」は書いてあると助かる。

DoD(Definition of Done)が曖昧だと、チームは不安定になる

「何をもって完了とするのか」をチームで揃えること。これが曖昧なチーム、かなり多い。

ある人にとって

「実装が終わったらDone」

別の人にとって

review approve → QA完了 → staging反映 → Business確認 → release完了 まで含めてDone

→ 全員が「終わったつもり」で会話してしまう。これは危険な兆候。

用語定義を揃えないと、後半で事故る

地味だけど、かなり怖いやつ。例えば「公開」。この単語、チームによって意味が違うことがある。

BUSINESS ユーザーに見える
開発 DB flag ON
CS 審査完了
MARKETING LP掲載済み

全員が 同じ単語で別の話 をしている。しかもこういうズレは release直前で爆発 しやすい。

→ だから強いチームほど、最初に言葉を揃える。

AIに実装を任せられる時代だからこそ、「認識」がさらに重要に

最近は、生成AIに実装そのものをかなり任せられるようになってきた。Issue作成もPR作成も、以前よりかなり楽。

  • Background整理
  • User Story整理
  • Acceptance Criteria作成
  • テスト観点洗い出し
  • RCA整理
  • PR文章作成

かなり高品質に出してくれる。だから——

「Issue書くの面倒」「PR整理が大変」は、以前ほど言い訳になりづらくなってきている。

生成AIを使わない手はない。

ただし、認識がズレたままAIに任せると危険

AIは実装も文章も作れる。でも「何を作るべきか」を決めるのは人間。認識がズレたまま指示を出すと——

ゴミが爆速で量産される。しかも、人間が雑に実装するより速い。

さらにAIは普通に嘘をつく。

  • 存在しない仕様
  • 実装していない変更
  • 間違った影響範囲
  • 嘘のテスト内容
  • 存在しないfile名

ファクトチェック / 実装内容との整合性確認 / 変更file確認 / テスト内容確認 を人間側が必ずやる。

AIは強力。でも「認識責任」まで肩代わりしてくれるわけではない。

結局、強いチームは「認識ズレ」を潰している

開発が速いチームは、コードを書く速度だけが速いわけではない。

  • Issueが分かりやすい
  • PRが読みやすい
  • RCAが共有されている
  • DoDが揃っている
  • 用語が統一されている
  • コミュニケーションが密
  • 確認コストが低い

だから、無駄な往復が少ない。結果として速い。

コミュニケーションは "ふわっとした話" ではなく、普通に開発生産性の話。

最後に

ソフトウェア開発は、コードを書く仕事に見える。
でも実際は 「人間同士の認識を揃え続ける仕事」 にかなり近い。

Issueを書く / PRを書く / RCAを共有する / 完了条件を揃える / 言葉を揃える / 途中で会話する

一見地味。でも、ここを丁寧にやるチームほど——

品質が高い / 手戻りが少ない / 開発速度が安定する / 属人化しにくい / Businessとの信頼が強い

そして結局、それが一番速い。

おわり / Q&A

議論したいポイントあればどうぞ 🙌

PDF化したいときは index.html?print-pdf をブラウザで開いて印刷 → PDF保存