もう一度やったら通りました
一言でいうと
間欠的な失敗は「たまに起きること」ではなく、まだ測っていない確率であり、測った瞬間に、何回実行すれば直したと言えるのかも一緒に決まります。
なぜ必要なのか
「もう一度やったら動きました。」この一文が出ると、たいていの調査はそこで止まります。再現できないので直せず、直せないので記録も残りません。来週同じことが起きたら、最初からやり直しです。
ところが、この一文には、すでにデータが1つ入っています。1回は失敗し、1回は成功したのです。2回の試行のうち1回が失敗したという意味です。もちろん、これで「失敗率50%」とは言えません。試行が2回しかないからです。だから、次にすることは決まっています。もっと実行してみることです。
間欠的な失敗が特に危険な理由は、別にあります。直ったかどうかを1回の成功で判断させてしまうからです。失敗率10%の問題を直さないまま1回実行して合格すれば、何もしていないのに、直ったように見えます。その確率は90%です。
どう動くのか
1. 試行回数を書く。失敗率は、常に分数です。「たまに失敗します」は、分子も分母もない言葉です。200回実行して24回失敗したなら、0.12です。
2. 推定値に区間を付ける。200回中24回と20回中2回は、どちらも0.1ですが、信頼できる度合いが違います。比率の区間を求める方法は複数あり、失敗が0件のときやサンプルが少ないときにも崩れないものとして、ウィルソンスコア区間がよく使われます。失敗が0件のとき、区間の幅が0にならない点が重要です。0回見たからといって、確率が0であるわけではありません。
3. 失敗した実行の証拠を、その場で残す。間欠的な失敗は、もう一度呼び出せません。試行ごとに終了コード、標準エラー出力、かかった時間、前の実行との間隔をファイルに書いておけば、失敗した実行でだけ真になる条件が、表から自然に浮かび上がります。この記録がなければ、「そのときは何と出たんだっけ」と尋ねる相手がいません。
4. 何回実行すべきかを計算する。失敗率pの問題を直さないままn回実行して、すべて合格する確率は、(1-p)のn乗です。その確率を1-c以下に抑えるには、次が必要です。
(1 - p)^n <= 1 - c 양변에 로그를 취하면
n >= log(1 - c) / log(1 - p)
p=0.25, c=0.95 -> n >= 10.4 -> 11번
p=0.10, c=0.95 -> n >= 28.4 -> 29번
p=0.02, c=0.95 -> n >= 148.3 -> 149번
このコードブロックの韓国語の語句は、順に「両辺の対数を取ると」と、必要な回数を表す単位(回)という意味です。
この表が言っていることは明白です。まれな問題ほど、直したという主張により多くの試行が必要です。失敗率2%の問題を1回合格させて直したと言うのは、何も言っていないのと同じです。
現場での姿
1つ目は、観測が症状を変えることです。ログを付けて、デバッガーをかけて、1ステップずつ実行すると、症状が消えます。タイミングに依存する問題は、遅くなった瞬間に条件が成立しないからです。これは問題が消えたのではなく、観測方法が条件を変えたのであり、消えたという事実そのものが手がかりです。遅く実行して消えるなら、原因は速度か順序にあります。
2つ目は、リトライで覆い隠すことです。リトライは、間違った対応ではありません。ただし、リトライ回数を決めるには、失敗率が必要です。失敗率25%でリトライを3回許可すると、4回すべてが失敗する確率は0.4%です。この計算なしに「とりあえず3回」と書くと、根拠のない数字が運用ドキュメントに入ります。
3つ目は、隔離しないことです。間欠的に失敗するテスト1つがデプロイパイプライン全体を10回に1回ずつ止めると、人々は結局、失敗を無視する習慣を身につけます。その習慣は、本物の失敗にもそのまま適用されます。そのため、直すまでは隔離し、隔離した一覧と隔離した日付を残します。
4つ目は、直した根拠が1回の成功であることです。先ほどの計算がある理由です。直したあとに何回連続で合格させるべきかを先に決め、その回数を実行した記録を報告書に貼ります。
5つ目は、測定条件を書かないことです。同じ作業でも、連続で実行したときと、間隔をあけて実行したときで失敗率が違うなら、それ自体が原因を指すデータです。ところが、報告書に「失敗率25%」とだけ書くと、次の人は自分の条件で0%を見て「再現せず」と閉じてしまいます。試行回数とともにどのように実行したかを書いて初めて、その数字が再利用されます。
ここまでを1行にまとめると、こうなります。間欠的な失敗を扱うことは、バグを探すことである前に、分数を作ることです。分子と分母ができれば、その後の判断、つまりリトライを何回許可するか、隔離するか、直したと言ってよいかが、すべて計算になります。分数がなければ、その判断は、すべて好みになります。
実務で本当に大切なこと
- 「たまに」を分数に変えます。分母のない失敗率はデータではありません。
- 0件は0%ではありません。区間を一緒に書きます。
- 証拠は、失敗したその場でしか集められません。試行ごとに記録します。
- 直したという主張には、計算された試行回数が伴う必要があります。
次のラボですること
ときどき失敗する作業を受け取って、試行回数と失敗回数から失敗率と区間を測り、失敗した実行でだけ真になる条件を、試行の記録から抜き出します。間隔をあけて測り直して、観測が症状を消すことを自分で確認し、リトライバジェットと隔離の基準を計算で決めます。最後に、修正バージョンを計算された回数だけ実行して、「直した」を根拠とともに主張します。