오버엔지니어링은 내가 가장 좋아하던 미루기 방법이었다

한동안 나는 이 프로젝트에 믿을 수 없을 만큼 열심히 매달려 엄청난 양을 쏟아냈고, 그 모든 것에 대해 더없이 뿌듯해했다 — 그러면서도 실제로는 거의 아무런 진전도 이루지 못했다. 나는 시스템의 원대한 미래를 설계하고 있었다. 여러 부분이 서로 협력하고, 확장되고, 언젠가는 스스로 굴러가게 될 컴포넌트로 가득한, 사방으로 뻗어나가는 거대한 아키텍처를.

유일한 문제는, 그 모든 것이 올라앉기로 되어 있던 기본적인 것이 아직 작동하지 않는다는 점이었다. 전혀.

마을을 짓기도 전에 제국을 건설하다

시스템의 핵심 — 다른 무엇이 중요해지기 전에 가장 먼저 해내야 했던 그 근본적인 것 — 이 작동하지 않고 있었다. 그것은 불안정했고, 절반쯤 망가져 있었으며, 내가 고치려는 시도를 완강히 버텨냈다.

그래서 나는 당연하다는 듯, 그 위에 올라앉을 층위들로 관심을 돌렸다. 부분들이 어떻게 서로 대화할지. 지금은 조금도 감당하지 못하는 규모를 훨씬 뛰어넘는 것을 어떻게 감당하도록 확장할지. 완성된 뒤에는 어떻게 스스로 배포하고 업데이트할지. 사실상 나는, 아직 제품도 없는 회사의 상세한 조직도를 그리고 있었던 셈이다 — 단 하나의 핵심 기능조차 돌아가지 않는 기업의 경영 구조를 설계하고 있었다.

오버엔지니어링이 그토록 기분 좋은 이유

이것이 왜 그렇게 매력적이었는지 솔직하게 짚고 넘어가고 싶다. 그 매력이야말로 함정의 전부이기 때문이다. 미래의 아키텍처를 설계하는 일은 순수하고 마찰 없는 즐거움이다. 노려보는 실패한 테스트도 없고, 죽기를 거부하는 끈질긴 버그도 없으며, 당신의 계획을 밀어내는 현실도 없다. 그저 당신과, 모든 것이 완벽하게 들어맞는 깔끔한 머릿속 다이어그램만 있을 뿐이다 — 그 안의 어떤 것도 실제로 돌아가도록 강요받은 적이 없기 때문에.

그것은 가장 생산적인 종류의 작업처럼 느껴진다. 바로 저항이 전혀 없는 종류이기 때문이다. 그리고 저항이 없다는 것은 진전처럼 느껴질 수 있다 — 당신이 실은 한 발짝도 움직이지 않았음을 알아차리기 직전까지는.

그것의 정직한 이름: 회피

번지르르한 묘사를 걷어내고 보면, 그 진짜 활동은 회피였다. 핵심 문제 — 기본적인 것을 작동하게 만드는 일 — 는 어렵고, 좌절스럽고, 진심으로 불확실했다. 나는 그것을 풀 수 있을지조차 알지 못했고, 모든 시도가 그 불확실함에 내 얼굴을 처박았다. 반면 그 원대한 아키텍처는 쉬웠고 끝없이 만족스러웠다. 거기서는 언제나 진전을 만들어낼 수 있었다. 왜냐하면 “진전”이란 그저 다이어그램에 깔끔한 상자 하나를 더 그려 넣는 것만을 의미했으니까.

그래서 나는 어렵고 현실적인 문제로부터 편안하고 가상적인 문제로 계속 도망쳤고, 그 도망에 그럴듯한 이름을 붙였다. 나는 그것을 설계라고 불렀다.

단서: 아직 갖지도 않은 문제를 풀고 있었다

오랫동안 내가 무시했던 분명한 신호가 하나 있었다. 내가 설계하던 모든 정교한 조각은, 기본 시스템이 작동해야만 비로소 존재하는 문제를 풀고 있었다. 협력은 부분들이 제 기능을 할 때라야 의미가 있다. 확장은 확장할 가치가 있는 무언가가 있을 때라야 의미가 있다. 자가 배포는 배포할 완성된 무언가가 있을 때라야 의미가 있다. 나는 내 프로젝트가 아직 던질 자격조차 얻지 못한 질문들에 대해 세심한 답을 짓고 있었던 것이다.

아직 실제로 갖지도 않은 문제를 풀고 있는 자신을 발견한다면, 그 대신 어떤 문제를 회피하고 있는지 물어볼 만하다.

그 대가는 낭비한 시간보다 더 나빴다

피해는 가상의 인프라에 쏟아부은 시간을 넘어섰다. 내가 설계한 정교한 구조는 일종의 우리가 되어버렸다. 일단 그 원대한 형태에 발을 들이고 나니, 진짜 문제가 정작 필요로 하던 단순하고 직접적인 수정들은, 작동하지도 않는 시스템 위에 내가 성급하게 둘러친 그 모든 아키텍처를 뚫고 싸워나가야만 했다. 나는 존재하지도 않는 건물을 위해 비계를 세웠고, 기초를 놓기 시작하기 위해서라도 먼저 그 비계부터 걷어내야 했다.

성급한 구조는 단지 당신의 노력을 낭비시키는 데 그치지 않는다. 그것은 자신이 섬기기로 되어 있던 바로 그것을 능동적으로 옭아맬 수 있으며, 정교할수록 결국 당신이 해야만 하는 작고 정직한 변경에 더 거세게 저항한다.

해법: 다음 층위를 벌어들여라

마침내 도움이 된 것은, 거의 민망할 만큼 무뚝뚝한 규칙 하나였다. 아래 층위가 실제로 작동하기 전까지는 그 위 층위를 지을 자격이 없다. “설계되었다”가 아니다. “계획되었다”도 아니다. 작동한다. 확장, 협력, 자동화 — 이것들은 실재하고 확장할 가치가 있는 무언가를 가짐으로써 벌어들이는 보상이지, 뭔가 진지한 것을 짓고 있다는 기분을 내려고 미리 덧붙이는 장식이 아니다.

나는 그 가상의 제국 대부분을 허물어버렸다. 결국 그것은 안도였다 — 내가 그토록 정교하게 회피해오던 단 하나의 어려운 문제와 단둘이 남겨진다는 것은.

더 깊은 교훈: 편안함은 경고일 수 있다

이 일에서 내가 얻은 가장 불편한 깨달음은 편안함 그 자체에 대한 의심이다. 작업이 순수하게 좋게만 느껴질 때 — 마찰도 없고, 만족스럽고, 실패도 없고, 안 된다고 말하는 현실도 없을 때 — 당신은 진짜 문제로부터 슬그머니 방향을 틀어, 마침 그것과 똑같은 느낌을 주는 더 쉽고 가상적인 문제 쪽으로 향했을 실질적인 가능성이 있다.

어려운 문제는 되밀어낸다. 그것이 그 문제가 진짜임을 알아차리는 한 가지 방식이다. 그래서 이제 무언가를 짓는 일이 수상쩍게 즐거워지기 시작하면, 나는 그 즐거움을 보상이 아니라 질문으로 다루려 한다. 이걸 이토록 즐기는 동안 나는 어떤 어렵고, 저항하고, 진정으로 중요한 것을 회피하고 있는가?

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