3秒でわかる
何かを良くすると別の何かが悪くなる関係。速度とメモリ、安全と手軽さのように、設計では必ずどちらを取るかを選ぶことになります。
30秒図解
もう少し詳しく
どういうものか
トレードオフは、ある指標を良くしようとすると別の指標が悪くなる関係のことです。どちらも同時に最大化はできず、どこで折り合うかを選ぶことになります。技術選定の議論で「どちらが正解か」がいつまでも決まらないとき、その多くは正解が無いトレードオフを正解探しとして扱っているために起きています。
なぜ必要か
この言葉を持っていると、比較の仕方が変わります。良いか悪いかではなく、何を差し出して何を得るのかという形で選択肢を並べられるようになるからです。設計レビューで理由を説明するときにも、速度のためにメモリを使うと決めた、と言えれば後任にも意図が伝わります。数年後に前提が変わったとき、当時の判断を安全に覆せるのは、この交換条件が書き残されている場合だけです。
具体例
-- 検索を速くするためにインデックスを張る
CREATE INDEX idx_orders_user_id ON orders(user_id);
-- 得るもの user_id での検索が全件走査から木の探索になる
-- 失うもの INSERT と UPDATE のたびに索引の更新が入り書き込みが遅くなる
-- 索引そのものがディスクを消費する同じ形はどこにでも現れます。キャッシュを持てば表示は速くなり、代わりに古いデータが出るリスクを抱えます。型を厳しくすれば実行時のバグは減り、代わりに書く量が増えます。マイクロサービスに分ければ独立して直せるようになり、代わりに通信と運用の複雑さが増えます。
つまずきやすいところ
トレードオフだと言えばどんな選択も正当化できてしまう、という落とし穴があります。何を失うのかを具体的に書かないまま交換条件だと主張する説明は、判断の根拠になりません。実際には、片方が明確に優れていて交換条件が存在しない場面も多くあります。たとえばパスワードの平文保存に速度という利点はありません。もうひとつは、測らずに交換してしまうことです。速度のためにコードを複雑にしたのに、実測すると遅かったのは別の箇所だった、という手戻りは珍しくありません。交換するなら先に測ります。
似た用語との違い
| 語 | 意味 |
|---|---|
| トレードオフ | 一方を取ると他方を失う関係 |
| ボトルネック | 全体の性能を決めている最も遅い箇所 |
| 技術的負債 | 早さを優先して後回しにした修正の蓄積 |
覚え方
「何を差し出したのか」を必ず一緒に言えるかどうかで、判断が理解できているかを確かめられます。速くしたと言うだけでは足りず、何と引き換えに速くしたのかまで言えて初めて、その選択を他人が検証できる状態になります。