첫 홀더 테스트를 마쳤습니다 (2)

언제 쯤이면 우리는 마일스톤 마감이 가까워짐에 따라 서로가 따로 개발하던 기능들이 같은 브랜치에 통합되어 상호작용하며 일어나는 온갖 결함을 예측해 이를 반영한 개발 비용을 산출할 수 있을까요. 애초에 이런 예측을 제대로 해 내는 개발 분야가 있을지 의심스럽기도 하지만 냉전 시대에 우주개발 분야에서는 직접 비용 예측 기법을 개발해 서로 다른 그룹의 작업물이 한 가지 결과로 통합되는 과정을 관리해냈다고 합니다. 그런데 그로부터 60년이 지난 지금도 컨텐츠가 그리 많지도 않고 아직 게임 시스템이 충분히 복잡하지도 않은 상황에서도 마일스톤 마감이 가까워 옴에 따라 여러 기능이 통합되어 일어나는 상호작용에 의한 결함은 여전히 스탭들의 초과 노동을 통해 수습하고 있습니다.

혹시 잘 알려지지는 않았지만 냉전 시대의 우주개발에서도 비슷했던 것은 아닐까요? 문득 영화 마션의 한 장면에서도 무지막지한 초과 노동을 강요하는 장면이 나오는데 잘 알려지지는 않았지만 그때나 지금이나 사실 비슷하지 않았을까 싶기도 합니다.

한국 시간으로는 금요일 저녁 아홉 시 부터, UTC 기준으로는 정오부터 홀더 테스트를 시작할 예정이었는데 그 전까지 우리들은 빌드에 남아 있는 우선순위 높은 다양한 결함을 해결해야 했습니다. 이번에는 ‘알려진 결함’으로 처리해 다음 마일스톤으로 넘길 수도 없었습니다. 바로 다음 날 저녁 고객들에게 빌드를 배포해야 했으니까요. 여기에는 두 가지 장애물이 있었는데 하나는 우리들이 NFT 세일을 하고 개발팀 각자의 지갑에 NFT가 확보되고 나서 충분히 테스트 되지 않아 게임과 이더리움 지갑이 연동된 환경에서 여러 문제가 발생했다는 점, 그리고 이제부터는 개발환경이 아니라 실제 고객들의 접근을 막아두었을 뿐 실제로 구축된 환경에서 테스트 해야 했는데 이 환경을 한 번 빌드하는데 40분이 필요했다는 점입니다.

즉 치명적인 결함을 수정했다면 개발환경에서 이를 확인했더라도 실제 환경에서 다시 확인하는데까지 최소 40분이 필요했고 또 결함이 멀티플레이와 관련된 것이라면 실제 환경에 문제 해결 확인을 위해 여러 사람이 필요했습니다. 결국 많은 사람들이 목요일 밤부터 금요일 아침에 걸쳐 빌드를 붙들고 우선순위 높은 결함을 해결하며 시간을 보냅니다.

결국 이번 홀더 테스트는 알려진 결함의 86%만이 완료된 상태로 진행됩니다.

다음 날, 한국 시간으로는 금요일 저녁에 몇 시간 전까지 일했던 사람들이 다시 회사에 주섬주섬 나타나 대강 저녁식사이자 아침식사로 뭔가를 주워 먹고는 다시 컴퓨터 앞에 앉아 테스트와 서비스 준비를 시작했습니다. 커뮤니티 매니저는 디스코드에서 고객들과 질의응답을 하고 또 서비스가 시작되면 라이브를 내보낼 준비를 하고 있었고 우리들은 이미 서비스에 나갈 빌드에 알려진 문제를 내일 서비스 전까지는 해결하기 위해 작업을 계속 하고 있었으며 인프라, 관제, 로그, 보안 등 온갖 자질구레하면서도 각각이 치명적인 항목들을 준비했습니다.

사실 우주개발을 주제로 한 영화를 보면 다들 거대한 워룸에 모여 앉아 각 담당자를 호출해 진행 여부를 최종 확인하는 장면이 나오는데 우리들은 한 사람이 여러 가지 업무를 수행하고 있어 그렇게 최종 확인을 통해 서비스를 시작하기 보다는 서비스 시작 시각은 정해져 있고 각자가 그 전까지 무슨 수를 쓰든 자신의 임무를 마치는 방식으로 서비스를 준비합니다.

