오아시스 해커톤에 참여하고 반성하며
8월 26일 월요일, 27일 화요일 이틀에 걸쳐 광주-호남 지역 해커톤에 참여했습니다.
이 해커톤에 참여하면서 짧은 기간 안에 꽤 다양하고 많은 갈등과 고뇌, 인내를 경험했던 것 같습니다.
배경
사실 지역에 매력적인 개발 행사가 없어서 이러한 행사에 관심을 갖고 있지 않았습니다.
심지어 최근 해커톤이라는 물건의 행사를 지켜보다보면 원래 알고 있던 것에 비해 상당히 변형된 느낌이라 더욱이요.
이렇게 부정적인 스탠스를 취하고 있는데도 왜 어떻게 해커톤에 참여하게 되었냐, 과 동기가 해커톤 참여를 밀어붙였기 때문입니다.
평소에 스케줄이 굉장히 빠듯하지 않으면 왠만한 요구는 수용해서 해커톤 신청서를 제출하기까지 오랜 시간이 걸리지는 않았습니다.
잘못 관리된 위기
하지만 실제로 개인 스케줄이 상당히 위협적으로 구성되고 있었기 때문에 해커톤을 받아서는 안 되었습니다.
심지어 해커톤으로 끌어들인 동기조차 본인의 스케줄과 능력을 제대로 평가하지 못했기 때문에 준비 기간에서부터 꽤 삐걱거렸습니다.
개발은 카페인을 코드로 바꿔내는 기계야
해커톤의 기획은 이동 경로로 간단한 그림을 그려낼 수 있는, 일종의 네비게이션을 개발하는 것이었습니다.
하지만 빡빡한 스케줄 때문에 해커톤 준비를 하나도 하지 못했기 때문에 실질적인 개발은 해커톤이 시작하는 14시부터 시작했습니다.
이전에 지도 라이브러리를 제대로 활용해본 적 없었던 데다 지도상의 주요 지점들이 위/경도로 관리된다는 사실도 이번 해커톤을 계기로 알게 되었을 정도였습니다.
각각 볼륨의 차이는 있지만 해커톤 기간에 생성하고 커밋한 레포만 6개에 이르렀습니다.
개발이 이루어지는 24시간동안 제대로 눈 붙인 건 겨우 30분이었던 것 같습니다.
Open Street Map에서 도로 정보 추출하기
처음에는 오픈스트리트맵의 XML 포맷 데이터에서 도로 정보를, OpenCV를 사용해서 이미지 상 외곽선 데이터를 뽑아낸 다음 외곽선을 도로에 근사하고자 했습니다.
사실 OSM XML 규격은 공개되어있고 이미지에서 외곽선을 뽑아내는건 OpenCV의 기초 파트이니, 관건은 외곽선을 도로에 근사시키는 방법이었습니다.
이 과정에서 다양한 방법을 시도해보았습니다.
- 외곽선 데이터를 래스터화해서 도로 위에 오버레이, 겹치는 부분을 선택해서 목표 달성
- 외곽선 데이터를 그대로 이용해서 무언가 대단한 수식이나 기법을 이용해 도로에 근사
특히 위 두 접근이 가장 기억에 남는데, 사실 시간이 별로 없었으므로 빠르게 포기하게 되었습니다.
팀 내에서 실질 개발 인원은 저 혼자인데다, 웹 페이지 하나 만드는 것조차 도전적이게 될 정도의 시간만 남아있었기 때문입니다.
다만 이 두 방법 모두 충분히 흥미로워서 나중에 여유가 생기면 언젠가 다시 접근해보지 않을까 싶습니다.
리액트/넥스트 프레임워크에 지도 API 통합하기
또 생소했던 것은 CDN을 통해서만 인증을 거치면서 불러올 수 있는 라이브러리를 Next.js 환경에서 사용했던 것입니다.
보통 HTML의 헤더 부분에 넣기 위해서만 CDN을 사용할 것이라 생각했기 때문에, 인증 값이 포함된 CDN 주소를 HTML에 하드코딩해야하는지 고민했던 기억이 있습니다.
Script 컴포넌트가 구현되어있어 이것을 사용할 수 있었지만, 스크립트 로드 이후의 콜백이 제대로 처리되지 않아서 결국에 lit를 사용해서 재구현했습니다.
여유가 있었다면 원인을 분석하고 고쳐내서 의존성을 늘리지 않으려 했겠지만, 새벽 네 시에 머리 절반 이상의 전원이 나간 채 타임어택을 멈출 수 없었기 때문에 많은 것을 내려놓을 수밖에 없었습니다.
사실 lit를 도입하고도 콜백이 잘 작동하지 않는 것은 여전해서, 각종 콜스택이 단단히 꼬이게 되었습니다.
네트워크 상황과 기기 로컬에 캐싱된 리소스에 따라서 페이지가 로드되기도 하고 오류가 나기도 했습니다.
결국 절대 해서는 안될 만행, setTimeout
으로 호출 타이밍을 강제 조정하기까지 도입하고나서야 어느정도 안정될 수 있었습니다.
https를 지원하지 않으면 GPS가 안켜진다구요??
정말 난처한 사실 중 하나는 https를 지원하지 않으면 Geolocation API를 사용할 수 없다는 것입니다.
VPN 네트워크로 개발과 테스트 환경을 만들어 사용하고 있었기 때문에 https 프로토콜을 사용하지 않고 있었고, 비보안 출처로서 API 호출이 차단된 것이었습니다.
사실 잘 생각해보면 타당하고 당연한 이야기지만 지금까지 상황을 미루어보아 이것을 고려할 여유는 없었습니다.
이 문제를 해결하기 위해 급하게 https 서명된 서버들에 코드를 배포해보았지만, 넥스트 지식 부족으로 어째선지 제대로 작동하지 않았습니다.
그래도 우리 팀의 발표는 꽤 뒤쪽에 배치되어 있어서 다른 팀이 발표하는 도중에도 계속해서 배포 작업을 이어갈 수 있었습니다.
해커톤 이후
위기에 빠진 프로젝트
해커톤에서 발생한 실수와 실패를 바로잡기 위해 지나치게 많은 비용을 끌어다 사용했습니다.
해커톤보다 먼저 시작하고 더 우선해야할 다른 일과 약속을 파토내거나 위기에 빠뜨렸습니다.
최우선 사항으로 두었어야 할 연구실 세미나는 계속해서 밀려서 제대로 된 결과물을 내지 못했습니다.
저는 아직도 제대로 준비하지 못한 세미나 자료를 가지고 박사과정 선배님 앞에서 억지로 발표하던 그 순간이 아직도 머리에서 떠나질 않습니다.
당연하게도 일련의 스케줄 실패와 기대 이하의 참여도로 지적을 받았습니다.
그 외에도 동아리 회장, 대외 TF 업무도 모조리 지연되어 문제제기나 항의를 받기 전에 우선 사과부터 하는 생활의 일상이었습니다.
진짜 상대방이 진정성을 의심하지 않을까? 싶을 정도로 사과하는 일이 잦았기 때문에 더욱 열심히 사과하고 다녔던 것 같습니다.
업무와 스케줄 정리
사실 문어발식 업무 끌어오기와 파괴적인 스케줄은 이전부터 문제인식하고 있었습니다.
근 수 개월간 심리 상태가 요동치면서 공공기관 지원으로 받은 심리 케어에서는, 주요한 원인이 과로에서 오는 스트레스로 보이니 하고 있는 일을 많이 잘라내라는 말까지 들었습니다.
그럼에도 불구하고 최대한 많은 것을 포기 않고 안고가려고 했었지만 그것이 비현실적이라는 것을 이제서야 알게 되었습니다.
그래서 동아리 회장직 사임부터 시작해서, 다양한 것들과 헤어질 결심을 했습니다.
이제와서라도 지금 안고 있는 일들의 우선순위를 정하고 많은 것을 정리하지 않을까 싶습니다.
갈등 해결하기
해커톤에 들어가기 전부터 저는 이미 꽤 지쳐있었습니다.
같이 하자고 부른 사람은 계속해서 다른 용무로만 연락을 주고, 심지어 그 내용도 몇 시간 전에 수 차례 이야기 했던 것이었습니다.
무언가 제 이야기도, 주장도 무력하게 흩어지는것 같았고, 아무리 이성적이려고 해도 감정적이게 되어갔습니다.
심지어는 팀원 모두가 참석해야하는 자리에, 다른 밤샘 일정으로 지쳐 결석한다는 이야기를 들었을 때는 정말 다양한 감정을 느꼈던 것 같습니다.
내 의견과 입장은 무시하고 이 모든걸 강행한 사람이 나에게는 희생을 강요하고 본인은 무책임하게 행동하는 것이 아닌가
표면적으로 감정을 눌렀어도 냉전 상태에 가까워서 해커톤 초반 팀 분위기는 정말 좋지 않았습니다.
그럼에도 어쨌든 해커톤이 진행될수록 서로 고생을 나누고 머리를 맞댄 덕에 감정 자체가 많이 누그러졌습니다.
저 역시 감정 제어를 제대로 못해 떳떳한 입장은 아니었고, 서로가 각자 본인의 문제를 모르는 것도 아니었으므로, 구체적인 내용은 잠시 내려놓고 다소간의 대화를 나누며 갈등을 봉합해나갔습니다.
제가 이번 해커톤에서 실망했던 모습들이, 나 역시 해커톤으로 다른 업무들에 타격을 주면서, 똑같은 모습을 하고 있는 것이 아닌가 하는 반성을 하게 되었습니다.
올해의 터닝 포인트를 나중에 꼽게 된다면 이번 해커톤과, 그간 방치했던 문제들을 해커톤을 계기로 직시하게 된 것이 되지 않을까 싶습니다.