本文へ移動

ホーム / EM / 第2部 技術の判断

第2部 技術の判断・第3章

アーキテクチャと技術的負債

★★☆ 重要6トピック・面接 3問

システムの全体像を説明し、負債の返済や大きな移行を事業と合意しながら進めるための知識を押さえる。

ひとことで

モノリスは1つにまとめた形、マイクロサービスはサービスごとに分けて独立してデプロイする形。チームの数と運用の力で選ぶ。

アーキテクチャの3つの形モノリス1つのアプリ・1つの DBデプロイも1つモジュラーモノリス1つのアプリの中を境界で分けるマイクロサービスサービスごとにデプロイ・DB を分ける右に行くほど、チームの独立性は上がるが、運用と通信の複雑さも増える多くのチームは左か真ん中から始め、必要になってから分ける
「どれが正しいか」ではなく、チームの数と運用の力に合う形を選ぶ

EM はアーキテクチャの細部を決める立場ではありませんが、システムの形とチームの形はつながっているので、全体像は説明できるようにしておきます。

モノリスマイクロサービス
向いている規模1〜数チームたくさんのチームが独立してリリースしたいとき
よい点作りやすい・テストしやすい・データの整合が簡単チームごとに独立してデプロイ・拡張できる
つらい点大きくなると変更の影響が読みにくく、リリースが詰まるネットワーク越しの失敗、分散したデータの整合、監視・運用の手間
必要な土台よいテストとモジュールの境界CI/CD・監視・分散トレース・オンコールの体制

間をとるモジュラーモノリス(1つのアプリのまま、中を機能の境界で分ける)から始め、チームが増えて境界がはっきりしてから切り出す、という進め方がよくとられます。「マイクロサービスにすれば速くなる」とは限らず、運用の土台がないまま分けると障害の調査がかえって難しくなります。

チームの分け方とコンウェイの法則

面接ではこう答える

モノリスはアプリと DB を1つにまとめた形で、作りやすくデータの整合も簡単ですが、大きくなると変更の影響が読みにくくなります。マイクロサービスはサービスごとにデプロイと DB を分ける形で、チームが独立して動けますが、ネットワーク越しの失敗や監視・運用の手間が増えます。私はまずモジュラーモノリスで境界をきれいにし、チームが増えてリリースが詰まるようになってから切り出すのが現実的だと考えています。

ひとことで

負債を見える化し、事業への影響で優先順位をつけ、計画的に返す。

技術的負債とは、早く出すために後回しにした設計やコードの問題で、放っておくと「利子」として開発の遅れや障害が増えていくものです。負債をゼロにすることは目指しません。大事なのは、見える化して、影響の大きいものから計画的に返すことです。

負債の一覧と見積もり

チケットやスプレッドシートに「負債の台帳」を作り、次の項目を書きます。

項目書くこと(例)
内容決済まわりのテストがなく、変更のたびに手で確認している
影響(利子)決済の変更1件ごとに確認で半日。月4件で約2人日。過去1年で障害2件
起きる頻度月4件の変更、今後の決済方法の追加で増える見込み
返す見積もりテストを書くのに 10人日
放置したときのリスクセキュリティ・障害・採用(古い技術で人が集まらない)など
負債の優先順位を決める2軸すぐ返す利子が大きく、安く返せる計画して返すロードマップに載せるついでに直す触るときに整える記録して待つ状況が変われば見直す大小利子(影響)返すコスト(小 → 大)
左上(利子が大きく安く返せる)から手をつけ、右上は計画して返す

優先順位は「利子の大きさ ÷ 返すコスト」でざっくり決めます。上の例なら、10人日の投資で月2人日が浮くので、約5か月で元がとれます。返し方は3通りを組み合わせます。

  • 毎回一定の割合:スプリントの一部(例えば 15〜20%)を負債の返済に充てると決めておく。割合はチームで決める。
  • ついでに直す:機能を作るとき、触る場所の周りだけ整える。
  • プロジェクトにする:大きな移行(言語やフレームワークの更新など)は、ロードマップに正式に載せる。

負債の返済を事業の言葉で説明する

面接ではこう答える