다만 여러 가지 문제 중 서비스를 시작한 다음 첫 번째 멀티플레이 게임이 반드시 중단되는 문제는 결국 원인을 찾지 못하고 서버가 열리자 마자 우리들 스스로가 재빨리 첫 번째 멀티플레이 방을 열어 플레이 하다가 그 방을 터뜨리기로 했습니다. 이 문제 때문에 목요일에서 금요일로 넘어가는 사이에도 수 없이 원인을 찾으려고 시도했는데 우리가 추측한 원인은 모두 빗나갔고 모두가 눈을 시뻘겋게 뜨고 문제가 생기는 순간을 지켜보고 있을 때는 결코 문제가 재현 되지 않아 치명적이긴 하지만 이 문제로 서비스를 연기할 만한 상황은 아니었습니다. 우리는 누구보다도 빨리 클라이언트를 다운로드 해 누구보다도 빨리 첫 번째 방을 열고 또 누구보다도 빨리 플레이 해 클리어 하거나 크래시를 겪을 자신이 있었습니다. 다들 컴퓨터 앞에서 손을 꺾어 두둑 소리를 내고는 고객보다 빨리 첫 번째 방을 열어 터뜨릴 준비를 합니다.

서비스 웹사이트에 달려 있던 카운트다운이 끝나고 클라이언트 다운로드가 시작되었고 우리들도 같은 링크로 고객과 똑같이 다운로드 해 설치한 다음 게임을 시작했지만 접속이 되지 않습니다. 상황 자체는 너무 익숙해서 웃음이 났는데 이 상황과 이 분위기 속에 웃으면 안 될 것 같아 고개를 숙입니다. 한편 다들 대수롭지 않은 반응이었는데 우리가 로켓을 발사하는 거라면 몰라도 서비스 시작에 서버에 접속할 수 없는 상황은 그리 치명적이지 않았습니다. 그냥 문제를 찾아내고 수정하고 재배포하고 서비스를 시작하면 그만입니다.

다만 이 상황의 분위기는 꽤 곤란한데 게임디자인 입장에서 이 상황에 마땅히 할 일이 없기 때문입니다. 그저 분위기를 해치지 않도록 조용히 자리에 앉아 모니터링 할 수 있는 것들을 모니터링 하며 상황을 파악하고 커뮤니티 매니저가 고객들에게 상황을 설명할 수 있도록 의사소통 하고 엔지니어들이 사람을 동원한 테스트를 요청하면 재빨리 환경을 구축해 접속하는 정도가 우리가 할 수 있는 일의 한계입니다. 인게임 로그를 모니터링 하다가 초반에 접속했던 사람들이 모두 빠져나가고 지난 1분간 기록된 로그가 모두 사라지자 ‘아 정말 쉽지 않구나’싶은 생각이 들었습니다.

점검은 30분씩 연장해 거의 두 시간 동안 진행됐는데 이전 같으면 우리들은 이미 고객들로부터 온갖 욕을 먹어 만신창이가 됐겠지만 디스코드에서 커뮤니티 매니저로부터 설명을 듣고 대기 중인 고객들은 이전에 우리들이 경험했던 것에 비해 거의 적대적이지 않았습니다. 고객들은 생각보다 훨씬 우리들에게 우호적이었는데 아마도 이전에 다른 비슷한 시도들이 지금 수준에도 도달하지 못한 사기극으로 끝난 사례를 봐 와서 그런 것 같기도 하고 또 자신이 직접 판단해 우리가 판매한 NFT를 구입했고 자신의 믿음에 우리가 보답해 주기를 기대하는 것 같아 보이기도 했습니다.

어쨌든 거의 두 시간 가까이 점검한 끝에 원인을 찾아내 수정했고 정상적으로 서비스를 시작합니다. 여담으로 서버가 열리자마자 처음 열린 멀티플레이가 항상 중단되는 문제는 두 시간 동안 수정한 뭔가의 영향을 받아 더 이상 재현 되지 않았고 우리들은 첫 번째 멀티플레이 게임을 끝까지 무사히 마쳤습니다. 우리도 여전히 고객들과 함께 플레이 하며 새로운 결함들을 보고했지만 그리 치명적이지는 않았고 서비스는 서서히 안정되어 갔고 처음으로 자리에서 일어나 저녁때 사다 둔 도넛을 먹으며 한 숨 돌렸습니다.

누군가 이 시간에도 배달이 된 거냐고 물었지만 저녁때 이미 사다놨습니다.

첫 날 서비스를 마치고 집에 갔다가 한국 시간으로 토요일 오후에 회사에 나와 다음 날 서비스를 준비합니다. 실은 전 날 서비스를 마치고 나서 이미 수정한 결함을 다시 실제 서비스 환경에서 테스트하고 다시 문제를 해결하느라 몇 시간을 다 일한 다음 퇴근했던 참이라 집에서 보낸 시간이 그리 길지 않았고 지난번 시차적응 때처럼 낮과 밤이 뒤집힌 상태로 다들 멍해 보였습니다. 전 날 고객들이 길을 잘 찾지 못하는 것을 보고 밤 새 바닥에 아주 적나라한 화살표를 깔았는데 그 전까지는 소위 ‘김치 게임’에서나 하는 게임과 어울리지도 않는 가이드를 설치하는데 부정적이던 분들도 첫 날 고객들이 헤매는 모습을 보고 나서는 더 이상 토 달지 않고 우리들이 적나라한 화살표를 설치해도 아무 말 하지 않게 되었습니다.

