2019년 마무리

Posted on Saturday, 28 Dec 2019end-of-the-year

한 해 동안 정신 없이 지내왔는데, 벌써 며칠 뒤면 2019년도 끝나네요. 그러고 보니 작년과 재작년에는 학교 생활에 치중하느라 이런 포스트를 쓰지도 못 했지요. 올해도 하마터면 이대로 해를 넘길 뻔하다가 큰 맘 먹고 올 한 해 동안 일어난 일들을 정리해 보기로 했습니다.

개인 프로젝트

올해 작업한 개인 프로젝트에 대한 내용을 정리하려고 보니, 새로 시작한 건 없고 전부 오래 전부터 지금까지 이어져 오던 것들 뿐이네요. 그래도 올해 들어서 정말로 많은 변화가 있었습니다.

Serum

Serum은 2016년을 마무리하는 블로그 포스트에서도 소개해 드린 적이 있는, Elixir 프로그래밍 언어로 작성된 정적 웹사이트 생성기입니다. 3년이라는 긴 시간 동안, 가끔씩은 개발을 쉬고 재개하기를 반복하다가, 올해 상반기에 마침내 Serum v1.0.0이 정식으로 출시되었습니다.

사실은 언제라도 버전 1.x를 붙이고 출시할 수 있었지만, 여태껏 그렇지 못했던 건 제가 스스로 “정말로 이 코드 베이스가 1.0.0이라는 버전 넘버를 부여받을 자격이 있나?”같은 고민을 끊임 없이 해 왔기 때문입니다. 테스트하기 힘든 모듈 간의 의존 관계, 확장성이 제한된 Serum 웹사이트 프로젝트의 구조, 기능 추가와 유지보수가 어려울 정도로 못나게 쓰여진 코드 등등의 이유로 Serum은 긴 시간동안 메이저 버전 번호가 0에 머물러 있었습니다.

그러다가 대학교를 졸업하고 취업을 준비하는 기간 동안에, 남는 시간을 Serum에 투자해서 Serum v1.0.0을 Erlang/Elixir의 공개 패키지 저장소인 Hex에 올릴 수 있었습니다. 2016년에 소개한 버전과의 주요 차이점은 다음과 같습니다.

  • Serum 프로젝트의 구조 변경

    기존에는 독자적인 프로젝트 디렉토리 구조를 사용하면서 serum.json 파일로 프로젝트를 설정하였지만, 현재는 설정 파일을 serum.exs로 변경하여 Elixir의 값들을 직접 사용하여 프로젝트를 설정할 수 있게 되었고, 기존의 디렉토리 구조를 유지하면서 Elixir의 빌드 도구인 Mix와도 호환되도록 개선했습니다. 따라서 이제 Serum 프로젝트 내에서도 Hex에서 원하는 패키지를 내려받아 EEx 템플릿 등에서 사용할 수 있고, lib/ 디렉토리 내에 모듈을 작성하여 그 모듈을 EEx 템플릿 내에서 자유롭게 사용할 수 있습니다.

  • 플러그인 및 테마 지원

    Serum 플러그인은 Serum이 웹사이트를 빌드하는 도중 특정 시점에 실행되는 모듈로, 생성되는 컨텐츠를 변경시킬 수 있으며 Serum의 기능을 확장시켜 주는 역할을 합니다. 이 글의 맨 위에 있는 “차례“도 플러그인이 이 글의 머릿글만을 모아서 지정한 위치에 삽입한 것입니다.

    테마는 정해진 템플릿과 CSS, 이미지 등의 애셋을 모아놓은 패키지입니다. Hex에서 원하는 테마 패키지를 찾아 다운로드 받고 Serum 프로젝트가 테마를 사용하도록 설정하면 손쉽게 웹사이트의 모습을 바꿀 수 있습니다.

  • 좀 더 이뻐진(?) 명령줄 인터페이스

    사실 별 건 아니고, Serum이 터미널에 출력하는 텍스트의 형식이 좀 더 이뻐진 걸 자랑하고 싶었을 뿐입니다. 😊

이 글을 쓰는 시점에서 Serum의 최신 버전은 1.3.0이며, 현재 내년 상반기에 Serum 2.0을 릴리즈하는 것을 목표로 열심히 작업하고 있습니다. 항상 지켜봐 주세요!

Neo둥근모 글꼴

