나는 어떻게 취업을 (못) 하게 되었나
페이스북에서 학부생인데 기계학습 관련 직종으로 취업하고 싶지만 어떻게 해야 좋을까, 혹은 나는 어떤 공부를 해야 좋을까 하는 고민을 올린 글을 많이 봤어요. 저도 비슷한 고민을 하고 있었고, 나름대로 취업에 대한 고민의 결론을 내렸고, 이를 위해 노력한 성과가 어느 정도 나와서, 이를 공유하고 싶어졌습니다. 사실 결과적으로는 대학원에 진학하게 되었습니다.
(1) 카카오 추천팀과, (2)당근마켓의 면접을 다 합격하게 된 게 성과…‘ㅅ’…
결국 석사를 진학하게 되었지만 ^0^…
(1) 제가 어떤 사람이고, (2) 어떻게 공부를 해왔는지 공유하면, 기계학습 관련 취업을 준비하는 사람들에게 분명히 도움이 될 거라 생각해서 이런 글을 쓰게 되었습니다.
그리고, 사실 대학교를 마치기까지의 제 자신에 대한 회고 같은 느낌도 있어요.
이 글의 대상은 학부를 졸업하고, 기계 학습 엔지니어로 취직하고자 하는 사람을 위한 글입니다.
경력있고 실력있는 엔지니어, 리서쳐 분께서 보면 겨우 이런 일을 가지고 자랑하는 듯한 글을 쓴다는 생각이 들 수도 있을 것 같습니다. 하지만, 음… 제 경험이 도움이 될 사람도 분명히 있을 것이라 생각해 제 경험을 공유하고자 합니다.
나는 어떤 사람인가
저는 한양공업고등학교를 나왔습니다. 어느 정도 공부를 한 결과 운이 좋아 성균관대학교에 입학하게 되었습니다.
공고 출신이 대학 입시를 준비하고, 성공하는 과정에서, 지레짐작하며 포기하는 것이 나쁘다는 사실을 배웠어요. 좋지 않은 학교를 나왔다는 사실이 날 도전하지 못하게 막을 수는 없다는 사실을 알게 되었습니다. 날 막는건, 단지 도전할 용기를 내지 못하는 자신 뿐이라는 사실을 배웠어요. 혹시 좋지 않은 대학교를 나왔다거나, 전공이 다르다거나, 혹은 대학교를 나오지 않았다고 해서 포기하지 않았으면 좋겠어요. 내 학벌이나, 학점이 아닌 실력으로 평가받을 수 있다고 믿으려 노력하고 있습니다.
어떻게 기계학습을 공부하게 되었는가
기계학습에 처음 관심을 갖게 된 건, 2017년 연초에 여자친구랑 헤어지고 하루종일 유투브만 들여다보던 시절이었던 것 같아요. (다른 사람들은 알파고때 많이 관심을 갖게 되었다고 들었어요.) 사용자가 좋아할 만한 동영상을 추천해주는 것을 연구하는 분야를 “추천 시스템”이라고 부르는 것도 모르는 채, “유투브 신기하네” 정도로만 생각하고 있었습니다.
한 두어달쯤 그렇게 생활했을까, 이렇게 살면 안된다는 생각을 했었습니다. 선배들이 취준하는 모습을 보고, 나도 뭐라도 해야겠다 하는 생각을 했었어요. 그래서, 아무 생각도 없이 요즘 핫하다는 데이터마이닝을 연구하는 교수님을 찾아가서 학부연구생을 시켜달라고 했어요. 물론 데이터마이닝이 뭐 하는건진 하나도 몰랐어요…
운이 좋아서(교수님이 부임된지 얼마 되지 않아 연구실에 사람이 전혀 없었기 때문에) 연구실에 자리를 하나 얻을 수 있게 되었고, 추천 시스템, 조금 넓게는 머신 러닝과의 만남은 이 때 시작되었습니다.
어떤 방법으로 공부했는가
개인적으로, 대학원에 진학하거나 학부연구생을 할 수 있는 환경이라면, 무조건 하시는 걸 추천드려요. 연구실 생활의 가장 큰 장점으로는, 내가 뭘 공부하면 좋을지 잘 모를때 가이드라인이 존재한다는 점인 것 같아요. 어떤 논문을 읽어야 좋을 지, 어떤 것을 공부해야 좋을 지 등등… 좋은 지도교수님과, 좋은 선배와, 개인의 노력까지 합쳐지면 혼자 공부할 때에 비해서 성장의 폭이 달라지는 것 같아요. 그렇게 할 수 없는 경우에도, 혼자 공부하는 것보다는 되도록 다른 사람과 함께 공부하는 것을 추천해요. 성장은 협력에서 나오는 것이 아닐까 하는 생각을 많이 하곤 해요.
이 글은, 그렇지 못한 사람들을 위해, 제가 어떻게 공부했는지를 알려주고자 하는 글입니다!
수학을 피할 수는 없습니다
저도 수학을 잘 하진 못했던 것 같아요. 생소하기도 하고, 처음에 MLP를 이해하지 못해서 몇주간 헤멨던 기억이 납니다. 수학보단 insight가 중요한게 아닐까, 수식은 이해하지 못해도, 코드를 이해하면 되지 않을까 하는 유혹에 혹하기도 했어요. 근데 이런 생각이 들더라구요. 내가 잘 할 수 없으니까, 수학을 신 포도라고 생각하게 되었던 건 아닐까? 수학 공부하는걸 포기하지 않으면 더 많은 걸, 더 자세히 알 수 있다고 생각해요.
생각나는게 몇 개 없지만 예를 들자면,
- Bias-Variance Tradeoff가 왜 생기는지
- Regularlization은 왜 overfit을 줄이게 되는지
- 왜 minibatch training이 전체 샘플을 사용하는 것에 비해 충분히 괜찮은 estimate를 제공하며, overfit도 일부 줄이는 효과를 얻는지
이런 것들은 글로, 혹은 코드로 이해하기 쉽지 않지만, 수식으로 설명하면 쉽게 이해가 된다고 생각합니다. 이 뿐만 아니라, 기계 학습을 공부하며 마주치는 많은 내용들은 그리 복잡하지 않은 확률론, 미적분학 지식이 있으면 더 쉽고, 더 자세히 이해할 수 있습니다. 처음부터 수학을 너무 깊게 공부할 필요는 없다고 생각합니다. 목표는 수학을 잘 하는게 아니니까요. 하지만, 수학을 너무 무서워하지 않게, 꾸준히 연습할 필요는 있다고 생각합니다.
저는 기계 학습을 공부하며 모르는 수학이 나오면, 어디 적어뒀다가 주말에 찾아서 공부를 했어요. 이제는 너무 유명한 PRML이나, 수리통계학 두 책을 가장 많이 본 것 같습니다.
분명, 수학을 꾸준히 공부하다 보면, 공부하길 잘했다 싶은 순간이 올 것이라 믿어요. 제가 그런 경험을 했고, 같이 수학을 공부하던 친구도 그런 경험을 했습니다. 포기하지 않았음 좋겠어요!
무슨 모델을 공부했는지보다는, 어떤 문제를 해결하는가에 집중하기.
학부 연구생을 경험하며 처음으로 어떤 문제를 해결하는 방법에 대해 배우게 되었습니다. 특히, 이는 지금까지 내가 공부했던 방식과 전혀 다른 방식이었어요. 지금까지의 공부는, 알고리즘으로 예를 들자면, 알고리즘을 배우고 그 다음 이를 이용해 해결할 수 있는 문제를 푸는 방식이었어요.
새로 배운 방식은, 예를 들자면 이런 것 같아요. 유저의 시청 이력(유저가 아이템을 클릭한 목록)이 충분해야 추천을 잘 만들 수 있는데, 유저가 시청 이력을 충분히 남기지 않았다. 이를 어떻게 해결할까?
즉, 두 방법을 요약하자면 다음과 같습니다.
- 해결책 X를 먼저 배운 뒤, 이 X로 해결할 수 있는 문제 Y에 적용해본다.
- 문제 Y를 먼저 정의한 뒤, 이 문제를 해결할 만한 방법 Z를 열심히 생각한다.
기계학습 분야에서는 (제 생각에는) Z는 특히 책으로 배우기 어려운 것 같아요. 기계학습 문제가 적용되기 시작한지 그리 오래 되지 않아, 방법론이 정리되지도 않았고, 상당히 많은 분야에 적용할 수 있기 때문이라고 생각하는데 정확히는 잘 모르겠습니다.
기계학습 모델로 어떤 문제를 해결하고자 하면 생기는 문제는 대부분 Z에 있고, 이 과정에서 상당히 많은 문제가 발생합니다. (대부분은 책에 없는 문제였어요.) 이 과정에서 생기는 문제를 잘 해결하는 것이 좋은 엔지니어의 필수적인 자질이라고 생각합니다. 이는 기계학습 엔지니어 뿐만 아니라, 모든 엔지니어에게 필수적인 자질이겠죠. 저는 운좋게도 이 과정을 학부 연구생을 하며 자연스럽게 배울 수 있었습니다.
예를 들면, 만든 기계학습 모델을 200ms 내에 Serving하는 API를 만들어야 한다고 가정해봅시다. 단순히 생각했을 때, 다음과 같은 현실적인 문제를 추가적으로 해결해야 합니다.
- 모델을 Web API로 돌릴 수 있을 정도로 경량화 되어있어야 한다. (돈을 충분히 쓴다면 필요 없는 경우도 많겠지만)
- 일단, 개별 Query에 대해 200ms 이내로 서빙해야 한다.
- 요청이 (예상 범위 내에서) 많아지는 경우에도, 200ms 이내로 서빙해야 한다.
이 부분은 일부는 기계학습의 영역이고, 일부는 컴퓨터 공학의 영역인 것 같아요. 사람마다 잘 하는 일이 다르므로, 잘 하는 부분이 생길 거고, 못 하는 일이 생길 거라고 생각합니다. 자신이 잘 하는 일, 좋아하는 일을 강조하면 서류/면접에서 좋은 결과 있을 것이라 생각해요.
리서치를 목적으로 하신다면, 다른 방법으로 접근하는게 좋을 것이라 생각해요. 하지만, 리서치의 본질도 문제를 제기하고, 해결 방법을 제안하는 것이므로 크게 다르지는 않을 것이라 생각해요.
블로그/오픈소스 활동
자신이 배운걸 습관적으로 남들한테 보여주는게 중요합니다! 이러면 (기본적으로는 쪽팔릴까봐) 더 열심히 하게 되고, 이력서처럼 활용도 가능합니다. (어딘가 지원할때 제 깃허브와 블로그 이외에 다른 것을 제출해보지는 않았어요. 대부분의 경우 긍정적인 답변이 오는 것으로 보아, 블로그와 깃헙 활동만으로 포트폴리오는 충분하지 않나 싶어요.)
특히, 블로그는 꼭 하는게 좋은 것 같아요. 내가 얼마나 성장했는지 확인하기 가장 좋은 방법이기 때문입니다. (과거에 쓴 글이 너무 쪽팔려지면 성장한 겁니다…)
오픈소스 활동도 꼭 해보시길 권해요. 처음에 코드를 커밋할 때에는, 반신반의했어요.이런 멋진 코드를 쓰는 사람들이 활동하는 곳에 내가 코드를 올린다는게 방해가 되지는 않을까 생각했어요.
그러다, 그러다 정말 우연히 올린 오타 수정 Commit이 grpc에 반영되게 되었고,
So what?쯤의 대답이 돌아올 줄 알았는데, “Thanks!”라는 친절한 대답을 들었던 것 같아요. 다른 사람들에게는 별 일 아닐 수도 있겠지만, 조금 자신이 생겨서 이번에는 새로운 기능을 만들어보거나, 코드를 조금 수정해보거나 해봤어요.
이러는 동안 정말 많은 것들을 배울 수 있었습니다. flake를 사용해 pep8에 맞는 Python code를 작성하는 방법, Travis를 이용하는 방법, Remote에 있는 사람과 협업하는 방법 등… 가장 중요한 것은, 정말 훌륭한 코드를 읽어볼 수 있다는 점이었어요.
단지 방에서 혼자 프로그래밍을 했다면 배울 수 없는, High standard를 가진 사람들과 (돈을 받지는 않지만) 많은 사람들이 사용하는 프로덕트를 만들 수 있는 기회라니…(게다가 원하는 시간에만 일할 수 있음) 놓치면 안됩니다.
이게 다, 처음 제 commit에 Thanks라고 말해준, grpc를 maintain하는 어떤 아저씨로부터 시작되었다고 생각하면 신기하기도 해요ㅋㅋㅋ… 현재는 큰 레포지토리는 아니지만, Implicit이라는 라이브러리를 maintain하고 있습니다.
참고로, open source 활동의 가장 좋은 점은 이거에요.
이걸 보고 Job offer가 들어오기도 합니다 >_<
결론
가장 중요한 것은, 면접이나 취업을 잘 하는 것이 아니라, 자기 자신이 성장하는 것인 것 같아요. 요즘은 어딜 가던 면접 프로세스가 정말 잘 되어있어서… 결국 자신의 진짜 모습을 보여주게 되어 있고, 이로 평가받게 되니까요. 엔지니어로서 자신의 모습을 솔직하게 보여줬을 때, 서류나 면접에 합격할 정도의 수준은 (저도 가능했으니) 누구나 노력한다면 가능할 것이라 생각합니다. 그러니, 음… 개인적으로는, 자신을 어떻게 보여줄 지에 대해 너무 신경쓰기보다, 자기 자신이 더 좋은 사람이 되기 위해 노력하는게 맞다고 생각해요.
저는 결국 대학원에 진학하는 것을 선택했어요. 더 많이 성장할 수 있다고 생각해서…라고 생각할래요. (사실은 납치당함) 하지만 처음 언급했듯이, 제가 어떻게 기계 학습을 공부하게 되었고, 공부했는지가 다른 분들에게 도움이 될 것이라 생각합니다.
읽어 주셔서 감사합니다.