Showing Posts From

2시

새벽 2시, 슬랙 알림음이 울렸다

새벽 2시, 슬랙 알림음이 울렸다

새벽 2시, 슬랙 알림음이 울렸다 핸드폰 화면이 파랗게 켜졌다. 새벽 2시 3분. 슬랙 알림이었다. 개발팀 리드의 메시지였다. "긴급. 프로덕션 배포 후 결제 모듈 오류 발생. 즉시 대응 필요합니다." 침대에 누워있던 몸이 반사적으로 일어났다. 13년을 하면서 이런 순간이 몇 번 있었는데, 체감상 점점 더 자주 터지는 것 같다. 남편은 여전히 깊게 자고 있다. 휴대폰 불 밝기를 낮춰서 침대 옆에 앉았다. 채널에 들어가니 개발팀장도 이미 온라인이었다. QA팀 부리드 신은 5분 전부터 확인 중이라고 했다. 상황은 심각했다. 결제 오류면 매출 직결이다. 우리 회사는 B2C 서비스라 고객 이탈로 직결될 수 있다. 밤 11시 배포였다. 테스트는 완벽하게 했다. 차수별로. 회귀 테스트도 깔끔하게 통과했다. 내가 직접 체크리스트를 짰다. 그런데 났다. 공황 vs. 책임감 30초가 지났다. 충동적으로 팀원들 슬랙을 켜고 싶었다. 그런데 손가락이 멈췄다. 새벽 2시다. 신은 이미 일어났을 거다. 다른 팀원들까지 깨우는 게 맞나? 아니다. 우선 상황을 파악해야 한다. 개발팀 리드에게 물었다. "현상 상세하게 주실 수 있나요? 에러 로그, 재현율, 영향 고객 규모." 너무 비즈니스 톤이었다. 내가 쓴 문장을 다시 읽으니 감정이 뺀져 있었다. 하지만 지금은 감정을 다룰 때가 아니다. 팀원들 수면 시간을 빼앗을지 말지 결정해야 한다. 응답이 2분 뒤에 왔다. 에러 로그 캡처, 재현율 100%, 영향 고객 약 8000명. 지난 1시간. 기술적으로는 간단한 문제였다. 데이터 타입 검증 로직이 배포 때 바뀌었단다. 우리 테스트에는 그 경로가 없었단 얘기다. 테스트 케이스 gap. 내 책임이다. 손이 떨렸다. 화면을 껐다가 다시 켰다. 신에게 메시지를 보냈다. "신. 일어났어? 상황 보자." 응답이 10초 만에 왔다. "이미 보고 있습니다. 개발팀이랑 핫픽스 준비 중." 신은 밤새 깨어있었던 거다. 내 팀원이. 새벽 2시에 홀로.30분 간의 체크리스트 침대에서 일어나 거실로 나갔다. 남편을 깨울 수 없다. 내일 그 친구 회의 많다. 노트북을 켰다. 실시간으로 개발팀과 슬랙 채널을 통해 진행 상황을 체크하기로 했다. 내가 할 일은 명확했다. 첫 번째. 원인 분석 리드. 개발팀이 핫픽스하는 동안 우리는 왜 이걸 못 잡았는지 파악해야 한다. 테스트 케이스 갭? 배포 전 리뷰 미스? 아니면 요구사항 자체에서 놓친 부분? 두 번째. 재발 방지책 수립. 오전 미팅 전에 대안까지 제시해야 한다. 그래야 관리진에게 설명할 수 있다. 세 번째. 팀원 폴로업. 신이랑 다른 팀원들이 이걸로 자책하지 않도록 해야 한다. 이건 내 책임이니까. 노트북 화면에 Jira를 켰다. 해당 스토리를 찾아서 요구사항부터 다시 읽기 시작했다. 오전 2시 26분. 요구사항은 "결제 모듈 타입 검증 강화"였다. 내가 쓴 테스트 케이스는 7개. 스토리 댓글에 개발팀 리드가 남긴 기술 문서를 다시 봤다. "정수, 실수, 문자 타입 모두 검증합니다." 우리 테스트는 정상 케이스 5개, 비정상 케이스 2개였다. 그런데 논리적 결함이 있었다. 비정상 케이스가 "null 값", "공백 문자" 이렇게만 있었다. 부동소수점 오버플로우 테스트는 없었다. 완전히 기술적 경험 부족이었다. 아니다. 나의 경험 부족이었다. 2시 41분. 개발팀이 핫픽스 배포했다고 올라왔다. 고객 영향이 멈췄다. 긴장이 풀렸다. 그 순간 눈시울이 뜨거워졌다. 아니다. 아직도 많이 남았다. 오전 4시, 팀원들을 깨우기 신에게 직통으로 전화를 걸었다. 음성 통화로 했다. 새벽 4시지만 문자로는 안 될 것 같았다. "안녕하세요." 신이 받았다. 목소리가 말끔했다. 안 자고 있었단 얘기다. "신, 고생 많았다. 지금 팀미팅을 하려고 하는데 괜찮겠어?" "예. 준비 중입니다." "다른 팀원들은 깨우지 마. 신, 넌 좀 괜찮아?" 5초간 침묵. 나는 전화기를 귀에 붙인 채 창밖을 봤다. 서울 하늘이 여전히 까맣다. "네. 진짜 죄송합니다." "뭔 소리해. 이건 내 책임이야. 요구사항 분석 단계에서 엣지 케이스를 못 잡은 건 내 책임이다. 넌 정상적으로 테스트 케이스를 실행했어. 반복하는데 이 오류는 나오지 않았어?" "맞습니다. 테스트는 다 통과했어요." "그럼 됐다. 프로덕션에는 시뮤레이션할 수 없는 데이터가 있는 거고, 우리는 그걸 예상할 수 없는 영역이 있는 거다. 오전 9시에 팀 전체가 모이면 어쨌든 얘기하겠지만, 지금은 먼저 자. 부리드가 다음 배포까지 감시할 거니까." "네. 감사합니다." 전화를 끊었다. 시간은 4시 12분. 밖은 여전히 까맣다.포스트모템 문서 작성 4시 30분부터 포스트모템 틀을 만들기 시작했다. 13년 해오면서 학습한 게 있다면, 장애 나면 감정적으로 대처하지 말고 시스템적으로 남겨야 한다는 거다. Root Cause Analysis 섹션을 작성했다. 원인:테스트 설계 단계에서 부동소수점 오버플로우 엣지 케이스 미포함 기술 문서 "타입 검증" 요구사항을 기능 관점에서만 해석 요구사항 검토 시 개발팀 기술 리드와 상세 논의 생략 테스트 케이스 리뷰 프로세스에서 경험 많은 멤버 참여 없음재발 방지책:타입 검증, 수치 연산 관련 스토리는 의무적으로 부리드 리뷰 추가 요구사항 분석 미팅에 개발팀 시니어 1명 참석 기술 요구사항 테스트 케이스에 "엣지 케이스 10개 이상" 체크리스트 추가 일일 빌드 배포 전 핵심 경로 수동 테스트 재강화5시 15분. 문서가 완성됐다. 관리자 슬랙 채널에 올렸다. CEO, CFO, 개발팀장이 받을 거다. 메시지를 달았다. "장애 원인 분석 및 개선안 첨부. 재발 방지를 위해 우리 팀의 테스트 프로세스를 다음 주부터 강화하겠습니다. 고객 영향도 해결되었으며 지속 모니터링 중입니다." 너무 뻣뻣한가? 다시 읽었다. 맞다. 이 정도가 맞다. 새벽 5시 30분, 여전히 깨어있다 침대에 가서 누웠다. 하지만 안 된다. 눈이 떠져 있다. 천장을 본다. 회의 시간까지 3시간 30분이 남았다. 팀원들을 어떻게 안심시킬지 생각했다. 신은 3년차다. 좋은 팀원이다. 하지만 이런 장애가 나면 자책한다. 내 역할은 그걸 다루는 거다. 내가 새벽 2시에 깼을 때 느낀 감정들을 정리해봤다. 처음엔 공황이었다. 그 다음은 책임감이었다. 그 다음은 팀원에 대한 미안함이었다. 공황은 줄었다. 책임감은 여전하다. 하지만 미안함이 문제다. 미안함이 다른 감정들을 잠식하면 안 된다. 내가 관리자가 된 건 5년 전이다. 그때 처음 느꼈던 감정은 "이제부터 내가 책임진다"는 거였다. 장애는 내 책임이다. 팀원 성과도 내 책임이고, 팀원 심리 상태도 내 책임이다. 이 책임감이 13년을 버티게 했나? 처음 회사 들어왔을 때는 "버그를 못 찾은 게 죄책감"이었다. 5년 전부터는 "팀원들이 괜찮게 해줄 수 없어서"가 죄책감이 됐다. 후배들이 가끔 물어본다. "선배님, QA 리드 됐을 때 달라진 점이 뭐예요?" 나는 대답한다. "프로세스 생각이 많아진다. 그리고 동시에 그 프로세스를 깨트리지 않으려고 한다. 왜냐면 프로세스가 팀원을 지켜주니까." 새벽 5시 47분. 노트북을 다시 켰다. 슬랙을 봤다. CEO가 반응했다. 엄지손가락 이모지. 일단 넘겼다.오전 9시, 팀 미팅 모두가 화상 회의 링크를 들어왔다. 신은 물론이고, 3년차 박, 2년차 임, 1년차 신입 이, 그리고 팀원 4명 더. 총 8명이 카메라를 켰다. "좋아. 어제 프로덕션 배포 후 장애가 났으니까 빠르게 공유할 거다. 먼저는 개발팀이랑 빠르게 핫픽스한 우리 팀원 신에게 감사한다. 밤새 깨 있었지?" 신이 고개를 저었다. 카메라 화질에서도 피곤한 얼굴이 보였다. "기술적 원인은 간단했다. 부동소수점 오버플로우. 근데 우리 테스트에는 그 케이스가 없었다. 이게 내 책임이다." 내가 말하는 동안 회의실 카메라가 조용했다. "각 팀원이 테스트 프로세스에서 실수한 게 아니다. 요구사항 분석 단계에서 우리가 엣지 케이스를 충분히 생각 못 했고, 내가 그걸 캐치 못 했다. 이제부터 뭘 할 거냐면..." 포스트모템 문서를 공유했다. 재발 방지책 4가지를 차근차근 설명했다. 특히 "부리드 리뷰 의무화"와 "개발팀 시니어와 요구사항 협업" 부분을 강조했다. "이건 우리 프로세스가 약하다는 뜻이니까, 우리가 보강해야 한다. 그리고 신. 너는 배포 전 수동 테스트 재강화 부분을 리드해 줄래?" 신이 고개를 끄덕였다. "네." "좋아. 다른 질문 있어?" 박이 손을 들었다. "혹시 이건 우리 평가에 반영되나요?" 좋은 질문이었다. 관리자라면 싫어할 질문이었지만, 나는 싫어하지 않았다. "당연히 안 된다. 각 개인의 업무 성과 평가에는 영향 없다. 대신 우리 팀 전체의 품질 메트릭스에는 반영된다. 그리고 경영진 리포트에도 올라간다. 하지만 이게 좋은 신호야. 왜냐면 이런 장애는 우리가 배울 기회이고, 다음부턴 못 잡을 확률이 줄어든다는 뜻이거든." 9시 27분. 회의를 끝냈다. 오전 10시, 남편과 커피 남편이 일어났다. "뭐 있었어?" "프로덕션 장애. 밤 2시에 났어." "그래서 못 자?" "응." "괜찮아?" "응. 이미 해결됐어." 그것보다 더 얘기하지 않았다. 남편도 개발자라 알아듣긴 하지만, 이런 건 일단 자기 책임으로 받는 게 맞는 것 같다. 공유하면 옮겨지거든. 남편이 커피를 만들어줬다. 아메리카노. 원래 세 잔이 평균인데, 오늘은 벌써 다섯 잔을 마셨다. "딸한테는?" "안 말했어. 엄마가 좀 바쁜 줄만 알면 돼." 남편이 웃었다. "13년을 이렇게 했네." "응." 남편이 맞다. 13년을 이렇게 했다. 밤에 깨서 일하고, 아침에 팀을 챙기고, 저녁에 리포트 쓰고, 주말에도 사건이 터지면 뛴다. 그런데 이게 성가신가? 아니다. 이게 일이니까. 게다가 내 팀원들이 안정적으로 일할 수 있게 하는 일이니까. [IMAGE_4] 오후 2시, 현실로 돌아와 사실 이 장애가 내 커리어에 영향을 줄까 생각했다. CEO가 본 건 포스트모템인데, 거기엔 "내 책임"이라고 명시했다. 나쁜 판단이었나? 아니다. 관리자가 책임을 회피하면 팀원들이 먼저 피한다. 팀 분위기가 완전히 달라진다. 우리 팀 문화는 "장애는 성장의 기회"다. 내가 처음 팀장 됐을 때부터 만든 문화다. 그래서 처음엔 이 문화가 안 먹혔다. 다른 팀에서는 장애가 터지면 책임자 찾아가지고, 우리는 "뭘 배우나"부터 시작했다. 5년이 지나니 이제는 팀원들이 오히려 소극적일 수 있다고 지적한다. "리스크 기반으로 테스트하되, 우리가 놓칠 수 있는 부분이 뭐냐"고 자발적으로 물어본다. 이게 좋은 신호다. 오후 2시. 신에게 슬랙을 보냈다. "수고했어. 내일부터 일상 복구하고, 이번 주 목요일까지는 추가 테스트 케이스 작성 시간 좀 갖자." 신이 응했다. "감사합니다." 어제 밤 2시와 오늘 오후 2시. 12시간이 지났다. 밤새 카페인만 했는데도 피곤하지 않다. 왜냐면 이건 내 일이거든. 책임감이 아드레날린인 셈이다. 저녁 7시, 퇴근 준비 리포트를 다시 봤다. 이번 주 테스트 성공률 99.6%. 어제 장애를 제외하면 99.99%다. 아이러니하지만 사실이다. 뭐 이 정도면 충분하다. 완벽한 건 없다. 다만 "다음 번엔 더 잘하자"만 있을 뿐이다. 남편에게 톡 보냈다. "7시에 나와." 퇴근 길에 걸어가면서 생각했다. 13년을 QA에 바쳤다. 몇 번 회사 이직도 고민했다. 개발 쪽으로 전향할 수도 있었다. 5년 전에 경영진 트랙도 제안받았다. 하지만 여기서 남았다. 왜냐면 품질은 협업의 결과라는 걸 알았거든. 그리고 팀원들을 보면서 성장하는 그 느낌이 있거든. 새벽 2시 슬랙 알림음이 싫을 수도 있다. 근데 그 소리가 울리면, 나는 일어난다. 왜냐면 이게 내 일이고, 이게 내 책임이고, 이게 내 팀이니까. 13년 후에도 여전히 같은 느낌이다. 다만 패턴만 달라졌다. 처음엔 "버그를 못 찾아서"였고, 이제는 "팀원들이 안전하게 일할 환경을 못 만들어서"다. 지표는 올라가야 한다. 그런데 지표만으로는 팀을 재지 못한다. 8시 30분. 집에 들어갔다. 딸이 "엄마!"라고 했다. "오늘 뭐 했어?" "학교에서..." 평범한 저녁이었다. 그게 고맙다.장애 없이 끝나는 날도 좋지만, 장애가 터지고 그걸 정확하게 처리하는 날이 더 남는다.