포스트모템 미팅, 누군가는 울었다

포스트모템 미팅, 누군가는 울었다

포스트모템 미팅, 누군가는 울었다 새벽 3시 장애 알람 휴대폰이 울렸다. 새벽 3시. 슬랙 알람 22개. 결제 시스템 다운. 일어나서 노트북 켰다. 남편이 물 한 잔 갖다줬다. "또야?" 고개만 끄덕였다. 모니터링 보니 최악이다. 결제 실패율 100%. 30분째 지속 중. 고객센터 폭발하고 있다. 개발팀 리드한테 전화했다. "지금 보고 있어요." 목소리가 떨린다. 데이터베이스 커넥션 풀 고갈. 누군가 쿼리를 잘못 날렸다. 롤백하는 데 1시간 걸렸다. 새벽 4시 30분 복구. 피해액 추산 시작. 30분간 결제 못한 건수 1,247건. 추정 매출 손실 8,500만원. 침대로 돌아갔다. 잠은 안 온다. 내일 포스트모템 해야 한다.회의실 예약, 금요일 오후 3시 목요일 아침에 공지했다. "금요일 3시, 장애 포스트모템" 참석자 12명. 개발팀 5명, QA팀 3명, 기획 2명, 인프라 2명. 준비할 게 많다. 타임라인 정리. 로그 분석. 영향도 산정. 근본 원인 파악. 수요일부터 자료 모았다. 목요일 저녁까지 정리했다. 슬라이드 32장. 중요한 건 톤이다. 누굴 탓하는 미팅이 아니다. 시스템을 고치는 미팅이다. 그게 내 역할이다.회의실, 무거운 공기 금요일 오후 3시. 다들 들어왔다. 표정이 무겁다. 특히 민수. 2년차 백엔드 개발자. 그 쿼리 짠 사람. 자리에 앉는데 손이 떨린다. 얼굴이 창백하다. 전날 밤 못 잤을 거다. 나도 그랬으니까. 5년 전 내가 놓친 버그로 장애 났을 때. 팀장한테 혼날까봐 화장실서 울었다. 회의 시작했다. "장애 포스트모템 시작하겠습니다." "이 자리의 목적은 한 가지입니다." "재발 방지." 민수가 고개 숙였다. "누굴 탓하는 자리 아닙니다." "시스템 문제를 찾는 자리입니다." 목소리 톤 신경 썼다. 단호하지만 따뜻하게. 타임라인, 차근차근 화면에 타임라인 띄웠다. 시간 순서대로 정리한 것. 22:15 - 신규 기능 배포 22:47 - 첫 슬로우 쿼리 발생 01:23 - 커넥션 풀 60% 사용 02:38 - 커넥션 풀 95% 도달 03:02 - 완전 고갈, 서비스 다운 04:32 - 롤백 완료, 서비스 복구 "보시면 배포 후 4시간 30분 뒤 장애입니다." "슬로우 쿼리는 2시간 전부터 감지됐습니다." 인프라 팀장이 끄덕였다. "모니터링에 안 걸렸어요?" "임계치가 80%였습니다." "95% 되고 나서야 알람 갔습니다." 첫 번째 문제점. 알람 기준이 너무 높다. 근본 원인, 하나가 아니다 민수가 손 들었다. "제가 쿼리를 잘못 짰습니다." 목소리가 떨린다. "인덱스 안 태운 게..." 끊었다. "민수씨, 잠깐만요." 화이트보드에 썼다. 근본 원인 분석 (5 Whys) "왜 장애가 났습니까?" "쿼리가 느렸다." "왜 쿼리가 느렸습니까?" "인덱스를 안 탔다." "왜 인덱스를 안 탔습니까?" "개발 단계에서 확인 안 했다." "왜 확인 안 했습니까?" "쿼리 성능 리뷰 프로세스가 없었다." "왜 프로세스가 없었습니까?" 침묵. 민수 쪽 안 봤다. 화이트보드만 봤다. "이건 개인 실수가 아닙니다." "시스템 구멍입니다."누군가 울 것 같은 순간 영향도 설명했다. "30분 동안 결제 불가" "1,247건 실패" "고객 272명 이탈" "추정 손실 8,500만원" 숫자 말할 때마다. 민수 얼굴이 구겨진다. 기획팀 차장이 말했다. "이거 누가 책임지나요?" 목소리에 날이 섰다. 분위기 싸해졌다. 민수가 고개 더 숙였다. 여기서 내가 안 나서면. 이 미팅은 마녀사냥 된다. "책임은 제가 집니다." 확실하게 말했다. "QA 팀장으로서." "배포 승인은 제가 했습니다." "쿼리 성능 검증 프로세스 없던 것도 제 책임입니다." 기획 차장 쳐다봤다. "민수씨 혼자 문제가 아닙니다." "우리 시스템 전체 문제입니다." 민수가 고개 들었다. 눈이 빨갛다. 재발 방지, 구체적으로 화이트보드에 적었다. Action Items 1. 쿼리 성능 리뷰 프로세스모든 신규 쿼리 explain 분석 필수 데이터베이스 팀 리뷰 후 배포 담당: 민수 + DBA팀 기한: 2주민수한테 물었다. "민수씨, 이거 같이 만들어볼래요?" "네." 목소리 나왔다. 2. 모니터링 개선커넥션 풀 알람 임계치 80% → 60% 슬로우 쿼리 5초 이상 즉시 알람 담당: 인프라팀 기한: 1주3. 스테이징 환경 강화프로덕션 데이터 규모 반영 부하 테스트 시나리오 추가 담당: QA팀 + 인프라팀 기한: 3주4. 배포 체크리스트 업데이트쿼리 성능 검증 항목 추가 롤백 계획 사전 수립 담당: QA팀 기한: 1주하나씩 설명했다. 누가 뭘 언제까지. 구체적으로. "이거 하면 막을 수 있었나요?" 개발팀 리드가 물었다. "네." "최소한 스테이징에서 잡았을 겁니다." 포스트모템은 학습이다 마무리했다. "이번 장애로 배운 것" 화이트보드에 적었다.개인 실수는 없다. 시스템 구멍만 있다. 모니터링은 예측 가능해야 한다. 프로세스가 사람을 지킨다."민수씨 실수 아닙니다." "우리가 만든 환경이 실수하기 쉬웠던 겁니다." 팀원들 고개 끄덕였다. "이제 우리가 할 일은" "실수해도 괜찮은 시스템 만드는 겁니다." 민수가 손 들었다. "저..." 목소리 떨린다. "다음부터 쿼리 짤 때" "인덱스 두 번 확인하겠습니다." "그리고..." 말 끊겼다. "죄송합니다." 고개 숙였다. 어깨가 떨린다. 울고 있다. 회의 후, 복도에서 회의 끝났다. 다들 나갔다. 민수만 남았다. 자리에 앉아 있다. 고개 숙인 채. 다가갔다. "민수씨." 고개 들었다. 눈 빨갛다. "괜찮아요." "팀장님..." "제가 큰일 낸 거 아닌가요?" 앉았다. 옆자리에. "5년 전에요." "제가 UI 버그 하나 못 잡았어요." "그게 배포됐고." "회원가입 안 됐어요. 이틀 동안." "진짜요?" "네." "그때 팀장님이 그러시더라고요." "포스트모템은 처벌이 아니라 학습이라고." "배웠어요?" "많이." "그래서 지금 팀장 하는 거예요." 민수가 웃었다. 눈물 닦으면서. "민수씨가 쿼리 성능 리뷰 프로세스 만들면" "이 회사에서 그 전문가 되는 거예요." "할 수 있을까요?" "할 수 있어요." "제가 도와줄게요." 자리에서 일어났다. "오늘 일찍 가요." "맥주나 한잔 하고." "네, 팀장님." 저녁, 집으로 퇴근길. 피곤했다. 근데 기분은 나쁘지 않다. 포스트모템 잘 끝났다. 누구도 상처받지 않았다. 액션 아이템 명확하다. 다들 책임감 생겼다. 이게 리더의 일이다. 장애는 막을 수 없다. 완벽한 시스템은 없다. 실수는 반드시 생긴다. 중요한 건. 그 후에 뭘 배우느냐. 그리고. 팀이 함께 배우느냐. 집 도착했다. 현관문 열었다. "엄마!" 딸이 뛰어온다. 안아줬다. "오늘 어땠어?" "좋았어!" 좋았으면 됐다. 저녁 먹으면서 남편한테 말했다. "오늘 포스트모템 했어." "어땠어?" "누가 울었어." "니가?" "아니, 후배." "왜?" "자기 탓인 줄 알았대." "근데 아니라고 했지." "착하네." "착한 게 아니라 사실이야." "시스템 문제니까." 설거지하면서 생각했다. 13년 하면서 배운 것. 품질은 개인이 아니라 시스템이다. 리더는 사람을 탓하는 게 아니라. 시스템을 고친다. 그리고. 팀원을 지킨다. 월요일 아침, 슬랙 메시지 주말 지나고. 월요일 아침. 민수한테 슬랙 왔다. "팀장님, 쿼리 성능 리뷰 가이드 초안 작성했습니다." "확인 부탁드려요." 문서 열었다. 20페이지. 주말에 작성한 거다.인덱스 체크리스트 Explain 분석 방법 슬로우 쿼리 판단 기준 데이터베이스 팀 리뷰 프로세스꼼꼼하다. 예시까지 달았다. 답장 보냈다. "민수씨 대단한데요?" "이거 전사 표준으로 만들어요." "감사합니다 팀장님." 웃었다. 혼자. 장애는 팀을 무너뜨릴 수도 있고. 더 강하게 만들 수도 있다. 차이는 리더가 만든다. 오전 회의 들어갔다. CTO가 물었다. "지난주 장애 포스트모템 어땠나요?" "좋았습니다." "재발 방지책 4개 나왔고요." "팀원 한 명이 전문가 됐습니다." "전문가?" "쿼리 성능 리뷰 프로세스 만들고 있습니다." "전사 표준으로 제안하려고요." CTO가 끄덕였다. "좋네요." 회의 끝나고 자리 돌아왔다. 커피 마셨다. 포스트모템은 쉽지 않다. 누군가는 운다. 누군가는 방어한다. 누군가는 회피한다. 근데 제대로 하면. 팀은 강해진다. 그게 내가 13년 배운 것이다.누군가 울었지만, 팀은 더 단단해졌다. 포스트모템은 처벌이 아니라 학습이다.