Neo둥근모는 유명한 DOS용 한글 비트맵 글꼴인 “둥근모꼴”을 트루타입 윤곽선 글꼴로 변환하고, 거기에 제 멋대로 여러가지 문자와 기호를 추가하는 프로젝트입니다. 사실 이 프로젝트도 몇 년 전부터 계속 해 오던 것인데, 최근에 엄청난 변화가 있었습니다. 바로 Python 스크립트와 오픈 소스 글꼴 제작 소프트웨어인 FontForge에 대한 의존을 없애고, 비트맵 데이터로부터 윤곽선을 추출해 내는 것부터 TTF 파일을 생성하는 것까지 전부 직접 작성한 Elixir 프로그램으로 교체했다는 것이에요. (!!!)

비트맵 이미지로부터 윤곽선을 만들어 내는 알고리즘을 작성할 때에는 Planar union of rectangles with sides parallel to the coordinate axis라는 제목의 글이 굉장히 큰 도움이 되었습니다. 그리고 TrueType 및 OpenType의 기술적 사양에 대한 모든 것은 Microsoft Typography 웹 사이트에 공개되어 있습니다. 여기에 올라와 있는 문서들을 차근차근 읽어보면서 글꼴 파일을 구성하는 각종 테이블과 구조체들을 Elixir의 바이너리 문법을 사용하여 하나씩 구현해 내는 게 정말 재미있는 경험이었습니다.

글꼴을 빌드하는 과정을 전부 갈아치운 다음에 새로운 버전을 릴리즈했는데, 이 때 프로그램 소스 코드를 좀 더 멋지게 보여줄 수 있는 ligature를 포함한 “Neo둥근모 Code”라는 글꼴도 처음으로 릴리즈했습니다.

그리고 현재 터미널이나 텍스트 편집기 이외의 곳에서 범용적으로 사용할 수 있는 가변폭 글꼴인 “Neo둥근모 Pro”도 공개를 준비하고 있으니 많이 기대해 주세요. (“Pro”는 “proportional”이라는 단어를 줄인 것입니다. “Pro”가 붙었다고 돈을 받는다거나 하지 않아요. 🤣)

이런저런 이야기들

2019년에는 제 삶을 책으로 비유하면 새로운 장이 시작된다고 할 수 있을 정도로 커다란 일들이 많이 지나갔습니다.

대학교 졸업

네. 서울과학기술대학교 컴퓨터공학과에 2013년 3월에 입학하여 올해 2월에 무사히 졸업했습니다. 군 복무 기간을 제외하고 4년 동안 많은 사람들을 만나고, 많은 것들을 배우고, 많은 것들을 하면서 즐거웠던 일, 아쉬웠던 일들이 많이 있었네요. 이제 이 모든 것들을 뒤로 하고 진짜 사회 생활을 시작해야 하는 때가 되었습니다. (두둥)

첫 입사 지원, 첫 면접, 그리고 첫 실패

취업을 준비하던 중에 아는 사람을 통해 모 중견 IT기업의 인턴 공개채용 공고를 보게 되어 지원을 하게 됐습니다. 이력서 제출, 온라인 코딩 테스트, 오프라인 필기 테스트 등등, 인턴 하나 뽑는데 1차 면접 전까지 거쳐야 하는 절차도 많았고, 절차와 절차 사이의 기간도 정말 길었던 것 같습니다.

이력서 제출

여긴 뭐, 크게 신경 쓸 만한 것은 없었습니다. 지원을 위한 최소한의 자격 요건만 충족된다면 이 단계는 거의 다 통과가 된다고도 했었고, 저도 대학교를 갓 졸업한 상태라 이력서에 개인 신상 정보와 학력 정보 외에는 딱히 적을 수 있는 것이 없었습니다.

온라인 코딩 테스트

온라인 코딩 테스트는 “프로그래머스”라는 사이트를 통해 집에서 진행됐는데, 제한 시간은 기억이 나질 않지만 총 다섯 개의 알고리즘 문제를 풀어야 했습니다. 처음 세 문제는 짧은 시간 안에 무난하게 풀 수 있었고, 네 번째 문제도 약간 어려웠지만 그래도 자신있게 코드를 작성할 수는 있었는데, 역시 예상했던 대로 마지막 문제가 가장 어려웠습니다. 고민만 하는데 문제 풀이 시간의 반 이상을 잡아먹었던 것 같아요. 코드 작성도 테스트 시간 종료를 불과 몇 분 앞두고서야 마무리할 수 있었습니다.

마지막 문제같은 경우에는 테스트 중에 제공된 예제 테스트 케이스로는 제대로 된 정답을 출력할 수 있었지만, 나중에 제가 생각한 접근법이 잘못되었다는 것을 알게 되었습니다. 그래도 이 테스트는 통과할 수 있었어요.

오프라인 필기 테스트

