ShortLeash
주니어 개발자들을 위한 패턴 언어 - 추측의 꼬리가 길어지기 전에 빠르게 확인하여 미궁을 탈출하는 법
Contents
The Story 1: The Long Chain of Assumptions (Programming)
두 명의 개발자, 민수와 하나가 '데이터가 간헐적으로 깨지는 버그'를 조사하고 있다.
민수의 추리 (The Long Leash): 민수는 자리에 앉아 코드와 로그를 뚫어지게 쳐다보며 거대한 가설을 세웠다. "음, A 모듈에서 데이터를 보낼 때 네트워크 타임아웃이 나고, 그게 B 데이터베이스의 트랜잭션 롤백과 겹치면서, C 캐시 서버의 인덱스가 꼬이는 거 아닐까? 아, 그러려면 D 설정 파일의 타임아웃 값도 확인해야겠네." 민수는 1시간 동안 이 복합적인 시나리오를 머릿속으로 조립했다. 하지만 그 사슬의 첫 번째 고리(네트워크 타임아웃)가 틀렸다면 나머지 1시간의 고민은 모두 쓰레기가 된다. 민수는 추측의 끈(Leash)을 너무 길게 늘어뜨렸다.
하나의 추리 (The Short Leash): 하나는 가설을 세우자마자 끈을 잡아당겼다. "네트워크 문제라고? 그럼 먼저 A 모듈에서 에러 로그가 남았는지부터 확인하자." 하나는 2분 만에 A 모듈의 상태를 확인했고, 네트워크는 정상임을 알아냈다. "네트워크는 아니네. 그럼 다음은 데이터베이스인가?" 하나는 추측의 사슬이 두 마디 이상 길어지기 전에 매번 확인을 거쳤다. 그녀는 짧은 확인을 반복하며 15분 만에 진짜 원인을 찾아냈다.
The Story 2: The Scent of the Hound (Ordinary Life)
민수와 하나는 숲속에서 잃어버린 물건을 찾기 위해 사냥개와 함께 수색하고 있다.
민수의 수색 (The Loose Dog): 민수는 사냥개의 목줄을 길게 풀어주었다. 사냥개는 이 냄새 저 냄새를 맡으며 숲속 깊은 곳으로 달려갔다. 민수는 사냥개를 따라가느라 숨이 찼고, 어느 순간 사냥개가 왜 저쪽으로 가는지, 처음에 쫓던 냄새가 맞는지조차 알 수 없게 되었다. 결국 사냥개는 토끼를 쫓아 엉뚱한 곳으로 가버렸고 수색은 실패했다.
하나의 수색 (The Short Leash): 하나는 사냥개의 목줄을 짧게 쥐었다. 사냥개가 냄새를 맡고 한 걸음 내디딜 때마다 하나는 확인했다. "지금 그 냄새가 맞아?" 사냥개가 엉뚱한 풀숲으로 고개를 돌리려 하면 하나는 즉시 목줄을 잡아당겨 올바른 방향으로 되돌렸다. 하나는 사냥개와 함께 호흡하며 단계를 밟아 나갔고, 결국 잃어버린 물건을 정확히 찾아냈다. 추측의 에너지가 분산되지 않도록 끈을 짧게 쥐는 것이 수색의 비결임을 하나는 알고 있었다.
Context
버그를 잡고 있거나(DetectiveWork), 복잡한 시스템의 동작 방식을 파악 중이다. 몇 가지 단서를 찾았고, 머릿속에서 "왜 이런 일이 벌어지는지"에 대한 시나리오가 써지기 시작하는 시점이다.
일상적인 상황:
- "아마 이럴 거야"라는 막연한 심증을 바탕으로 수천 줄의 코드를 읽어 내려간다.
- 하나의 가설 위에 다른 가설을 쌓아 올리며 복잡한 '소설'을 쓴다.
- 한참을 고민한 뒤에야 "아, 맨 처음 가정이 틀렸었네"라며 허탈해한다.
- 원인을 정확히 밝히기도 전에 거대한 수정 계획부터 세운다.
당신은 지금 추측의 끈을 너무 길게 풀어주어, 진실이라는 사냥감을 놓치고 미궁 속으로 끌려 들어가고 있다.
Problem
확인되지 않은 가설을 바탕으로 추론을 길게 이어가면 불확실성이 기하급수적으로 증폭된다.
불확실성의 복리: 가설 A가 맞을 확률이 70%고 그 위에서 세운 가설 B가 맞을 확률이 70%라면, 두 가설이 모두 맞을 확률은 49%로 떨어집니다. 사슬이 길어질수록 당신은 진실이 아닌 확률의 늪에 빠집니다.
시간의 증발: 틀린 가정 위에서 보낸 1시간은 단순히 1시간의 손실이 아니라, 올바른 길로 갈 수 있었던 기회비용까지 포함된 거대한 낭비입니다.
인지적 매몰: 공들여 복잡한 시나리오를 쓰고 나면, 나중에 그 시나리오가 틀렸다는 증거가 나와도 그것을 부정하고 싶어집니다. 뇌는 자신의 노력을 정당화하려 하기 때문입니다.
Solution
가설을 세웠다면, 다음 가설로 넘어가기 전에 "가장 빠르고 직접적인 방법"으로 그 가설을 즉시 검증하라.
추측의 끈(Leash)을 짧게 쥐고, 수시로 잡아당겨 진실과 대조해야 합니다.
Principle 1: Smallest Jump (최소한의 점프)
한 번에 단 한 단계만 추측하십시오.
- "A 때문에 B가 되고 결국 C가 될 거야"라고 상상하지 마십시오.
- "지금 A가 범인인가?"만을 먼저 확인하십시오. 확인이 끝나면 비로소 다음 단계를 고민하십시오.
Principle 2: Fail Fast, Verify Faster (빠른 실패, 더 빠른 확인)
가설을 증명하는 것보다 **반증(Falsify)**하는 것이 더 빠를 때가 많습니다.
- "이게 문제라면, 여기서 이 로그가 찍혀야만 해."
- 로그를 찍었는데 안 찍힌다? 그럼 그 가설은 1초 만에 쓰레기통에 던져버리고 다음으로 넘어가십시오.
Principle 3: No Reasoning without Evidence (증거 없는 추론 금지)
눈으로 직접 확인한 사실(Fact)만이 다음 추론의 발판이 될 수 있습니다.
PresentMoment에서 배운 대로, 실행 결과를 확인하기 전까지는 모든 추론은 '소설'일 뿐임을 명심하십시오.
Principle 4: Use Tiny Experiments (실험 활용)
TinyExperiment를 사용하여 가설을 확인하십시오.
- 코드를 고치기 힘들다면 특정 변수 값을 강제로 바꿔보거나(Mocking), 로직의 일부를 주석 처리하여 현상이 사라지는지 확인하는 것도 훌륭한 '짧은 끈'입니다.
Real Examples
Example 1: The Config Mystery
"설정 파일이 안 읽히는 것 같아요. 그래서 DB 연결이 안 되고, 커넥션 풀이 꽉 차서..."라고 추측하는 대신, 설정 파일의 경로를 10초 만에 print() 해보는 것. 오타를 발견하는 순간 뒤의 복잡한 추론은 필요 없게 된다.
Example 2: The API Lag
"외부 API가 느려서 우리 서버 스레드가 부족해지는 것 같아요."라고 의심될 때, 해당 API 호출부를 1분간 주석 처리하고 가짜 응답을 리턴하게 해본다. 그래도 서버가 느리다면 외부 API 문제는 즉시 기각된다.
Common Pitfalls
"I'm 99% sure" (99% 확실해요)
이 생각이 가장 위험합니다. 99% 확실한 것도 1초 만에 확인할 수 있다면 확인하십시오. 버그는 항상 당신이 확신한 그 1%의 예외에서 자라납니다.
Professional Pride (전문가적 자존심)
"이 정도는 코드만 봐도 알지." 숙련된 탐정일수록 자신의 직관을 믿지 않고 눈앞의 증거를 믿습니다. 자존심을 버리고 데이터를 보십시오.
Connection to Other Patterns
DetectiveWork - ShortLeash는 수사의 효율을 극대화하는 핵심 전술입니다. 효율성
TinyExperiment - 짧은 끈을 확인하기 위한 가장 날카로운 도구입니다. 도구
PresentMoment - 지금 일어나는 사실에 발을 딛고 있어야 끈을 짧게 유지할 수 있습니다. 기반
TightLoop - 환경이 갖춰져 있어야 끈을 자주 잡아당길 수 있습니다. 전제 조건
Signs of Success
- 디버깅 중에 "아, 이게 아니었네"라고 깨닫는 시점이 획기적으로 빨라진다.
- 가설을 검증할 때마다 불확실성이 눈에 띄게 줄어드는 리듬을 느낀다.
- 팀원들과 대화할 때 "이럴 것 같아요"보다 "확인해보니 이렇습니다"라고 자신 있게 말하게 된다.
- 복잡한 추론 없이도 버그의 실체에 직선으로 접근한다.
The Ultimate Insight
추측은 멀리 갈수록 길을 잃고, 확인은 자주 할수록 길을 찾는다.
사냥개를 멀리 풀어놓으면 사냥개가 무엇을 쫓는지 알 수 없습니다. 짧은 끈으로 사냥개를 통제하며 함께 걸어가십시오. 진실은 당신의 복잡한 시나리오 속에 있는 것이 아니라, 바로 당신의 다음 확인(Verification) 속에 있습니다.
CategoryPatternLanguage CategoryProgramming CategoryDebugging CategoryProblemSolving