'QA는 왜 항상 일정을 늘려달라고 해?' - 경영진과의 대화

'QA는 왜 항상 일정을 늘려달라고 해?' - 경영진과의 대화

또 이 대화 경영진 회의실이다. 에어컨 온도는 22도. 나는 노트북을 연다. "QA 기간 2주 더 필요합니다." CPO가 한숨을 쉰다. "왜 항상 QA는 일정을 늘려달라고 해?" 13년 했다. 이 질문 100번은 들었다. 개발은 3주 늦어도 "기술 부채"라고 하면 넘어간다. QA가 2주 요청하면 "일정 지연"이 된다. 이게 현실이다. 오늘도 숫자 싸움이다.준비한 무기들 회의 30분 전. 자료를 다시 확인했다. 지난 3개월 장애 리포트. 배포 후 긴급 핫픽스 12건. 고객 클레임 48건. CS 처리 비용 2400만원. "테스트 기간 부족이 원인"이라고 적힌 포스트모템이 7건이다. 이번 릴리즈는 결제 모듈 개편이다. 리스크가 다르다. 리그레션 범위만 1200개 케이스다. 자동화로 커버되는 건 40%. 나머지는 수동이다. 팀원 8명. 계산하면 최소 15일이다. CPO는 "10일 안에"라고 했다. 불가능한 숫자다. 근데 "불가능"이라고 하면 끝이다. 숫자로 말해야 한다.대화의 기술 "10일로 줄이면 어떻게 되는지 보여드리겠습니다." 스크린에 표를 띄운다.시나리오 테스트 커버리지 예상 누락 결함 배포 후 장애 확률15일 (요청) 92% 2-3건 15%10일 (현재안) 67% 8-12건 45%7일 (최악) 48% 15건+ 75%CFO가 몸을 앞으로 기울인다. "45% 장애 확률이면 비용이 얼마죠?" 준비한 슬라이드다. "지난 분기 결제 장애 1건당 평균 처리 비용 320만원입니다. 개발 긴급 투입, CS 대응, 보상 비용 포함입니다. 10건 터지면 3200만원입니다." "QA 2주 연장 비용은 팀 인건비 기준 480만원입니다." CPO가 펜을 내려놓는다. 숫자는 거짓말을 안 한다. 근데 이 숫자를 만들려고 새벽 2시까지 엑셀 돌렸다는 건 말 안 한다. 그들이 듣고 싶은 말 "대안은 있습니까?" 이 질문이 나오면 절반은 이긴 거다. "세 가지 옵션 준비했습니다." "첫째, 테스트 범위 축소. 결제 코어만 집중. 주변 기능은 스모크 테스트만. 리스크는 남지만 12일로 가능합니다." "둘째, 외부 QA 인력 투입. 3명, 1주일. 비용 900만원. 일정은 10일로 맞출 수 있습니다." "셋째, 스테이지 배포 후 모니터링 강화. 실사용자 5% 먼저 오픈. 문제없으면 전체 배포. 초기 대응 리소스 확보 필요합니다." CPO가 고개를 끄덕인다. "셋째로 가죠. 대신 QA팀이 배포 후 3일간 온콜 가능합니까?" "가능합니다. 대신 다음 스프린트 계획 조정 부탁드립니다." "OK." 회의는 40분 만에 끝났다. 이게 정치다. 내가 원하는 15일은 못 받았다. 근데 10일에 무리한 범위 떠안는 것도 막았다. 타협이다. 매번 이렇다.회의실을 나와서 슬랙에 팀원들한테 메시지 보낸다. "스테이지 배포 방식으로 결정. 코어 시나리오 집중. 배포 후 3일 온콜 체제. 다음주 월요일 킥오프 미팅." 답장이 바로 온다. "또요?" "네..." "알겠습니다ㅠ" 미안하다. 근데 이게 최선이었다. 자리로 돌아와서 커피를 마신다. 세 번째다. 다음 회의는 1시간 후다. 개발 리드랑 테스트 범위 협의. 거기서 또 싸워야 한다. "이건 QA 범위 아니지 않냐", "개발에서 체크했으면 됐지", "왜 이걸 또 테스트해야 하냐." 경영진한텐 일정 늘려달라고 하고, 개발팀한텐 범위 줄이자고 한다. QA 팀장이 하는 일이다. 아이러니하다. 품질 책임자인데 품질 타협을 제일 많이 하는 사람이 나다. 숫자로 말해야 산다 신입 때는 몰랐다. "품질이 중요합니다", "리스크가 있습니다", "장애 날 수 있습니다." 이렇게 말하면 될 줄 알았다. 안 먹힌다. 경영진은 숫자를 본다. 확률, 비용, ROI. 그래서 나는 엑셀을 판다. 지난 1년간 모든 장애를 분석했다. 원인별, 비용별, 테스트 커버리지와의 상관관계. 피봇 테이블을 20개는 만들었다. "테스트 커버리지 10% 감소 시 장애 발생률 1.8배 증가" 이런 문장 하나 만들려고 3개월 데이터를 긁는다. 근데 이게 있으면 회의실에서 산다. CFO는 비용으로 말하면 듣는다. CPO는 일정 대안 주면 듣는다. CTO는 기술 부채 연결하면 듣는다. 같은 이야기를 세 가지 언어로 준비한다. 관리자가 되고 나서 배운 거다. 나는 QA 전문가인데 경영 통역사가 됐다. 팀원들한텐 못 보여주는 것 팀원들은 모른다. 내가 회의실에서 얼마나 싸우는지. "QA는 왜 항상 시간 더 달라고 해?"라는 말을 몇 번이나 듣는지. 그냥 "일정 조정됐어, 이렇게 하자"고 말한다. 왜냐면 팀원들은 테스트에 집중해야 하니까. 이런 정치 싸움에 에너지 쓰면 안 되니까. 근데 가끔 후배가 묻는다. "팀장님, 우리가 요청한 거 다 받아들여진 거예요?" 아니다. 절반도 못 받았다. 근데 "응, 최선이었어"라고 답한다. 이게 리드의 역할이다. 밖에서 싸워서 안으로 들어올 땐 방패가 되는 거. 팀원들은 내가 경영진한테 까이는 걸 볼 필요 없다. 나만 알면 된다. 집에 가면 남편한테 푼다. 남편도 개발 리드니까 안다. "QA는 항상 그런 거야, 고생했어." 위로는 안 되는데 그래도 들어주는 사람이 있다는 게 다행이다. 다음 릴리즈는 또 이번에 타협했다. 다음에도 타협할 거다. 근데 완전히 지는 건 아니다. 지난 2년간 내가 쌓은 데이터 덕분에 QA팀 예산은 30% 늘었다. 자동화 인프라 투자도 승인받았다. 팀원 2명 증원도 했다. 회의 한 번에 다 이기는 건 불가능하다. 근데 매번 조금씩 근거를 쌓으면 흐름은 바뀐다. "QA는 왜 항상 일정 늘려달라고 해?" 이 질문을 듣지 않는 날이 올까? 모르겠다. 근데 이제는 이렇게 생각한다. 이 질문을 받는다는 건, 우리가 일정에 영향을 줄 만큼 중요한 존재라는 뜻이다. 10년 전엔 QA는 의견도 못 냈다. 일정은 개발팀이 정했고 QA는 주어진 시간에 맞췄다. 지금은 회의실에 앉아서 숫자로 말한다. 타협은 하지만 무시당하진 않는다. 이게 내가 13년 동안 싸워서 얻은 거다.오늘도 이겼다고 할 순 없다. 근데 지지도 않았다.