오프라인 필기 테스트는 서울에 올라가서 응시했습니다. 책자로 된 시험지를 받아서 시험을 봤는데, 몇몇 프로그래밍 관련 문제를 제외하고는 전부 대학교 수업을 들었다면 한 번 쯤 들어봤을 법한 내용이었습니다. 저는 분명 대학교 4년 다닐 동안 수업을 열심히 들었는데, 왜 대부분의 문제를 푸는 데 식은땀을 흘렸을까요 ㅎㅎ… 제가 무슨 문제를 맞추고 무슨 문제를 틀렸는지는 모르겠습니다만, 이것도 어찌 저찌 해서 통과할 수 있었습니다.

1차 면접

이제 대망의 1차 면접입니다. 이 단계를 통과하면 약 3개월동안 지원한 회사에서 인턴으로 근무할 수 있고, 그 후에 2차 면접을 본 후 정식으로 입사를 하게 됩니다. 오프라인 필기 테스트를 통과했다는 통지를 받고 나서 1차 면접을 보러 가기 전까지 맨 처음에 제출한 이력서와는 별도로 자기소개서를 작성해야 했습니다. 간단한 자기 소개와 지금까지 진행했던 프로젝트에 대한 내용을 썼습니다. 자기소개서를 작성하다 보니 이번 면접은 안 되겠구나 하는 생각이 벌써부터 들더군요. 😅

면접은 서울이 아닌 판교에 있는 사옥에서 진행되었습니다. 사실 제대로 준비를 못 한 것 같아서 기다리는 내내 너무나도 떨렸고, 면접을 보는 중간 중간에도 입 안이 바짝 말라서 면접관 앞에서 몇 번이나 물을 마셨는지 모르겠네요. 그리고 면접 결과를 먼저 말씀드리자면, 나 자신에게나, 그 자리에 앉아있던 면접관에게나, 굉장히 실망스러웠습니다. 뭐, 제가 자기소개서나 면접 준비를 제대로 하지 못했다고 칩시다. 그렇지만 제가 지원한 분야와 전혀 상관이 없는 면접관 셋을 불러서 앉혀 놓은 거나, 면접을 시작하자마자 거기 있던 한 분이 내뱉은 말이나, 그 후 면접 시간이 끝날 때까지 받은 질문들은 도저히 이해할 수 없었습니다. “이 사람들이 나를 뽑을 생각은 없지만, 어디 한 번 여기 불러서 앉혀놓고 창피나 주자고 부른 것 같다”는 생각이 지금도 지워지지 않고 있습니다.

물론 1차 면접은 불합격했고, 저는 또 다시 취업 준비 모드로 돌아갔습니다. 뭐, 그 후에 그 회사를 중심으로 여러가지 크고 작은 논란이 일었다는 걸 생각하면 거기에 붙지 않은게 다행이라는 생각도 드네요. 지금은. 이거 이렇게 대놓고 말하면 위험한가요? 뭐 어때요. 다만, 이번 공개채용 도전 후에 얻은 게 딱 하나 있는데, 바로 “지금까지 해 온 건 많은데 이력서나 자기소개서에 넣을 만 한 것은 없었다”는 뼈아픈 깨달음이었습니다. 앞으로 어떻게 해야 할까요 ㅋㅋㅋ…

마침내 찾은 나의 첫 직장

이번에는 강남에 있는 한 중소 IT 회사에 눈길을 돌렸습니다. 백엔드 개발자 채용 공고에서 무엇보다도 저를 사로잡은 건, 바로 자격 요건과 우대 사항에 Elixir 프로그래밍 언어에 대한 경험이 쓰여 있었다는 것입니다! 저는 별다른 고민 없이 그 회사의 채용 관련 사이트에서 입사 지원서를 작성하고 이력서를 만들어서 보냈습니다. 그 후 면접 일정을 잡기 전까지 상당히 오랜 기간을 기다렸던 것 같습니다. 나중에 채용을 담당하시는 분들이 출장을 다녀와서 그랬다는 것을 알게 되었고요.

첫 면접은 집에서 온라인 화상 통화로 진행됐습니다. 가벼운 분위기 속에서 입사 지원서에 기입된 내용에 대한 것과 하게 될 업무에 대한 이야기를 나누었고, 그 외 캐주얼한 대화도 나누었습니다. 인터뷰는 무난하게 마쳤는데, 한 가지 걱정했던 건 역시 프로그래밍 언어와 관련된 게 아니었나 싶습니다. 채용 공고 상에 Elixir 프로그래밍 언어에 대한 언급이 있긴 했지만, (입사를 한다는 가정 하에) 제가 다루게 될 코드 베이스는 전부 Ruby로 되어 있고, 온사이트에서 프로그래밍 테스트를 할 때도 Ruby를 써야 할 것이라는 안내를 받았기 때문입니다. 그래서 이 때부터 저와 Ruby와의 인연이 시작됩니다.

