Site Reliability Engineering #9

9章 単純さ

そうして費用をいくらつぎ込んでも、信頼性だけは手に入らない。 信頼性は、極限まで単純さを追求することでしか手に入らないのだ。

--- C.A.R Hoare、チューリング賞記念講演にて

プロダクションソフトウェアシステムの大部分では、安定性とアジリティをバランス良く調整しなければならない。 SREは信頼性を高めるためにプロセス、プラクティス、ツールを駆使してアジリティの犠牲を最小限に信頼性を確保する。 高い信頼性で素早くロールアウトできることでプロダクション環境の変更が理解しやすくなり、バグの発見と修正が短くなる。 信頼性を高めるためには予想通りに作業の目標を完遂する「退屈」なことが望ましいことが述べられている。

「退屈」であるためには必要な複雑さと想定外の複雑さを区別することが必要である。 必要な複雑さとは問題の定義から取り外せない本質的なもの、想定外の複雑さとはエンジニアリングによって解決できるものとある。 例えばWebサーバでWebページを高速に返すために必要な複雑さと、JavaでWebサーバを書いた場合のガベージコレクションがパフォーマンスに与える想定外の複雑さがある。 SREは想定外の複雑さがあるシステムに対して、システムの差し戻しや自身が継続的に取り除く努力を行うことがある。

24H365Dの稼働が求められるWebサービスでは新しいコードがある程度の負債と言える。SREは肥大化していくソフトウェアに対して削除していくことで潜在的な障害やバグの可能性を減らす

理想としては追加するものがなくなったのではなく、取り除くものがなくなった状態であり、分かりやすい最小限のAPIが目指すものである。

サポート可能なシステムを作成するにはシステムのコンポーネント疎結合にして単純にする。 単純さは開発者のアジリティとシステムの安定性を同時に高めてくれる。 システムがより複雑になるとAPI間やバイナリ間の責任範囲の分離が重要となる。 うまく設計された分散システムはスコープが明確ではっきりとした目的を持ち協調動作します。

ソフトウェアを単純にして信頼性を高め、ゴミが散らばらないように環境を保つことによって、本当のエンジニアリングが前進できるようにしてる。