なぜ速い開発チームほど、変更を検知してしかテストしないのか
Hatched by John Smith
Jun 10, 2026
1 min read
3 views
64%
速さを邪魔しているのは、テストそのものではない
毎回のプルリクエストで10分待つ。これが積み重なると、開発者はテストを信じなくなるのではなく、テストに触れる気力を失う。待ち時間は単なる不便ではない。思考の連続性を断ち切り、修正の意図を曖昧にし、確認したいことを先延ばしにする。結果として、品質を守るための仕組みが、かえって品質改善の速度を下げる。
ここで重要なのは、問題の本質が「テストが遅いこと」だけではないという点だ。より深い問題は、すべてを毎回同じように検証する設計にある。もし変更したのが1つのコンポーネントだけなら、なぜ全コンポーネントを毎回同じ重さで走らせるのか。もし検索対象が明らかに絞られているなら、なぜ広大な全文を毎回なめるのか。遅さの正体は、実は計算量の問題であると同時に、知識の使い方の問題でもある。
この視点で見ると、フロントエンドのインタラクションテストと、検索エンジンの日本語 Sparse search は、遠い世界の話ではない。どちらも問うているのは同じことだ。**「本当に必要なものだけを、どうやって賢く探し当てるか」**という問いである。
全件実行は安心に見えて、しばしば最も非効率な安全策である
「全部走らせれば安心」という感覚は強い。網羅性のあるチェックは心理的に分かりやすく、説明もしやすい。だが、現実の変更は均質ではない。ある変更はボタンの表示だけを変え、別の変更は状態管理の流れを変え、さらに別の変更は複数コンポーネントに波及する。すべてを同じ粒度で扱うのは、町内の小さな落とし物を探すのに、都市全体を毎回掘り返すようなものだ。
検索の世界でも同じ構図がある。従来の「すべての文書を同じ強さで評価する」方法は、確かに分かりやすい。しかし膨大な日本語文書の中から関連性の高いものを探すとき、単純な総当たりはコストが高すぎる。そこで Sparse search の発想が生きる。すべてを均等に見るのではなく、関連性の高い語や特徴にだけ重みを寄せる。これは単なる高速化ではない。探索そのものの設計を変えている。
テストも同じだ。変更されたコンポーネントだけを検知し、そこに紐づくテストだけを回す。これは手抜きではない。むしろ、変更の局所性を理解したうえで安全を維持するための設計だ。重要なのは、全件実行を「真面目さ」の象徴として扱わないこと。真面目さは、総量ではなく適合度で測るべきである。
速いシステムとは、たくさん動くシステムではない。必要なときに、必要な場所だけを正確に動かすシステムである。
変更を理解するとは、差分を読むことではなく、影響範囲を推定すること
ここで一つ、見落とされがちな視点がある。変更検知とは、単にファイル名やディレクトリ名を見て「この部品が変わった」と判定する作業ではない。本当に難しいのは、その変更がどこまで波及するかを推定することだ。
たとえば、UI上のラベル文言を1文字変えただけなら、影響範囲は比較的狭いかもしれない。だが、同じコンポーネントでも内部で状態遷移の条件が変われば、別の画面や別のテストケースに連鎖的な影響が出る。つまり、変更検知の価値は「変わった場所を見つけること」ではなく、変化の半径を測ることにある。
検索で言えば、Sparse search は入力中の語句に対して、どの特徴量が本当に効いているのかを絞り込む行為に近い。日本語のように形態が複雑な言語では、表面的な一致だけでは十分でない。文脈、語の分割、意味の近さ、ノイズの扱いなどを含め、関連性の核を見つける必要がある。これはテストの世界でも同じで、単純なパス名一致だけではなく、コンポーネント間の依存関係や再利用関係まで含めて「この変更は何に効くのか」を見なければならない。
このとき有効なのが、ファイル単位ではなくグラフ単位で考えることだ。コンポーネントは孤立した箱ではなく、依存のネットワークの中にある。ある変更がどのコンポーネントに伝播しうるかをグラフとして捉えれば、テストの選択は一気に知的になる。全件実行は「念のため」の保険だが、影響範囲推定は「合理的な保険設計」だ。
高速化の本質は、無駄を削ることではなく、信頼を再設計すること
ここで誤解してはいけないのは、選択的実行が単なる最適化ではないということだ。もし仕組みが雑で、変更検知の漏れが多ければ、速くはなるが信頼できない。するとチームは結局、疑心暗鬼になって全件実行へ戻る。つまり、速度と信頼性はトレードオフではなく、信頼の設計品質によって両立が決まる。
この構造は検索でも同じで、Sparse search の価値は「速く探せる」ことだけではない。関連性の低い候補を減らしながら、意味のある候補を残すことで、検索結果の体験を改善する。速いのに外す検索は使えない。遅いのに当たる検索も使いづらい。結局のところ、求められるのは精度とコストの同時最適化である。
ここで役立つ考え方がある。テストを「合否判定の装置」と見るのではなく、変更のリスクを見積もるレーダーと考えることだ。レーダーは全空域を無差別に高解像度で見る必要はない。怪しい方向には詳しく、安定した領域には粗く当てる。こうした可変解像度の発想は、インタラクションテストの設計にも、情報検索の設計にもそのまま応用できる。
たとえば次のように分けられる。
- 高リスク変更: 状態管理、非同期処理、依存関係の組み替え。ここは広めに回す。
- 中リスク変更: 既存コンポーネントの見た目や文言。関連テストを中心に回す。
- 低リスク変更: 純粋なスタイル修正や静的な表示の微修正。最小限の確認で済ませる。
この段階設計があると、テストは「毎回全部」から「変更に応じて濃淡をつける」へ進化する。検索でいえば、単語一致だけでなく、候補の絞り込みに応じて探索範囲を変えるのに似ている。重要なのは一律処理をやめることであり、それが最終的に信頼の厚みを増す。
開発体験と検索体験は、どちらも「待たされ方」の設計で決まる
人は、待ち時間そのものより、待ち時間の意味が見えないことに強くストレスを感じる。何を待っているのか分からない。どれくらい待つのか分からない。待った末に得られる確信が薄い。これが最悪の体験だ。
開発現場で10分のテストがつらいのは、10分という数字だけが理由ではない。10分のあいだに、開発者の頭の中で保っていた仮説や文脈が薄れていくからだ。修正した意図、関連する画面、再現しようとしていたバグの感触が、待機の間に蒸発する。結果として、確認が単なる義務になり、学習が止まる。
検索も同じだ。日本語の検索で期待するのは、ただ速く結果が返ることではない。自分の意図に沿った候補が、少ない往復で出てくることだ。雑に広く探すより、意図に近いところへ短い経路で到達できるほうが、体験は圧倒的によい。Sparse search の価値は、関連性の高いものに素早くたどり着けることにある。これはまさに、テスト選択の価値と同じだ。
良いシステムは、ユーザーや開発者に「待て」と言わない。代わりに、「あなたが本当に知りたいことはこれです」と先回りする。
この発想をチーム運営に置き換えると、GitHub Actions の効率化や変更箇所ベースの実行は、単なるCI改善ではなく、認知の断絶を減らすための仕組みになる。早く返ることは、単に時間を節約するのではない。思考の流れを守ることだ。
Key Takeaways
- 全件実行は安心の象徴ではなく、変更の局所性を無視した設計かもしれない。 まずは「何が変わったか」ではなく、「どこまで影響しうるか」を見る。
- テストを合否判定ではなく、リスク推定のレーダーとして設計する。 高リスク変更には厚く、低リスク変更には薄く当てる。
- 変更検知はファイル単位では不十分。 依存関係やコンポーネント間のつながりをグラフとして捉えると、より賢い選択的実行ができる。
- 検索の Sparse な発想は、テスト選択にもそのまま応用できる。 すべてを同じ重みで扱わず、関連性の高い部分に計算資源を寄せる。
- 開発体験を改善する最短経路は、待ち時間を短くすることではなく、待ち時間の意味を高めること。 何を検証しているのかが明確なら、少ない時間でも強い確信が得られる。
結局、速さとは「見ない勇気」ではなく「見るべきものを知る知性」
速いチームは、手を抜いているのではない。むしろ逆だ。何を省略してよく、何を絶対に省略してはいけないかを、仕組みとして定義している。そこには、変更の性質を理解し、影響の広がりを見積もり、関連性の高いものだけに計算を集中させる知性がある。
だから本当の問いは、「テストを全部回すべきか」ではない。「この変更に対して、どの確認が最も情報価値が高いのか」だ。検索も同じで、広く当てることより、意図に最も近い候補を最短で引き当てることが大切だ。
テストと検索は、どちらも探索の問題である。限られた時間の中で、どれだけ賢く、どれだけ確信を持って、必要なものにだけたどり着けるか。その問いに向き合うとき、10分の待ち時間は単なる遅さではなく、設計の思想を映す鏡になる。真に強いシステムは、すべてを同じように見ない。見るべきものを見極め、見なくてよいものを賢く脇に置く。そこに、速さと信頼の両方が宿る。
Sources
Hatch New Ideas with Glasp AI 🐣
Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)
Start Hatching 🐣