1차 인터뷰를 하고 나서 몇 주 동안 난생 처음 써 보는 Ruby 언어의 기초적인 부분을 공부했습니다. 💦 Ruby Koans라는 것이 큰 도움이 되었는데요, 짧은 시간 동안 Ruby를 맞아 가면서 배운다는 느낌으로 쭉쭉 진도를 뺐습니다. 그리고 서울 강남에 있는 회사에 방문해서 실무 테스트를 봤는데요, 알고리즘 위주의 코딩 테스트와는 많이 달랐습니다. 먼저 실제 프로덕션 환경에서 사용되는 것과 비슷한 모습의 Ruby on Rails 예제 프로젝트를 GitHub 상에서 공유받고, 이미 올라와 있던 pull request를 보며 제가 코드 리뷰를 진행했습니다. 그 다음에 그 리포지토리를 git clone해서 GitHub 이슈에 기술된 대로 기능을 구현하고, RSpec 테스트를 작성하고, 같이 참석하신 직원분들과 함께 코드 리뷰를 진행했습니다.

온사이트 실무 테스트도 이전에 했던 온라인 화상 인터뷰 때와 마찬가지로 편안한 분위기에서 진행했던 것 같습니다. 솔직히 말씀드리자면, 회사 개발팀의 분위기가 좋은 의미로든 살짝 나쁜 의미로든 (…) 저와 아주 잘 맞았던 것 같습니다. 서울에서 집에 돌아오고 얼마 뒤, 저는 마침내 회사로부터 채용이 확정되었다는 연락을 받았습니다. 🎉

최대 3개월동안 trial을 한다는 조건으로 6월의 첫 영업일부터 첫 출근을 했고, 8월에 예정된 trial 기간보다 한달 일찍 회사에 정식으로 입사하게 되었습니다. 처음 두세 달 동안은 완전히 익숙해지지 못한 Ruby 프로그래밍 언어와 제가 앞으로 만지게 될 코드 베이스에 적응하느라 정신이 없었던 것 같습니다. 지금은 전혀 문제가 되지 않지만 그 당시 가장 힘들었던 건 코드와 코드 사이를 내비게이션하는 것이었습니다. 유연한 메타프로그래밍, 어디서든 기존의 클래스를 다시 열어서 새로운 메서드를 끼워넣는 것, include 등을 통한 mixin 같은 것들 때문에 내가 보고 있는 클래스나 메서드가 어디에 정의되어 있는 것인지 알아내는 게 힘들었고, Ruby 언어는 진흙공작 내지는 액체괴물을 만지는 것 같다는 인상을 갖게 되었습니다. 그래도 태스크를 하나하나 완수해 가면서 코드 베이스에 대한 이해도가 높아지고, 이러한 어려움은 자연스럽게 극복할 수 있었습니다.

(진짜) 서울 생활

대학교를 다니는 동안에도 4년 내내 생활관에 거주하면서 서울 생활을 했지만, 이제 서울에 일자리가 생긴 관계로 서울에서 자취를 하게 되었습니다. 지금껏 잘 하지 않았던 방 청소라든가 밥을 지어먹는 것 등등을 스스로 하게 되니까 힘들긴 해도 매번 하고 나면 보람차네요. 얼마 전에는 월급을 모아서 새로운 데스크톱 컴퓨터를 조립할 수 있었습니다. 난생 처음으로 제가 모은 돈을 100% 투자해서 만든 컴퓨터라 애착이 많이 가는 물건입니다.

못 다한 마지막 한 마디

이 글의 내용은 숨겨져 있지만, 여러분이라면 그리 어렵지 않게 찾으실 수 있을 겁니다.

2020년에는?

올 한 해는 돌이켜 보면 한편으로는 뿌듯하면서도, 다른 한 편으로는 아쉬움이 많이 남은 해였습니다. 먼 미래를 내다보지 않고 지금 눈 앞에 닥쳐오는 현재만을 바쁘게 살아왔던 것 같습니다. 올해 초에 생각해 뒀던 수많은 올해의 계획들과 향후 몇 년 간의 휘황찬란한 계획은 이제 무엇이었는지 잘 기억도 나지 않습니다. 분명 제 생활의 많은 것들이 바뀌고 하루하루 새로운 것들을 경험해서 그런 것이겠지요. 다가오는 2020년에는 조금만 여유를 갖고 삶의 도중에 잠시 뒤를 돌아보고, 멀리 앞을 내다보는 시간을 많이 가질 수 있었으면 좋겠습니다.

올 한 해 동안 저와 함께 해주신 모든 분들, 정말로 수고 많으셨습니다. 새해에도 화이팅 하는 거예요!