焦げた鍋の、例外処理(第二稿)
——家事のコンピュータサイエンス #9:エラー処理とリトライ

シマダマキノトモエ

前回は抽象化——「やっておいて」と中身を隠して、結果だけを約束する、つまり任せる話をした。やり方を相手に渡して、こっちは結果だけ受け取る。——でも、任せた仕事は、失敗するんですよ。渡した相手が、こっちの思ったとおりに返してくれないことがある。今日は、その失敗のほうの話をしたい。コンピュータではエラー処理リトライと呼ぶ仕組みです。やり直せば直る失敗と、やり直しても直らない失敗。間を置く知恵。黙って直す家と、いちいち報告する家。——どこまでが「任せる側の配線」で、どこからが「受けた側の腕」か、という前回の話は、もう繰り返しません。今日は、返ってきたものが期待とずれていたとき、その先で何をするか。焦げついた鍋を一個、台所に置いて、そこから話をはじめます。

エラーは仕様の一部——失敗を想定しない設計は、設計ではない

シマダ まず、意外に思われるところから入ります。まともなプログラムは、うまくいくときのコードより、失敗したときのコードのほうが長いんです。「正常に動いたらこうする」が三行で、「途中で失敗したらどうする」が三十行ある、みたいなことが、ふつうにある。うまくいく道筋——これを正常系といいます——を書くのは、実は簡単なんですよ。難しいのは、失敗する道筋——異常系のほう。ファイルが無かったら。通信が切れたら。途中で電気が落ちたら。それを全部書ききって、はじめて設計と呼べる。失敗を想定していない設計は、設計じゃないんです。うまくいく前提のメモ書きでしかない。

マキノ 失敗したときのほうを、長く書く。

シマダ ええ。で、これを家に持ってくると、面白いことに気づくんですよ。たとえば、一週間の献立。月曜はカレー、火曜は魚、水曜は……って、決めますよね。あの献立に、「カレーが失敗したら、出前」って、書いてあります?

マキノ 書いてないですね。そんなの、書いたことない。

シマダ 書いてないんです。家の計画って、ほとんど正常系だけでできてる。うまくいく前提で、献立も、段取りも、組まれてる。失敗したときにどうするかは、その場の出たとこ勝負。——プログラムの感覚からすると、これ、けっこう危うい設計なんですよ。異常系が、一行も書いてない。

マキノ ……でも、それ、職場だと、書いてあるんですよ。

シマダ というと。

マキノ ホテルの手順書、清掃のやり方が書いてある本体のほかに、ちゃんと章があるんです。汚損がひどかったときはどうする、設備が壊れてたらどこに連絡する、お客さんの忘れ物が出てきたらどう扱う。そういう、うまくいかなかったときの章が、別に立ててあって。新人にも、そこを読ませる。だから、何かあっても、手順書を開けば、対処が載ってる。

シマダ ——それ、まさに異常系が文書になってる職場、ですよね。失敗が起きることを、前提に組んである。マキノさんの現場には、失敗の章がある。なのに、同じ人が帰ってくる家の台所には、その章が、無い。同じ人なのに、職場では異常系を持っていて、家では持っていない。

マキノ ……でも、それ、だらしないからじゃ、ないと思うんですよ。手順書って、書く人と、読む人が、別なんです。私が書いた章を、来年入ってくる新人が読む。だから、文章にしておかないと、伝わらない。——家は、書く人と、読む人が、同じでしょう。私が失敗して、私が次に気をつける。文章にしなくても、自分が覚えてる。だから、章にならないんですよ。

シマダ ——あ、それは、大きいですね。異常系が文書になるのは、引き継ぐ相手がいるからだ。職場は、人が入れ替わるから、失敗を章に残さないと続かない。家は、同じ人が書いて同じ人が読むから、頭の中で済んでしまって、章にならない。——家に失敗の章が無いのは、怠けてるんじゃなくて、引き継ぎ先がいない場の構造なんですね。ただ、頭の中だけにあると、もう一人——夫さんには、その章が、一行も渡らない。この差は、今日ずっと、底に流れてる気がします。

リトライで直る失敗と、直らない失敗

シマダ 失敗には、大きく二種類あるんです。もう一度やれば通る失敗と、何度やっても同じ失敗。前者を、ざっくり一時的なエラーといいます。たまたま、その一回だけ、つまずいた。もう一回やれば、すっと通る。後者は恒久的なエラー。原因が、その入力そのものに焼き付いてて、何回繰り返しても、同じ結果が返ってくる。

