brunch

[8화] 꿈에 나타난 코드

by 곽준원
네가 UI 전체 맡아봐

입사하고 나서 겨우 1주가 지난 시기였습니다. 사람들 얼굴과 이름이 매칭되기 시작했고. 사내 메일 규칙도 어느 정도 이해했고, UI 시스템의 단순 기능 개발도 혼자서 할 수 있게 되었습니다. 말 그대로 아직 어색함이 가시지 않은 단계였습니다. 그런데 그 시점에서 갑자기 하나의 일이 떨어졌습니다. 아주 단순한 말 한 줄로 말이야.


"UI 관련 전체 리뉴얼, 네가 맡아줘."


이 말을 듣고 저는 일단 침묵했습니다. 왜냐하면 그 말이 실제로 의미하는 무게를 알고 있었기 때문입니다. UI 창 몇 개 수정해 줘도 아니고, 이 버튼 인터랙션을 변경해 줘도 아니었습니다. 단순히 스킨만 살짝 바꾸자도 아니었습니다.


그건 '전체 리뉴얼'이었습니다. 다시 말해서 화면 구성 전부를 새로 뜯어고쳐야 한다는 뜻이었습니다. 그 안에는 이런 것들이 들어 있습니다.


어떤 버튼이 어디에 있어야 하는가.

그 버튼은 언제 활성화되고 언제 비활성화되는가.

전투 화면과 로비 화면의 톤은 같을 것인가 다를 것인가.

접속하자마자 플레이어가 가장 먼저 보게 될 정보는 무엇인가.

유저가 다음 행동을 고민하지 않게 만드는 흐름은 무엇인가.

그 동작의 뒷단에서 서버와의 통신은 언제 일어나는가.


그리고 그걸 제가 담당하는 겁니다. 신입이 입사하고, 불과 1주가 지난 시점에, 그 장면을 지금 표현하면 이렇습니다.


아직 조심스럽게 칼을 쥔 수련생에게 "자. 이제 네가 이 칼로 가족들 밥을 책임져"라고 말한 느낌. 저는 속으로 이렇게 생각했습니다. '이건 원래 신입한테 오는 미션인가..? 아니면 사람이 없어서 나한테 온 건가?'


결론은 간단합니다. 사람이 없었습니다. 메인 클라이언트 프로그래머는 인게임의 구현에 시간을 모두 할애했습니다. 나머지는 당연히 하나뿐인 제가 다 처리할 수밖에 없었습니다. 그리고 일정은 이미 정해져 있었습니다. 클로즈 베타 테스트까지 UI 전체를 정비해야 했습니다. 뒤로 미뤄줄 사람은 없었습니다.


쉽게 말하면 '지금 당장 누군가 해야 하는데, 그 누군가가 바로 너다'였습니다.


협업은 갑자기 시작된다.

당연하지만, UI는 혼자 하는 작업이 아닙니다. 여기에는 UI 아티스트(디자이너)와 기획자가 있습니다. 버튼의 형태, 여백, 색감, 정렬, 강조, 알림, 경고창 톤, 로고의 보이는 위치. 그분들은 화면의 '느낌'을 책임지는 사람들이었습니다. 그분과 저는 일정표를 붙잡고 앉았습니다.


"이 창은 이 날까지 끝내야 해요."

"이 레이아웃은 이 날까지 시안 나옵니다."

"이 경고창은 일단 투명도만 조절해 보고, 폰트는 나중에 통일할게요."


그 순간 저는 한 가지를 깨달았습니다. 회사에서의 협업은 '같이 하면 되죠.'라는 말로 끝나지 않는다는 걸요. 협업은 '정확히 어디까지 내가 책임지고, 어디부터는 당신 책임인지'를 하루 단위로, 심지어 버튼 단위로 합의하는 일입니다.


저는 이제 막 회사에 적응하던 신입이었습니다. 그런데 그 신입이 갑자기 타 부서와 일정을 맞추고 우선순위를 정하고, "이건 CBT 이후로 미뤄도 돼요? 안 돼요?"를 판단해야 하는 입장이 된 겁니다. 당연히 부담스러웠습니다. 하지만 동시에 이런 생각도 들었습니다.


'아.. 나 지금 진짜 일을 하고 있구나.'

'이제는 학원이 아니라 회사구나.'

'여긴 실전이구나.'


