Я потерял неделю из-за сбоя, который должен был пережить
Однажды я потерял почти всю неделю работы из-за единственного сбоя. И не потому, что сам сбой был какой-то редкой катастрофой — это было обычное, заурядное прерывание, из тех, что случаются постоянно. Неделю я потерял потому, что по ходу дела ничего не сохранял. Поэтому прерывание, случившееся за несколько минут до конца, перечеркнуло дни накопленного прогресса, и вернуть хоть что-нибудь было невозможно. Всё просто исчезло — и всё это время оно могло исчезнуть, а я этого не замечал.
Самое мучительное, если оглянуться назад, — насколько всего этого можно было избежать. Сбой не уничтожил мою работу. Её уничтожило то, что я не сделал её способной пережить прерывание.
Тихий оптимизм допущения, что всё доработает до конца
Свои долго работающие процессы я строил так, будто они всегда будут выполняться начисто, от начала до конца, без перерывов, каждый раз. Никакого сохранения промежуточного состояния. Никакой возможности восстановиться на полпути. Просто запустить, дать отработать и предположить, что дело дойдёт до конца. Если бы кто-то прямо спросил меня, безопасно ли такое допущение, я бы ответил, что нет. Но я никогда себя об этом не спрашивал — и потому продолжал строить на нём дальше.
Это распространённый и почти невидимый вид оптимизма: молча считать, что счастливый путь — единственный путь. Ты проектируешь под мир, в котором всё идёт правильно, потому что именно этот мир ты представляешь, пока строишь. А потом выпускаешь это в реальный мир, у которого множество других путей, и большинство из них куда менее приятны.
Всё, что работает достаточно долго, будет прервано
Вот та истина, планировать вокруг которой я отказывался. Любой процесс, который работает достаточно долго, рано или поздно будет прерван. Сбой. Скачок питания. Машина, у которой кончилась память. Моя собственная ошибка. Перезагрузка, которая не могла подождать. Конкретная причина не имеет значения, и причин больше, чем можно перечислить.
На коротком отрезке прерывание — это риск. На достаточно длинном горизонте оно перестаёт быть риском и становится неизбежностью. Вопрос не в том, будет ли прервано что-то долго работающее, а лишь в том, когда и как часто. И стоит увидеть это так, как проектирование, будто прерывания не случится, предстаёт тем, чем оно и является: преднамеренным планированием ошибиться насчёт того, что гарантированно произойдёт.
Цену задаёт то, что вы сохранили, а не сам сбой
Это и есть то прозрение, которое перестроило всё моё представление об этом. Ущерб от прерывания почти целиком определяется тем, насколько восстановимой была ваша работа, — а не тем, насколько серьёзным было прерывание. Сбой редко оказывается значимой переменной. Значимо то, что вы сделали заранее.
Один и тот же сбой, ударивший в один и тот же момент, обходится вам в пять минут, если вы недавно сохранили прогресс, или в пять дней, если не сохранили ничего. Прерывание в обоих случаях идентично. Последствия же различаются колоссально, и эта разница была целиком определена выбором, который вы сделали раньше, задолго до того, как сбой наступил. Не сбой решает, сколько вы потеряете. Это решаете вы, заранее, выбирая, какую часть работы вы готовы сделать восстановимой.
Контрольные точки — это арифметика, а не паранойя
Стоило мне взглянуть на это так, и доводы в пользу регулярного сохранения промежуточного состояния перестали выглядеть избыточной осторожностью и стали выглядеть простой арифметикой. Прерывание со временем неизбежно. Цена, когда оно случается, ограничена тем, как давно вы сохранялись в последний раз. Так что частое сохранение — это просто дешёвая страховка от гарантированного события, причём с премией, которую вы можете задать сколь угодно низкой, сохраняясь чуть чаще.
Отказ от этого — не храбрость, не сосредоточенность и не быстрота. Это просто плохая математика — отказ от недорогой защиты от того, что точно произойдёт, ради небольшого удобства прямо сейчас. Я поздравлял себя с тем, что не трачу время на страховочные сетки, и при этом тихо нёс огромный, незастрахованный риск против события, в котором даже не было сомнений.
Проектируйте под возобновление, а не только под перезапуск
Однако есть уровень выше периодического сохранения, и именно он оказался важнее всего. Более глубокое решение — строить долго работающую работу так, чтобы после прерывания она возобновлялась с того места, где остановилась, а не начиналась заново с самого начала.
Это различие решает всё, когда прерывания часты. Процесс, который при каждом падении начинается с нуля, в достаточно скверной среде может вообще никогда не завершиться — каждое прерывание стирает всё, и если они приходят достаточно часто относительно времени выполнения, вы не продвигаетесь ни на шаг, как бы упорно ни работали. Процесс же, который возобновляется, всегда движется вперёд. Его можно сбивать снова и снова, и он всё равно, в конце концов, дойдёт, потому что каждое прерывание стоит лишь той малости, что накопилась с последнего сохранения. Перезапуск хрупок так, что это накапливается; возобновление устойчиво так, что накапливается в обратную сторону.
Тот же принцип — почти везде
Это обобщается далеко за пределы любого отдельного долгого вычисления. Это применимо почти к любой работе, ценность которой накапливается со временем и теряется, если её намеренно не сохранять. Шаблон один и тот же: прогресс накапливается, приходит прерывание, и всё, что не было сделано долговечным, исчезает.
Поэтому вопрос, который я научился задавать о чём угодно, что занимает время и имеет значение, — это уже не уютный вопрос «а что, если это прервётся?», который держат на расстоянии вытянутой руки как гипотезу. Это прямая версия в духе «считай, что это случится»: «когда это прервётся, сколько я потеряю?». Этот вопрос, заданный заранее, меняет то, что вы строите. Первый вопрос позволяет надеяться. Второй вынуждает готовиться.
Урок глубже: прерывание — это запланированное событие
Всё сводится к тому, что я перестал проектировать под мир, где всё идёт правильно, и начал проектировать под мир, где дела регулярно идут не так, — потому что второй и есть тот мир, который существует на самом деле, а первый никогда не был ничем, кроме приятного допущения, которым я тихо подменил реальность.
Отказоустойчивость, как я в итоге понял, — это не пессимизм. Это точность. Прерывание — не отдалённая гипотеза, которую можно оптимистично списать со счетов. По сути, это запланированное событие — вам просто не сообщают дату. Строить так, будто оно наступит, — не мрачно и не боязливо. Это просто честно по отношению к единственному миру, в котором вообще можно строить. Я потерял неделю, чтобы усвоить, что сбой никогда не был проблемой. Проблема была в том, что я построил нечто, не имеющее способа пережить прерывание, — в мире, где прерывание гарантировано.
— Никаких сигналов, никаких доходностей, не инвестиционный совет.