나는 눈을 감은 채 날고 있었고, 그것을 직관이라 불렀다
오랫동안 나는 내 시스템이 내부에서 실제로 무엇을 하고 있는지에 대해 거의 아무런 실질적인 가시성도 없이 작업했다. 그 안에서 아마 이런 일이 벌어지고 있겠거니 짐작해 가며 시스템에 관한 결정을 내렸고, 어느 순간 나는 그 짐작에 조용히 직관이라는 이름표를 다시 붙여 두고 있었다. 결국 프로젝트 전체를 위해 내가 한 가장 레버리지가 큰 일은 민망할 만큼 단순했다. 나는 불을 켰다.
돌이켜보면, 내가 어둠 속에서 일하는 것을 그렇게 오래 참아냈다는 사실이 이상하다. 어려운 부분은 사고(思考)이고, 볼 수 있다는 것은 사치라고 나는 짐작했던 것 같다. 나는 그것을 정확히 거꾸로 알고 있었다.
어둠 속에서의 디버깅
무언가 잘못되면 — 그리고 늘 무언가 잘못되고 있었다 — 나는 내부를 들여다보고 무슨 일이 벌어졌는지 확인할 실질적인 방법이 없었다. 무엇이 들어갔는지 볼 수 있었고, 무엇이 나왔는지 볼 수 있었지만, 그 사이의 공간 전체는 봉인된 블랙박스였다. 디버깅이라고 할 만한 내 전 과정은, 그 박스 안에서 무슨 일이 벌어지고 있을지에 대한 이론을 세우고, 무언가를 바꾸고, 출력이 나아지는지 나빠지는지 지켜보고, 이를 반복하는 것으로 이루어져 있었다.
이것은 실제 메커니즘에 대해 완전히 눈을 감은 채 진행하는, 짐작과 확인에 의한 디버깅이다. 느리고, 사람을 미치게 하며, 무엇보다 스스로를 감추는 방식으로 신뢰할 수 없다. 출력이 우연히 좋아지면, 그 이론이 옳다는 것을 한 번도 실제로 확인하지 않았음에도 당신은 자신의 이론에 공을 돌린다. 당신은 가끔 물건에 부딪히고 거기서 가구의 위치를 추론해 가며 어두운 방을 헤쳐 나가고 있는 것이다.
직관으로 분장한 짐작
진짜로 위험했던 부분은 내가 그것에 대해 스스로에게 들려준 이야기였다. 나는 이 시스템에 대한 감을 익혔다고 — 어쩐지 문제가 아마 어디 있는지를 그냥 안다고 믿게 되었다. 나는 이것을 일종의 힘겹게 얻어낸 직관으로, 경험 많은 사람들이 으레 갖추고 있다고들 하는 그런 직관으로 취급했다.
하지만 진짜 직관은 압축된 경험이다. 방대한 양의 진정한 관찰이 시간이 지나며 빠른 판단으로 증류된 것이다. 내가 가진 것은 그게 아니었다. 내가 가진 것은 압축된 무지였다. 턱없이 적은 실제 정보에 적용된 희망과 패턴 매칭을, 전문성의 언어로 분장시킨 것이었다. 실제로 무슨 일이 벌어지는지 볼 수 없었기에 나는 그럴듯한 이야기를 지어냈고, 그러고는 치명적이게도 내가 지어낸 것을 스스로 믿었다. 충분히 자신 있게 반복된 짐작은 지식처럼 느껴지기 시작한다. 특히 그것을 반박해 줄 가시성이 주변에 전혀 없을 때 그렇다.
볼 수 없는 것은 고칠 수 없다
마침내 그 깨달음이 도착했을 때, 그것은 거의 모욕적일 만큼 뻔했다. 내 병목은 문제를 푸는 영리함이 아니었다. 그것은 애초에 문제를 관찰하지 못하는 나의 거의 완전한 무능이었다. 알고 보니 디버깅의 엄청난 비중은 그저 실제로 무슨 일이 벌어지고 있는지를 볼 수 있는 것에 달려 있었다 — 그리고 나는 그 단계를 통째로 건너뛰고 곧바로 푸는 데로 직행하려 했던 것이다.
관찰이 없으면, 세상에서 가장 날카로운 추론조차 상상된 사실에 적용되고 있을 뿐이다. 당신은 스스로 지어낸 전제에서 흠 없이 추론해, 대단한 확신을 품은 채 아무 데도 아닌 곳에 도착할 수 있다. 나는 정확히 그것을 거듭 반복하면서, 그 확신을 진전으로 착각하고 있었다. 사고의 입력이 짐작이었을 때, 내 사고의 질은 거의 무의미했다.
관측 가능성은 공짜가 아니고, 선택사항도 아니다
해결책은 한 구간의 지독하게 멋없는 인프라 작업이었다. 올바른 것들을 로깅하고, 각 단계에서 시스템이 실제로 무엇을 보고 무엇을 했으며 왜 그랬는지 기록하고, 실행 중에 그 내부를 들여다볼 방법을 만드는 일이었다. 이 가운데 어느 것도 눈에 보이는 기능을 만들어내지 않는다. 그 어느 것도 그 순간에는 진짜 진전처럼 느껴지지 않는다 — 신나는 작업에서 벗어난 우회로처럼, 무언가를 만드는 대신 치르는 세금처럼 느껴진다.
바로 그 틀이 실수다. 이 작업은 진짜 진전에서 벗어난 우회로가 아니다. 그것은 진전의 전제 조건이다. 짐작을 봄으로 전환해 주는 바로 그것이기 때문이다. 시스템을 관측 가능하게 만드는 데 쓴 매 시간은, 들여다볼 수조차 없는 문제들에 맹목적으로 허우적대는 데 쓰지 않은 시간으로 몇 배가 되어 되돌아왔다. 나는 볼 수 있는 능력을 선택사항으로 취급해 왔었다. 그것은 오히려 다른 모든 것이 그 위에 서 있는 토대에 가깝다.
좋은 가시성의 형태
내가 배워야 했던 한 가지 미묘한 점은, 관측 가능성이 모든 것을 로깅하는 것과 같지 않다는 것이다. 구분 없이 쏟아지는 세부 정보의 소방 호스는 그 자체로 또 하나의 실명(失明)이다 — 모든 것이 기록되면 아무것도 찾을 수 없고, 신호가 가장 필요한 바로 그때 당신은 잡음 속에 빠져 죽는다. 더 많이가 목표가 아니다.
좋은 가시성은 일이 잘못됐을 때 당신이 실제로 답해야 할 질문들을 중심으로 설계된다. 이 특정 순간에 시스템은 무엇을 보았는가? 왜 그것은 그 행동을 했는가? 정확히 어디서 이 숫자가 나왔는가? 핵심은 무슨 일이 벌어졌는지의 이야기를, 필요할 때마다, 행동에 옮기기에 충분한 명료함으로 재구성할 수 있게 하는 것이다 — 아무도 읽을 수 없는 로그에 내부 상태 전체를 쏟아붓는 것이 아니라. 완전성을 위해서가 아니라 질문을 위해 설계하는 것, 그것이 이 일의 모든 기예다.
불 켜진 방은 사고방식을 바꾼다
일단 내부를 실제로 볼 수 있게 되자, 작업의 성격 전체가 바뀌었다. 나는 이론을 세우기를 멈추고 들여다보기 시작했다. 몇 주 동안 진짜 미스터리로 남아 있던 문제들 — 내 온갖 영리한 짐작을 견뎌낸 문제들 — 이 몇 분 안에 명백해졌다. 멀찍이서 추론하는 대신 마침내 그것들이 일어나는 것을 지켜볼 수 있었기 때문이다.
그 대비는 나에게 겸허해지는 무언가를 가르쳐 주었다. 어두운 방은, 내가 절반쯤 자기기만에 빠져 믿었던 것처럼, 나를 더 날카롭거나 더 직관적으로 만든 적이 결코 없었다. 그것은 그저 나를 더 느리게, 훨씬 더 자주 틀리게 만들었을 뿐이며, 게다가 내가 틀렸다는 것을 모른다는 추가 비용까지 청구하고 있었다. 가시성은 문제를 더 쉽게 만들어 주지 않았다. 그것은 문제를 보이게 만들었고, 보이는 문제는 보이지 않는 문제와는 완전히 다른, 그리고 훨씬 더 다루기 쉬운 종류의 것이다.
더 깊은 교훈: 추론하기 전에 보라
결국 나는 단지 작업 순서를 거꾸로 알고 있었던 것 같다. 내 본능은 늘 먼저 추론하고, 관찰은 나중에 — 굳이 관찰을 한다면 — 하는 것이었다. 이제 나는 그 반대를 하려고 무던히 애쓴다. 어떤 강한 이론도 세우도록 스스로에게 허락하기 전에 먼저 그것을 보이게 만든다. 관찰 없이 세운 이론은 그저 실험복을 걸친 짐작일 뿐이며, 실험복을 걸친 짐작은 그 위에 무언가를 쌓아 올리기에 가장 값비싼 것들 중 하나이기 때문이다.
가장 가치 있는 투자는, 아주 흔히, 더 똑똑한 알고리즘이나 더 영리한 아이디어가 아니다. 그것은 더 맑은 창문이다. 나는 오랜 시간 어두운 방을 머리로 헤쳐 나가려 애쓰며 내 직관을 자랑스러워했지만, 정작 내게 필요했던 것은 멈춰 서서, 스위치를 찾고, 줄곧 내 눈앞에 있던 것을 들여다보는 일이었다.
— 시그널도 없고, 수익도 없고, 투자 자문도 아닙니다.