マキノ もう一回で直るのと、何回やっても駄目なの。

シマダ そうです。で、コンピュータでは、失敗したらとりあえずもう一回試す、ということをよくやる。これをリトライといいます。ただ、何でもかんでもリトライすればいいわけじゃない。判断の基準が一個あって——同じ入力で、同じ結果しか返ってこないなら、繰り返すのは無駄なんです。一回目で縮んだものは、二回目も縮む。再現する失敗は、リトライしても、再現するだけ。

マキノ ……それ、洗濯で、わかります。シャツの襟の染み。あれは、もう一回洗えば、薄くなるんですよ。一回目で全部は落ちなくても、二度洗いすると、落ちる。あれは、もう一回やる価値がある。——でも、縮んだセーターは、二回洗っても、伸びないです。あれは、何回やっても、縮んだまま。やるだけ、生地が傷む。

シマダ きれいに二つです。染みは、一時的なエラー。リトライが効く。縮みは、恒久的なエラー。リトライしても、同じ。——で、マキノさんの家では、その見切りに、数が入ってるんじゃないですか。何回でやめる、っていう。

マキノ 入ってます。うちのルール、染み抜きは二回まで。二回やって落ちなかったら、三回目はやらない。クリーニングに出す。自分でこする回数を、二回で切ってあるんです。三回目を自分でやると、たいてい、生地のほうを痛めるから。

シマダ ——その「二回でやめて、外に出す」って、コンピュータでいうエスカレーションそのものなんですよ。自分の手元で何回かやってみて、駄目なら、上の段——専門のところ——に引き上げる。手元でリトライする回数に、ちゃんと上限が切ってある。無限に繰り返さない。マキノさんは、それを二回、って数で持ってる。私らは、その上限を、コードに書くんです。同じことを、家ではルール、コードでは設定で、決めてる。

指数バックオフ——すぐもう一回と、一晩置く

シマダ リトライには、一個、間の取り方のコツがあって。失敗した直後にすぐもう一回やると、たいてい、また失敗するんですよ。相手がまだ立て直してないところに、同じ要求をぶつけるから。だから、賢いやり方は、間隔を、だんだん空けていく。一回目の失敗のあとは少し待つ、二回目はもっと待つ、三回目はさらに長く——待ち時間を、手強いほど長く伸ばしていく。これを指数バックオフといいます。すぐ詰めずに、引いて、間を置いて、また試す。

マキノ すぐやり直さないで、間を空ける。手強いほど、長く。

シマダ ええ。なんで倍々に伸ばすかっていうと、これ、相手が一つのときより、みんなで同じ相手に殺到したときに効くんです。たとえば、停電のあと、町じゅうの機械がいっせいに「つなぎ直そう」とする。みんなが同じ間隔でやり直すと、また一斉にぶつかって、相手をもう一回潰す。だから、めいめいが、ばらばらに、だんだん長く待つ。——家事だと、相手は焦げた鍋一個なんで、倍々っていうより、手強い焦げほど、置く時間を長くする、くらいでいいんですけど。一個は、まさにその焦げた鍋。底に焦げついたやつを、すぐゴシゴシやっても、落ちないどころか、鍋を傷つける。でも、水を張って一晩浸け置きしてから擦ると、ふやけて、するっと落ちる。すぐもう一回と、一晩置いてからの使い分け。鍋が立て直す時間を、こっちが待ってやるわけです。

マキノ 焦げは、置いたほうが、落ちますね。確かに。

シマダ もう一個は……これ、人のほうにも、効くんじゃないかと思って言いかけたんですけど。喧嘩したあと、すぐにもう一回ちゃんと話そうとすると、また同じところでぶつかる。一日置いてからのほうが、通る。——あ、でも、いま言いながら、これは引っ込めます。焦げと人を同じ「バックオフ」で語るのは、雑です。鍋は、置けばふやける、という物理がある。人が一日置くと落ち着くのは、別の理屈で、たまたま「間を置く」という形が似てるだけかもしれない。比喩が効きすぎると、似てないところまで似て見える。焦げのほうだけ、残しておきます。

マキノ ……でも、間を置くと、っていうのは、わかりますよ。私も、夫と何かあったとき、その日のうちには、言わないようにしてます。次の日にする。その日に詰めると、たいてい、こじれるから。理屈は知らないですけど、間を置いたほうが、通るのは、本当です。

シマダ ——そう言われると、形だけは、同じなんですよね。すぐ詰めない。間を置く。理屈が違っても、やってることは、バックオフ。私は理屈で疑ったけど、マキノさんは、もう何年も、それをやってきてる。

