본문 바로가기

가로등 밑에는 버그가 없다

반응형

 

새벽 2시, 알림이 울린다.
주문 API의 응답 시간이 평소의 스무 배로 뛰었다.
타임아웃이 번지고, 고객 문의가 쌓이기 시작한다.
당직자가 제일 먼저 여는 건 배포 기록이다.
저녁 6시에 나간 릴리스가 눈에 들어온다.
범인 확정.
다들 그렇게 믿는다.
방금 바뀐 것이 방금 터진 것의 원인이라는 건, 너무나 자연스러운 추론이니까.

롤백을 건다.
5분 뒤, 그래프는 꿈쩍도 하지 않는다.

 

 

📑 목차

 

 

모두가 같은 곳을 판다

 

여기서부터가 진짜 삽질의 시작이다.
롤백이 안 먹혔으니 배포 자체가 문제는 아닐 텐데, 팀은 여전히 그 릴리스 주변만 판다.
바뀐 쿼리를 뜯어보고, 새로 추가된 인덱스를 의심하고, 방금 머지된 PR의 diff를 한 줄씩 다시 읽는다.
슬랙에는 "이 커밋 아니야?" "저 함수 좀 이상한데"가 오간다.

한 시간이 지나도 원인은 나오지 않는다.
그런데 이상하지 않은가.
확실히 아니라고 방금 증명된 영역을, 왜 우리는 계속 파고 있을까.

이유는 단순하다.
거기가 우리가 볼 수 있는 유일한 곳이기 때문이다.
diff는 깔끔하게 정리돼 있고, 코드는 익숙하고, 배포 시각은 장애 시각과 그럴듯하게 겹친다.
반면 나머지 세계 — 커넥션 풀, DNS 리졸버, 인접 서비스의 캐시 TTL, 어젯밤 조용히 돌아간 배치 — 는 어둡고, 낯설고, 로그도 흩어져 있다.
그래서 우리는 밝은 쪽만 본다.

 

 

열쇠는 가로등 밑에 없었다

 

밤늦게 술 취한 사람이 가로등 밑을 뒤지고 있다.
지나가던 이가 묻는다.
"여기서 열쇠를 잃어버렸어요?" 취객이 답한다.
"아니요, 저쪽에서요.
근데 여기가 밝잖아요." 심리학에서 '가로등 효과(streetlight effect)'라고 부르는 이 오래된 우화는, 사실 장애 대응실에서 매일 밤 재연된다.

그날의 진짜 원인은, 아무도 두 시간 동안 쳐다보지 않은 곳에 있었다.
한 예로 들자면 — 2년간 아무도 건드리지 않은 설정값.
커넥션 풀 최대치가 트래픽 자연 증가를 어느 순간 넘어섰고, 저녁 배포는 그저 방아쇠를 조금 당겼을 뿐이다.
코드는 죄가 없었다.
죄가 없으니 롤백이 안 먹혔던 거다.

핵심은 이거다.
그 설정값은 아무도 건드리지 않았기 때문에 아무도 감시하지 않았다.
최근 바뀐 것만 의심하는 습관은, 오래 안 바뀐 것을 완벽한 사각지대로 만든다.
가장 안정적이라 믿는 영역이 가장 어두운 영역이 된다.

 

 

밝은 곳이 곧 함정이다

 

여기서 한 번 더 뒤집어 보자.
우리가 가로등 밑을 파는 건 게을러서가 아니다.
그 빛은 다름 아닌 우리의 전문성이다.
나는 이 서비스 코드를 잘 안다.
그래서 코드부터 본다.
인프라 엔지니어라면 네트워크 계층부터 팠을 것이고, DBA라면 슬로우 쿼리 로그부터 열었을 것이다.
각자 자기 가로등 밑을 판다.

그리고 시니어가 될수록 이 빛은 더 밝아지고, 동시에 더 좁아진다.
경험이 쌓인다는 건 "이건 이래서 안 될 리 없어"라는 확신의 목록이 길어진다는 뜻이기도 하다.
그 확신 하나하나가, 들여다보지 않기로 한 어둠의 목록이다.
주니어가 순진하게 "혹시 이건 확인해봤어요?"라고 물었다가 정답을 맞히는 순간이 그래서 생긴다.
그는 아직 끌 가로등이 없었을 뿐이다.

 

 

어둠으로 한 걸음

 

그러니 장애를 빨리 잡는 사람의 진짜 무기는 지식의 양이 아니다.
자기 확신을 증상으로 취급하는 습관이다.
"그건 아닐 거야"라는 문장이 입에서 나오는 순간, 바로 그곳에 손전등을 비추는 훈련.

실전에서 이건 거창한 게 아니다.
원인을 좁히기 전에 "지금 우리가 안 보고 있는 계층이 어디지?"를 한 번 소리 내어 묻는 것.
최근 diff만이 아니라 "최근 6시간 동안 아무것도 안 바뀐 것 중에 지표가 흔들린 건 없나"를 함께 보는 것.
확신이 강할수록 그 영역을 먼저 배제 증명하는 것.
롤백이 안 먹힌 그 5분을, 계속 파라는 신호가 아니라 가로등을 옮기라는 신호로 읽는 것.

버그는 언제나 어두운 곳에 있다.
밝은 곳에 있었다면, 진작 보였을 테니까.

🔗 이어서 읽기

반응형