42 SEOUL에서는 교육생, 이하 카뎃들을 위한 여러 행사가 진행되곤 한다. 카뎃들이 자발적으로 여는 게임 대회부터 연말에는 스태프분들이 주최하는 백일장까지 그 종류는 다양하다. 그런 최근에 열렸던 이벤트들 중 가장 규모가 대단했던 것을 꼽자면 단연 해커톤일 것이다.
참여해본 경험이 전혀 없었던 나는 처음 공지가 올라온 때부터 기대 반 두려움 반을 가졌다. 행사의 취지 뿐만 아니라 필요한 기기를 대여해주는 환경 자체가 매력적이었지만, 만진 적 없는 iOS 및 라즈베리파이의 활용이 권장되고 있었기 때문이다. 하지만 난 선발 과정인 La Piscine도 통과한 카뎃이 아닌가. 난 두려움을 떨쳐내기로 했다.
세 명이서 조를 이뤄야 참가할 수 있었는데, 인원 모집이 마감되는 와중에도 아직 같이 진행할 동료들을 구하지 못했던 나는 슬랙에서 급하게 공개 구직(?)을 했다. 다행히 잠시 후 연락이 왔고, 덕분에 무언가 좋은 것을 만들어낼 수 있을 것이란 기대감은 더욱 커져만 갔다.
그렇게 해커톤 개최가 선언된 첫 날, 이노베이션 아카데미 소속의 멘토님께서 하신 말씀이 하나 있었다. 해커톤에서 아무리 기획이 좋아도 대부분 실제 구현은 로그인까지만 만들고 끝나더라는 말씀. 그 때는 모두가 그 말을 웃고 넘겼다. 나도 그랬다. 기대를 버리더라도 그 이상으로 만들 수 있지 않을까 하는 생각이 있었으니까.
하지만, 돌이켜보면 그게 우리 이야기였을 줄은 몰랐다.
해커톤이 진행되는 온라인 화상 통화방에는 여러 조들의 고군분투하는 모습이 보였다. 대부분 세 명이서 노트북을 갖고 방에 모여 이야기를 하고 키보드를 두들기고 있었다. 두 조가 한 장소를 빌려 사용하는 진풍경도 펼쳐졌다. 그래, 모두 '실제로 모여' 있었다.
언택트 시대인데 모이는 걸 권장하는 것이 옳냐고 말할 수도 있겠다. 하지만 중요한 건 그것이 아니다. 핵심은 해커톤에서 조를 구성하고 진행하기 전부터 함께 여러가지를 의논하고 궁리한 흔적들이 보였다는 것이다. 기획이 튼튼한 것도, 장소를 섭외할 수 있었던 것도 그런 까닭이었으리라.
반면에 우리 조는 말 그대로 조를 결성하지 못하다가 급하게 모인 경우에 속했기 때문에, 해커톤 전날부터 무엇을 만들고 어떻게 진행할 지에 대한 의논이 단 한 마디도 없었다. 돌이켜보면 조금 더 적극적으로 움직였어야 했는데 말이다.
모두 다 같이 온라인으로 모였으면 좋았을 것이라 이야기하며, 무엇을 만들 지 회의를 급히 시작했다. 결국 논의된 것은 라즈베리파이도 iOS를 구동하는 아이패드도 사용하지 않는, 비교적 평범한 아이디어였다. 식사를 하고 싶은 카뎃이 식사 모임을 만들 수 있고, 다른 카뎃들은 그 모임에 참가할 수 있으며, 식사 이후에는 식사에 대한 평가도 할 수 있는 모바일 어플리케이션 말이다.
이대로 개발이 계속 순탄했으면 정말 좋았겠지만.
첫 날 오후 저녁 여덟시에 모여 향후 개발 방향을 논의하기로 약속을 잡았었다. 시간이 되기 전부터 슬랙 창과 디스코드 둘 모두를 켜두고 기다렸지만 사십분이 되도록 두 곳 모두 아무런 말이 없었다. 불안해서 슬슬 대화를 하려고 할 때 쯤 다른 조원이 다들 계시냐는 메세지를 올리셨다. 가까스로 다행이라 생각하며 그렇게 이야기를 나누던 도중이었다.
"저기, 혹시 다른 분 연락 안 되시나요?"
우리 조에서 적극적으로 의견을 개진하며 이끄시던 위치에 있으신 분이 어째 보이시질 않는 걸 걱정하시는 것이었다. 나는 부탁을 받고 슬랙 콜과 디스코드 통화 둘 모두를 시도해봤지만 묵묵부답이셨고, 연락처를 구하기 위해 인트라넷에 접속해도 찾을 수 있는 것은 하나도 없었다. 주무시는 걸까 싶어 몇 시간이고 기다린 후에도 나타나질 않으셨기 때문에, 결국 밤을 새서 개발을 진행해보려는, 그리고 오프라인으로 진행할 장소를 같이 협의하기로 했던 우리의 계획에는 차질이 생겼다.
정신을 반 쯤 놓았다가 차려보니 벌써 다음 날 아침 여덟시였다. 불안한 나는 42 SEOUL의 스태프분께, 지금까지 모습을 나타내지 않는 동료가 있는데 어떻게 해야 좋냐는 질문을 드렸다. 내 말을 들으신 스태프분이 연락을 취해보겠다고 한 지 몇 분 뒤였다. 다행히도, 늦게나마 모습을 드러내신 동료 분께서는 '갑자기 잠에 들었고 지금 연락을 받고 깼다'라고 해명하셨다.
무단으로 모습을 드러내시지 않은 것이 개인적으로 야속했지만 그 분 탓만 할 수는 없는 노릇이다. 어쨌든 조원 셋 모두 연락처를 서로 공유하지 않은 책임이 있지 않던가. 이런 준비는 미리 누군가가 제안을 해서 진행했어야 하는 부분이라 생각한다. 앞으로 다른 작업을 공동으로 진행할 때는 연락처를 기본으로 공유해야겠다는 결심을 했다.
다른 조들이 첫 날 저녁부터 진행했던 것과 달리, 우리 조는 해커톤 두 번째 날이 되어서야 본격적인 개발을 시작했다. 우리는 기획을 구현하기 위한 스택을 다음과 같이 정했다.
역할 분담은 조금 특이하게 됐다. 나는 La Piscine도 합격했으니 무엇이든 배우면 되겠다는 생각으로, 웹 프론트엔드만을 경험해왔던 내가 백엔드를 하기로 결정했다. 난 이 때만 해도 AWS를 사용하는 것이 닷홈 무료 호스팅을 설정하는 것처럼 쉬울 줄만 알았다. 내 기대하곤 다르게 설정해줘야 하는 부분이 많았기 때문에, 콘솔에 접속해서 서버를 개설하는 것부터가 쉬운 일은 아니었다. 일단 급한 대로 생활코딩 강좌와 Node.js 및 Express 튜토리얼 유튜브 동영상을 빠르게 훑은 나는 인스턴스를 생성하고 웹 서버를 만드는 데까지 성공했다.
한편 내가 이러는 동안 데이터베이스를 맡으신 분도 우여곡절을 겪으시기는 마찬가지였다. 첫날부터 MongoDB를 비롯한 비관계형 데이터베이스를 처음 접하신 채로, DynamoDB를 사용하기 위한 서버를 설정하는 부분에서 시간을 많이 소모하셨다. 결국 우리는 설정 도중, 계획을 변경해 DynamoDB에서 MySQL을 사용하기로 했다. MySQL을 이용하기 위해 RDS 서비스를 이용해야 했는데, 인스턴스를 생성하는 것뿐만 아니라 이를 우리가 가진 EC2 인스턴스와 연결하는 것도 또 다른 차원의 문제였다. 결국 보안 그룹 설정에 대한 개념을 알고 나서야 이를 해결할 수 있었다.
그렇게, 우리의 계획은 천천히 변하고 있었다. 모바일 어플리케이션으로 구현하는 부분을 맡으신 분도 결국 웹으로 플랫폼을 변경하자고 제안하셨다. 결국 스택은 다시 아래와 같이 바뀌었다.
새로운 것을 배우는 것은 언제나 즐거운 일이다. 하지만 단 삼일 안에 완성품을 만들어야 하는 환경이라면 이야기가 달라진다는 걸 우리는 잊고 있었다. 물론 학습이 주된 목적이라면 아무래도 괜찮다는 생각도 들지만, 핵심은 배우기에 만만한 것은 없다는 것이다.
이렇게 계획이 자주 바뀐 개발이, 후술하듯 순탄할 리가 없다.
우리 프로젝트의 형태가 이렇게 웹 어플리케이션으로 변경된 것은 아마 둘째날 저녁이었을 것이다. 내가 처음으로 Passport 라이브러리를 사용해 로그인의 기본 구조를 만들기 위해 git push
를 여러 번 명령하며 일일이 수동으로 배포하여 테스트를 진행하는 동안, 데이터 스키마는 정리되었어도 API에 대해 협의된 것은 단 하나도 없었다. 화면의 구성도도 공유된 것이 하나도 없는 채로 개발은 계속 진행됐다. 슬슬 반쯤 포기하고 싶었지만, 역으로 오기가 생겨버린 나는 로그인 만큼은 구현에 성공하리라 결심하고 편의점에서 몬스터 몇 캔을 사와 마시곤 다시 의자에 앉았다.
그렇게 셋째 마지막 날의 새벽 다섯 시가 되고 나서야, 데이터베이스 Workbench 프로그램에 방금 로그인한 내 42 인트라 계정의 아이디가 표시되는 것을 보고는 기뻐 소리쳤다. 팀원들끼리 모여 있던 슬랙에 내 성과를 알렸지만, 이미 다들 잠에 빠져버린 상태였다. 그 때서야 알았다. 이거 망했구나. 그것도 아주 철저하게.
셋째 날, 다른 조들이 공들인 발표 자료와 함께 시연 영상까지 깔끔하게 편집해서 모두에게 보여줄 때, 우리는 어떠한 시연도 없이 우리들의 실패한 광경을 담백하게 보여줄 수 밖에 없었다. 발표는 내가 맡았는데, 발표 마지막 즈음에 갑자기 감정이 차올라 울 뻔 한 것은 비밀이다. 진행자분께선 안타까운 마음에 발표가 모두 끝난 이후 내게 박수를 쳐주셨다.
아래 있는 동영상은 해커톤 일정이 종료된 이후, 주최 측에서 시연 영상이 필요하다고 하길래 데이터베이스 Workbench 프로그램을 띄워둔 채로 컴퓨터 화면을 촬영한 후 편집한 것이다. 지금 봐도 매우 초라하다. 클릭하면 재생할 수 있다.
이 날 이후로 모든 것을 할 수 없을 것만 같았고, 자신감이 아주 바닥이었다. 모두 뭔가 하나 씩은 해내는데 왜 나만 그러지 못하는 걸까? 내가 아무것도 못한다는 것을 모두에게 증명해버리다니. 가뜩이나 마음 속 깊은 곳에 자리 잡고 있던 자괴감이 해커톤이 끝난 이후로 더 심해졌다.
하지만 지금은 괜찮다. 다음과 같은 것을 깨달았기 때문이다: 이렇게 쫄딱 망했는데 생각해보면 나도 누군가도 피해를 입은 게 단 하나도 없잖아? 이런 게 바로 학생의 특권 아닐까?
돌이켜보면 해커톤의 결과물은 없다고 쳐도 얻은 성과 자체는 굉장히 많다. 나 개인으로 한정해놓고 봐도, 프론트엔드 전문으로 하던 웹 개발자가 백엔드를 직접 경험할 수 있었으니까. 다른 팀원분들도 마찬가지였다. 데이터베이스를 담당하던 분께선 웹에 흥미를 느껴 웹 프론트엔드부터 공부하기로 결심하셨고, 다른 조원 분께서도 새로운 기술의 도입을 조심스러워해야 할 때가 있다는 사실을 깨달으셨다고 이야기해주셨다.
그리고 가장 중요한 것, 우리 모두 공통으로 깨달은 것이 있다. 바로 이상적인 협업이라는 건 매우 실현하기 어렵기 때문에 절대로 만만하게 봐선 안 된단 사실. 적절한 역할 분배, 효율적인 스케줄 관리, 기본적인 연락처 공유와 같은 프로그래밍 실력 외적인 것이, 실제론 어플리케이션 개발 진행과 완성 여부에 중요한 역할을 하고 있다는 것을 뼈저리게 느꼈다. 멘토님께서는 내가 정말 좋은 경험을 했다고 해주셨는데, 글을 적는 지금 생각해보면 그 말에 깊이 공감할 수 있다.
이번에 배운 교훈들은 다음에 협업할 기회가 생긴다고 해서 반드시 효율적으로 써먹을 수 있을 것이란 보장은 할 수 없을 것 같다. 세상엔 정말 많은 팀들이 각자의 문화와 분위기, 그리고 다양한 형태를 갖고 있기 때문에 꼭 어느 것 하나가 정답으로 통하리란 생각은 위험할 테니까.
하지만 적어도 누군가와 함께 일을 한다는 것의 소중함과 위대함을 깨달았으니, 조금은 더 조심스럽게 접근할 수 있을 것 같다. 더불어서, 물론 하나만 잘 하기도 힘들지만, 기본적인 CRUD를 할 수 있을 정도로 백엔드 실력을 키운다면 좀 더 좋은 개발자가 될 수 있을 것이라 생각한다. 그래, 아쉬운 것이 없도록 뭐든 최선을 다하자.
코드는 아래에서 확인할 수 있다.