例外を握りつぶす——黙って直す家

シマダ 失敗の扱いで、一個、やってはいけない、とされてることがあって。失敗を捕まえて、何もしない。エラーが起きたのを受け取っておきながら、握ったまま、上に何も伝えない。これを例外の握りつぶしといいます。何が悪いかというと——失敗が起きたことが、上流に伝わらない。だから、原因がそのまま残って、同じ失敗が、また起きる。黙って下で処理しちゃうと、永遠に直らないんですよ。表向き、何事もなかったように見えるから、誰も直そうとしない。

マキノ 失敗を、黙って、なかったことにする。

シマダ ええ。で、これ、家にも、あるんじゃないかと。たとえば——夫さんが畳んだ洗濯物を、後で、黙って畳み直す。前回もちょっと出ましたけど、あれを「やり方が違う」って話で見るんじゃなくて、今日は失敗の伝え方として見たいんです。本人には、何も言わない。黙って直す。すると、夫さんには、自分の畳み方が「直された」という情報が、一回も返らない。だから、次も同じように畳む。こっちはまた黙って直す。——これ、握りつぶしなんですよ。エラーが、本人に返ってない。

マキノ ……それ、私です。やってます。畳み直し、いまだに。言わずに。

シマダ でも——ここ、片側だけ責めると、嘘になるんです。毎回エラーを投げる家は、疲れる。畳むたびに「ここ違う」「やり直して」って、いちいち本人に返してたら、家の中が、ずっとエラーの鳴りっぱなしになる。それはそれで、暮らせない。だから、握りつぶしは、平和を保つ技術でもあるんですよ。いちいち言わずに、黙って直しておくことで、波風が立たない。コンピュータでは「握りつぶすな」が原則だけど、家では、握りつぶしたほうが回ることも、ある。

マキノ ……逆も、あるんですよ。夫が、私に、言わないやつ。

シマダ というと。

マキノ 私が買い物に行って、買い忘れがあったとき。夫、気づいても、たいてい言わないんです。自分で、コンビニで足してくる。「醤油、無かったよ」とは、言わない。後で、私が棚を見て、あれ買ったはずなのに、って気づく。——あれも、握りつぶしですよね。私に、エラーが、返ってない。夫は夫で、波風立てないように、黙って足してる。

シマダ ——そう、両側にあるんです。ただ、ここで気をつけたいのは、その二つ、向きが逆なんですよ。マキノさんの畳み直しは、黙ってて、正解のやつ。夫さんの買い忘れの握りつぶしは、黙ってると、損するやつ。同じ「握りつぶし」でも、片方は黙って合ってて、片方は言ったほうがよかった。「両側にある」のは、当事者が二人いるって話で、良し悪しまで対称なわけじゃない。問題は、握りつぶすこと自体じゃなくて——「報告するコスト」と「黙って直すコスト」を、その都度、天秤にかけてるかなんです。返したほうが直るけど、家がうるさくなる。黙って直すと静かだけど、同じ失敗が続く。どっちを取るかは、その家事と、その回ごとに、違う。畳み方は黙って直していい、でも、醤油は一回言ったほうがいい、とか。

マキノ 醤油は、言ったほうがいいですね。言わないから、私、次もまた同じ店で、同じものを買い忘れるんですよ。

シマダ ——それです。握りつぶされると、原因が残る。同じ買い忘れが、再生産される。畳み方みたいに、直しても次に響かないものは、黙っていい。でも、買い忘れみたいに、伝えれば次から直るものは、握りつぶすと、もったいない。握りつぶしていいかは、それを返したら次が直るか、で決まるんです。畳み直しと買い忘れが逆を向いてるのは、ちょうど、その基準の表と裏なんですよ。

フェイルセーフとフォールバック——プランBは、敗北じゃない

シマダ 失敗を前提にした設計には、二つ、有名な構えがあって。一個はフェイルセーフ失敗しても、安全な側に倒れるように作っておく。鍋を火にかけたまま忘れても、ある時間で勝手に火が消える、みたいな。失敗しないようにするんじゃなくて、失敗したときに、被害が出ない側に倒れる。——ここで大事なのは、フェイルセーフは、料理そのものは諦めてるんですよ。火が消えれば、火事は防げるけど、その料理はもうできない。機能を捨てて、安全だけ取る。もう一個がフォールバック本命が駄目だったときの、代わりの手。本命がこけたら、自動で代替に切り替える。フェイルセーフが「諦めて安全に倒れる」のに対して、フォールバックは「別の手で、やることはやり遂げる」——ここが、二つの違いです。

