brunch

You can make anything
by writing

C.S.Lewis

by 콩나물 석이 Oct 24. 2021

3. 테크니컬 인터뷰

테크니컬 인터뷰란 무엇인가?

테크니컬 인터뷰는 취직과 이직 단계에서 빠지지 않는 핵심 단계이다. 테크니컬 인터뷰는 지원자의 문제 해결 능력과 커뮤니케이션 능력을 판단하는 인터뷰로, 기술적인 문제를 주어진 시간에 푸는 인터뷰다. 보통 50분에 한 문제를 풀게 되며, 면접관에게 자신의 생각을 말로 설명하면서 풀게 된다. 고등학생 때 수학 시험 서술형 문항을 그 자리에서 받고, 선생님이 보는 앞에서 칠판에 풀이과정을 써 내려가며, 왜 이런 방향이라고 생각하는지 말로 설명하고, 때때로 선생님에게 힌트를 얻어가며 문제를 풀어나가는 그림을 그려보면 가장 비슷하다. 


코로나 이전에는 직접 대면으로 인터뷰를 하였지만, 요새는 Microsoft Teams나 Zoom으로 온라인 인터뷰로 진행되는 추세이다. 면접관에게 자신의 화면을 공유하면서 코드를 작성한다. 얼마큼 자신의 질문과 생각을 조리 있게 전달하는지, 면접관의 피드백에 맞추어 본인의 설루션을 개선해나가는지, 또 막막한 경우에 어떻게 문제를 해결해가는지 지원자의 능력을 종합적으로 판단하는 살 떨리는 시간이다. 인턴의 경우에 1-2회 테크니컬 인터뷰로 끝나기도 하지만, 풀타임의 경우 3-5번의 인터뷰를 하기 때문에 정신적, 체력적으로 모두 힘든 인터뷰 단계이다. 


구체적으로 지원자는 데이터 스트럭쳐와 알고리즘을 바탕으로 문제를 해결해나야 한다. 문제를 푸는 것도 중요하지만(못 풀면 붙기 힘들다고 봐야 한다), 문제를 풀어나가는 과정에서 어떤 식으로 인터뷰어와 소통하는지, 막혔을 때 어떤 식으로 문제를 해결해나가는 방법을 택하는지 등을 보는 인터뷰로 굉장히 스트레스받는 인터뷰라고 할 수 있다. 일단 기본적으로 문제를 모르면 식은땀 등에서 주룩 흐르기 시작하며, 잘 몰라서 막막하고 답답한 상황에 면접관과 대화를 통해 힌트도 얻고 문제도 해결하고, 본인의 솔루션을 옵티마이징까지 하는 고난의 시간으로 인터뷰를 여러 번 봐도 항상 긴장되는 시간이다. 


북미에서는 대개 Cracking the Code Interview (CTCI)와 Elements of Programming Interviews in Python이라는 책을 바이블로 삼으며 Leetcode라는 웹사이트에서 문제를 많이 풀며 연습하고, 친구들과 모의 인터뷰를 하면서, 모르는 문제는 유튜브 + 구글링으로 튜토리얼을 찾아보며 준비를 한다. 

두꺼워서 모니터 받침대로 딱인 CTCI

모르는 사람이 용감하다고, 나는 테크니컬 인터뷰라는 것의 존재도 모르고 별생각 없이 컴퓨터 공학 공부를 시작했다. 방대한 인터뷰 공부량과 면접의 압박감은 학교를 다니면서 가장 어려웠던 시기였다. 하지만 이도 초급, 중급, 고급 단계로 나눠서 차근차근 미리 준비한다면 덜 고통스럽게(그래도 지난하고 고통스럽긴 하지만) 정복 가능하다. 단계별 준비 방법은 아래와 같다.

  

테크니컬 인터뷰 준비 단계 Part 1

Data Structure를 배우지 않은 단계로, Stack, queue, tree, graph라는 것 자체를 모르는 레벨이다. 리트코드(LeetCode) 이지 레벨 문제도 외계어같이 느껴지는 단계이다. 이 단계의 가장 큰 목표는, 데이터 스트럭쳐 및 기본적인 알고리즘을 익히고, 리트코드 이지 문제를 다소 버벅거리더라도 푸는 단계가 되는 것이다. 총 소요 기간은 4개월 정도로 추정된다. 


초급단계가 제일 어렵고 좌절감을 많이 느끼는 단계이다. 이때, 포기하지 않고 4~6개월만 열심히 하면 어느 정도 궤도에 오르게 되고 그다음부터는 고통스럽긴 하나 덜 고통스러워진다. 고통을 감내하는 인내심이 는 건지, 실력이 는 건지는 잘 모르겠으나 모든 일은 항상 처음이 제일 힘든 법이다. 


