카카오 채용 과정 후기 3편 (기술 인터뷰 준비)

5월 3일 오전에 이메일을 통해서 코딩테스트 합격 소식을 받은 후, 그 날 오후에 바로 원격 인터뷰(전화 인터뷰) 일정 조율 전화가 걸려왔다. 일정 조율은 비교적 지원자의 스케줄을 잘 맞춰주는 편이었다. 그리하여 5월 9일 오후 2시에 원격 인터뷰 일정이 잡히게 되었다. 사실 코딩테스트 전까지는 ‘코딩테스트만 잘 넘기면 그 다음은 뭐…’라고 생각하였으나, 코딩테스트를 지나고보니 그게 아니었다. 코딩테스트는 leetcode, hankerrank 등의 알고리즘 문제 풀이 사이트를 통해서 연습을 하다보면 어느정도 유형이 나오지만, 인터뷰의 경우에는 무슨 내용이 나올지 몰라 엄청 막막했다. 특히나, 제대로 알아본적도 없는 검색시스템이라는 부서에 지원을 했으니… 그나마 다행이었던건 이맘때쯤이 주말, 어린이날 대체공휴일을 끼고 있는 긴 주말을 포함하고 있었고 근처에 조용히 오랜시간 방해받지 않고 공부에 집중할 수 있는 공간이 있었다. 그리고 모르긴 몰라도 일반적인 개발자 면접에서 나올법한 내용들을 대충 추려보면 이것도 어차피 정해진 범위 내에서 나오지 않을까 하는 생각으로 지금까지 배워온 것들 그 중에서도 특히 학부때 배운 컴퓨터과학 전공의 중요한 부분들을 복습하기 시작했다.