그 감각은 무서움과 동시에 묘한 고양감을 줬습니다. '이제 진짜 개발자 맞는구나.' 이 확신은 그때마다 저를 앞으로 조금씩 밀어주었습니다.


그 시절의 보안 감각

요즘 게임 회사에서 이런 말을 하면 믿기 어려워할 수도 있습니다. 당시 분위기는 지금과 많이 달랐습니다. 지금은 소스코드가 모두 버전 관리 서버(Git, Perforce 등)에 있고, 외부 반출은 철저히 막히고, 사내망 외부로 유출되는 것도 관리되고, 빌드 접근도 권한별로 나뉩니다.


하지만 제가 일하던 그 시절은 이러한 보안이 존재하지 않았습니다. 코드 폴더를 zip으로 압축하고, 그 파일을 저의 개인 메일로 보냅니다. 집에 도착해서 파일을 다운로드하여 zip을 풀고 코드를 확인합니다.


그게 가능했습니다. 아무도 이상하다고 하지 않았습니다. 그만큼 당시의 개발 환경은 느슨했고, 내부 프로세스도 아직 미완성 상태였고, '우리는 빨리 만들어서 내보내야 한다.'라는 게 더 중요했습니다. 보안? 관리? 권한 분리? 그건 솔직히 나중 문제였습니다.


아직 업계 전체가 어릴 때였습니다. 조직이 사람보다 큰 게 아니라, 사람이 조직보다 큰 시기였습니다. 지금 생각하면 위험한 문화이기도 하지만, 동시에 솔직한 문화이기도 했습니다. '일단 빨리 만들자. 문제 생기면 그때 막자.' 저도 그 흐름 안에 있었습니다.


퇴근 후에도 퇴근이 아니었다.

회사에서 퇴근했습니다. 그러면 일이 끝나야 합니다. 보통은 그렇습니다. 하지만 그때는 회사에서 일이 끝나지 않았습니다. 집에 도착하면 zip으로 가져온 코드를 열어봅니다. 그리고 앉아서 코드를 분석합니다. 정확히 말하면 '분석'이라는 표현도 약합니다. 저는 거의 코드에 매달렸습니다.


어떤 버튼을 눌렀을 때 호출되는 함수가 있습니다. 그 함수 안에서 또 다른 함수를 호출합니다. 그 함수는 또 다른 매니저 클래스를 참조해서 상태를 묻습니다. 그 상태는 다른 전역 관리자에서 가져옵니다. 거기 들어가 보면 매크로로 퉁쳐놓은 처리들이 보입니다.


그 구조를 따라가다 길을 자주 잃습니다. 처음에는 '아 코드 참 어렵다.' 정도로 받아들였습니다. 근데 며칠 지나서 깨달았습니다.


'아니. 이건 코드를 분석하지 못하는 게 아니라, 이 구조가 진짜로 복잡한 거 아닌가?'


UI는 화면에 보이는 층입니다. 그런데 화면에 보이는 이 층은 사실상 게임 전체 시스템들과 전부 연결되어 있습니다. 플레이어 정보, 아이템 소지 여부, 매치메이킹 상태, 방 정도, 레이스 결과, 랭킹, 재화, 환경 설정 등등..


버튼 하나가 그냥 버튼이 아니었습니다. 버튼 하나가 서버로 나갔고, 다시 돌아온 정보를 반영했고, 그 반영 결과가 또 다른 UI 조각을 바꿨습니다. 이걸 신입인 제가 둘 다 이해해야 했습니다. '겉(화면)'과 '속(로직)'을 동시에 말이죠.


솔직히 많이 버거웠습니다. 온종일 들여다봐도 이해가 끝나지 않는 날이 많았습니다. 그런 날은 새벽 2시, 3시까지 모니터만 바라봤습니다. 아무 말도 안 하고, 그냥 계속 함수 따라 들어가고, 다시 나오고, 메모해 보고, 다시 확인하는 그 과정은 몸부림이었습니다. 제가 할 수 있는 유일한 방식의 버팀이었습니다.


어느 순간, 코드가 꿈에 나타났다.

그런 말이 쌓이니까 이상한 현상이 찾아왔습니다. 꿈에서 코드가 나타난 것이죠. 정확하게는 꿈속에서 디버깅을 하고 있었습니다. 그리고 논리적으로 막혔던 부분이, 꿈속에서는 너무나 자연스럽게 해결되었습니다. 그 장면은 이렇게 흘렀습니다.


