내가 추가한 건 전부 합리적이었다. 그 합이 나를 파묻었다.
이 프로젝트에 내가 추가했던 거의 모든 것은, 그것을 추가하던 그 순간만 놓고 보면 더할 나위 없이 합리적인 선택이었다. 모든 기능에는 진짜 명분이 있었다. 내가 추가로 처리한 모든 예외 케이스는 실제로 발생한 케이스였다. 모든 사소한 개선은 무언가를 정말로 나아지게 했다. 그런데 개별적으로는 분별 있었던 이 모든 추가의 합은, 너무 무겁고 너무 뒤엉키고 너무 넓어져서 거의 움직일 수조차 없는 시스템이었다.
불편한 지점은, 누구도 그렇게 만들기로 결정한 적이 없다는 것이다. 콕 집어 가리킬 만한 잘못된 판단의 순간은 없었다. 그저, 하나하나 충분히 변호 가능한 결정들이 쌓이고 쌓여, 누구도 일부러는 절대 선택하지 않았을 무언가가 되어버렸을 뿐이다.
모든 추가는 국소적으로 정당하다
이것이 범위 확장(scope creep)을 거부하기가 그토록 어려운 이유의 핵심이다. 그것은 단 하나의 나쁜 결정으로 찾아오지 않는다. 끊김 없이 길게 이어지는 좋은 결정들의 연속으로 찾아온다. 새 기능은 하나하나 유용하다. 추가되는 예외 케이스는 하나하나 실재한다. “이왕 손댄 김에 이것도 하면 좋겠다”는 개선 하나하나가, 그것을 결정하는 그 순간에는 진짜로 말이 된다. 어느 한 단계에서도, 당신은 스스로 잘못이라고 알아챌 만한 일을 하고 있지 않다.
바로 그 점이 이것을 그토록 음험하게 만든다. 만약 범위 확장이 그것을 하는 동안 실수처럼 느껴진다면, 당신은 멈출 것이다. 하지만 그렇지 않다. 그것은 성실함처럼, 꼼꼼함처럼, 책임감 있는 대응처럼, 만들어내는 것처럼 느껴진다. 개별적인 “예” 하나하나는 변호하기 쉽고, 손해는 그중 어느 하나 때문이 아니라 당신이 아주 오랫동안 합리적으로 “예”를 계속해왔다는 사실 때문에 발생한다.
추가하는 순간에는 보이지 않는 비용
회계 장부는 조작되어 있고, 특정한 방식으로 조작되어 있다. 무언가를 추가할 때, 그 이득은 선명하고 즉각적이다. 그것이 당신에게 무엇을 주는지 정확히 보인다. 반면 그 비용은 결정의 순간에 거의 보이지 않는데, 비용 대부분이 아직 발생하지 않았기 때문이다.
모든 추가는 나중에 조용히 도착하는 지속적 비용을 짊어지기 때문이다. 더 넓어진 표면적. 부품들 사이의 더 많은 상호작용. 망가질 수 있는 더 많은 것들. 시스템을 건드리는 누구든—미래의 당신을 포함해—이해해야 할 더 많은 것들. 영원히 유지보수해야 할 더 많은 것들. 이득은 일회성의, 눈에 보이는 획득이다. 비용은 영구적인, 눈에 보이지 않는 세금이다. 결정이 잊힌 한참 뒤에 소액으로 분할 납부된다. 그래서 당신이 선택하는 바로 그 순간, 보이는 이득은 거의 항상 보이는 비용을 능가한다. 그 거래가 좋아서가 아니라, 선택을 하는 그 순간부터 비용의 절반이 숨겨져 있기 때문이다.
국소적으로 합리적, 전역적으로 엉망
이 모든 것의 종착점은, 개별 부품은 전부 정당한데 전체는 재앙인 시스템이다. 이것이 누적(accretion)의 틀림없는 징표이며, 잔혹한 속성을 하나 갖고 있다. 실수라고 콕 집어 가리킬 단 하나의 대상이 없다는 것이다. 실수는 누적 그 자체이고, 그것은 각각 따로 떼어놓고 보면 완벽히 괜찮았던 수백 개의 별개 결정들에 얇게 발려 흩어져 있다.
이것을 마주하는 일은 정말로 방향감각을 잃게 만드는데, 문제를 고치는 당신의 모든 본능이 나쁜 부분을 찾아 수리하는 것을 중심으로 짜여 있기 때문이다. 그런데 여기엔 나쁜 부분이 없다. 모든 것을 망친 컴포넌트를 찾아 나서지만 찾을 수가 없다. 어떤 컴포넌트도 모든 것을 망치지 않았기 때문이다. 모두가 조금씩, 함께 망쳤다. 원인이 개별적으로 합리적으로 보이는 모든 것에 고르게 분산되어 있는 문제는, 디버깅으로 빠져나올 수가 없다.
표류는 늘 “더하기” 쪽을 가리킨다
이 밑바탕에는 어떤 종류의 중력이 깔려 있고, 그것은 어느 프로젝트에서든 꾸준히 한 방향을 가리킨다. 바로 추가하기다. 무언가를 더하는 것은 진척처럼 느껴진다. 눈에 보이고, 만족스럽고, 보고 가리킬 수 있는 산출물을 만들어낸다. 더 많이 만드는 것은 일하는 것처럼 느껴진다. 실제로 일이기 때문이다.
빼기는 그 모든 것의 반대처럼 느껴진다. 무언가를 제거하는 것은 손실처럼, 들인 노력을 무르는 것처럼, 뒷걸음질처럼 느껴진다. 그리고 결정적으로, 그것은 결코 긴급하게 느껴지지 않는다. 무언가를 제거하지 못한 그 순간에 망가지는 것은 아무것도 없기 때문이다. 빼지 않은 비용은 보이지 않고 유예되어 있다. 추가하는 비용과 똑같이. 그래서 강제하는 계기가 결코 생기지 않는다. 따라서 의도적인 저항이 없는 한, 시스템은 오직 쌓이기만 한다. 표류는 한 방향이고, 그대로 흘러가게 두었을 때의 기본 결과는 파묻혀 꼼짝 못 하는 엉망진창이다.
빼기는 의도적이고 불편한 싸움이다
무언가를 제거하는 일은 추가하는 일보다 훨씬 더 어려운 것으로 드러나는데, 그 어려움의 대부분은 난이도와는 아무 상관이 없고 심리와 전적으로 관계가 있다. 무언가를 제거할 때, 당신은 누군가가—대개 당신 자신이—한 작업을 파괴하는 것이다. 그것이 애초에 거기 있지 말았어야 했다고 암묵적으로 인정하는 것이다. 거기엔 창조의 만족스러운 감각도, 감탄할 새 산출물도, 추가가 주는 그 작은 보상도 전혀 없다. 그것은 순수하고, 화려할 것 하나 없고, 살짝 고통스러운 되돌리기다.
하지만 그럼에도 그것을 하려는 의지—기능을 잘라내고, 더는 제 자리를 벌지 못하는 컴포넌트를 죽이고, 잘 작동하지만 그 무게값을 못 하는 것들을 삭제하려는 의지—는 통제 불능으로 향하는 끈질긴 표류를 상쇄할 수 있는 거의 유일한 힘 중 하나다. 빼기는 결코, 단 한 번도 기본값으로 일어나지 않는다. 그것은 오직 누군가가 모든 편안한 본능에 맞서 그것을 위해 싸우기로 결심할 때에만 일어난다.
”아니오”라고 말하는 것 자체가 하나의 기능이다
가장 도움이 됐던 재구성은, 내가 내린 가장 가치 있는 설계 결정 몇 가지가 하지 않기로 결정한 것들이었음을 깨달은 것이다. 당신이 거절하는 모든 합리적인 추가는, 앞으로 결코 짊어지지 않아도 될 무게이고, 결코 변호하지 않아도 될 표면이며, 뒤따르는 모든 달 동안 결코 치르지 않을 복잡성이다.
한 프로젝트가 무엇이 아닌지에 대한 분명한 감각은, 그것이 무엇인지에 대한 감각만큼이나 중요한 것으로 드러났다. 그리고 붙들기는 훨씬 더 어렵다. 그것을 유지한다는 건 진짜로 좋게 들리는 것들을 반복해서 거절한다는 뜻이기 때문이다. 모든 배제는 완벽히 분별 있어 보이는 아이디어에 맞서는 작고 지속적인 저항 행위이고, 당신은 그 저항을 영원히 반복해서 수행해야 한다. 그 대가라곤 당신이 피했다는 사실조차 결코 보지 못할 문제의 부재뿐이다. “아니오”는 아무런 산출물도 남기지 않는다. 바로 그래서 그것이 그토록 저평가되고, 그토록 필수적이다.
더 깊은 교훈: 부분들로부터 전체를 지켜라
결국 모든 것은 이렇게 귀결된다. 나는 모든 결정을 국소적으로 최적화하고 있었다—이 특정한 추가가 좋은가?—정작 프로젝트의 운명을 실제로 결정한 질문은 전역적인 것이었는데도. 이것이 전체에 무엇을 하는가? 이 둘은 다른 질문이고, 내가 가정했던 것보다 훨씬 더 자주 서로 다른 답을 갖는다.
시스템은 단순히 국소적으로 좋은 부분들의 합이 아니다. 그것은 자신만의 건강, 자신만의 무게, 자신만의 일관성을 갖는다—전체에 속하는 속성들, 어떤 단일 결정도 책임지지 않지만 모든 단일 결정이 영향을 미치는 속성들. 그 전체를, 그저 하나만 더 추가하자는 꾸준하고 진짜로 합리적인 요청의 흐름에 맞서 지켜내는 일이, 알고 보니 실제 일의 대부분이었다. 나는 내 일이 좋은 개별 결정을 내리는 것이라 여겼다. 사실 그것은 그런 결정 수백 개의 누적된 무게로부터 시스템을 지켜내는 일이었다.
— 시그널도, 수익도 없으며, 투자 자문이 아니다.