우선, 데이터 스트럭쳐(자료구조)를 배우는 것이 최우선 과제이다. 재학생이라면 Data structure and algorithms (자료구조와 알고리즘) 수업을 최대한 빨리 수강하는 게 좋다. 컴공에서 가장 중요한 분야 중 하나이고, 어차피 맞을 매(?) 먼저 맞는 게 좋다. 학교 수업을 들을 환경이 안된다면 Coursera, Edx 등에서 데이터 스트럭처와 알고리즘 관련 수업을 찾아서 듣는다. 무료로 유수 대학 강의를 들을 수 있기 때문에, 본인이 제일 재밌어 보이는 학교의 강의로 선택해서 듣는다. 수업을 듣다가 어렵거나 잘 모르겠는 부분은 추가로 유튜브에 튜토리얼을 검색해 보거나 stackoverflow, 블로그 포스팅, 책 등으로 궁금증을 해소한다. 기본기가 탄탄해야 나중에 어려운 문제도 풀 수 있기 때문에, 대충 익히는 게 아니라 꼭! 진심을 다해 이해해야 한다.


Cracking the Coding Interview (CTCI)라는 컴공 생의 바이블 책을 구매해서 정독한다. 책이 상당히 두껍기 때문에 모니터 받침대로 딱이긴 하나, 정신 차리고 문제를 풀어야 한다. 책에 데이터 스트럭쳐 별로 간단한 정리가 있고 뒤이어 문제들이 수록되어 있다. 데이터 스트럭쳐 강의를 듣는 속도에 맞추어서 각 챕터를 정독하고, 문제를 홀수만 짝수만 (시간 많으면 전부다) 풀어본다. 굳이 IDE에서 할 필 요 없이 그냥 손으로 풀어봐도 무방하다. 어차피 현 단계에서는 문제들을 보고 푸는 원리를 익히는 시기이다. 사실 단계가 올라가더라도 sudo 수도 코드로 화이트보드 코딩을 하는 경우가 많기 때문에, syntax가 조금 어긋나더라도 너무 스트레스받을 필요 없다.


CTCI가 수학의 정석 같은 책이라면, Leetcode는 수학의 정석 문제풀이 편이다. 수학 익힘책과 같이, 문제들이 카테고리별로 잘 정리되어있다. 초급 자라면, 난이도 Easy 문제들에 도전한다. 리트코드는 테크니컬 문제들을 연습할 수 있는 웹사이트로 무료 버전과 프리미엄 버전이 있다. 몇 년 전까지만 해도 리트코드와 해커랭크가 양대산맥이었는데, 요새는 다양한 웹사이트들이 생긴 것 같다. 나는 리트코드만 사용했고, 군더더기 없이 깔끔하고 사용하기 편리해서 추천한다. 초급의 단계에선 리트코드 프리미엄을 결재할 단계는 아닌 것 같고, 무료 계정을 만든 뒤 리트코드에서 top interview question을 클릭 -> Tag를 본인이 타깃 하는 데이터 스트럭처 유형을 고르고 -> 그중에서 Easy && Acceptance Rate이 너무 낮지 않은 문제를 풀어본다. 

리트코드 사이트 캡처, 우측 상단 Tags를 클릭하면 토픽을 정할 수 있다

본인이 앞으로 문제를 풀 언어를 정하는 것이 좋다. 나는 Java를 선택했으나, Python을 추천한다. 파이선을 쓰면 자바로 몇 줄을 써야 하는걸 한 줄에 해결 가능하다고 하기 때문에, 다시 돌아간다면 Python을 선택할 것이다.


이렇게 반복해서 목표 수준, "데이터 스트럭쳐 및 기본적인 알고리즘을 익히고, 히트코드 이지 문제를 소화 가능하다"에 도달하면 다음 단계로 넘어간다. 


테크니컬 인터뷰 준비단계 Part2

Part2 에서는, Data structure를 배웠으나 완벽하게 체화된 상태는 아니고, 데이터 스트럭쳐들의 개념을 알고 니트 코트 이지 문제는 어느 정도 풀 수 있고 미디엄은 직접 풀지는 못하지만 해답을 보면 이해가 가능한 상태의 지원자에게 해당된다. 나는 이 단계에서 주로 인터뷰를 보았다. 경험상 인턴직은 중상급 정도만 돼도 합격하기에 무리가 없다. Amazon, Microsoft, Coursera, SAP, IBM 등에서 인터뷰를 보았고 합격을 받았다. 