팀원 1on1에서 '저 퇴사하고 싶어요'라고 들었을 때

팀원 1on1에서 '저 퇴사하고 싶어요'라고 들었을 때

목요일 오후 3시 1on1 시간이었다. 민지. 입사 3년차. 우리 팀에서 제일 꼼꼼한 애다. "팀장님, 저 퇴사하고 싶어요." 커피 마시다 말았다.준비한 건 아니었을 거다. 떨리는 목소리였다. "개발자로 전환하고 싶어요. QA는... 미래가 안 보여요." 3년 전 생각났다. 아니, 10년 전. 나도 똑같은 말 했었지. 예상했어야 했다 사실 조짐은 있었다. 최근 2주. 민지가 이상했다.회의 때 의견 안 냄 리뷰 요청해도 "네" 하고 끝 점심 같이 안 먹음 눈 마주치면 피함그냥 바쁜가 했다. 아니었다. "언제부터 생각했어?" "한... 6개월?" 6개월. 반년을 혼자 끙끙댔다는 거다. 팀장인 내가 몰랐다."이유를 들어도 될까?" 민지가 핸드폰 꺼냈다. 메모앱. 정리해온 거다. 진심이었다. 민지의 이유들 하나씩 읽어줬다. "QA는 개발보다 연봉이 낮아요." 맞다. 우리 회사만 그런 것도 아니다. "버그 찾으면 칭찬보다 '왜 이제 찾았냐'는 말을 더 많이 들어요." 이것도 맞다. "자동화 공부해도 개발팀이 '그건 우리가 할게요'라고 해요." 이것도 맞다. 지난주에 그랬다. "친구들이 개발자로 이직해서 연봉 2천 오른 얘기 들으면..." 말끝을 흐렸다. 다 맞는 말이었다. 하나도 반박 못 하겠더라. "그래서 개발자 준비 중이에요. 인프런 강의 듣고 토이 프로젝트 하고..." 밤에 코딩 공부한다고 했던 게 이거였구나. "팀장님한테 미안해서 말 못 했어요. 근데 오늘은... 거짓말하기 싫어서요." 민지 눈이 빨개졌다. 나도 코끝이 찡했다. 13년 차가 할 수 있는 말 "민지야." 뭐라고 해야 할까. 'QA도 좋은 직업이야' 같은 헛소리는 하기 싫었다. '연봉은 올라갈 거야' 같은 거짓말도 하기 싫었다. "팀장님도 그렇게 생각하시죠? QA는... 한계가 있다고." "응. 맞아." 민지가 놀란 표정이었다. "나도 10년 전에 개발자 전환 고민했어. 진짜로." "...정말요?" "응. 자바 공부도 했어. 토이 프로젝트도 만들었고." "그럼 왜 안 하셨어요?"한참 생각했다. "QA가 좋아서는 아니었어." 솔직하게 말했다. "그냥 10년 하다 보니까 여기가 내 자리더라. 이상하게." QA라는 자리 "민지야. 솔직히 말할게." "네." "QA는 인정받기 어려운 직업이야. 맞아." 민지가 고개 끄덕였다. "연봉도 개발자보다 적어. 이것도 맞아." "근데 팀장님은..." "근데 나는 계속했어. 왜냐면." 뭐라고 설명해야 할까. "우리가 없으면 진짜 큰일 나거든. 진심으로." 지난달 생각났다. 배포 전날. 민지가 시나리오 테스트하다가 결제 버그 찾았다. "결제 금액이 100배로 나가는 버그. 그거 민지가 찾았잖아." "...네." "그거 배포됐으면?" 민지가 입술 깨물었다. "CS 폭주하고, 환불 처리하고, 신뢰도 떨어지고. 최소 3억 손해." "근데 개발팀은 '고마워'보다 '휴 다행이야'라고만 했잖아요." "응. 맞아." 이게 QA다. 당연한 걸 당연하게 했을 뿐인데 아무도 알아주지 않는다. 근데 못 찾으면 욕먹는다. "근데 민지야. 그게 우리 일이야." "......" "불합리하지. 나도 안다." 퇴사를 말리고 싶지 않았다 "민지야. 솔직히 말할게." "네." "나는 너 붙잡고 싶어. 진심으로." 민지가 나를 봤다. "너 지금 우리 팀에서 제일 잘해. QA 감각도 좋고, 리스크 판단도 빠르고." "근데요?" "근데 개발자 되고 싶으면 해." "...네?" "13년 차가 3년 차한테 해줄 수 있는 말은 그거야." 민지 표정이 복잡했다. "QA는 마음에 들어서 하는 직업이 아니야. 적어도 나한테는." "그럼 왜 하세요?" "적성이 맞아서." 이상한 말 같지만 진짜다. "나는 버그 찾는 게 재밌어. 시나리오 짜는 것도 재밌고. 리스크 생각하는 것도." "저도 그런데요." "그래?" "네. 근데... 그게 커리어가 될까요?" 할 말이 없었다. 정답을 모르겠더라. 13년을 돌아보면 "민지야. 내가 13년 했잖아." "네." "10년 전에는 QA가 지금보다 더 안 좋았어." "...그랬어요?" "응. 테스터라고 불렀고, 수동 테스트만 했고, 경력 인정도 안 됐어." "지금은요?" "조금 나아졌어. 진짜로." QA 직무가 생긴 것만 해도 발전이다. 자동화 테스트 요구하는 것도. 성과 평가에 품질 지표가 들어간 것도. "5년 전보다는 확실히 나아졌어. QA 컨퍼런스도 생기고, 커뮤니티도 커지고." "근데 여전히 개발자보다는..." "응. 맞아." 이건 부정 못 한다. "그래도 나는 믿어. 앞으로 더 나아질 거라고." "...정말요?" "응. AI 시대에 품질은 더 중요해질 거야. 자동화도 더 발전할 거고." "그럼 저도 계속해야 할까요?" 대답 못 했다. 그건 내가 정해줄 수 있는 게 아니니까. 멘토의 한계 1on1 끝나고 혼자 남았다. 민지는 "생각해보겠습니다"라고 하고 나갔다. 표정은 여전히 어두웠다. 설득했나? 아니다. 위로했나? 그것도 아니다. 그냥 내 생각을 말했을 뿐이다. 창밖을 봤다. 저 밖에는 수많은 개발자들이 있다. 민지보다 적게 버는 개발자도 있고, 더 힘들게 사는 개발자도 있다. 근데 '개발자'라는 타이틀은 'QA'보다 낫다. 이게 현실이다. 슬랙에 민지 프로필 들어갔다. "3년차 QA Engineer. 꼼꼼함이 장점. 완벽주의자." 민지가 직접 쓴 소개다. 만약 민지가 떠나면. 팀은 돌아가겠지. 다른 사람 뽑으면 되고. 근데 민지 같은 사람 또 오기 어렵다. QA 감각. 이건 배워지는 게 아니거든. 팀장의 책임 저녁 7시. 남편한테 전화했다. "오늘 후배가 퇴사하고 싶대." "아 그래? 왜?" "QA가 미래 없다고." "...뭐라고 했어?" "사실을 말했지. 맞다고." 남편이 웃었다. "너답네." "근데 나 잘한 거 맞아?" "몰라. 근데 거짓말하는 것보단 낫잖아." 그렇긴 하다. 'QA도 좋은 직업이야' 같은 말 했으면. 민지는 더 혼란스러웠을 거다. "만약 민지가 진짜 퇴사하면?" "그럼 어쩔 수 없지." "내 책임 같은데." "왜?" "내가 QA를 매력적으로 만들지 못했으니까." 남편이 한숨 쉬었다. "여보. 그건 당신 책임이 아니야." "근데..." "QA 생태계 문제지. 당신이 어떻게 해." 맞는 말이다. 근데 위로는 안 된다. QA를 계속하는 이유 집에 와서 샤워했다. 거울 보니까 피곤한 얼굴. 38살. 13년 차. 왜 나는 QA를 계속하나. 개발자 전환할 수 있었다. 10년 전에. 연봉도 더 받을 수 있었다. 근데 안 했다. 왜? 답은 간단하다. 이게 내 자리니까. QA는 품질 지키는 사람이다. 아무도 안 보는 곳에서 리스크 찾는 사람. 배포 전에 마지막으로 확인하는 사람. 장애 나면 제일 먼저 달려가는 사람. 누가 해야 한다. 그게 나다. 13년 동안 느낀 거. QA는 소명이 아니다. 근데 누군가는 해야 하는 일이다. 그리고 나는 그걸 잘한다. 이상하게. 금요일 아침 출근했다. 민지가 자리에 있었다. "팀장님." "응." "어제 얘기 감사했어요." "...응." "집에 가서 생각 많이 했어요." "그래?" "일단은 더 해볼게요. QA." 가슴이 뛰었다. "근데 조건이 있어요." "뭔데?" "팀장님처럼 되고 싶어요. 13년 차." 뭐라고 대답해야 할까. "민지야. 나는 롤모델이 아니야." "알아요. 근데 팀장님은 거짓말 안 하잖아요." "......" "그게 좋았어요. 어제." 민지가 웃었다. "QA 힘들다고, 맞다고 해줘서. 근데 계속한다고 해서." "그래?" "네. 그럼 저도 해볼게요." "떠나고 싶으면 언제든지 떠나." "네. 알아요." 민지가 자리로 돌아갔다. 나는 커피 마시러 갔다. 손이 떨렸다. 아직도 잘 모르겠다. 내가 잘한 건지. 민지가 옳은 선택을 한 건지. 근데 확실한 건. 거짓말은 안 했다. 오후 회의 개발팀 리드 미팅. "이번 스프린트 일정 좀 빡빡한데요?" 개발 리드가 말했다. "테스트 기간 이틀만 줄여주시면..." 예전 같았으면 협상했을 거다. 근데 오늘은. "안 됩니다." "네? 왜요?" "품질은 협상 대상이 아닙니다." 회의실이 조용해졌다. "이틀 줄이면 시나리오 테스트 못 합니다. 장애 나면 책임 누가 집니까?" 개발 리드가 입술 깨물었다. "죄송합니다. 제가 너무..." "괜찮습니다. 일정은 함께 조율하죠." 회의 끝나고 민지가 말했다. "팀장님. 멋있었어요." "...그래?" "네. 저도 저렇게 할 수 있을까요?" "할 수 있어. 13년 차 되면." "아니요. 지금도 할 수 있어요." "...그래?" "네. 팀장님 보고 배웠어요." 민지가 웃었다. QA는 이런 직업이다. 누군가 지켜야 할 것을 지키는 일. 쉽지 않다. 외롭다. 근데 누군가는 해야 한다. 그게 우리다.팀원 퇴사 고민은 팀장 고민이기도 하다. QA 생태계 문제는 우리 모두의 숙제다. 근데 오늘 하루는 버텼다.