사운드 관련 결함을 발견했는데 예상 대로 사운드 처음 넣는 사람이 할 법한 실수로 인한 것이었습니다. 덕분에 오픈 전 마지막 빌드가 시작되기 전까지 미친 듯 집중해 게임에 나오는 모든 3D 사운드를 전부 검사해 실수를 수정하는데 두어 시간을 소모했습니다. 이전 다른 프로젝트에서 게임 사운드는 내가 모르는 누군가가 어느새 넣어 놓는 당연한 것이었지만 결코 당연하지 않으며 엄청난 노동력이 필요하다는 사실을 깊이 깨달았습니다.

한편 고객들이 멀티플레이 환경에서 다양한 플레이를 시작하자 우리가 모르던 여러 가지 문제가 나타났는데 이들을 해결하기 위해 전 날 새벽에 겪던 상황을 똑같이 겪어야 했습니다. 실제 환경 빌드에는 40분이 걸렸고 해결에 실패하면 다시 수정을 거쳐 40분 동안 기다립니다. 덕분에 이미 날은 밝았고 매 멀티플레이 테스트마다 스탭들의 집중도는 점점 올라가 마지막으로 문제가 해결되었음을 확인한 판에서는 비공식적으로 최고 기록을 달성했습니다. 비공식 기록은 이유는 홀더 테스트 시간 범위가 아닌 시간대에 달성했기 때문인데 정확한 시간 조건을 포함해서 조회한 최고 기록은 우리가 아니지만 기간만을 조건에 포함하고 시간을 포함하지 않으면 우리가 달성한 기록이 최고 기록입니다. 다들 빨리 집에 가고 싶어 테스트를 최대한 빨리 끝내기 위해 플레이에 극도로 집중했는데 이 동안은 아무도 말하지 않았고 오직 키보드, 마우스를 조작하는 소리와 누군가 죽는 순간 ‘아..!’ 하는 탄식 소리만 들려왔습니다.

마지막 날에도 똑같이 저녁때 출근해 UTC 기준으로 낮 시간에 접속한 고객들에게 서비스를 제공했고 이번에도 전 날 여러 결함을 수정한 빌드를 제공했지만 서비스 마지막 날에는 다음 날 빌드를 제공하지 않기 때문에 새로운 결함이 보고되더라도 이를 기록하기만 하고 수정하지는 않은 채 각자 고객들과 똑같이 플레이 하거나 모니터링 하며 시간을 보냈습니다. 드디어 저도 틈이 좀 생겨 실시간으로 로그를 조회해 커뮤니티 매니저가 사용할 만한 재미 있는 숫자를 전달할 수 있었는데 가령 하루 동안 한 사람이 레벨에서 75번 떨어져 죽었다는 데이터를 뽑아내 도대체 이 고객은 어떤 플레이 경험을 한 것인지 상상하기 쉽지 않았습니다. 서비스가 끝나면 한번 이 고객의 발자취를 따라가 봐야겠습니다.

그렇게 홀더 테스트 마지막 날 서비스 종료 시각이 다가오고 그때까지 게임에 남아 있던 사람들 모두 광장에 모여 기념 사진을 찍기로 합니다. 여러 사람들이 광장에 모였지만 로그 상으로는 그 순간에도 여전히 누군가는 인게임에서 죽고 죽이기를 계속하고 있었습니다. 광장에 모인 사람들은 커뮤니티 매니저의 통솔에 전혀 따르지 않았고 각자 자기 하고 싶은 일을 하며 잠시도 가만 있지 않았는데 마치 가끔 출근길에 마주치는 어린이들을 통솔하는 선생님들 같은 느낌이 들어 웃겼습니다. 그렇게 우리들은 마지막으로 기념사진을 찍고 커뮤니티 매니저의 라이브 방송을 종료하며 서비스를 마무리했습니다.

https://twitter.com/xocietyofficial/status/1685745370268344320

한국 시간으로 월요일 새벽이었지만 아직 동이 트지는 않은 시간이었고 또 결함을 수정한 다음 빌드를 낼 필요가 없었으므로 사람들은 최대한 빨리 회사를 떠나 돌연사 직전의 몸뚱이를 쉬로 집으로 출발합니다. 한편 당장 월요일 아침의 보고 준비를 위해 방금 전까지 했던 서비스의 주요 숫자들을 후다닥 집계해 비즈니스 부서로 전달하는데 시간을 쓴 다음 저 역시 돌연사에 대비해 최대한 빨리 집으로 이동했습니다. 그렇게 지난 꽤 긴 기간에 걸쳐 준비한 NFT 세일과 홀더 테스트 이벤트가 마무리 되었습니다.