학교에서 데이터 스트럭쳐와 알고리즘 수업을 들었으면 (UBC는 2학년 200 level 수업들) 이제 문제를 많이 풀어보고 유형을 익히는 단계이다. 아마 이 정도 시기에 첫 인턴십을 지원하고 인터뷰를 준비하는 시기가 될 텐데, 인턴십 지원 레쥬메를 여기저기 넣으면서 인터뷰 준비를 인텐시브 하게 공부하는 기간이라고 생각하면 될 듯하다. 리트코드를 본격적으로 때려잡는 시간이다. 대략 세 가지 방법이 있을 것 같다. 나는 두 번째 방법으로 했으나, 모두 좋은 옵션인 듯하다. 중요한 건 계속 하루에 2~3문제씩 꾸준히 풀어주기만 하면 어떻게 해도 상관없다.     


첫 번째 방법이다. CTCI의 챕터 순서대로 각 1주일간 공부한다. String 1 week, Array 1 week, Linked list 1 week, Tree 1 week.. 이런 식으로. 매일 리트코드에서 해당 데이터 스트럭쳐 관련 문제를 2~3개 풀고 이지 40% 미디엄 50% 하드 10% 정도의 비율로 푼다. 한 바퀴를 다 돌면, 다시 돌면서 이지-미디엄-하드 비율을 점차 미디엄-하드 위주로 변경하면서 계속 돌린다. 첫 번째 방법은 일주일에 한 타입의 데이터 스트럭쳐만 때리는 방법이라면, 2번 방법은 한주에 다양한 데이터 스트럭쳐를 본인의 중요 비중에 맞춰서 푸는 방법이다. 나는 나에게 제일 까다로운 스트럭쳐 위주로 공부했는데, 그래프와 트리, 링크드 리스트가 약한 편이어서 이를 중점적으로 공부했다. 대략 일주일에 트리/그래프 50% 링크드 리스트 20% 기타 30% 이런 식으로 풀었다. 중급 단계가 되면 어레이와 스트링, 스택과 큐는 금방 익숙해지기 때문에, 점차 트리/그래프 문제들로 수렴하게 된다. 처음 1달은 이지-미디엄 비중으로 풀다가 이후 2달, 3달 차에는 주로 미디엄-하드로 푼다. 단순하게 리트코드 인터뷰 최다 빈출 문제로 소팅 후 맨 위에서부터 하루에 2~3문제씩 푼다.      


인터뷰가 잡히기 시작했다면, 과감하게 히트코드 프리미엄을 결제해야 한다고 생각한다. 나는 해당 회사 최다 빈출 문제를 2주일 정도 집중적으로 풀고 인터뷰를 보러 들어갔다. 회사에 따라서 매번 랜덤 하게 문제가 나오기도 하고 (G사가 그렇다고 한다), F사의 경우에는 기출에서 많이 나오기로 유명하다. 어찌 됐든 인터뷰 직전에는 기존에 많이 나온 문제들을 봐 두는 게 도움이 되는 것 같다.


하루에 2~3문제 푸는 게 말이 쉽지, 정신적으로 정말 힘들다. 왜냐하면 모르는 문제들을 풀어야 됨 -> 머리를 쥐어뜯으며 풀어봄 -> 도저히 안 풀림 -> 에라 잇, 답을 봄 -> 디스커션 패널에 올라온 학생들은 3줄로 품(0_0 띠용) -> 난 재능이 없나 보다 하며 자괴감 -> 3번 반복 -> 좌절 이상태가 되기 때문이다. 좌절감이 극에 차오르면 문제를 푸는 대신 유튜브에 올라온 해설 영상을 봤다. 고맙게도, 리트코드 문제 제목을 검색하면 전 세계 누군가가 한 명쯤은 꼭 풀어서 영상을 올려놨다. 


개발자라면 항상 안고 가야 하는 테크니컬 인터뷰

테크니컬 인터뷰 준비는 정말 고단하고 지치고, 자존감이 떨어지기도 하고, 좌절감을 맛보는 시간이다. 하지만 디벨로퍼로서는 피할 수 없는 숙명이고, 너무 한 문제 한 문제에 흔들리지 말고 꾸준히 연습한다면 생각보다 덜 괴롭게 산을 넘을 수 있다. 개발자가 제일 많이 하는 테크닉: Divide and Conquer를 적용한다.  테크니컬 인터뷰 준비를 작은 단위로 나눠서 차근차근 경험치를 쌓아가길 추천한다. 

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari