アーキテクチャ・フィットネス関数

英語名 Architecture Fitness Function
読み方 アーキテクチャ フィットネス ファンクション
難易度
所要時間 1〜2時間
提唱者 Neal Ford, Rebecca Parsons, Patrick Kua
目次

ひとことで言うと
#

「このアーキテクチャは狙い通りに機能しているか」を自動テストで定量的に検証し続ける仕組み。コードにユニットテストがあるように、アーキテクチャにもテストを書くという発想。

押さえておきたい用語
#

押さえておきたい用語
Fitness Function(フィットネス ファンクション)
アーキテクチャの特性(パフォーマンス、セキュリティ、結合度など)数値で評価する関数のこと。合格ラインを設定し、CI/CDで自動実行する。
Evolutionary Architecture(進化的アーキテクチャ)
ビジネス要件の変化に追従して段階的に進化できるアーキテクチャ設計。フィットネス関数はこの進化を安全に行うためのガードレールになる。
Architecture Characteristic(アーキテクチャ特性)
パフォーマンス、可用性、セキュリティなどシステムの非機能要件を指す。
Guided(ガイデッド)
フィットネス関数が「進化の方向」を示してくれる状態。テストがないと自由に劣化できるが、テストがあれば望ましい方向にだけ変更が進む

アーキテクチャ・フィットネス関数の全体像
#

フィットネス関数:アーキテクチャ特性を自動検証するサイクル
特性を定義パフォーマンス・結合度セキュリティ等関数を実装閾値と計測方法をコードで定義CI/CDで自動実行PR・デプロイ時に検証閾値違反でブロック結果をフィードバック → 閾値を調整代表的なフィットネス関数の例パフォーマンスP95レイテンシ< 200msスループット > 500 rpsメモリ使用量< 512MB結合度循環依存 = 0パッケージ間依存< 5外部API呼出し先< 3セキュリティ既知脆弱性 = 0HTTPS率 = 100%依存ライブラリ更新< 30日合格 or 不合格デプロイ可否を自動判定
フィットネス関数の導入フロー
1
特性の選定
重要なアーキテクチャ特性を3〜5つ選ぶ
2
閾値の設定
現状値を計測し合格ラインを数値で定義
3
自動化
CI/CDパイプラインに組み込み毎回実行
継続的改善
ビジネス変化に応じて閾値と関数を更新

こんな悩みに効く
#

  • アーキテクチャの品質が徐々に劣化しているのに気づけない
  • 「パフォーマンスが大事」と言いつつ定量的な基準がない
  • リファクタリングした結果、かえって設計が悪くなったケースがある

基本の使い方
#

守りたいアーキテクチャ特性を選ぶ

すべての特性を守ろうとしない。ビジネスにとって最重要な3〜5つに絞る。

  • 決済システム → レイテンシ、セキュリティ、可用性
  • 社内ツール → 保守性、結合度、テストカバレッジ
  • リアルタイム通信 → スループット、レイテンシ、スケーラビリティ
現状値を計測して閾値を決める

いきなり理想値を設定するのではなく、現状を計測した上で「これ以上劣化させない」ラインを決める。

  • 現状のP95レイテンシが180msなら、閾値は200msに設定
  • 循環依存が2箇所あるなら、「これ以上増やさない」= 2以下
CI/CDパイプラインに組み込む

手動チェックは続かない。PRマージ前やデプロイ前に自動実行し、閾値を超えたらブロックする仕組みにする。

  • ArchUnitでパッケージ依存ルールを検証
  • Lighthouseでパフォーマンスバジェットを検証
  • 負荷テストツール(k6, Gatling)でスループットを検証

具体例
#

例1:フィンテックスタートアップがAPI応答速度を守る

従業員50名のフィンテック企業。サービス成長に伴いAPIレイテンシが3ヶ月で120ms→350msに悪化。ユーザーからの「遅い」というフィードバックが急増していた。

導入したフィットネス関数

特性関数閾値計測方法
レイテンシP95応答時間< 200msk6負荷テスト
スループット秒間処理数> 300 rpsk6負荷テスト
メモリ最大ヒープ使用量< 512MBPrometheus

CI/CDに組み込み、PRマージ前に自動実行。閾値を超えるPRは自動的にブロックされる。

導入から6ヶ月後、P95レイテンシは 350ms → 160ms に改善。それ以降も200msの閾値を一度も超えていない。

例2:大手小売のマイクロサービスがモジュール結合度を管理する

エンジニア200名体制の小売EC。マイクロサービス30個の依存関係がスパゲッティ化し、1つのサービスを変更すると平均4つのサービスに影響が波及していた。

ArchUnitを使って以下のフィットネス関数をCI/CDに追加。

  • 循環依存 = 0(検出したらビルド失敗)
  • 1サービスの外部依存先 <= 3サービス
  • 共有ライブラリの変更頻度 <= 月2回

結果、新たな循環依存の混入がゼロになり、サービス変更時の影響範囲が平均 4サービス → 1.2サービス に縮小。デプロイ頻度は週1回から日次に改善された。

例3:医療系SaaSがセキュリティ特性を自動検証する

患者データを扱う医療SaaS。年1回のセキュリティ監査で毎回指摘を受け、対応に3ヶ月を費やすのが恒例行事になっていた。

監査で指摘される項目をフィットネス関数化して日次で自動実行することにした。

  • 既知脆弱性のある依存ライブラリ = 0(Snykで検出)
  • HTTPS以外の通信 = 0(ネットワークポリシー検証)
  • 暗号化されていないデータストア = 0(Terraformスキャン)
  • 認証なしで到達可能なエンドポイント = 0(OWASPスキャン)

監査前の慌ただしい対応がなくなり、直近の監査では指摘事項ゼロを達成。セキュリティ対応のコストは年間で 約40%削減 された。

やりがちな失敗パターン
#

  1. 最初から完璧な閾値を求める — まず現状値を計測し、「これ以上悪化させない」ラインから始める。理想値をいきなり設定するとほとんどのPRがブロックされて形骸化する
  2. フィットネス関数を増やしすぎる — 関数が多すぎるとメンテナンスコストが跳ね上がる。ビジネスにとって本当に重要な3〜5特性に絞る
  3. 自動化せずにスプレッドシートで管理する — 手動計測は1〜2回で放置される。CI/CDに組み込んで初めて継続的な品質保証になる
  4. 閾値を更新しない — ビジネス要件やトラフィック量は変わる。四半期ごとに閾値の妥当性をレビューし、必要に応じて厳しくしたり緩めたりする

まとめ
#

アーキテクチャ・フィットネス関数は 「アーキテクチャのユニットテスト」 ともいえる仕組みで、重要な特性を数値化してCI/CDで継続検証する。守りたい特性を3〜5つに絞り、現状値をベースに閾値を設定し、自動化するのが導入の基本。閾値はビジネス変化に合わせて定期的に見直し、フィットネス関数自体も進化させていく必要がある。