'아.. 저 함수에서 상태를 갱신하고 다시 UI 쪽으로 올려 보내면 되는구나.'

'아.. 이 순서가 잘못된 거였네. 갱신이 먼저고 렌더링은 그 뒤였구나.'

'아.. 이 변수는 지역 변수가 아니라 멤버로 빼줘야 상태 유지가 되지.'


꿈속의 저는 완벽했습니다. 깨끗하게 이해하고 있었고, 정확하게 알고 있었고, 손에 막힘이 없었습니다. 심지어 버그가 하나도 없이 정확하게 동작했습니다. 현실에서는 하루 종일 붙들고도 안 되던 흐름이, 꿈에서는 너무나 자연스럽게 정리되었습니다.


'됐다.. 됐어. 이제 진짜 됐다.'


그 감각은 말로 설명하기 힘듭니다. 진짜로 무언가를 완성한 감각이었습니다. 어떤 사람은 중요한 시험을 앞두고 꿈에서 만점을 받은 기분을 경험하기도 한다고 합니다. 저는 그 비슷한 것을 느꼈습니다.


그리고 그렇게, 저는 아주 만족스럽게 꿈속에서 '개발 완료'의 감정을 느낀 채 잠에서 깼습니다. 그다음 장면은 조금 애틋합니다. 저는 눈 뜨자마자 '잠깐만 잠깐만 잠깐만...' 하면서 책상을 뒤졌습니다. 볼펜을 들고, 노트를 꺼내서, 꿈에서 짰던 그 코드를 적기 시작했습니다. 함수 이름, 흐름 순서, 갱신 위치, 조건 분기, 변수 선언. 저는 마치 도망가는 기억을 붙잡는 사람처럼 적었습니다.


왜냐하면 꿈은 빨리 날아가니까요. 조금만 늦으면 잊힙니다. 제가 노트에 적은 그 코드들은 어떤 곳에서는 거의 설계도처럼 보였고, 어떤 곳에서는 이미 실제 코드에 가까웠습니다. 그만큼 제 머리는 몰려 있었고, 제 몸은 붙잡으려 했습니다. 그건 지금도 제 기억에 남아 있는 장면입니다. 손이 약간 떨렸습니다.


새벽빛이 방 안에 희미하게 들어오고 있었고, 저 혼자 책상에 웅크려 앉아서 공책에 중괄호와 if문을 쓰고 있었습니다. 그 순간만큼은, 저는 확신했습니다.


'나 이제 진짜 개발자다.'


물론 현실은 그렇게 따뜻하지 않았다

하지만 이렇게 말하면 너무 로맨틱하게 들리니까 현실도 같이 적겠습니다. 그렇게 적어둔 코드를 출근해서 회사에서 그대로 타이핑하고 빌드를 돌리면.. 절대 안 돌아갑니다. 정말이지 기가 막히게 안 돌아갑니다.


꿈속에서는 모든 것이 깔끔하게 정리돼 있었습니다. 상태는 항상 일관됐고, 참조 순서도 완벽했고, 포인터는 한 번도 뻗지 않았습니다. 자료형 문제도 없었습니다. 어떤 객체도 예상보다 일찍 소멸되지 않았습니다.


현실은 다릅니다. 현실의 코드는 다른 사람들의 습관이 섞여 있고, 이미 돌아가던 흐름이 있고, 타이밍 문제도 있고, 프레임마다 호출되는 업데이트 타이밍도 있고, 서버 응답 지연도 있고, 심지어 '왜 이걸 여기서 다시 호출해?' 싶은 임시 처리가 중간중간 박혀 있습니다.


현실은 깔끔하지 않습니다. 현실의 코드에는 타인의 과거와 급한 수정과 타협과 “일단 이건 나중에 정리하자”가 층층이 붙어 있습니다. 그러니까 제 ‘꿈의 코드’를 그대로 넣으면 안 맞습니다.


그건 마치 이렇습니다. 머릿속에서는 손으로 직접 깎은 맞춤형 부품이 완벽하게 끼워지는데, 현실의 기계는 이미 테이프, 구리선, 본드, 육각 나사가 전부 동시 사용 중인 상태인 겁니다. 제 부품만 정확해봐야 소용이 없습니다. 전체가 이미 임기응변으로 돌아가고 있으니까요. 처음에는 실망도 했습니다.


‘꿈에서는 됐는데 왜 현실은 안 되지?’

