2019 NAVER CAMPUS HACKDAY WINTER 참가 후기
네이버에서 3년째 꾸준히 열고 있는 캠퍼스 핵데이. 무려 네이버 개발자들과 함께하는 1박 2일 해커톤이다.
핵데이는 워낙 유명해서 예전부터 꼭 해보고 싶었던 활동 중 하나였는데 이번에 처음으로 참여하게 되어 후기를 남긴다. 지난 기억을 더듬어 일기처럼 쓰다 보니 글이 구구절절하다는 점 미리 양해 바란다.
서류 접수
핵데이는 여타 다른 해커톤들과는 달리 프로젝트 주제를 사전에 정해준다. 참가 접수를 시작할 때쯤 핵데이 organization에 주제들이 이슈로 올라온다.
자기소개서에는 그중에서 원하는 주제를 1개 또는 2개 선택해서 관련된 경험을 적어야 한다. 학교에서 과제로 했던 건 쓰지 말라는 설명을 읽고 학교 수업 외적으로도 프로그래밍 공부를 하는 사람을 선발하려는 거구나 싶었다.
안드로이드는 신청할 수 있는 주제가 세 개 있었다. 그런데 미디어 프레임워크, 지도 등 구현에 필요한 기술로 나온 것들이 전부 한 번도 경험해보지 못한 것들 뿐이었다. 핵데이 지원 기간이라는 것을 뒤늦게 알게 되어 남은 시간이 많지 않았는데, 다른 주제들보다 스터디를 빨리 할 수 있을 것 같아서 자막 기반 영상 분석 라이브러리를 선택했다.
접수 기간동안 Kotlin과 Swing으로 smi 파일을 파싱 해서 문장을 분석하는 간단한 프로그램을 만들었다. 자막 역시 한 번도 다뤄본 적 없는 영역이었는데, Regex로 파싱 하는 코드를 짜는 게 나름 재미있었다. 혹시 어떤 예제를 만든 건지 궁금하면 링크에서 확인하면 된다.
지원서에는 소스코드를 올려둔 GitHub 링크를 넣고 대략적인 구현 방법에 대해 설명을 썼다. 그리고 예전에 블로그에 안드로이드에서 HTTP 통신을 하는 방법을 정리했던 적이 있던 지라 그 얘기도 썼다. 그 외에도 관심분야와 기술 실력을 자랑할 수 있는 프로젝트를 소개하는 문항이 있었는데, 예전에 만들었던 토이 프로젝트 이야기를 썼다.
코딩테스트
코딩 테스트는 Kotlin으로 응시했고, 두 시간 동안 세문제를 풀어야 했다. 난이도도 어렵지 않았어서 대부분 잘 풀었으리라 생각된다. 나는 세문제를 다 풀지 못했으나 안내 메일에 이런 문구가 있어서 바로 낙담하지는 않았다.
본 테스트 결과로 참가자 선발이 결정되는 것은 아니며 지원자 검토 시 참고사항으로 이용될 예정입니다.
다행히 참가자 발표 날 초대 메일을 받았다. 지하철에서 메일을 받고 마음속으로 기쁨의 춤을 췄다.
인터넷에 올라온 핵데이 후기들도 이것저것 찾아서 읽어보았다. 모두가 입을 모아 커넥트원이 춘천 맛집이라고 극찬하는 것을 보며 큰 기대를 품게 되었다.
사전 미팅
초대 메일을 받은 다음날 github 리포에 초대를 받고, 라인 단톡방이 만들어졌다.
미리 사전 미팅을 하자고 해주셔서 강남에서 다 같이 점심식사 후 커피를 마셨다. 사전 미팅에서는 멘토님께 핵데이에 대해 궁금했던 것도 여쭤 보고 프로젝트의 방향성에 대해 이야기를 나눴다.
핵데이 당일 시간에 쫓기지 않도록 미리 역할을 나눠서 개발을 해두고 해커톤 당일엔 여유롭게 보내자고 제안해주셨다. 설명을 들으면서도 개발을 당일 날 제로베이스로 시작하면 막막할 것 같긴 했다.
멘토님이 다시 회사로 복귀하신 후에 다른 멘티님들과 밖이 깜깜해질 때까지 어떻게 구현할지 얘기를 나눴다. 처음 만난 사람들과 팀플을 하면서 그렇게 입에 침이 마를 정도로 말을 많이 해본 게 처음이었다. 기본적인 틀만 주어져 있고 그 외의 것은 모두 우리가 자율적으로 결정할 수 있었기 때문에 생각할 거리가 엄청나게 많았다. 라이브러리 내부 구조, 코딩 컨벤션, 주고받을 데이터 형식 등등을 정해서 공유했다.
사전 작업
라이브러리엔 크게 1) 자막 데이터 파싱 2) 적절한 키워드 추출 3) 오픈 API로 연관데이터 조회의 세 단계가 필요했기에 셋이서 각자 기능을 하나씩 맡아서 개발하기로 했다. 다들 아무거나 맡아도 상관없다길래 뽑기 앱으로 역할 분배를 했다.
팀원 모두가 서울/경기에 살고 있었던 덕분에 따로 한번 더 모였다. 카페에서 다 같이 코딩도 하고 지난번에 정하지 못했던 사안에 대해서도 마저 논의를 했다. 나는 키워드 추출 부분을 맡았는데 서류 접수할 때 만들었던 예제에 비슷한 기능이 이미 있었기에 나름 수월하게 준비한 것 같다. 라이브러리에 필요한 기능은 대부분 구현이 됐기 때문에 우리는 핵데이날 여유롭게 보낼 수 있을 것이라는 낙관적인 추측을 했다. (물론 이 예상은 나중에 다 깨진다)
핵데이 당일
1일 차
드디어 핵데이 당일이 되었다. 전날 밤에 설레서 잠을 제대로 못 잤다. OT 장소에 앉아있으면서 옆에 앉은 다른 팀 참가자들이 나누는 대화를 들었는데 대화 내용만 들어도 왠지 모를 고수의 포스가 느껴졌다. 우리 팀에선 나 혼자 다른 버스를 배정받아서 홀로 버스에서 졸다 보니 금세 춘천에 도착했다.
커넥트원은 들었던 대로 시설이 정말 훌륭했다. 서울에서 일반적으로 볼 수 있는 느낌의 고층건물이 아니라, 거대한 조형예술품을 보는 듯한 기분이었다. 간식이 무슨 제사상처럼 으리으리하게 차려져 있었고 밥도 정말 맛있었다.
멘토님이 우리가 작성한 코드에 대해 리뷰를 남겨주셨다. 프로젝트 구조, 네이밍, 효율성, 확장성 등등 생각하지 못했던 부분에 대해 자세하고 꼼꼼하게 코멘트를 남겨주셔서 크나큰 감동을 받았다. 근데 눈앞에 닥친 feature 개발하느라 정신이 없어 리뷰받은 내용을 반영을 못했다.. 나 같은 경우 키워드 추출을 위해 형태소 분석기를 돌리는 무거운 작업을 별생각 없이 동기로 처리한 게 대표적인 문제였다.
라이브러리의 큼직한 기능은 개발이 되어있으니 요것들을 조합해서 사용자가 내부 구조를 몰라도 되게 묶어주는 작업이 필요했다. 그리고 또 해야 할 일은 샘플 앱 개발! 라이브러리를 만들었으니 샘플 앱에 적용을 해야했다.
어떤 형태로 라이브러리를 쓸 건지 논의를 하고 1) 라이브러리 완성 2) 자막 실시간 렌더링 3) 자막에 따라 연관 데이터를 띄워 주기로 다시 역할을 나눠 작업을 시작했다. 나는 연관 데이터를 표시하는 UI를 구현하는 3번 역할을 맡았다.
라이브러리로 얻어온 연관 데이터는 플레이어 위에 리스트 형태로 overlap 시켰다. 동영상 플레이어다 보니 화면이 회전되는 상황 등을 고려해 데이터를 교체하거나 UI를 제어하는 작업은 AAC ViewModel + LiveData + databinding으로 처리했다.
라이브러리 적용 결과를 눈으로 볼 수 있게만 하면 되는데 이게 생각처럼 뚝딱뚝딱 진행되지 않았다.. 이날 많은 오류들이 생겨났지만 우리 팀을 제일 애먹였던 것은 멀티쓰레드 환경에서의 동기화 문제였다. Thread safe한 처리가 왜 중요한 건지 뼈저리게 느끼는 하루였다.
해커톤 취지상 밤을 새울 필요는 전혀 없었다. 그래도 기껏 여기까지 왔는데 일찍 잠들면 분명 아쉬움이 남을 것 같아 늦게까지 개발을 계속했다. 늦은 시간인데도 자러 가지 않고 남아있는 팀이 꽤 많았다. 그리고 여기저기서 들려오는 '아 이거 왜 안되지,,,' 밤이 깊어질수록 해커톤 장소가 점점 고요해졌다. 새벽 4시가 넘어가니 머리가 잘 안 돌아가서 자러 갔다. 1인 1실로 제공된 숙소도 이게 연수원인지 호텔인지 헷갈릴 정도로 좋았다.
2일 차
일찍 일어나려 했으나 아침잠이 많은 나에겐 무리였다... 비몽사몽 하다가 아침도 못 먹었다.
오전에는 막바지 작업을 했다. 병합과 버그 수정에 힘을 쏟다 보니 시간이 쏜살같이 흘러갔다. 연관 데이터 표시 UI를 구현하면서 자막을 담당하는 분과 미디어 플레이어가 있는 화면을 동시에 수정할 수밖에 없었다. 그래서 작업물을 합치는 과정에서 merge conflict가 꽃 피어났다.
git을 사용한 지 2년 정도가 되어가는데 핵데이에서 git & github를 역대급으로! 하드하게 활용했다.
그동안 했던 팀 프로젝트에서는 브랜치가 많아봐야 5개 정도였다. 핵데이 프로젝트에서는 20개 가량의 브랜치가 만들어지면서 히스토리가 점점 화려해졌다.
멘토님께서 2시 이후로는 키보드를 만지지 말자고 하셨는데 오류를 조금씩 고치다 보니 결국 해커톤 종료 시간을 약간 남겨두고서 개발을 자체적으로 마쳤다.
결과적으로 자막을 띄우고 우리가 만든 라이브러리를 활용해 얻어온 데이터를 보여주는 데까지는 성공했다. 어찌저찌 돌아만 가는 상태라 해야 할까? API를 무료로 쓰다 보니 데이터 요청 횟수에 한도가 있어 영상 재생 후 조금만 지나면 더 이상 데이터를 조회할 수 없었다.
자막 싱크가 약간씩 안 맞는 문제도 있었고, 연관 데이터 리스트가 자막을 정통으로 가려버리는 주객전도형 UI로 인해 동작이 완벽하진 않았다. 그래도 멘토님께서 원래 하루 만에 완벽하게 할 수가 없고, 이 정도면 많이 한 거라 말씀 해주셔서 보람을 느꼈다.
핵데이 종료 후
다른 팀의 작업물을 시연해보거나 발표를 한다거나 하는 시간은 따로 없었고 바로 집에 갈 채비를 했다. (모여서 진짜 밥 먹고 코딩만 했다.) 다른 Android/iOS 팀들은 어떻게 마무리됐는지 내심 궁금했으나 알 수 없었다. 집에 도착하자 밤 9시 정도가 되어 느낀 점 정리고 뭐고 바로 기절해버렸다.
핵데이는 색다른 주제에 대한 공부와 더불어 온전히 코딩에만 집중할 수 있는 최고의 환경을 제공해줘서 참여하는 내내 행복했다. 먹여주고 재워주고 입혀주고 참가자한테 이렇게 잘해주는 해커톤은 난생처음이라 신세계였다. 열심히 코딩하는 또래 개발자들이 주변에 가득하니 짧은 시간임에도 내게 많은 자극이 되었다.
핵데이에서 멘토님과 팀원분들을 알게된 것도 참 좋았다. 팀원분들은 서로 안되거나 막히는 게 있을 때 같이 코드를 보고 자기 일처럼 열심히 아이디어를 주려고 하셨다. 서로 학교생활이나 취준 등등의 주제로 이런저런 대화를 나눴는데 개발이라는 교집합이 있어서 어색함 없이 얘기가 잘 통했다.
팀원 중 안드로이드 개발을 시작한지 얼마 안된 분도 계셨다. 새롭게 접한 언어와 개발 환경이 익숙치 않을텐데 빠르게 적응하고 해커톤에서도 정말 밤을 꼴딱 새가며 코딩하는 모습을 보고 나도 더 열심히 해야겠구나 동기 부여가 되었다.
또래 개발자들과 새로운 인연을 맺을 수 있고, 프로젝트 경험도 쌓을 수 있고, 멘토님의 코드 리뷰까지 받을 수 있으니 개발자를 꿈꾸는 학생들에겐 이것보다 좋은 대외활동은 없을 것이다. 대학생들에게 한 번쯤 꼭 해보라 강력하게 추천하고 싶고 나 또한 여건이 된다면 실력을 더 키워서 다시 참가해보고 싶다.
우수참가자 선정
핵데이가 끝나고 얼마 후 우수참가자 선정 메일을 받았다. 마무리 단계에서 코드에 엄청난 depth의 스파게티를 만들어놓기도 했고 결과물의 동작도 어설픈 부분이 많았다. 그럼에도 불구하고 좋게 봐주신 거겠지 싶어 다시 한번 감사해졌다.
기술 면접
면접 시간이 두 시간이라는 안내를 본 뒤로 나라는 사람에게 두 시간이나 물어볼 거리가 있는가 하는 자기 성찰의 시간을 가졌다. 기말고사 기간과 겹쳐 많은 준비는 못했지만 자료구조, 네트워크, 운영체제 책을 보면서 공부를 했다.
나는 네이버웹툰에서 제시한 프로젝트를 수행했기 때문에 판교역에 있는 네이버웹툰 사무실에서 면접을 봤다. 인생 첫 기술면접이 네이버 계열사라니... 가는 길에서부터 무지하게 긴장이 됐다. 사무실에 도착하니 엄청난 존재감을 뿜어내는 유미의 세포들 대왕 인형이 있어서 인상적이었다.
면접은 회의실에서 일대일로 진행되었다. 첫 번째 질문은 당연한 거지만 자기소개. 필수 질문인데 미처 생각을 못해서 되는대로 막 말했다. 면접 끝나고 예시를 찾아보니 보통 자신의 장점과 근거가 되는 사례를 엮어 문장을 미리 외워가더라.
자기소개 이후엔 손코딩이 준비되어 있었다. 평소에 IDE의 환상적인 자동완성을 사용하다가 갑자기 종이에 코드를 쓰려니 평소에 자주 쓰던 내장 함수들의 이름이 헷갈렸다. 그 후로는 기술적인 질문이 쭉 이어졌다. 성격의 장단점, 갈등 해결, 우리 서비스 써봤나요 같은 인성 질문은 전혀 없었다. only 기술..!! 말로 기억을 포장하는 스킬이 아직 부족한 나한테는 잘된 일이었다.
면접에선 주로 안드로이드와 자바 문법 등을 질문받았다. 의외로 핵데이에서 했던 과제나 CS 관련 질문은 별로 없어서 차라리 예전에 만들었던 안드로이드 예제들을 다시 봤으면 좋았겠다는 생각이 들었다. 아는 건 아는 대로 말했고 모르겠는 것도 많아서 모르겠어요...를 꽤 많이 말한 듯 하핫;; 그러면 면접관님이 계속 대답할 수 있게 유도를 해주시다가 끝까지 모르면 친절하게 설명을 해주셨다.
여담이지만 면접 장소에 미리 도착해서 근처 스타벅스에 있었는데, 마지막으로 뭘 봐야 할까 생각하다가 네이버 기술 블로그에서 자바와 안드로이드 연관 글을 몇 개 골라서 읽었다. 그중 하나가 GC의 동작 방식을 설명하는 글이었는데 마침 면접 때 GC에 대한 질문이 나와 대답을 할 수 있었다. 이어서 GC가 돌아가는 heap 영역의 구성에 대해 추가 질문을 하셨다. 원래라면 모르겠습니다 스택이 +1 됐을 것을 직전에 뭐라도 본 덕분에 어떻게든 대답을 할 수 있었다. 신기하면서도 블로그를 보길 잘했다는 생각이 들었다. 면접 전 막판에 뭘 할지 고민이라면 그 회사 기술 블로그에서 직무와 관련된 글을 정독하는 것도 나쁘지 않을 듯.
체험형 인턴 합격
지금 이 글은 침착하게 쓰고 있다만 면접 때 답변을 제대로 못한 게 많았기에 떨어졌으리라 짐작하고 있던 와중이었다. 결과 발표 메일을 받았다. 입사정보를 입력하라는 메일을 보자마자 육성으로 헉! 소리가 나왔다.
첫 면접을 통해 많은 교훈을 얻었다. 핵데이에선 앞으로 뭘 더 공부할지 키워드를 얻었다면 면접에선 프로그래밍을 공부하는 자세에 대해 크게 배웠다. 뭐든 어설프게 알면 설명을 잘할 수가 없다. 면접에서 그나마 스스로 잘했다고 생각한 것은, 중간중간 정적이 있었지만 말을 크게 더듬거나 하지는 않았다는 점이다. 그리고 블로그를 했던 건 정말 좋은 선택이었다. 한번 글로 정리해놨던 건 최근에 쓴 적이 없더라도 어렴풋이 기억이 났다.
면접 때 나에게 부족했던 부분과 앞으로 어떤 노력을 해야 할지 정리해봤다.
- 지식을 말로 풀어서 설명하려면 확실한 이해가 전제 조건이다. 매끄럽게 말을 하려면 평소에 연습을 해봐야한다.
- 이미 만들어진 거 사용만 하는 게 아니라 내부 구조도 보고 이해해야 한다.
- 바퀴의 재발명을 하진 않더라도 바퀴가 왜 그렇게 만들어졌는지는 알아야 했다.
- 특정한 기술을 선택할 때 선택한 이유, 장단점을 명확히 알고 설명할 수 있어야 한다.
- IDE에 의존하지 않고 펜으로 코딩하는 연습이 필요하다.
- 단순히 코드만 짜는 게 아니라 안드로이드 앱을 실행할 때 내부적으로 어떤 일이 생기는지 구체적으로 알아야 한다.
해커톤은 참가자 선정 메일을 받았을 때 온전히 신나 할 수 있었는데 면접은 내가 어떻게 통과한건지 블로그에 글을 쓰는 지금도 의문이다. 그래도 나에게서 무언가 성장 가능성을 보셨기 때문에 좋은 결과가 나온 거라 믿고 싶다. 좋은 기회를 얻었으니 두 달 동안 열심히 하고 와야겠다.
'else' 카테고리의 다른 글
두 달간의 인턴십을 마치며 (2) | 2020.02.29 |
---|---|
스위프트 프로그래밍 3판 리뷰 (1) | 2019.11.16 |
2019 핵데이 윈터 코딩테스트 후기 (3) | 2019.10.15 |