안녕하세요? younghch입니다. 부족한 실력에 취업 후기를 쓴다는 것이 부끄럽지만, 준비를 하면서 비전공자로써 막막한 점이 많았기에 다른 분들께 조금이나마 도움이 될까 글을 써봅니다.

저는 군대에서 C를 공부하면서 개발에 입문했고, 전역하고 본격적으로 공부를 시작하고 1년이 조금 더 지나 원하는 회사에 갈 수 있었습니다. 개발을 시작하고 하루 8~10시간 정도 공부했고, 국비지원 교육을 수강하고 마지막학기에 CS수업을 몰아 들으며 42서울 과정을 병행했습니다.

1년간 다양한 회사에 떨어져본 개인적인 감상은, “프로젝트가 부족하면 서류에서, 알고리즘 실력이 부족하면 코딩테스트에서, CS 깊이가 부족하면 면접에서 탈락한다.” 입니다.

서류: “비전공자” + “나”를 뽑을 이유

 전공자도 많고, 잘하는 비전공자도 많은데 그 중 저를 뽑을 이유를 만들어야 한다고 생각했습니다. 저를 특별하게 만들어줄 점을 고민했고 실제로 프로그램을 배포해본 경험이 차별점이 될 수 있을 것이라 생각했습니다.

물리학과라 수학에는 자신있었기에 머신러닝을 차별점으로 잡으려고도 해봤습니다. 하지만 이력서가 벡엔드와 머신러닝이 섞여 어느쪽에서도 뽑고 싶지 않다는 평을 들었고, 벡엔드에 집중해서 자기소개서를 작성했습니다.

토이 프로젝트에서 끝내지 말고 출시해보자!

 괜찮은 토이 프로젝트를 해본 경험이 있는 분들은 정말 많습니다. 제가 국비지원 학원에 다니는 동안에도 학원에서 한두달에 프로젝트 하나씩은 진행되었습니다. 하지만 잘 만든 프로젝트조차도 단지 포트폴리오에 보여주기 위해서 깃허브에 올리고 정리를 하는 경우가 다반사였습니다.

 프로그램을 출시하는 것은 스스로 학생이 아닌 개발자라고 부를 수 있는 조건이자 다양한 경험을 하고 빠르게 성장하는 방법이라고 생각합니다. 실제로 사용자를 끌어당길 수 있는 주제를 찾아야 하며 특별한 프로그램을 만들기위해 새로운 기술을 익힐 수 있고 기능 구현을 넘어 UI/UX까지 폭넓게 경험해 볼 수 있습니다. 사용자를 확보해 보면서는 내가 만든 프로그램이 왜 매력이 떨어지는지 개선점을 찾을 수 있고, 배포 이후에 기기에 호환성이나 버그, 추가할 기능에 따라 유지보수도 경험해 볼 수 있습니다.

 저는 두개의 프로그램을 출시했는데, 안드로이드에 머신러닝을 적용해 문제지를 찍으면 틀린 문제를 모아주는 오답노트 앱이 가장 많은 질문을 받았습니다. 자바로 웹 개발을 해본 경험은 있지만 안드로이드는 처음이라 구글 개발자 문서를 읽으며 필요한 기능을 그떄그때 만들었고, 원래 사용하던 PyTorch대신 자바와 호환이 되는 TensorFlow를 사용해야 했습니다. ART를 이해하며 JVM에 대해서도 더 깊게 이해할 수 있었고, 무작정 CNN을 쌓는 것을 벗어나 객체탐지 관련 논문을 읽으며 가장 알맞은 모델을 찾고 학습시켜 볼 수 있었습니다. UI는 Material Design 가이드라인을 지키며 작성했고, 앱 배포이후에는 Android 10 이상에서 호환성 문제와 사용자 피드백에 따라 여러 차례 업데이트를 진행해야 했습니다.

프로그램을 배포하며 많이 성장했고 할 이야기가 많아졌습니다. 서류 합격률도 좋았고, 이번 합격한 회사에서는 면접관님께서 직접 사용 해보셨다고 관련 질문을 주셔서 제 취업을 결정지은 가장 큰 요인이 아닐까 생각이 들었습니다.

아쉬웠던 점은 웹 프로젝트를 클라우드 서버에 배포했다면 좋았겠지만, 쉬운 길을 택해서 크롬익스텐션이나 안드로이드처럼 서버 없이 동작하는 방향으로 출시한 것입니다. 채용공고에 AWS 서버를 사용해본 경험이 있으면 우대하는 곳이 많더라고요.

출시가 싫다면 가고싶은 회사의 채용공고의 기술스텍에 맞춰 프로젝트를 진행해보는 것도 좋습니다.

코딩테스트…알고리즘….

 코딩 테스트에서 탈락하면 제가 부족하다고 느껴져 억울하지는 않더군요. 그리고 운도 많이 따르는것 같습니다.

파이썬을 사용하자

 저는 Java로 알고리즘을 풀다가 Python으로 바꿨습니다. 저는 속도때문에 파이썬을 좋아하지 않았지만 언어를 바꾸고 코드 작성시간이 눈에 띄게 줄어들었습니다. 실제로 관련 통계가 있는데요, 2017년 카카오 신입 공채에서 언어별 합격자 비율은 C++ 25%, Python 24%, Java 11%, JavaScript 8% 이며 Python의 코드 라인수는 C++에 비해 60%수준이라고합니다. 그리고 가끔은 C로 구현된 라이브러리를 이용해 편법처럼 푸는 재미도 있습니다.

