台風は空振りに終わった:プロダクトマネージャーが台風に耐えるように、最も暗い時間をやり過ごす方法
先に、人を怒らせるかもしれないことを一つ言っておく。あなたが人生で経験する「最も暗い時間」のほとんどは、今回の台風と同じ結末をたどる――空振りに終わる。そして「空振りに終わった」というこの一言こそ、台風そのものより、プロダクトマネージャーを死に至らしめる。
今年の第9号台風「バウィー」は昨夜、南へ進路を変えた。舟山を正面から直撃することなく、台風級まで勢力を弱めながら、浙江省の温嶺から福建省の霞浦一帯の沿岸へ向かっていった。だから舟山や普陀のこちら側では、7月9日にはもう止めたフェリー、欠航した便、夜通し停泊地から沈家門西埠頭へ移した一隻また一隻の漁船――あとから見れば、みんな無駄骨だったように見える。今朝はもう、グループチャットで「知ってたら、夜通し船を動かさなくてよかったのに」と言う人がいる。
この一言のところで立ち止まってほしい。この一件でいちばん噛みしめる価値があることは、まさにこの「知ってたら要らなかった」の中に隠れているからだ。
前回、私は普陀山について書いた。観音に台風を防いでもらおうと願いに行くのではなく、堤防を修理しに行け、と。「直撃されなかった」ことを、神秘的な加護のおかげにするな。それは誤った原因帰属だ。 今回はそこから一歩先へ進める。堤防を修理し終えて、警報が本当に鳴り響いたあの夜、舵を握るあなたは、いったい何をすべきなのか?
私の答えはこうだ。台風に耐えるとは、いつも一つの動作ではなく、連なった三つの動作だ――台風が来る前に、備えを尽くす。台風のただ中で、風雨を引き受ける。台風が去ったあとに、ゴミを片づける。 この三つは、十回のうち九回が空振りに終わったとしても、一つも省いてはいけない。プロダクトマネージャーの最も暗い時間は、こうしてやり過ごすものだ。
一、台風が来る前:あなたの余裕は、すべて以前に蓄えたもの
最も暗い時間の中で、いちばん人を欺くものは「余裕」だ。
夜中にシステムが落ち、データがおかしくなり、上司から電話がかかってきても、平然と座って、一つひとつ事態を整理していく人がいる。あなたはそれを、生まれつきの精神力だ、その場の即興だ、と思う。違う。最も暗い時間の中の余裕は、一グラムもその場で生えてきたものではない。すべては普段の、あの「台風のない日々」の中で、少しずつ蓄えてきたものだ。
プロダクトやシステムを作る人間にとって、「蓄える」のはとても具体的なものだ。いつでも押せるロールバックのスイッチ。まず1%のトラフィックだけ流して試し、100%のユーザーを一気に水へ突き落とすことをしない段階的リリースの仕組み。ユーザーが罵る前に、どこから出血しているかを先に知らせてくれる監視とアラート。書き出されていて、しかも本当に演習した手順書。普段から少しずつ貯めておいた、まだ使うときが来ていない信頼とキャッシュフローの余裕。
ここでのキーワードは「本当に演習した」だ。
2017-01-31、GitLab は今日でも繰り返し語られる事故を起こした。あるエンジニアが深夜、間違ったデータベースに削除コマンドを叩き、本番データベースのデータを消してしまった。データベースを消したこと自体はこの世の終わりではない――全員の背筋を凍らせたのは、そのあとに起きたことだ。彼らには五種類のバックアップと複製の仕組みがあったのに、調べていくと、どれ一つとして本当に使えるものはなかった。自動の pg_dump バックアップは、設定ミスのせいで、実は一度も成功して走ったことがなかった。バックアップが失敗したらメールで通知するはずだったのに、その通知メールは DMARC の設定に黙って拒否され、誰も受け取っていなかった。Azure のディスクスナップショットはあったが、復元には18時間以上かかった。最後に GitLab を崖っぷちから引き戻したのは、あるエンジニアが事故の6時間前に、たまたま手動で取っておいた一つのスナップショットだった。この一つの「たまたま」があったからこそ、彼らは6時間分のデータだけを失って済んだのだ。
この一件は、「備えを尽くす」という言葉の本当の意味を、生々しく突きつけた。堤防を修理したつもりが、台風が来て初めて、それが絵に描いた堤防だったと気づく。 五種類のバックアップは、聞こえは鉄壁のようだが、どれ一つとして真剣に検証も演習もされていなかった。演習していない手順書は手順書ではない、願かけと呼ぶ。ドキュメントに書いた「我々には完璧な災害復旧計画がある」という一文は、台風が来る前は、一つの祈りと何ら変わらない。
もっと徹底したやり方は、いっそ台風が来るのを待たないことだ。Netflix は「Chaos Monkey」という名のプログラムを飼っている。その毎日の仕事は、本番環境で、あえて風もなく波も穏やかな真っ昼間を選んで、稼働中のマシンを何台かランダムに落とすことだ。聞こえは自傷行為のようだが、実はいちばん正直な演習だ――本物の台風が来て初めて堤防が絵だったと気づくくらいなら、いっそ毎日自分で狂った猿を一匹マシンルームへ放ち、まだ事故を起こしていないシステムを先に一度壊してみて、本当に立て直せるのか、立て直せないのかを見るほうがいい。Chaos Monkey に耐えられるあの余裕こそ、本物の余裕だ。こんなふうに痛めつけられたことのない余裕は、まだ運を使い切っていないだけだ。
だから第一の「空振りに終わる」がここに現れる。あなたが蓄えたあのロールバックも、演習も、バックアップも、そのほとんどは、一生のうち一度も使わない。使わないと、無駄にやった気がしてくる。だが視点を変えて考えてみてほしい――あなたが過ごしてきたあの平穏な日々は、運がよかったのではない、備えが買ってきたものだ。 「無駄な備え」を一度もしない人間は、まだ順番が回ってきていないだけだ。
二、台風のただ中:あなたは最前線に立って雨に打たれなければならない
どれだけ備えを尽くしても、台風が本当に顔面に襲いかかってくるその瞬間は、やはり痛い。このとき試されるのは、もう一つ別のものだ――引き受けること。
危機のただ中で、舵を握る者が、絶対にやってはいけないことが二つある――逃げること、そして責任の押しつけだ。
逃げるとは、自分を隠して風が過ぎるのを待つこと。責任の押しつけとは、慌てて「あのボタンを押したのは誰だ」を探すこと。この二つの動作は、その場ではあなたを少し楽にしてくれるが、同時にいちばん高価なものを殺してしまう――あなたのチームが、まだ前へ突っ込む勇気を持てるかどうか、だ。引き受けるとは、要するにその逆をやることだ――最前線に立ち、その場でいちばん難しいが、今すぐやらなければならない決定を下す。 まず止血する。ロールバックすべきならロールバックし、停止すべきなら停止し、切るべきなら切り、非を認めるべきなら認め、ユーザーに知らせるべきなら明日まで引き延ばさない。ツケは、あなたが先に引き受ける。
やはり GitLab のあの日だ。彼らは今日から見てもきわめて直感に反することをやった――データベースの復旧を公開ライブ配信したのだ。 数千人がオンラインで見守るなか、データベースを消した醜態も、五層のバックアップが全滅した内情も、少しずつ広げ、少しずつ直していった。これはパフォーマンスではない。これは「引き受ける」ことのいちばん硬い形だ――私がやらかした、私が全員の目の前でそれを直す、私は隠れない。一つの会社がこう振る舞えて初めて、チームのエンジニアは知るのだ。ここでは、事故が起きたときの第一反応は、直すことであって、隠すことではない、と。
一方、事故が起きるとまず会議を開いて責任を追及する場所と比べてみよう。事故が起きた瞬間、全員の最初の仕事は、いかに自分を切り離すかを考えることだ。ログを急いでバックアップし、チャット履歴を急いでスクショし、「このモジュールは私の担当じゃない」が口をついて出る。引き受けることの反対は、うろたえることではない、押しつけることだ。 責任を下のチームへ押しつけ、外の「運が悪かった」へ押しつける人間について、風がやんだあとにみんなが覚えているのは、後ろに縮こまっていたあの背中だけだ。
この段が三つの中でいちばん難しいのは、雨に打たれるのが本当に冷たいからだ。夜中の三時、事態はまだ見通しがつかず、すべての目があなたに注がれている。あの味は、いいものではない。だがあなたのチームがその瞬間に見ているのは、いつだって、あなたがうろたえているかどうか、模範解答を持っているかどうか、ではない――彼らが見ているのは、火がいちばん大きいとき、あなたが一歩前へ出たのか、一歩後ろへ縮んだのか、だ。 最も暗い時間が本当に量っているのは、この一歩の向きだ。
三、台風が去ったあと:散らかったゴミこそが本当の試験場
台風が通り過ぎ、空が晴れると、いちばん危険な気の緩みもやってくる。多くの人は風雨に耐え抜いたのに、最後に「片づけるのが面倒」で死ぬ。
風がやんだあとの散らかり放題こそ、本当に腕の見せどころだ。片づけるとは、ただ散らかった状態を整えてシステムを再び動かすことではない――それは復旧にすぎない。本当の片づけとは、今回の痛みを、次は二度と踏まないルールに変えることだ。振り返りは仕組みのところまで振り返り、今回の教訓を、次回自動的に効く一つのチェック、削り取った一つの隠れた危険、更新した一つの手順書に変える。
Knight Capital は、まさに片づけをしなかったせいで死んだ。2012-08-01の朝、この高頻度取引の会社は新しいコードをリリースし、エンジニアが手動で8台のサーバーへデプロイして、1台漏らした。よりによってそのサーバーには、とっくに廃止されたのに誰も削除していなかった旧機能のコードが残っていた。コードネームは「Power Peg」。新しいコードは、それと同名のスイッチを再利用していた。だから更新されなかったそのマシンで、本来なら墓の中に眠っているはずの死んだコードが呼び覚まされ、狂ったように市場へ注文を出しはじめた。45 minutes で、154銘柄にわたる約 ~397 million shares を約定させ、税引前損失は4.4億ドル。この会社はその年の暮れに買収され、消えた。
このチェーンがどれだけ短いか見てほしい。削除すべきなのに面倒で削らなかった廃コード一片、それに、チェックもなく1台漏らしたデプロイが加わっただけで、一つの会社の命を丸ごと奪った。 これが「片づけない」ことの極致だ――ゴミはシステムに残しておいても勝手に消えはしない、ただ静かに、それを点火する火花を一つ待っているだけだ。
もう一度 GitLab を振り返ろう。同じく命取りになりうる事故だったのに、彼らは事後に、公開してほとんど自虐的とすら言える振り返りレポートを書き、五層のバックアップの一層ずつがどう機能しなかったかを、一条ずつ書き出し、それから一条ずつ直していった。一方はゴミを免疫力に変え、もう一方はゴミをその場に残して爆発を待った。二つの会社が今それぞれどうなっているかは、あなたも知っての通りだ。
片づけには、特に逆にやってしまいやすいところがもう一つある。仕組みを掃け、人を掃くな。 振り返りの目的は「次はこの穴が自動的に埋まる」ようにすることであって、運悪くボタンを押し間違えたあの人を吊るし上げることではない。ひとたび人を吊るし上げはじめると、全員が最初に学ぶのは、次に事故が起きたらまず隠すことだ。あなたが仕組みだけを直し、誰がやったかを問わなければ、みんなは初めて、問題を真っ先に声に出す勇気を持つ。この「事に対して人に対せず」の振り返りは、もともとインターネットが発明したものではない、航空業界から育ってきたものだ。飛行機が一機墜ちれば、調査団の目的のすべては、同じ型式の機体が今後もう空から墜ちないようにすることであって、そのパイロットを恥辱の柱に釘づけにすることではない――なぜなら、ひとたび人を釘づけにしはじめると、次にミスをする乗員は隠すことを選び、そして隠すことが、次の一機をもっと悲惨に墜落させるからだ。Google はのちにこれを SRE 手册に書き込み、名前をつけた。「blameless postmortem(非難なき事後検証)」だ。GitLab のあのデータベースを消したエンジニアは公開処刑されなかった。これは情に流されたのではない、冷静なのだ――一度痛い目にあうことは成長ではない、痛みを二度と犯さないルールに変えて、はじめて成長だ。
四、あの「知ってたら夜通し避難させなくてよかった」に戻る
さて冒頭に戻り、今朝のあの「知ってたら、夜通し船を動かさなくてよかったのに」に戻ろう。
この一言は、実は前回のあの誤った原因帰属の鏡像だ。前回、人々は「無事」を観音の加護のおかげにした。今回、人々は「無事」を「もともと事故など起きなかった」のおかげにする。一方は手柄を菩薩に、もう一方は手柄を運に記す――どちらも密かに、あなたの次回の備えを取り消しにかかっている。
だが真相はこうだ。ほとんどの「空振りに終わった」は、まさに備えが成功した姿なのだ。 ある組織が、この何年か一度も「無駄骨」を経験していないなら、可能性は二つしかない――自分を欺いていて、幸運のたびに「我々のシステムに問題はない」と思い込んでいるか、あるいはすでに本当に一度ひっくり返され、血の授業料を払ったか、だ。Knight Capital は「空振りに終わった」ことがなかった。リリース前の一度ごとの無事を、すべて「プロセスに欠陥なし」と読み込み、そのままあの45分まで読み進めてしまったからだ。
台風「バウィー」は今回南へ去り、舟山はおそらく無事に切り抜けられる。だがあの漁民たちが今夜眠れるのは、台風が土壇場で気を変えたあのわずかな気まぐれのおかげではない、昨夜、夜通し停泊地から動かしたあの船たちのおかげだ。
次の最も暗い時間が正面から叩きつけてくるかどうか、あなたには決められない。あなたが決められるのは、台風に耐える者が決して欠かさないあの三つのことだけだ。台風が来る前に、堤防を、本当に波を防げるところまで修理する、紙に描くのではなく。台風のただ中で、隊列のいちばん前に立ってあの雨に打たれる。台風が去ったあとに、散らかったゴミを掃ききって、今後もう二度と犯さない規則に掃き上げる。この三つを全部やり切れば、人はあなたを運がいいと言うだろう。この三つで手を抜けば、Knight Capital のあの45分は、遅かれ早かれあなたに順番が回ってくる。
ディスカッション