리스크 기반 테스트, 예산 없이 시작하다

리스크 기반 테스트, 예산 없이 시작하다

리스크 기반 테스트, 예산 없이 시작하다 또 반려됐다 자동화 투자 건의서 작성했다. 세 번째다. 이번엔 ROI 계산도 넣었다. 예상 절감 시간, 인건비 환산, 장애 감소율까지. 경영진 답변: "내년에 검토하겠습니다." 작년에도 들었다. 재작년에도. 회의실 나오면서 생각했다. 예산 없으면 못 하나? 아니다. 해야 한다. 품질은 돈으로만 사는 게 아니니까. 팀원들한테 말했다. "우리 방식으로 한다."전부 테스트는 환상 월요일 아침 팀 미팅. "이번 릴리즈 테스트 케이스 850개입니다." 신입 팀원이 말했다. 표정이 밝다. 나는 물었다. "일정은?" "3일입니다." 계산했다. 팀원 8명. 하루 8시간. 총 192시간. 케이스당 13분. 불가능하다. "다 못 한다." 팀원들 표정이 굳었다. "그래서 선택한다. 중요한 것만." 이게 리스크 기반 테스트다. 전부 하는 게 아니라 중요한 것부터. 예산 없으면 더 중요하다. 13년 전엔 나도 전부 하려 했다. 밤새워서라도. 지금은 안다. 그건 착각이다. 리스크 매트릭스 그리기 화이트보드 꺼냈다. 가로축: 발생 확률. 세로축: 영향도. 4사분면으로 나눴다. "우선순위 1: 높은 확률, 큰 영향" "우선순위 2: 낮은 확률, 큰 영향" "우선순위 3: 높은 확률, 작은 영향" "우선순위 4: 낮은 확률, 작은 영향" 팀원들이 포스트잇 붙이기 시작했다. 결제 로직 → 1사분면 로그인 → 1사분면 신규 AI 추천 기능 → 2사분면 관리자 통계 페이지 → 3사분면 이용약관 텍스트 수정 → 4사분면 850개 케이스가 정리됐다. 1사분면이 120개. 이것만 해도 충분하다.영향도 측정하는 법 개발팀 리드한테 물었다. "이번 릴리즈에서 결제 로직 변경 있나?" "네, 할부 옵션 추가했습니다." "작년 결제 장애 때 CS 문의 몇 건이었지?" "2300건이요. 환불 처리만 3일 걸렸습니다." 영향도는 이렇게 잰다. 과거 데이터. Jira에서 검색했다. 지난 6개월 Critical 버그. 결제 관련: 12건 로그인 관련: 8건 추천 관련: 2건 Confluence에서 장애 포스트모템 찾았다. 평균 복구 시간, CS 비용, 매출 손실. 숫자가 있으면 설득이 된다. 경영진한테도, 팀원들한테도. "이번엔 결제부터 집중 테스트합니다." 누구도 반대 안 했다. 발생 확률 판단하기 확률은 어떻게 아나. 코드 변경량 본다. Git diff 줄 수. 새 기능 > 기존 기능 수정 > 버그 픽스. 개발자 경력 본다. 시니어가 짠 코드 < 주니어가 짠 코드. 미안하지만 통계적 사실이다. 기술 스택 본다. 검증된 라이브러리 < 새로 도입한 라이브러리. 이번 릴리즈 분석했다.결제 로직: 500줄 변경, 주니어 개발, 새 PG사 연동 → 높음 로그인: 100줄 변경, 시니어 개발, 기존 OAuth → 중간 추천 AI: 신규 기능, 외부 API 의존 → 높음숫자로 보면 명확하다. 감이 아니라 근거다.850개를 120개로 팀 미팅 2일차. "4사분면 케이스는 스킵합니다." "3사분면은 스모크 테스트만." "2사분면은 핵심 시나리오만." "1사분면은 풀 테스트." 팀원 하나가 물었다. "4사분면 버그 나오면요?" "나온다. 근데 치명적이지 않다." "우리가 못 찾으면 유저가 찾는다. CS가 처리한다." "그게 현실이다." 13년 전 나라면 이 말 못 했다. 완벽주의였으니까. 지금은 안다. 완벽은 없다. 우선순위만 있다. 120개 케이스 배분했다. 시니어 팀원 → 1사분면 복잡한 시나리오 주니어 팀원 → 1사분면 단순 시나리오 각자 하루 15개씩. 3일이면 된다. 야근 없이. 자동화는 나중에 팀원이 또 물었다. "자동화하면 더 빠른데요." 맞다. 근데 자동화에도 비용이 든다. 스크립트 작성 시간: 케이스당 1시간 유지보수 시간: 월 20시간 CI/CD 파이프라인 구축: 80시간 툴 라이선스: 연 500만원 예산 없다. 인력도 부족하다. "지금은 수동으로 간다. 효율적으로." "1사분면 테스트만 반복되면 그때 자동화한다." 실제로 작년에 그랬다. 로그인 테스트 3달 연속 1사분면. 그때 Selenium으로 자동화했다. 개인 시간 써서. 경영진은 몰랐다. 팀 생산성만 올랐다고 봤다. 그걸로 충분했다. 개발팀이랑 협상 리스크 매트릭스 들고 개발 리드 만났다. "1사분면 기능 버그 나오면 배포 연기합니다." "2사분면은 핫픽스 가능하면 배포 진행합니다." "3, 4사분면은 다음 스프린트로 미룹니다." 개발 리드가 고개 끄덕였다. "합리적이네요." 리스크 기반 접근의 장점이다. 협상 카드가 생긴다. "전부 테스트해야 해요" → 개발팀: "일정 늦어지는데?" "1사분면만 보장합니다" → 개발팀: "그럼 배포 가능하겠네요." 예산 없어도 영향력은 키울 수 있다. 테스트 실행 3일 일정 시작했다. 첫날: 1사분면 결제/로그인 테스트 둘째날: 2사분면 신규 기능 핵심 시나리오 셋째날: 리그레션, 통합 테스트 팀원들 야근 안 했다. 120개만 하니까 가능했다. 버그 발견: 18건 Critical: 3건 (전부 1사분면) Major: 8건 (2사분면 5건, 1사분면 3건) Minor: 7건 (3사분면) Critical 3건 개발팀에 전달했다. "배포 블로커입니다. 수정 필요합니다." 개발 리드가 우선순위 올렸다. 이틀 만에 픽스 완료. Minor 7건은 백로그로. "다음 스프린트에서 처리하겠습니다." 경영진 보고: "치명적 버그 사전 차단, 일정 준수" 칭찬받았다. 배포 후 모니터링 배포 당일 저녁. 슬랙 알람 울렸다. CS팀에서. "결제 오류 문의 들어왔습니다." 심장 내려앉았다. 1사분면인데. 확인했다. 특정 카드사 무이자 할부 오류. 우리는 테스트했다. 근데 그 카드사는 안 했다. 테스트 환경에 그 카드 없었다. PG사에서 제공 안 했다. 밤 10시에 개발팀이랑 회의했다. 원인 파악, 핫픽스 배포. 새벽 2시 종료. 다음 날 포스트모템 작성했다. "테스트 환경 카드사 목록 확대 필요" "PG사 연동 시 전체 카드사 검증 프로세스 추가" 완벽은 없다 회고 미팅 했다. "우리가 못 잡은 버그 나왔습니다." "그래도 잘했습니다." 팀원들 표정이 어두웠다. "850개 다 했으면 잡았을까요?" 고개 저었다. "모르겠습니다. 테스트 환경 문제니까." "우리는 제한된 리소스로 최선을 다했습니다." "1사분면 집중해서 Critical 3건 사전에 잡았습니다." "하나 놓쳤지만 빠르게 대응했습니다." 이게 현실이다. 예산 없는 QA의 현실. 완벽은 환상이다. 우선순위가 전부다. 경영진 설득 분기 보고 때 자료 만들었다. 슬라이드 1: 리스크 기반 테스트 도입 전후 비교테스트 커버리지: 100% → 15% (숫자는 솔직하게) 치명적 버그 차단율: 75% → 90% 장애 복구 시간: 평균 8시간 → 4시간 팀 야근 시간: 월 80시간 → 월 20시간슬라이드 2: 비용 절감 효과장애 대응 인건비 절감: 월 300만원 CS 비용 감소: 월 150만원 예산 투입: 0원슬라이드 3: 향후 제안1사분면 자동화 투자 시 추가 절감 예상: 연 5000만원CFO가 물었다. "예산 없이 이렇게 했다고?" "네. 팀원들이 똑똑하게 일했습니다." "내년 자동화 예산 검토하겠습니다." 처음으로 긍정적 답변 들었다. 다른 팀에 전파 타 팀 QA 리드가 찾아왔다. "리스크 매트릭스 어떻게 만드나요?" 화이트보드 다시 꺼냈다. 설명했다. "과거 데이터 찾으세요. Jira, 장애 로그, CS 문의." "영향도는 숫자로. 발생 확률은 코드 변경량으로." "4사분면 나누고 1사분면만 집중하세요." 그 팀도 예산 없었다. 우리 방식 적용했다. 두 달 뒤 만났다. "팀 야근 절반 줄었어요." QA 커뮤니티에도 올렸다. 노하우 공유. 댓글 많이 달렸다. "우리도 예산 없는데 해볼게요." "리스크 매트릭스 템플릿 공유 가능한가요?" Confluence에 정리해서 링크 걸었다. 1년 후 올해 자동화 예산 나왔다. 3000만원. 적다. 근데 시작할 수 있다. 1사분면 케이스부터 자동화했다. 우선순위대로. 6개월 만에 40개 케이스 자동화. 수동 테스트 시간 30% 줄었다. 그 시간에 2사분면 커버리지 올렸다. 리스크 기반 접근은 계속한다. 예산 있어도. 효율의 문제니까. 경영진이 이제 묻는다. "리스크 1사분면 몇 개죠?" 전부 테스트했냐고 안 묻는다. 팀원들도 바뀌었다. 케이스 수로 자랑 안 한다. "Critical 버그 3건 잡았습니다" 이렇게 말한다. 예산은 핑계다 솔직히 말한다. 예산 있으면 좋다. 툴 사고, 교육받고, 인프라 구축하고. 근데 예산 없다고 품질 포기할 순 없다. 우리한테 있는 건 머리다. 리스크 분석, 우선순위, 과거 데이터. 13년 하면서 배웠다. 비싼 툴보다 똑똑한 전략이 낫다. 물론 둘 다 있으면 최고다. 근데 하나만 고르라면 전략. 내년엔 예산 더 받을 것이다. 리스크 기반으로 성과 냈으니까. 그때도 이 방식은 유지한다. 돈으로 품질 사는 게 아니니까.예산 없어도 머리는 있다. 그걸로 이긴다.