처음 시작하시는 분들을 위한 공부 방법

 풀면서 배워도 되지만 알고 풀면 더 낫습니다. 하지만 자료구조는 먼저 공부하시고 시작하는게 좋습니다. 알고리즘 책도 한권 사서 체계적으로 공부하며 푸는 것이 좋다고 생각합니다.

문제가 안풀리더라도 한시간 이상 고민해보고, 정답을 보더라도 안보고 자신이 직접 짤 수 있어야합니다. 답을 맞췄더라도 다른 더 좋은 풀이가 있는지 꼭 봐야합니다. DFS, BFS, 다익스트라 알고리즘 정도까지만 알면 왠만한 문제는 풀 수 있는 것 같습니다. 알고리즘은 내공같은 느낌도 있어서 벼락치기보다는 꾸준히 조금씩 하는게 좋다고 생각합니다.

추천드리는 책 : 윤성우의 열혈 자료구조 (C), 파이썬 알고리즘 인터뷰

조금 달랐던 코딩테스트들

서버에 쿼리로 JSON을 받아와 파싱하기, SQL문작성하기, sklearn으로 분류모델 만들기, 가격예측 모델 만들기

면접: 잘 모르겠다

저는 멘토님들께 많은 도움을 받았습니다. 저도 왜 붙고 떨어지는지 잘 모르겠어서 제가 느낀 이유와 멘토님들의 조언, 그리고 제가 들었던 질문들을 적어보겠습니다.

제가 느꼈던 면접

저는 처음에는 CS지식이 부족해 떨어진다고 생각했습니다. 면접에서 대강은 아는데 구체적으로 알지 못하는게 문제라는 평을 들었고 단기간에 쌓았기에 내공이 부족하다고 느꼈습니다. 운영체제를 제대로 알기위해 집현전에 있는 전공서로 공부했고 면접때마다 모르는 내용이 나오기에 제가 뭘 모르는지 알기 위해 정보처리기사를 공부했습니다.

하지만 멘토님께서 해주신 조언이 더 도움이 되었습니다.

멘토님께서 해주신 조언

  • ‘지식을 보려면 서면 평가로 하면 되는데 굳이 면접을 보는 이유는 같이 일하고 싶은 사람인지 느낌을 보는 자리이다, 다 대답한다고 붙는 것도 떨어지는 것도 아니다.’
  • ‘자신이 만든 프로젝트의 기술을 완벽하게 설명할 수 있어야한다. 두루뭉술하게 설명하면 직접 한 프로젝트가 아니라고 느껴지고 모르면서 썼다고 느껴진다.’

들었던 질문

항상

  • 자기소개
  • 프로젝트 설명 + 꼬리질문
  • 왜 이 회사에 지원했는가?

파이썬

  • 파이썬에서 가비지 컬렉션은 어떻게 이루어지는가
  • set은 어떤 자료구조로 구현되어있는가
  • 인터넷에서 다수의 이미지를 다운받으면서 전처리를 하고싶다. 어떻게 해야 빠르게 처리할 수 있나?
  • 제너레이터란 무엇인가

  • SSL, TLS에 대해 설명해 보세요
  • HTTP의 요청 메소드의 종류와 쓰임을 설명하세요
  • DNS 란 무엇인가
  • Ajax에 대해 설명하세요

운영체제

  • 가상메모리는 무한히 많이 만들 수 있나요
  • 내 외부 단편화에 대해 설명하세요
  • 선점형 멀티테스킹이란?
  • 세마포어에 대해 설명하세요
  • 메모리 구조가 코드 데이터 스택 힙으로 이루어지는데 스텍은 정말로 스텍으로 구현되어있나. 힙은?
  • 스텍 오버플로우에 대해 설명하세요

ML

  • encoder와 decoder를 사용하는 이유
  • 사용했던 모델의 크기와 파라메터 수
  • 왜 그 모델을 사용했는가, 손실함수를 바꾸면 효율이 올라가나
  • 자바스크립트로 모델을 옮겨야 한다면 어떻게 할것인가
  • cGAN은 지도학습인가 비지도학습인가
  • 최근 읽었던 논문을 설명해봐라

42

  • C라이브러리를 구현했다고 했는데 정확히 어떤 라이브러리를 구현했는지
  • 다른 사람의 코드리뷰를 하면서 느낀점
  • printf를 구현할때 버퍼를 사용했는가, 왜 안했는지?
  • system call에 대해 설명해봐라, malloc은 systemcall인가?
  • 클린 코드를 강조했는데 클린코드를 작성했을때 이점은?

DB (물어본 적이 거의 없는것 같네요)

  • 시계열 데이터 베이스란?

준비하면서 도움이 되었던 깃허브

https://github.com/JaeYeopHan/Interview_Question_for_Beginner

마치며

42에서 공부하면서 좋은 코딩 습관을 익히고 좋은 동료들도 많이 만날 수 있었습니다. 꼭 하고싶었던 프로젝트가 있었는데 마치지 못하고 가서 아쉽습니다. 아직 부족한 실력에 글만 너무 긴것같아 걱정이 되지만 현업에서 진짜 실력자가 되어 나중에는 도움되는 이야기를 해드리고 싶습니다.

제 부족한 점을 원포인트로 짚어주신 김수보 멘토님, 방향을 제대로 잡도록 따끔한 조언을 해주신 오종인 멘토님, 첫 이력서 조언을 해주신 강중빈 멘토님께 정말 감사드리며 글을 마칩니다.