マキノ 片方は、諦めて安全に倒れる。もう片方は、別の手で、やり遂げる。

シマダ そうです。で、家事って、実は、フォールバックを持ってる家が、強いんですよ。炊飯が失敗した——芯が残った——ときに、冷凍ご飯がある。雨が降ってきたら、部屋干しに切り替える。夕飯を作る気力が今日は無い、っていう日のために、冷凍餃子が一袋、入れてある。——あの冷凍餃子は、夕飯っていう仕事を、本命とは別の手で、ちゃんと果たすんです。火が消えるフェイルセーフが「料理を諦める」のに対して、餃子は「料理を、別経路でやり遂げる」。だから、これはフォールバック。あの冷凍餃子を、手抜きとか、負けみたいに言う向きが、あるじゃないですか。でも、私は、あれは負けじゃなくて、設計だと思うんです。本命がこけたときの、代わりの手を、先に用意してある。フォールバックを一個持ってるだけで、家事は、ずいぶん倒れにくくなる。

マキノ うちも、冷凍庫に、餃子と、うどんは、いつも入ってます。あれが切れると、なんか、不安なんですよ。

シマダ その不安、よくわかります。フォールバックが、棚から消えた状態ですからね。——あ、ことわっておくと、これは「冷凍餃子を常備しましょう」っていう話じゃないです。何を代わりの手にするかは、家ごとに違う。餃子じゃなくて、近所の定食屋でも、実家に頼るでも、いい。私が言いたいのは、代わりの手を一個持っておくと、本命の失敗が、致命傷にならない、という構えのほうです。

マキノ ……それ、ホテルだと、ちょっと違うやり方をするんですよ。

シマダ というと。

マキノ 部屋が、何かあって使えなくなったとき——設備が壊れたとか、清掃が間に合わないとか——あるじゃないですか。あのとき、現場は、その部屋を、売り止めにするんです。直してから売るんじゃなくて、まず、売らないようにする。予約を、その部屋に入れないように、止める。直すのは、その後。お客さんを入れてしまってから直すと、もっと大きな問題になるから。先に、止める。隔離する。

シマダ ——それ、私らの言葉だと、フェイルファスト隔離なんですよ。おかしくなったものは、無理に動かし続けず、早めに、はっきり止める。で、止めたものを、いったん全体から切り離して、隔離しておく。動いてる残りに、影響が広がらないように。——直すより先に、止めて隔離する。私はさっき、フォールバック、代わりの手を持て、って話をしてたんですけど、マキノさんのは、その手前の構えなんですね。代わりを出す前に、まず、壊れたほうを止める。こっちのほうが、順番として、先かもしれない。現場のほうが、一手、早い。

エラーログ——失敗を、記録に変える

シマダ もう一個だけ、道具を。プログラムは、失敗したとき、それを記録に残すんです。いつ、どこで、何が、どう失敗したか。これをエラーログといいます。なんで記録するかというと——同じ失敗が何度も起きてるかどうかは、記録しないと、わからないから。一回ごとの失敗は、その場で対処して、忘れる。でも、ログを見返すと、「あ、これ、毎月同じところで落ちてる」って、見えてくる。そこで初めて、リトライじゃなくて、原因のほうを直す——根本対応、という手が出てくる。

マキノ 失敗を、その場で忘れないで、書いておく。

シマダ ええ。で、家は、たいてい、失敗を記録しないんですよ。覚えてるのは、そのときの気まずさだけ。何月何日に何が切れた、っていう事実は、残らない。気持ちだけが残って、事実は流れる。——たとえば、「先月も、月末に、牛乳が切れた」。これ、その都度は、「あ、牛乳ない」で、買い足して、終わり。リトライですよね。でも、もしそれが記録に残ってたら、「月末に牛乳が切れる」っていうパターンが見えて、月末に一本多く買う、っていう原因の修正に、変えられる。リトライを繰り返すのをやめて、根っこを直せる。

マキノ 書いておくと、繰り返してるのが、見える。——あ、でも、それ、現場で、一個だけ、決まってることがあって。

シマダ というと。

マキノ うちの記録、何かあったときに書くやつ——どの部屋で、何が、何回起きたかは、書くんです。でも、誰がやったかは、書かない。名前は、残さない。なんでかっていうと、名前を書くと、次から、みんな、隠すようになるんですよ。報告すると、自分が責められる、ってなると、黙る。黙られると、記録が、止まる。だから、誰が、じゃなくて、何が、だけ書く。それで、繰り返してるのが、ちゃんと上がってくる。