우리들 거의 대부분은 전통적인 업계에서 게임을 만들어 왔기 때문에 이렇게 중간에 고객들에게 빌드를 공개하는 행동을 그리 편안하게 생각하지 않아 왔습니다. 고객들은 이미 시장에 출시된 완벽하게 준비된 게임이나 이미 오랜 기간에 걸쳐 라이브를 해 완전히 다듬어진데다가 엄청난 컨텐츠를 구비한 게임과 우리들을 직접 비교하기 때문에 중간에 빌드를 공개하는 행동은 주로 나쁜 쪽의 결과를 만들어낼 뿐입니다. 그래서 이번 테스트 빌드를 준비하면서 지금 빌드 공개 안 하면 우리 망하나요? 같은 질문을 회의 시간에 받기도 했습니다. 저 스스로도 과연 지금 수준의 빌드로 잠시나마 서비스를 하는 행동이 과연 올바른지에 대해 한참을 고민한 적이 있지만 우리들은 전통적인 게임 업계에서 일하고 있지 않으며 우리들의 고객들 역시 전통적인 고객들과는 약간 다르다는 사실을 인정해야만 했습니다.

또 앞에서 잠깐 이야기했던 프로젝트가 취소되지 않았고 또 회사로부터 안정적인 지원을 받으며 취소될 가능성도 거의 없어 보이지만 내부에 광기에 찬 누군가가 상황을 통제하지 않으면 새로운 게임이 나올 때마다, 경영진이 다른 게임을 플레이 할 때마다 현재 상황을 전혀 고려하지 않은 요구사항이 높은 우선순위로 개발팀에 도착해 팀의 사기를 깎아내리는 상황이 일어나기도 합니다. 이런 상황을 돌파하는 방법에는 광기에 찬 누군가가 현재 상황을 고려하지 않은 요구사항을 강력하게 무시하거나 현 시점 까지의 상황으로 빌드를 마무리 해 ‘출시 당하는’ 방법 등이 있는데 이들 모두 개발을 마무리 해 모두의 이력서에 유효한 한 줄을 남길 수는 있지만 개발팀에 큰 상처를 남깁니다.

반면 이런 방식으로 우리들에게 상대적으로 우호적인 고객들을 대상으로 중간에 빌드를 공개하면 개발팀 관점에서는 이따금씩 서비스를 연습할 수 있고 또 중간에 실제 고객들을 만나 이들의 평가를 들으며 온갖 채널을 통해 팀에 도착하는 요구사항들을 걸러낼 수 있는 시각을 가질 수 있습니다. 또한 고객들과 만나는 경험은 우리들의 사기를 높여 줘 다음 개발을 계속하게 만들고 이번처럼 서비스에 대응하느라 낮과 밤이 뒤바뀌고 장시간 노동을 하게 만드는 상황에도 버틸 수 있게 해 줍니다.

우리들은 앞으로도 지금 이 시점에는 사기성 언어로 인식되는 키워드에 기반한 제품을 만들어 나갈 작정이고 이번 서비스는 거의 우리들은 여느 게이밍 NFT와 똑같은 스캠이 전혀 아니며 평생 게임 만들어 온 사람들이 모여 개발하는 중이라는 사실을 증명해내는 역할을 했다고 생각합니다. 꽤 피곤한 일이기는 하지만 적당한 마일스톤을 마무리할 때마다 비슷한 방식으로 짧은 서비스를 계속해 나갈 작정입니다. 이는 이전에 다른 프로젝트에서 겪던 오랜 시간에 걸쳐 개발했지만 결코 고객을 만나지 못한 프로젝트에서 일하며 겪는 극심한 사기 저하와 이탈을 방지하고 긴 시간에 걸쳐 개발하더라도 고객들로부터 쉽게 잊혀지지 않을 수 있는 방법이라고 생각합니다.

여전히 우리들은 이 새로운 시장과 새로운 고객들에 대해 잘 알지 못하지만 계속해서 알아 가고 또 계속해서 그에 맞춰 개발해 나갈 작정입니다. 다음 서비스 시점이나 그 시점에 갖출 기능을 지금 말하기는 어렵지만 그 때는 분명 지금 이야기한 목표에 더 가까워져 있을 것은 확실합니다. 오랜만에 고객들을 대상으로 서비스 한 경험은 몸을 돌연사 직전까지 몰고 갔지만 분명 재미 있었고 또 의미 있었습니다. 다음 작은 서비스를 개발팀에 기여하는 일원으로써 기대하고 또 스스로 그 기대를 채울 겁니다. 아. 한편 첫 서비스 결과에 대한 팀의 공식 보고는 XOCIETY Dev note #1을 보세요.