はじめに - なぜ予測が重要なのか
プロジェクトを進行していると、誰しもがこんなことを思ったことがあるではないでしょうか?
「もっと早く気づけたなぁ...」
「気づけていればこんなにめんどくさいことにならなかったのに...」
エンジニアリングだけではないと思いますが、上記より「予測する」という行動は未然に問題を防ぐには、とても重要そうです。
「シフトレフト」という言葉も最近よく聞きますが、こちらも未然に問題を防ぐために必要な考えとして広まっていますよね。
本記事では、「予測」「シフトレフト」それぞれの価値について考えを深めて、相互作用を引き起こすためにはどうすればいいか考えていこうと思います。
1-10-100の法則が示す「予測」の経済価値
ソフトウェア開発における品質管理の分野では「1-10-100の法則」が知られています。
これは問題の発見・修正にかかるコストが、工程が進むにつれて指数関数的に増大することを示しています。
- 設計段階: コスト 1
- 開発段階: コスト 10
- 本番環境: コスト 100
具体例で考えてみましょう!
設計段階で発見した場合のやること
- チーム内での議論
- 設計書の修正
本番環境で問題が発覚した場合のやること
- 原因調査
- 修正実装
- テスト
- デプロイとロールバック準備
- 他サービスへの影響調査と対応
- インシデントレポート作成
- 顧客への説明
後工程に行くにつれて、問題にかかわる人も増え、やることも増えていることが見て取れますね。
その他やることもあると思いますし、機会損失を含めれば100倍という数字も現実的なのではないでしょうか?
シフトレフトの本質は「予測」にある
シフトレフトは「テストを早期に行う」という単純な話ではありません。
その本質は「問題との出会いを早める」ことにあります。
しかし、ここに大きな課題があります。早期段階では、多くの問題がまだ「潜在的」な状態にあるということです。
- 10人でテストして動いたシステムが、1万人で動くとは限らない
- 今日動くコードが、3年後も保守可能とは限らない
- 現在のセキュリティ対策が、将来の脅威に対応できるとは限らない
これらの「まだ起きていない問題」を見つけるには、予測が不可欠です。予測なきシフトレフトは、見えている問題だけを早期に解決する活動に留まってしまいます。
予測が生産性を100倍にする理由
なぜ予測は「極めて生産性の高い仕事」なのでしょうか。
投資対効果の観点から
設計レビューで1時間かけて「3年後にこのデータ構造では破綻する」と予測し、設計を変更したと仮定します。
この1時間の投資が、3年後の以下の作業を防ぎます:
- データ移行バッチの開発(100時間)
- 移行期間中のシステム二重運用(200時間)
- 移行失敗時のリカバリ対応(50時間)
- 顧客影響の最小化対応(150時間)
1時間の予測が500時間の作業を削減。これが予測の生産性です。
ちょっと盛りすぎている感もありますが、実際起こりうることではあると思います。
複利効果の観点から
予測に基づいて早期に対策を打つことで得られる効果は複利的に増大します:
- 良い設計は、その上に良い実装を生む
- 良い実装は、保守しやすいコードを生む
- 保守しやすいコードは、素早い機能追加を可能にする
- 素早い機能追加は、ビジネスの競争力を高める
逆に、予測を怠った悪い設計は、技術的負債として複利的にコストを増大させていきます。
予測力を高めるために必要なこと
1. 「なぜ」を記録する文化
設計や技術選定の際、「なぜその決定をしたか」を記録することが重要だと考えます。
- 現在の前提条件は何か
- 将来どうなると想定しているか
- どのようなリスクを認識しているか
これらを記録しておくことで、将来の変化に対して適切に対応できます。
2. 過去から学ぶ仕組み
インシデントが発生したとき、「これは予測可能だったか」を必ず問うべきです。
- どの時点で予兆があったか
- なぜ見逃したのか
- 次は何を見るべきか
この振り返りが、組織の予測力を向上させます。
3. 予測を共有する場
個人の「嫌な予感」を組織の知識に変換する仕組みも構築しておくと、よさそうですね。
- 設計レビューでの「将来こうなりそう」という議論
- 定期的な技術的負債の棚卸し
- 予測と結果の記録
これらの活動により、属人的な予測力が組織的な能力に昇華されます。
予測とシフトレフトの相乗効果
予測とシフトレフトを組み合わせることで、以下のような好循環が生まれます:
- 予測により、将来の問題を特定 「このままだと1年後にパフォーマンス問題が起きる」
- シフトレフトにより、今すぐ検証 「想定される負荷でテストしてみよう」
- 早期の対策により、コストを最小化 「設計を見直して、スケーラブルな構造にしよう」
- 経験の蓄積により、予測精度が向上 「前回と同じパターンだ。今回は最初から対策しよう」
この循環により、開発プロセス全体の生産性が継続的に向上していきます。
予測の限界と向き合う
すべてを予測することは不可能だと思います。重要なのは:
- 予測の精度よりも、予測する習慣 完璧な予測を求めるのではなく、常に先を見る習慣が大切。
- 予測が外れても、思考プロセスに価値がある 予測のプロセスで得られた知見は、別の問題解決に活かす。
- 過度な予測は過剰設計につながる バランスが重要。ただし、予測不足よりも若干の過剰の方が安全。
実践:明日から始める予測
ミニマムな予測習慣
- コードを書く前の5分間 「このコードは1年後も理解できるか?」を自問する
- 設計レビューでの一言 「これ、将来問題になりそうな気がする」を恐れずに発言する
- 週次の振り返り 「今週起きた問題は予測できたか?」を5分だけ考える
チームでの予測文化
- 予測ログの導入 誰かの予測を記録し、後で答え合わせをする
- 「もしも」の時間 設計議論の最後に10分、「もしも」を話し合う
- 失敗からの学習 インシデント対応後に「予測可能性」を必ず議論する
まとめ:予測は最高の投資
エンジニアリングにおける予測は、最も費用対効果の高い活動の一つです。
1-10-100の法則が示すように、早期の問題発見は指数関数的なコスト削減をもたらします。
そして、早期発見を可能にするのが予測です。
シフトレフトを真に機能させるには、予測が不可欠です。
見えている問題を早期に解決するだけでなく、まだ見えていない問題を予測し、先手を打つ。
これがシフトレフトの本質的な価値だと思っています。
予測は特別なスキルではなく、必要なのは以下だけです:
- 少し先を見る習慣
- 予測を記録し共有する文化
- 予測と結果から学ぶ仕組み
今日の5分の予測が、1年後の500時間を節約するかもしれない、 今日の「嫌な予感」の共有が、3ヶ月後のシステム障害を防ぐかもしれないので、迷わず実践し、共有していこうと思います。
予測とシフトレフト。この2つを組み合わせることで、私たちは「問題を解決する」エンジニアに加え、「問題を予防する」エンジニアへと進化できます。
真に生産性の高いエンジニアを目指すべく、「予測」の日々を過ごしていきましょう。