技術的負債は、早く出すために後回しにした設計やコードの問題で、放っておくと開発の遅れや障害という利子がつきます。ゼロを目指すのではなく、台帳に内容・影響・返すコストを書いて見える化し、利子の大きさを返すコストで割ってざっくり優先順位をつけます。返し方は、スプリントの一定の割合を充てる、機能開発のついでに直す、大きな移行はロードマップに載せる、の3つを組み合わせます。

「コードが汚い」「リファクタリングしたい」では、事業側には伝わりません。時間・お金・リスクの言葉に直し、返さない場合に何が起きるかも並べます。

技術の言葉事業の言葉に直すと
決済のコードにテストがない新しい決済方法の追加に今は1か月。返せば2週間になる
この部分がよく落ちるこの部分の障害が年2回あり、1回あたり売上が〇〇円減った
フレームワークが古いサポートが終わった版で、脆弱性が出ても直せない
ビルドが遅い開発者1人あたり1日30分待っている。10人で月約100時間

提案の形

  • 投資と回収:「10人日で、月2人日が浮く。約5か月で元がとれる」のように示す。
  • 選択肢:今やる・次の四半期にやる・やらない、のそれぞれで何が起きるかを並べる。
  • 報告:終わったら約束した数字が改善したかを報告する。次の投資の合意がとりやすくなる。

数字は完璧でなくてかまいません。前提を書いて「ざっくりこのくらい」と示すほうが、何も示さないより判断の材料になります。

ひとことで

古いシステムを一度に切り替えず、入口で振り分けながら機能を1つずつ新しい側へ移す(ストラングラーフィグ)。

段階的な置き換え(ストラングラーフィグ)利用者入口(振り分け)新しいシステム移した機能から順に古いシステムまだ移していない機能新しい側の割合を少しずつ増やし、最後に古い側を止める。問題があれば振り分けを戻す
一度に全部を切り替える「ビッグバン移行」は、失敗したときに戻せない

古いシステムを作り直すとき、全部を作り終えてから一度に切り替えると、途中で価値が出ず、切り替えの失敗も大きくなります。入口で振り分けながら機能を1つずつ移すストラングラーフィグ(絞め殺しの木。古い木に巻きついて育つ植物にちなむ)がよく使われます。

段階やること
準備入口(ゲートウェイなど)を置き、振り分けられるようにする。監視で新旧を比べられるようにする
1つ移す影響が小さく、境界がはっきりした機能から移す
比べる一部の利用者だけ新しい側に流す。結果やエラー率を新旧で比べる
広げる問題がなければ割合を増やす。問題があれば振り分けを戻す
止めるすべて移したら古い側を止め、コードとデータを片づける

EM が気をつけるのは、移行中は新旧2つを運用する期間になることです。オンコールや問い合わせの負担が一時的に増えるので、計画に入れておきます。「最後の2割」が残り続けないよう、古い側を止める日もロードマップに載せます。

面接ではこう答える

大きな移行は、全部作ってから一度に切り替えると、途中で価値が出ず、失敗したときに戻せません。そこで入口に振り分けの仕組みを置き、影響の小さい機能から1つずつ新しいシステムに移します。一部の利用者だけ新しい側に流して新旧の結果やエラー率を比べ、問題がなければ割合を増やし、問題があれば戻します。移行中は2つを運用する負担が増えるので、その分の人と、古い側を止める日まで計画に入れます。

データは、アプリのコードと違って壊れると元に戻せないことがあります。EM は DB の細部まで知らなくても、次の点は設計レビューや計画で必ず確かめます。

観点確かめること
バックアップと復元バックアップがあるだけでなく、実際に復元を試したか。何時点まで戻せるか
スキーマ変更大きなテーブルの変更でロックや長時間の停止が起きないか。戻し方はあるか
データ移行移行の前後で件数や合計が合うかを確かめる手順があるか
個人情報どこに何を持つか、誰が見られるか、消す依頼にどう応えるか
保存期間いつまで持つか。増え続けたときの容量とコスト
整合性お金・在庫など、ずれてはいけないデータはどれか

特に「バックアップはあるが、復元を試したことはない」は、障害のときに初めて復元できないと分かる典型です。半年に1回など、復元の訓練を計画に入れます。

SRE の「DB運用」