‘내가 아직도 부족한 건가?’

‘아니면 회사 코드가 너무 꼬인 건가?’


근데 시간이 좀 지나고 나서 저는 이 장면을 달리 보게 됐습니다. 중요한 건 '꿈속 코드가 실제로 바로 먹히느냐'가 아니었습니다. 중요한 건 '내 머리가 드디어 스스로 문제를 붙잡고, 풀려고 굴러가기 시작했느냐'였습니다. 그전까지의 저는 늘 이랬습니다.


“이거 어떻게 하는 거예요?”

“이 부분은 왜 이렇게 짜셨나요?”

“저 여기서 막혔어요.”


즉, 계속해서 바깥에 도움을 요청하는 쪽이었습니다. 그런데 이 시점부터는 제가 제 문제를 물고 늘어지기 시작했습니다. 잠든 상태에서도. 누가 시키지 않아도. 누가 옆에서 가르쳐주지 않아도. 이건 아주 작은 변화처럼 보일지 모르지만, 저에게는 어마어마한 전환점이었습니다.


정확히 말하면, 저는 이때 비로소 ‘방어형 인간’에서 ‘공격형 인간’으로 넘어가고 있었습니다. 그전까지는 문제를 당하는 사람이었고, 이제부터는 문제를 쫓아가는 사람이었습니다.


몰입의 경험

이 경험을 저는 ‘몰입’이라고 부르고 싶습니다. 사람이 어떤 대상을 너무 오래, 너무 진지하게 들여다보면 뇌가 그 문제를 ‘나의 현재 생존 과제’로 인식하기 시작합니다. 그러면 의식적으로 붙잡지 않아도 무의식이 계속 계산합니다. 현실에서 손을 떼도, 머릿속에서는 그 루프가 계속 돕니다. 저에게는 그 상태가 처음으로 찾아온 순간이 바로 이때였습니다.


이 몰입은 두 가지 효과를 냈습니다. 하나. 두려움이 줄었습니다. '나 이거 진짜 못 하면 어떡하지?'라는 공포가 조금씩 사라졌습니다. 왜냐하면 제 안에서 처음으로 '할 수 있다'라는 목소리가 들리기 시작했기 때문입니다.


그 목소리는 거창하지 않았습니다. '나는 천재야' 이런 게 아니었습니다. 더 단순했습니다. '내 머리도 이제 여기에 붙었다.'


둘. 주인의식이 생겼습니다. UI는 이제 제 일이었습니다. ‘이게 잘 되면 내가 잘한 거고, 이게 안 되면 내가 못한 거다’라는 감각. 책임감이 무거워지면 사람은 지칠 수도 있지만, 동시에 책임감이 없으면 사람은 쉽게 무너집니다.


저는 그 책임감을 조금씩 즐기기 시작했습니다. 이건 엄청난 변화였습니다. 왜냐하면 저는 원래 책임 없는 쪽에 서 있던 사람이었거든요. '왜 해야 해요?'라고 묻던 학생이었고, '그건 내 역할 아니잖아요'라고 뒤로 숨고 싶었던 사람이었습니다.


그런 제가 어느 날 이렇게 생각하고 있었습니다. '이건 내 화면이다. 내 UI다. 내 코드다.'


이 시기를 지나서야..

돌이켜 보면, 이 경험은 저에게 단순한 업무 적응기가 아니었습니다. 이건 제 정체성의 재구성 과정이었습니다. 저는 스스로를 늘 이렇게 규정해 왔습니다.


고등학교 때: 규칙은 지키지만, 납득 안 되면 움직이지 않는 애.

대학교 때: 전산학과인데 코딩 못 하는 애.

대학원 때: 도망치듯 더 공부하러 간 애.

학원 때: 벼랑에서 매달린 애.

첫 입사 때: 겨우 합격선에 걸린 애.


그리고 그 모든 문장 끝에는 늘 묘하게 이런 꼬리가 붙었습니다.'하지만 아직 진짜는 아니다.' 그런데 이 시점부터, 그 꼬리가 사라지기 시작했습니다. '나는 개발자다.' 처음엔 속으로만 그렇게 말했습니다. 입 밖으로 꺼내진 못했습니다. 하지만 속으로는 분명히 말했습니다.


“나는 개발자다.”





#개발자 #코드 #몰입

keyword
매거진의 이전글[7화] 첫 출근, 첫 월급.