품질은 협업의 결과다 - 개발팀과 싸운 날

품질은 협업의 결과다 - 개발팀과 싸운 날

품질은 협업의 결과다 - 개발팀과 싸운 날 월요일 오전 10시 회의실에 들어갔다. 개발팀 리드 석진이 먼저 말했다. "이번 배포, 일정 당겨야 합니다." 나는 테스트 계획서를 펼쳤다. 283개 케이스. 리그레션 포함하면 최소 5일 필요하다. "5일 드려야 합니다." "3일 안에 가능하지 않나요?" 아니다. 불가능하다."결제 모듈 변경됐어요. 여기 리스크 높습니다." 석진이 한숨 쉬었다. "QA팀이 병목입니다. 솔직히." 그 말을 들은 순간 뭔가 확 올라왔다. 13년 하면서 수백 번 들은 말이다. QA가 느리다. QA가 막는다. QA 때문에 출시가 늦다. "병목이 아니라 안전망입니다." 내 목소리가 차가워졌다. 회의실 공기가 얼었다. 지난 3개월을 돌아보다 커피를 뽑았다. 네 번째다. 지난 분기 우리가 잡은 크리티컬 버그. 17건이다. 배포 전에 잡았다. 만약 그게 프로덕션에 나갔다면? 생각만 해도 끔찍하다. 2월에 결제 모듈 오류 놓쳤다. 내가 승인했다. 개발팀이 "사소하다"고 했다. 배포 후 30분 만에 장애 터졌다. 고객 클레임 47건. 매출 손실 추산 불가. 포스트모템 회의 3시간. 그때 석진이 뭐라고 했나. "QA에서 잡았어야죠." 맞다. 내 책임이다. 그런데 왜 테스트 시간은 안 주나. 오후 2시, 다시 회의 기획팀 리드도 왔다. 경은이다. 그는 내 편이다. 보통은. "일정 조율 필요합니다." 석진이 자료를 띄웠다. 개발 완료 예정일. 배포 목표일. 사이에 QA 기간 3일. "리그레션 빼면 되지 않나요?" 내가 웃었다. 웃긴 소리다. "리그레션 빼면 뭘 보장하죠?" "이번에 변경된 부분만 집중 테스트." "결제 모듈이 회원 모듈이랑 연동돼요. 주문 히스토리도 영향받고요. 전체를 봐야 합니다." 석진이 답답한 표정이다. "현실적으로 생각하세요. 경쟁사가 벌써 출시했어요." "경쟁사는 장애 안 나나요?" 내가 경쟁사 모니터링 자료를 꺼냈다. 지난달 그들의 앱 다운. 3시간. 트위터에 난리 났다. 우리는 그러면 안 된다.팀원 지영이가 말했다 회의 끝나고 지영이가 왔다. QA 5년차다. "팀장님, 3일이면 못 합니다." "알아. 나도 알아." "개발팀은 우리를 뭘로 보는 걸까요." 그 질문에 답을 못 했다. 13년 했는데도 모르겠다. "협력 부서인데 왜 맨날 싸워야 해요." 지영이 목소리가 떨렸다. 피곤한 거다. 나도 피곤하다. "지영아, 우리가 싸우는 게 아니야." "그럼요?" "우리는 품질을 지키는 거야." 진부한 말이다. 그런데 달리 할 말이 없다. 수요일 새벽 2시 결국 배포했다. 3일 테스트했다. 내가 승인했다. 리스크 문서에 사인했다. "결제 모듈 엣지 케이스 미검증" 배포 후 1시간. 슬랙에 빨간불 떴다. "결제 오류 발생" 심장이 멈췄다. 전화가 왔다. 석진이다. "결제가 안 됩니다." "알아요. 확인 중입니다." 팀원 3명 호출했다. 로그 뜯었다. 원인 찾았다. 예상했던 바로 그 케이스다. 엣지 케이스. 특정 결제 수단 + 쿠폰 중복 사용 시 에러. 테스트 계획서 283번 케이스. 리그레션 항목이었다. 새벽 4시, 긴급 회의 전화 회의다. 목소리들이 날카롭다. "왜 못 잡았습니까?" 경영진 질문이다. "테스트 기간이 부족했습니다." 내 대답이다. "그래도 크리티컬은 잡았어야죠." 맞다. 맞는 말이다. 그런데. "5일 요청했습니다. 3일 주셨습니다." 회의실이 조용해졌다. 석진이 말했다. "개발 일정이 촉박했습니다." "그래서 품질을 포기합니까?" 내 목소리가 떨렸다. 화난 거다. 13년 만에 처음으로 회의에서 목소리 높였다. 목요일 오전, 포스트모템 회의실에 모였다. 8명이다. 화이트보드에 타임라인 그렸다. 배포 시간. 장애 발생. 복구 완료. 피해 규모 집계했다. 거래 실패 78건. 고객 문의 124건. 매출 손실 약 3,200만원. "근본 원인이 뭡니까?" 내가 물었다. 석진이 답했다. "엣지 케이스 테스트 누락." "왜 누락됐습니까?" "시간이 부족했습니다." "왜 시간이 부족했습니까?" 질문을 계속했다. Why를 5번 물었다. 결국 나온 답. "일정 압박." 그리고 더 근본적인 원인. "팀 간 신뢰 부족."금요일, 달라진 것 석진이 내 자리에 왔다. "커피 한잔 할까요?" 카페테리아 갔다. 둘이 앉았다. "죄송합니다." 석진이 먼저 말했다. "저도요." 내 대답이다. "제가 일정만 생각했어요. 품질은 당연히 지켜질 거라고." "저도 QA가 다 막아야 한다고 생각했어요." 우리는 둘 다 틀렸다. 품질은 QA만의 책임이 아니다. 개발만의 책임도 아니다. 기획도, 디자인도, 모두의 책임이다. "다음부터는 달라야 합니다." 석진이 말했다. "네. 달라야죠." 새로운 프로세스 월요일 아침. 전체 회의 소집했다. 개발팀, 기획팀, QA팀. 12명 모였다. "품질 협업 프로세스 만들겠습니다." 화이트보드에 썼다. 1단계: 기획 단계부터 QA 참여요구사항 리뷰 리스크 사전 식별2단계: 개발 중 지속적 소통데일리 싱크업 15분 변경사항 즉시 공유3단계: 현실적 일정 수립테스트 기간 = 개발 기간의 30% 리그레션 필수 포함 버퍼 20% 확보4단계: 공동 책임품질 지표 공유 팀별 KPI에 품질 항목 추가석진이 끄덕였다. 기획팀 경은이도 동의했다. "일정은 늘어나겠네요." 경은이 말이다. "네. 대신 장애는 줄어듭니다." 내 대답이다. 한 달 후 새 프로세스로 첫 배포했다. 테스트 기간 7일 받았다. 개발 완료 후 하루 버퍼도 있었다. 283개 케이스 전부 돌렸다. 리그레션 포함. 크리티컬 버그 3건 잡았다. 개발팀이 즉시 수정했다. 배포했다. 새벽 12시다. 슬랙 모니터링했다. 1시간. 2시간. 3시간. 초록불이다. 이슈 없다. 석진한테 메시지 보냈다. "배포 안정적입니다." 답장 왔다. "고생하셨습니다. 팀장님 덕분입니다." 아니다. 우리 모두 덕분이다. 지영이가 물었다 "팀장님, 이제 개발팀이랑 안 싸워요?" 웃었다. 싸움은 아니었다. "우리는 원래 안 싸웠어. 품질을 지키려고 했던 거지." "그럼 이제는요?" "같이 지킨다." 품질은 협업의 결과다. 13년 만에 확실히 깨달았다. QA가 혼자 막는 게 아니다. 개발이 혼자 만드는 것도 아니다. 기획이 혼자 기획하는 것도 아니다. 우리는 팀이다. 지금 퇴근길이다. 8시다. 늦지 않다. 엘리베이터에서 석진 만났다. "내일 스프린트 플래닝에서 QA 일정 먼저 잡죠." "네. 먼저 잡아주세요." 웃으며 헤어졌다. 차에 올랐다. 핸들 잡았다. 한숨 쉬었다. 13년 했다. 이제야 제대로 하는 거 같다. 품질은 QA의 책임이 아니다. 품질은 우리 모두의 약속이다. 배포 후 장애 없이 잠드는 밤. 이것만큼 좋은 게 없다.품질은 혼자 지키는 게 아니다. 같이 만드는 거다.