우선 구글 문서를 하나 띄워서 생각나는 주요 키워드들을 쭉 나열하고 관련된 내용을 인터넷이나 책에서 찾아가면서 키워드 밑에 정리해나갔다. 학부 기초과목들 중에서 주요하게 정리했던건 다음과 같은 것들이 있었다.
(참고로 아래 내용들을 5월 3일부터 5월 9일 사이의 짧은 기간에 정리하고 복습했던건 아니다. 5월 3일 코딩테스트 합격 발표 이전부터 주요 키워드들을 정리해두었고 5월 14일 1차 대면 인터뷰 직전까지 계속해서 각 키워드에 대한 개념을 정리한 것을 아래에 나열하였다.)

  1. Data Structure & Algorithm
    사실 면접 관련해서 제일 공들여서 대비해야하는 것이 바로 자료구조와 알고리즘 부분인 것 같다. 우선 전체 면접 질문들 중에 차지하는 비중이 가장 컸다. 나는 2년이 조금 넘는 내 경력에서 Python만 주구장창 사용하였는데 마침 “Data Structure & Algorithms in Python”이라는 PDF 버전의 영문판 책을 인터넷에서 구하게 되어서 도움을 많이 받았다. 이 책 인터넷에 제목 검색하면 PDF 파일이 바로 나온다(링크). 영어이긴 하지만 내용이 좋아서 혹시 책이 필요한 분들에겐 강추한다. 내 기억에 학부 시절에 봤던 교과서는 같은 책의 C++ 버전이었던 것 같다.
    이 과목에서는 중요하게 다뤘던 sorting, binary search tree, hash, sortest path finding (graph) 등에 대해서 복습하였다. Linked list나 stack, queue 개념은 너무 기본적인 거라 대충 훑어만 보았다.

    • Sorting에서는 면접에 자주 나오기로 악명 높은 merge-sort, quick-sort 이 둘을 직접 구현도 해보면서 익숙해지기 위해 노력하였다. O(N^2) 시간복잡도의 기본적인 sorting 알고리즘들도 한번정도는 더 훑어보았다.
    • Binary search tree는 알고리즘 문제 풀이 사이트에서 자주 접했기 때문에 여전히 친숙하였으나 balancing 관련한 것들과 몇 가지 구두로 답변해야될 수도 있는 특성들에 대해서 복습하였다. RB-tree의 구현체와 같이 balancing tree의 직접적인 구현 및 상세 특성들에 대해서는 안 봤다.. 아시다시피 짧은 기간 내에 다시 본들 공부 대비 답변 효율이 좋은 것도 아니고 이건 물어보면 면접관이 (이 자료 구조를 다루는 업무를 보는게 아니라면) 좀 변태같다고 느껴질 수 있는거라..;;
    • Hash와 관련해서는 원격 인터뷰 후기에서도 언급할테지만 학부 시절 교수님이 늘 중요하다고 강조했던 것에 비하여 그 중요성을 간과하여 아쉬운 부분이 많았다. Hash는 비교적 간단하면서도 면접에서 항상 허를 찌를 수 있는 부분이 있다고 생각하기 때문에 꼼꼼히 그 특성에 대해서 공부해야한다. 물론, 업무에서도 자주 쓰이는 중요한 자료구조이기 때문에 더더욱 중요하다. Hash function의 구조, collision handling 등의 기본적인 부분에 주의해서 공부를 해야한다.
    • Shortest path finding 관련해서는 다익스트라 알고리즘이 유명하기 때문에 다시 복습하고 관련된 알고리즘 문제를 풀면서 구현을 해봤다. 사실 이 shortest path finding 분야도 공부 대비 질문 확률, 즉 가성비가 좋은 부분은 아니라 다익스트라 알고리즘 선에서 끝냈다. 다시 한 번 구현해 봤다는 것에 재미와 자부심을 느끼며.. ㅎㅎ
    • 그 외에는 heap, (2, 4) tree, B-tree, depth-first search, breadth-first search, 그리고 hash의 상위 개념인 associative array(map) 등에 대해서 복습하였다.
  2. Operating System & Computer System
    OS 과목은 학부 시절 최애 과목이었기 때문에 자신이 있었지만, 역시나 내 기억 속에는 오랜 세월의 흔적이 남아있었다. 주로 도움을 받은 책은 한빛아카데미에서 나온 책 “쉽게 배우는 운영체제”(링크)과 너무나도 유명한 OS계의 교과서 공룡책 “Operating System Concepts”(링크)이 있다. 한빛아카데미에서 나온 책은 쉽게 쓰여있어서 읽기 좋아서 구입할만하다고 생각한다. 그리고 공룡책은 인터넷에 검색하면 영문판 PDF 파일들이 널려있기 때문에 이를 참고해도 되고, 전공자 혹은 컴퓨터를 업으로 삼는 사람이라면 기념으로 한 권 정도는 사두는 것도 좋다고 생각한다.
    다만, OS 파트는 열심히 복습하였지만!!! 면접 질문으로는 나오지 않았다 ^^;;

    • OS의 정의와 역할부터 시작해서 다시 봤다. 커널의 의미, 역할, 구조 그리고 syscall에 대해서 찾아보고 폰노이만 구조로 대변되는 컴퓨터의 기본 구조와 인터럽트의 개념에 대해서 정리하였다.
    • 프로세스와 프로세스 스케줄링 알고리즘들을 무엇보다 흥미롭게 복습하였다. 이 파트가 OS 파트의 꽃 중에 하나랄까..? 우선 프로세스의 정의, 프로세스의 상태 정의, PCB(Process Control Block)의 역할 및 구성, Context Switching, Thread와의 비교 등 프로세스의 기본 적인 내용들을 복습하였다. 그 후에 책에 나오는 각종 프로세스 스케줄링 알고리즘들의 각 특성들을 정리하였다. OS 관련한 면접 질문이 나온다면 프로세스와 관련하여 나올 가능성이 가장 크다고 생각하기 때문에 (제일 물어볼만한 내용들이 많다) 확실히 공부해두는 것이 좋다고 생각한다. 특히 프로세스 스케줄링 알고리즘들은 물어보기 너무 좋은 내용이 아닌가 싶다.
    • Deadlock 또한 주변에서 듣기로 면접 단골 질문 중 하나라고 알고있다. Deadlock 뿐만 아니라 멀티스레딩 프로그래밍의 중요한 포인트에 대해서 “게임 서버 프로그래밍 교과서”(링크)라는 책을 통해 많이 얻어갔다. 게임 서버를 구현하면서 중요한 개념들을 설명하는 책인데, 게임 서버 구현이 아니라 그냥 프로그래밍 공부를 위해서도 읽을만한 책이라 추천한다.
    • 세 가지 캐시 교체 알고리즘에 대해서 복습하였다. 캐시라는 개념은 응용소프트웨어 레벨에서도 프로그래밍 기법으로도 많이 사용되고 그러므로 딱 물어보기 좋기 때문에 LRU, FIFO, LFU로 대표되는 캐시 교체 알고리즘의 의미에 대해서 정리하였다.
    • 그 외에 메모리 관리 기법, 스토리지 관리 기법 등등에 대해서도 복습을 하려했지만,,, 시간 관계상 다 하지 못 하였다. 나중에 시간이 될 때, 페이징, RAID 등 이번에 다루지 못한 OS 및 컴퓨터 시스템 주요 개념들에 대해서 공부를 할 계획이다. 어쩌면 다음 이직 때..?
  3. OOP
    OOP 개념 및 특징은 면접 단골 질문이라 배제할 수 없었다. 그러나 내 면접에선 질문으로 등장하지 않았다.
    SOLID로 유명한 OOP 설계의 다섯 가지 기본 원칙 그리고 Capsulation, Inheritance, Polymorphism, Dynamic Binding 등으로 나타나는 OOP의 기본 특징들에 대해서 복습하였다. 그냥 혹시나 몰라서 다시 한 번 봤다.

  4. Database
    Database는 상대적으로 CS 코어 과목에서 우선순위가 낮아서 제대로 공부하지 못했다. 그래도 ‘혹시 모르니’ 하는 마음으로 RDBMS의 Primary key, Foreign key, Unique key 각각의 개념, ACID로 대표되는 트랜잭션 보장을 위한 중요한 특성들, 그리고 기본적인 NoSQL DBMS들의 특징들에 대해서 정리하였다.

  5. 그 외
    요즘 개발 업계의 트랜디한 용어들(machine learning, microservices architecture, graph API 등)에 대한 내용, 네트워크 프로토콜 종류 및 특징, sync vs. async 프로그래밍, functional programming의 특성 등등등 여러가지 생각나는대로 검색하고 문서에 정리하였다.

그 다음으로, 나는 경력자로 지원한 것이었기 때문에 (검색분야는 처음이긴 하지만..) 당연히 내 경력 상의 경험들에 대해서 기술적인 질문들이 들어올 것을 대비하기 위해서, 제출한 프로젝트 기술서 내용 가운데 설명해야할만한 기술적인 부분들을 정리한 문서를 작성하였다. 내용이 궁금하다면 링크를 따라가시길 :~)

지나고보니 뭔가 많이 준비하긴 했구나 싶은데 막상 준비할 때는 모든 것이 부족해보였다. 준비하지 않음으로 인한 불합격이 두려워서 이것저것 찾고 정리하고 공부했던 것들이 나를 채용 과정 합격으로도 이끌었지만, 이 과정들이 한편으로는 내 커리어에 있어서 기초적인 내실을 한 번 다지고 가는 좋은 기회였다. :)

공유하기