依存の更新は小さく、こまめに更新の PR が届く自動化ツールCI で確かめるテストが守るこまめにマージ週ごとなど放っておくと:何年分もの更新がたまり、移行プロジェクトになる
更新を小さく続けるほど、1回の手間とリスクは小さくなる

アプリは多くのライブラリやランタイム(言語の実行環境)に依存しています。更新を後回しにすると、脆弱性が見つかったときにすぐ直せない、サポートが終わった版で動き続ける、といったリスクになります。

やること例
更新を自動化する依存の更新の PR を自動で作るツールを入れ、CI で確かめてこまめにマージする
サポート期限を一覧にする言語・フレームワーク・OS・DB の版と、サポートが終わる時期
脆弱性の対応の目安を決める深刻度ごとに「何日以内に直すか」をチームで決めて守る
担当を決める更新の PR を誰が見るか、当番を決める

EM は、こうした作業が「誰の仕事でもない」状態にならないよう、計画の中に時間を確保します。サポート期限は事業側にも分かる言葉で伝えやすく、負債の返済の説明にも使えます。

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • モノリスかマイクロサービスかは、チームの数と運用の力で決まる
  • 技術的負債は「利子 ÷ 返すコスト」で優先順位をつけ、事業の言葉で説明する
  • 大きな移行は段階的に置き換え、いつでも戻せるようにする

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1技術的負債の返済をどう事業側に説明しますか?

模範回答

「コードをきれいにしたい」ではなく、時間・お金・リスクの言葉に直して、投資として説明します。まず負債の一覧を作り、それぞれが今どれだけ損をしているかを数字にします。たとえば「決済まわりにテストがなく、変更のたびに確認で半日かかる。月4件で2人日、過去1年で障害が2回」という形です。

そのうえで「10人日かけて自動テストを入れると、毎月2人日が浮き、約5か月で元がとれる。新しい決済方法の追加も1か月から2週間になる」と、投資と効果、返さなかった場合のリスクを並べます。全部を一度に返すのではなく、影響の大きい順に、スプリントの一定割合を充てる形で合意をとります。

返したあとは、約束した数字が改善したかを報告します。結果を見せることで、次の投資の合意もとりやすくなります。

深掘りされたら

  • 影響が数字にしにくい負債(古いライブラリなど)はどう説明しますか?
  • 事業側が新機能を優先したいと言ったらどうしますか?

見られているポイント影響の数値化と投資対効果

Q2モノリスをマイクロサービスに分けたいという提案が出ました。どう判断しますか?

模範回答

まず「何に困っていて、分けると何が解決するのか」を聞きます。リリースが詰まる、変更の影響が読めない、一部だけ負荷が高い、などの具体的な問題がなければ、分けることで運用の手間だけが増えるからです。

問題がはっきりしていても、すぐ全部は分けません。例えば、まずモジュールの境界をきれいにし、独立させる価値が一番大きい1つだけを切り出します。その前に CI/CD・監視・分散トレース・オンコールの体制が整っているかを確かめ、足りなければそれを先に作ります。チームの分け方とサービスの分け方をそろえることも意識します。

深掘りされたら

  • 切り出す最初のサービスはどう選びますか?
  • データベースはどう分けますか?

見られているポイント目的から考えるか、運用の土台とチームの形まで見ているか

Q3古いシステムの置き換え(リプレイス)を任されたら、どう進めますか?

模範回答

一度に切り替えるのではなく、段階的に移す計画にします。入口に振り分けの仕組みを置き、影響の小さい機能から新しいシステムへ移し、一部の利用者で新旧を比べてから割合を増やします。問題があれば振り分けを戻せるようにしておきます。

計画では、移行中は新旧2つを運用する期間になるので、オンコールや問い合わせの負担を見込んで人を確保します。事業側には、途中でどんな価値が出るか、いつ古い側を止めるかを示し、撤退や延期の判断基準も先に合意しておきます。最後の一部が残り続けないよう、古い側を止める日もロードマップに載せます。

深掘りされたら

  • 移行が予定より遅れたら、どうしますか?
  • データの移行はどう確かめますか?

見られているポイント段階的な移行と戻し方、移行期間の運用負担を考えているか