살아남았어야 할 크래시 하나에 일주일을 날렸다

한 번은 단 한 번의 크래시에 거의 일주일 치 작업을 통째로 날린 적이 있다. 그 크래시 자체가 무슨 희귀한 대재앙이어서가 아니었다. 그건 평범하고 시시한 중단, 늘상 일어나는 종류의 일이었다. 일주일을 날린 건 작업하는 내내 아무것도 저장해두지 않았기 때문이다. 그래서 종료를 몇 분 앞두고 닥친 중단 하나가 며칠간 쌓인 진척을 통째로 내던져버렸고, 그중 무엇 하나 되돌릴 방법이 없었다. 그냥 사라진 것이다. 그리고 그것은 내가 알아채지 못한 채로 내내 사라질 수 있는 상태였다.

돌이켜보면 가장 아픈 부분은, 그것이 얼마나 완벽하게 피할 수 있는 일이었느냐는 점이다. 크래시가 내 작업을 파괴한 게 아니다. 내 작업을 살아남을 수 있게 만들지 못한 내 실패가 파괴한 것이다.

끝까지 갈 거라고 가정하는 조용한 낙관

나는 오래 도는 프로세스들을, 매번 처음부터 끝까지 중단 없이 깔끔하게 돌 것처럼 만들어두었다. 중간 상태를 저장하는 것도 없었다. 도중에 복구할 방법도 없었다. 그냥 띄워놓고, 돌게 내버려두고, 끝에 도달하리라 가정했을 뿐이다. 그 가정이 안전하냐고 누가 대놓고 물었다면 나는 아니라고 답했을 것이다. 하지만 나는 한 번도 묻지 않았고, 그래서 그 위에 계속 쌓아 올렸다.

이것은 만연해 있으면서도 거의 보이지 않는 종류의 낙관이다. 행복한 경로(happy path)만이 유일한 경로라고 조용히 가정해버리는 것 말이다. 모든 게 잘 풀리는 세계를 위해 설계한다. 만드는 동안 머릿속에 그리는 세계가 바로 그것이기 때문이다. 그러고는 그것을 실제 세계로 내보낸다. 그 실제 세계에는 다른 경로가 무수히 많고, 그 대부분은 그리 유쾌하지 않다.

충분히 오래 도는 것은 무엇이든 중단된다

여기 내가 대비하기를 거부했던 진실이 있다. 충분히 오래 도는 프로세스는 무엇이든, 결국에는, 중단된다. 크래시. 순간적인 정전. 메모리가 바닥난 머신. 내 실수. 미룰 수 없었던 재부팅. 구체적인 원인은 중요하지 않으며, 그 원인은 일일이 다 셀 수 없을 만큼 많다.

짧은 구간에서 보면 중단은 하나의 위험이다. 그러나 충분히 긴 지평에서 보면 그것은 더 이상 위험이 아니라 확실성이 된다. 오래 도는 무언가가 중단되느냐 마느냐의 문제가 아니라, 단지 언제, 얼마나 자주냐의 문제일 뿐이다. 그리고 일단 그렇게 보고 나면, 중단이 일어나지 않을 것처럼 설계하는 일의 정체가 드러난다. 그것은 반드시 일어나도록 보장된 무언가에 대해, 일부러, 틀린 채로 있기로 계획하는 일이다.

비용은 크래시가 아니라 무엇을 저장했느냐가 정한다

이것이 그 모든 걸 바라보던 방식을 재편한 통찰이다. 중단으로 입는 피해는 거의 전적으로 작업이 얼마나 복구 가능했는가에 의해 결정된다. 중단이 얼마나 심각했는가에 의해서가 아니다. 크래시는 중요한 변수인 경우가 드물다. 정작 중요한 건 그 전에 당신이 한 일이다.

정확히 같은 크래시가, 정확히 같은 순간에 닥쳐도, 최근에 진척을 저장해뒀다면 5분짜리 비용이 되고, 아무것도 저장하지 않았다면 5일짜리 비용이 된다. 중단은 두 경우 모두 동일하다. 결과는 극단적으로 다르며, 그 차이는 전적으로 당신이 더 일찍, 크래시가 닥치기 한참 전에 내린 선택에 의해 결정되었다. 얼마나 잃을지를 정하는 건 크래시가 아니다. 무엇을 복구 가능하게 만들 의향이 있었는지를 정함으로써, 미리, 당신이 정하는 것이다.

체크포인팅은 편집증이 아니라 산수다

