Showing Posts From

롤백하고

웹개발자는 롤백하고, 나는?

웹개발자는 롤백하고, 나는?

웹개발자는 롤백하고, 나는? 지난주 팀 술자리에서 웹개발 하는 대학 후배가 했던 말이 자꾸만 떠올라. "어제 배포 망쳤는데 1분 만에 롤백했어. 문제 없음." 그러곤 웃었다. 맥주 한 잔 마시더니 말이다. 나는 그 말을 듣고 어떤 표정을 했는지 모르겠다. 웃었을 수도 있고, 그냥 마셨을 수도 있고. 기억이 안 난다. 그냥 '아, 그렇구나' 했던 것 같다. 펌웨어는 그렇지 않다. 한 번 나가면 끝 양산이 나가기 전, 문제가 발견되는 게 가장 좋다. 그럼 다시 테스트하고, 버그 고치고, 다시 나간다. 시간은 걸리지만 그래도 시간이면 된다. 양산이 나간 후, 문제가 발견되는 건 다르다. 시리즈 50만 개가 판매되고 있다고 치자. 그 중 200개 정도에서 특정 상황에서만 먹통이 되는 버그가 있다고 하자. 그럼 어떻게 되나? 회사는 리콜을 결정한다. 50만 개를 다 회수해야 할까? 아니다. 200개만이라도 빼서 수리하는 데 생기는 비용. 택배비. 검수 비용. 인건비. 시간. 신뢰도 하락. 그 숫자가 억 단위가 된다. 수십억일 수도 있다. 그게 내 잘못일 수도 있다. 출근하면 테스트 결과부터 어제 밤 10시 50분에 보드에 올린 펌웨어의 테스트 결과가 10시간 돌려졌다. 실패다. 또다시 실패다. "UART로 로그 떴어?" 아니. 부팅도 안 돼. 하드웨어 이슈가 아닐까. HW팀에 연락했다. "그쪽 회로 정상 맞나요?" 이건 내가 이미 3번째 하는 질문이다. "펌웨어가 Initialize 못 하는 거 아니야?" 둘 다 맞을 수도 있다. 하드웨어 설계 스펙이 펌웨어 예상과 다를 수 있다. Reference Manual은 2년 전 버전이고, 실제 칩은 새로 나온 패키지다. 스펙이 바뀌었을 수도 있다. 누군가는 문서를 수정해야 했는데, 그 누군가가 일을 안 했을 수도 있다. 한국 회사지만, 칩은 중국 제조사다. 중국 매뉴얼을 영어로 번역한 거다. 한국어 번역은 없다. 그 스펙 매뉴얼이 1000페이지다. 찾는 게 뭔지를 정확히 모르면서 1000페이지를 찾는다. 마치 영어 사전에서 스펠링 모르는 단어를 찾는 것처럼. 웹개발자의 세계 회의실에서 웹팀 리드가 웃으면서 말했다. "저희는 버그 발견되면 바로 핫픽스하고 배포하면 돼요. 2시간이면 사용자가 문제 없다고 느껴요." 부러운 게 아니다. 그게 상식이기 때문에 더 부럽다. 생각해보니, 웹은 내가 배포한 버전이 뭐가 됐든 상관없다. 사용자는 항상 최신 버전을 본다. 내가 만든 거 못 봐. 버그도 못 봐. 내가 고쳤으면 끝이다. 앱도 마찬가지다. 물론 앱 스토어 심사 시간이 있지만, 긴급 업데이트는 몇 시간 안에 나간다. 사용자가 다운받으면 끝. 과거 버전은 사라진다. 우리는 다르다. 양산이 나가는 그날 양산이 나가는 날은 회의가 많다. "완전히 테스트했나?" "네, 온도 테스트, 습도 테스트, ESD 테스트, 수명 테스트 다 했습니다." "예상 이슈는?" "진동 테스트에서 한 번 부팅이 느렸는데, 재현이 안 돼서 일단 기록만 해뒀습니다." 그 말을 하는 순간부터 신경 쓴다. "한 번 부팅이 느렸다"는 게 뭔가. 왜 그랬나. 다시 재현되면? 그때는 뭐 할 건가. ECN 절차가 있다. 양산 후 발견된 버그를 고쳐서 나머지 로트에 반영하는 절차. 시간도 걸리고 비용도 든다. 1-2개 로트면 괜찮은데, 5-6개 로트까지 나갔을 땐 점점 비용이 커진다. 가장 최악의 경우는 리콜이다. 밤새는 일상 지난 화요일, 새벽 1시에 보드를 보고 있었다. 오실로스코프에서 SPI 신호가 이상했다. 클록이 들쑥날쑥했다. 펌웨어 버그일까, 하드웨어일까. HW팀 설계자에게 슬랙 메시지를 보냈다. "아직 안 주무셨나요?" 새벽 2시였다. 설계자도 깨어있었다. "어? 너도 봤어?" 그럼 다 같이 본다는 뜻이다. 보드를 들었다 놨다를 반복했다. 회로도를 봤다. 매뉴얼을 봤다. 코드를 봤다. 결론은 저항값 하나였다. Pull-up 저항이 약한 거였다. 나는 펌웨어가 잘못된 줄 알고 2시간을 낭비했다. "이거 저 고치고 다시 보내면 될 거 같은데?" HW팀이 말했다. "알겠습니다." 나는 왜 펌웨어만 의심했을까. 아마도 하드웨어는 기판이 나가면 고칠 수 없다는 생각 때문이었을 것 같다. 펌웨어는 다시 올릴 수 있으니까. 하지만 기판도 다시 나갈 수 있다. 다만 비용이 비싸고, 시간이 오래 걸릴 뿐이다. 돌이킬 수 없는 결정 웹개발자들이 부러운 이유는 뭘까. 아마도 피드백 루프가 빠르다는 것 때문일 것 같다. 내가 코드를 짰다. 1시간 뒤에 사용자가 버그를 발견했다. 1시간 뒤에 나는 버그를 알았다. 1시간 뒤에 내가 고쳤다. 1시간 뒤에 사용자가 고쳐진 버전을 봤다. 4시간 사이클. 그 안에 내가 배웠고, 고쳤고, 다시 배웠다. 우리는 다르다. 내가 코드를 짰다. 2주일을 테스트했다. 배포했다. 3개월 뒤에 버그가 발견됐다. 그 버그는 극단적인 상황에서만 나타난다. 사용자는 그 상황을 만났고, 우리는 그 상황을 못 만들었다. 이제 어떻게 해야 할까. 하드웨어를 회수하고, 펌웨어를 업데이트하고, 다시 배포한다. 3개월이 지난 버전을 수정해야 한다. 그 사이에 나는 다른 프로젝트를 했을 것이다. 코드를 까먹었을 것이다. 그 로직이 왜 그렇게 짜여있었는지 모를 것이다. 그래도 고쳐야 한다. 롤백은 불가능한 말 "혹시 이전 버전으로 롤백할 수 있나?" 그 질문은 펌웨어에서 가능할 수도, 불가능할 수도 있다. OTA(Over The Air) 업데이트를 지원하는 기기라면 가능할 수도 있다. 이전 버전의 바이너리를 기기에 내장시켜놓으면 된다. 하지만 그러려면 플래시 용량이 필요하다. 용량이 크면 가격이 올라간다. 가격이 올라가면 경쟁력이 떨어진다. OTA를 안 지원하는 기기라면 불가능하다. 그 기기를 들고 회사에 와서, 기사가 프로그래머에 연결해서, 플래시를 지우고, 다시 굽는다. 손으로. 유선으로. 사용자가 5000명이라면? 5000번을 해야 한다. 아니면 회수해서 한다. 회수 비용이 더 싸다. 5천만 원 정도. "저희는 롤백 정책이 없습니다. 대신 처음부터 완벽하게 만듭니다." 내 팀장이 지난 입사 면접에서 한 말이다. 완벽하다는 게 뭘까. 테스트? 배포 전에 할 수 있는 모든 테스트를 했다고 해도, 실제 환경에서는 뭐가 나타날지 모른다. 온도가 55도를 넘어가는 환경에서만 문제가 생기는 버그가 있다고 하자. 우리 테스트 챔버는 50도까지만 간다. 누가 이 문제를 찾을까. 사용자다. 밤 10시의 선택 어제도 밤 10시까지 있었다. 내일도 있을 것 같다. 마감이 일주일밖에 안 남았고, 발견된 버그가 3개다. 그 중 하나는 HW 이슈고, 하나는 내가 고쳐야 할 이슈고, 하나는 뭔지 모르는 이슈다. 회의실에서 팀장이 말했다. "정해진 마감까지 모든 버그를 고칠 수 없으면, 가장 중요한 버그만 고쳐서 나가는 것도 옵션입니다." 그 말은 뭔가. 남은 버그는 그냥 양산에 넣는다는 뜻이다. 나중에 ECN으로 고친다는 뜻이다. 아무도 반대하지 않았다. 모두가 알고 있다. 일정이 진짜 타이트하다는 걸. 그리고 완벽함은 환상이라는 걸. 그 순간, 웹개발자 후배가 떠올랐다. "어제 배포 망쳤는데 1분 만에 롤백했어." 1분. 1분이면 내 팀은 한 줄의 코드 리뷰도 못 한다. 모두가 아는 그 불안감 펌웨어 팀의 공통된 불안감이 있다. 그건 배포 바로 다음 날이다. 첫 번째 보고가 오기를 기다린다. 첫 번째 불량이 나오는 건 피할 수 없다. 전체 50만 개 중에 1개가 이상할 확률이 0이 될 수 없다. 하지만 그 1개가 우리 펌웨어 때문인지, 하드웨어 때문인지, 조립 공정 때문인지는 다르다. 만약 우리 펌웨어 때문이라면? 그 말은 50만 개가 모두 같은 문제를 가지고 있을 수도 있다는 뜻이다. 첫 번째 보고가 나오지 않으면, 다음 날을 기다린다. 1주일을 기다린다. 1개월을 기다린다. 기다리는 동안 내 머리는 자동으로 최악의 시나리오를 그린다. "혹시 특정 환경에서만 터지는 버그 있나?" "혹시 메모리 리크 있나?" "혹시 초기화 루틴을 빠뜨린 게 있나?" 밤에는 더 심하다. 근데 왜 계속하는가 질문 자체가 이상하다. 왜냐하면 이미 답을 알고 있으니까. 첫째, 다른 회사 갈 돈이 없다. 전직 시 정착금이 별로 없고, 새 회사에서 연봉 올려줄 가능성도 낮다. 경력 5년이면 중간이다. 주니어도 아니고 시니어도 아니다. 둘째, 이 일에 익숙해졌다. 다른 일을 하려면 또 배워야 한다. SI를 간 후배들 보니 나은 게 별로 없는 것 같았다. 그냥 다른 고통일 뿐이다. 셋째, 그리고 이게 가장 솔직한 이유인데, 나는 이 일이 싫지 않다. 디버깅할 때의 그 쾌감이 있다. 오실로스코프에서 파형을 보고, "아, 이거 타이밍 문제다"라고 깨닫는 그 순간. 아무도 안 돌던 코드가 돌기 시작했을 때의 그 희열. 웹개발자들이 이걸 경험하나? 모르겠다. 아마 비슷한 뭔가가 있을 것 같긴 한데. 다만 내가 만드는 건 서버에서 사라지지 않는다. 하드웨어에 박혀있다. 10년 뒤에도 누군가 쓸 것이다. 내 코드가. 내 버그도. 그게 또 다른 종류의 두려움이면서, 또 다른 종류의 자부심이다. 그래도 롤백은 아니다 웹개발자들을 부러워하는 건 여전하다. 하지만 달라진 게 하나 있다. 이제는 그들의 롤백 가능성이 부럽기보다, 내 돌이킬 수 없음이 당연해 보인다. 펌웨어는 그런 거다. 한 번 나가면 끝이다. 그 대신 뭔가를 얻는다. 책임감. 긴장감. 그리고 가끔씩 오는 성취감. 회사 물건이 고장 안 나고 계속 잘 돌아가는 그걸 보며 느끼는, 말로 설명하기 어려운 안정감. 내일도 9시에 출근한다. 어제 돌린 테스트가 실패했을 것 같다. 또 디버깅을 해야 할 것 같다. 또 밤 10시까지 있을 것 같다. 또 밤에 몰래 코딩을 할 것 같다. 그리고 이 모든 게 반복될 것 같다. 웹개발자는 롤백한다. 나는 그냥 계속 나간다.한 번 나가면 끝. 웹은 롤백. 펌웨어는 앞으로만 간다.