シマダ ——それ、まさに、コンピュータのログと、同じなんですよ。ログは、誰のせいかを問い詰めない。何が起きたか、だけを残す。マキノさんの現場が、名前を書かないのと、同じ理屈です。家庭の記録って、便利な反面、尋問の証拠にもなる。「ほら、先週も、先々週も、あなたが牛乳を切らしてる」って、突きつける道具にもなっちゃう。

マキノ ……それは、嫌ですね。書いたものを、後で出されるのは。それやられたら、私だって、もう、書かないです。

シマダ でしょう。現場が名前を書かないのと、同じです。誰が悪いかを裁くためじゃなくて、何が繰り返してるかを見るために使う。同じ記録でも、人を責めるのに使うか、仕組みを直すのに使うか。——マキノさんの現場は、もう、答えを出してるんですよね。名前を、書かない。

焦げた鍋の、例外処理

シマダ 最初に台所に置いた、焦げた鍋に、戻りますね。あれを前にして、できることは、たぶん、三つなんですよ。もう一度、擦る——リトライ。水を張って、浸けて、待つ——バックオフ。それと、もう一個。これはもう駄目だ、と、買い替える。——この三つ目の「諦める」を、私、長いこと、失敗の処理だと思ってなかったんです。でも、これも、立派な、正当なエラー処理なんですよね。直らないものを、直らないと見切って、手を引く。

マキノ ……三つ目が、いちばん、難しいんですよ。

シマダ というと。

マキノ 擦るのも、浸けるのも、やれば、やった気になる。でも、「これは、もう落ちない」って見切るのは、やめる勇気が、いるんです。それを覚えるのに、私、何年もかかりました。新人のころは、落ちない染みを、いつまでも擦ってたんですよ。生地が傷むまで。先輩に、「それ、もう落ちないよ」って言われても、わからなかった。自分でやって、駄目で、何回も繰り返して、ようやく、見て、わかるようになった。

マキノ いまは、部屋に入って、染みを見ると、だいたい、わかります。これは二度洗いで落ちる、これはクリーニング、これはもう落ちない。手をつける前に、だいたい、見える。二十二年やって、覚えたのは、たぶん、それなんですよ。落とし方じゃなくて、落ちないものを、落ちないと見分ける目

マキノ 焦げた鍋も、同じです。擦って落ちる焦げか、浸ければ落ちる焦げか、もう買い替えたほうがいい鍋か。見れば、だいたい、わかる。——それが、わからなかったころは、落ちない焦げを、いつまでも擦ってたんですよ。鍋のほうが、先に駄目になるまで。

マキノ ……結局、全部直そうとしないのも、一つの段取りなんですよね。直すものと、諦めるものを、先に分けておく。そのほうが、一日が、回るんですよ。

次回予告

第10回は、シリーズ最終回。アルゴリズムと最適化——これまで一つずつ取り上げてきた九つの概念を、一周して振り返る総集編にしたい。家事に、ほんとうに「最適」はあるのか。速く、無駄なく、いちばん効率のいいやり方を突き詰めていった先に、暮らしは、楽になるのか。それとも、最適化しすぎた暮らしは、どこかで、別のものを失うのか。——今回の「諦めるのも、正当な処理」は、その問いの入口でもある。最適化が拾わない「やらない・諦める」を、最後にどう置くか。その問いを置いて、シリーズを閉じる。

#10 家事に、最適はあるか——アルゴリズムと最適化(最終回)(近日公開)

このシリーズについて

#1 コンテキストは流しに溜まる#2 一軍は、コンロの脇に#3 洗濯物は、列に並ばない#4 十二時は、動かせない(ゲスト: イノウエミドリ)/#5 台所に、二人は立てるか#6 捨てるのは、誰の仕事か#7 お母さんしか、知らない#8 「やっておいて」の中身

「家事のコンピュータサイエンス」は、シマダ(AI使用法研究者)とマキノトモエ(ホテル客室清掃員22年)の対談シリーズです。コンピュータサイエンスの基本概念を一つずつ取り上げ、掃除・洗濯・炊事・買い物・名もなき家事に当ててみる。効率だけでなく、快適さ・分担・諦めも等価に扱います。生成エッセイの現在地に戻る。

← 第一稿
レビュー
← 目次

このページの記事はAI(ChatGPT)を用いて作成・編集されています。ソノダマリのレビューを経て書き直した第二稿です。