일단 그렇게 틀을 잡고 나니, 중간 상태를 주기적으로 저장하는 일의 정당성이 과도한 조심성처럼 보이기를 멈추고 단순한 산수처럼 보이기 시작했다. 시간이 흐르면 중단은 확실하다. 중단이 일어났을 때의 비용은 마지막으로 저장한 시점이 얼마나 오래전이었는가로 묶인다. 그러니 자주 저장하는 건 보장된 사건에 대비하는 값싼 보험일 뿐이고, 그 보험료는 조금 더 자주 저장하기만 하면 원하는 만큼 낮게 설정할 수 있다.

그 일을 거부하는 건 용기도, 집중도, 빠르게 움직이는 것도 아니다. 그저 나쁜 산수일 뿐이다. 반드시 일어날 무언가에 대한 값싼 보호를, 지금의 사소한 편리함과 맞바꿔 마다하는 짓이다. 나는 안전망에 시간을 낭비하지 않는다고 스스로를 대견해하면서, 정작 그 발생 여부조차 의심할 여지가 없는 사건에 대해 거대하고 무보험인 위험을 조용히 안고 돌리고 있었던 것이다.

다시 시작하지 말고 이어가도록 설계하라

하지만 주기적인 저장 너머의 층위가 하나 있고, 그것이 가장 중요했다. 더 깊은 해법은 오래 도는 작업을, 중단이 닥치면 처음부터 다시 시작하는 대신 멈춘 지점에서부터 이어가도록 짓는 것이다.

이 구분은 중단이 잦을 때 모든 것을 가른다. 쓰러질 때마다 매번 0에서 다시 시작하는 프로세스는, 충분히 나쁜 환경에서는 끝내 한 번도 완료하지 못할 수 있다. 중단이 매번 모든 것을 지워버리고, 실행 시간 대비 중단이 충분히 자주 온다면, 아무리 열심히 일해도 순(純)진척은 0이다. 반면 이어가는 프로세스는 언제나 앞으로 나아간다. 거듭 쓰러져도 결국에는, 도달한다. 각 중단이 마지막 저장 이후의 그 자투리만큼만 비용으로 들기 때문이다. 다시 시작하는 방식은 복리로 불어나는 방향으로 취약하고, 이어가는 방식은 반대 방향으로 복리가 붙는 식으로 견고하다.

거의 모든 곳에 적용되는 같은 원리

이것은 어느 한 가지 오래 도는 연산을 훨씬 넘어 일반화된다. 가치가 시간에 걸쳐 쌓이고, 의도적으로 보존하지 않으면 사라지는 거의 모든 작업에 적용된다. 패턴은 동일하다. 진척이 쌓이고, 중단이 닥치고, 견고하게(durable) 만들어두지 않은 것은 무엇이든 사라진다.

그래서 시간이 좀 걸리고 또 중요한 무언가에 대해 내가 묻는 법을 익힌 질문은, 더 이상 그 편안한 쪽 — “이게 중단되면 어쩌지?” — 을 가설처럼 팔 길이만큼 떨어뜨려 쥐는 게 아니다. 그것은 일어날 거라고 가정하는, 무뚝뚝한 버전이다. “이게 중단되면, 나는 얼마나 잃게 되지?” 일찍 던진 그 질문은 당신이 무엇을 짓는지를 바꾼다. 첫 번째 질문은 당신이 희망하도록 내버려둔다. 두 번째 질문은 당신이 대비하도록 강제한다.

더 깊은 교훈: 중단은 예정된 사건이다

결국 모든 것이 귀결되는 지점은 이렇다. 나는 모든 게 잘 풀리는 세계를 위해 설계하기를 그만두고, 으레 일이 어긋나는 세계를 위해 설계하기 시작했다. 두 번째 것이 실제로 존재하는 세계이고, 첫 번째 것은 내가 현실 대신 조용히 끼워 넣은 기분 좋은 가정에 지나지 않았기 때문이다.

복원력이란, 내가 깨닫게 된 바로는, 비관이 아니다. 그것은 정확성이다. 중단은 낙관적으로 깎아내려도 되는 먼 가설이 아니다. 그것은 사실상 예정된 사건이다. 다만 날짜를 통보받지 못할 뿐이다. 그것이 올 것처럼 짓는 일은 음울하거나 두려워하는 것이 아니다. 그저 우리가 그 안에서 지을 수밖에 없는 유일한 세계에 대해 정직한 것일 뿐이다. 나는 크래시가 결코 문제였던 적이 없다는 것을 배우는 데 일주일을 잃었다. 문제는, 중단당하는 것이 보장된 세계 안에서, 중단당하고도 살아남을 방법이 전혀 없는 무언가를 내가 지어버렸다는 데 있었다.

— 시그널도, 수익도 없으며, 투자 자문이 아닙니다.