개발자 면접 완전 정복하기 (1) - 코딩 테스트 편

개발자 면접 완전 정복하기 (1) - 코딩 테스트 편

일자

상시
유형
아티클
태그
이 아티클은 <나만 알고 싶은 개발자 취업 치트키> 시리즈의 3화입니다.


처음 이직 시도를 했을 때가 떠오릅니다. 별 근거도 없이 자신만만하던 4년 차 때, 평소 실력만 믿고 당당하게 기술 면접에 뛰어들었죠. 면접은 생각보다 훨씬 어려웠고, 결과는 처참했습니다. 식은땀을 삐질삐질 흘리며 겨우 첫 라이브 코딩 테스트를 마쳤던 기억은 쉽사리 잊히지 않습니다. 그렇게 직접 부딪혀 보고 나서야 깨달았어요. 기술 면접은 평소 실력만으로는 무리라는 것을.

개발자의 면접은 철저한 준비가 필요한 영역입니다. 1시간 안에 실력을 증명해야 하는 면접은 평상시 업무 방식과는 다를 수밖에 없습니다. 따라서 아무리 평소 실력이 뛰어난 개발자라도 기술 면접에 대비하기 위해서는 별도의 준비가 필요합니다. 어디서부터 어떻게 준비할지 막막한 분들을 위해 앞으로 세 편에 걸쳐 개발자 면접을 준비하는 방법을 상세히 공유할 예정입니다. 이번 1편에서는 개발자 면접 유형 다섯 가지를 살펴보고, 그중 가장 흔한 유형인 코딩 테스트에 대비하는 공부법을 공유합니다.

ⓒ 셔터스톡


개발자 면접 유형 총정리

면접을 준비하기에 앞서 어떤 방식으로 면접이 진행되는지 알아야겠죠. 개발자에게 출제되는 면접 유형에는 크게 다섯 가지가 있습니다.


1. 코딩 테스트

코딩 테스트는 지원자의 코딩 실력을 확인하기 위한 시험입니다. 실시간으로 면접관이 지켜보는 라이브 코딩 테스트와 면접관 없이 진행되는 온라인 코딩 테스트가 있습니다.


라이브 코딩 테스트
‘라이브’ 코딩이라는 이름답게 면접관과 영상 통화를 하며 실시간으로 면접관이 내는 문제를 코드로 구현하는 방식입니다. 보통 45분~1시간 정도의 시간제한이 있습니다. 하지만 자기소개를 하거나 직무에 관한 질문을 하는 데 5~10분 정도의 시간이 소요되기 때문에, 그 점을 감안하고 시간 계산을 해서 문제를 푸는 것이 좋습니다. 이 시간에는 주로 단시간 안에 풀 수 있는 알고리즘 문제가 출제됩니다.


온라인 코딩 테스트
이 유형은 라이브 코딩 테스트와 비슷하나 면접관이 지켜보지 않는다는 차이가 있습니다. 원하는 시간에 코딩 테스트를 볼 수 있는 링크가 제공되며, 링크에 접속해 시작 버튼을 누르면 제한 시간(보통 1~2시간) 카운팅이 시작됩니다. 그 시간 안에 주어진 문제를 코드로 구현해야 하며, 만약 제한 시간 안에 다 풀지 못하면 그 상태로 시험이 제출됩니다. 라이브 코딩과 비슷한 난이도의 문제 또는 약간 더 복잡한 유형의 알고리즘 문제가 출제됩니다.

질문 예제: https://school.programmers.co.kr/learn/challenges?tab=all_challenges


2. 코딩 과제

코드로 구현해야 하는 기능 목록이 과제로 제시되고, 제한 기간(보통 일주일 정도) 안에 코드를 작성해서 보내면 면접관이 평가하는 방식입니다. 코딩 테스트에 비해 비교적 넉넉한 시간이 주어지지만, 그만큼 작성해야 할 코드도 많고 신경 써야 할 부분도 많죠. 보통 코딩 과제로는 알고리즘 문제보다는 실질적으로 현업에서 볼만한 문제가 출제됩니다.

질문 예제:
  • 은행 송금 API를 작성하세요.
  • 호텔 예약 시스템의 일부분을 구현하세요.

코딩 과제 연습 문제: https://school.programmers.co.kr/skill_check_assignments


3. 이론적 기술 면접

코딩 문제가 아닌 이론적인 기술 질문을 여러 개 묻고 답하는 방식입니다. 컴퓨터 공학 지식부터 특정 프로그래밍 언어 관련 지식까지 광범위한 분야에서 다양한 질문이 나옵니다. 상세한 질문은 지원 분야 및 각 회사의 기술 스택에 따라 다릅니다. 대표적으로는 프론트엔드 개발자 직군의 경우 Javascript, React, 브라우저 작동 방식 관련 질문이 출제되고, 백엔드 개발자 직군의 경우 Java, Spring, 객체지향 프로그래밍 관련 질문이 출제됩니다.

질문 예제:
  • 브라우저에 www.google.com을 치면 페이지가 로딩되기까지 어떤 과정을 거치나요?
  • 객체지향 개발의 5원칙(SOLID 원칙)에 대해 설명해 주세요.


4. 시스템 설계 면접

특정 프로덕트의 전체 시스템 또는 일부를 설계하는 면접입니다. 예를 들어 트위터를 설계하라는 문제가 나온다면, 어떤 방식으로 서비스를 나누고, 각 서비스에 어떤 데이터베이스를 사용할 것이며, 높은 사용자 트래픽은 어떻게 처리할지 등을 설명해야 합니다. 현실적으로 한 시간 안에 상세한 시스템 설계를 하기는 어려우므로, 질문을 통해 면접관이 원하는 것이 무엇인지 알아내어 전체 시스템을 넓고 얕게 훑거나 한 부분을 집중적으로 파면됩니다. 이 유형은 주니어 레벨보다는 시니어 레벨의 면접에서 주로 출제됩니다.

질문 예제:
  • 실시간 채팅 앱을 설계하세요.
  • 검색창의 자동 완성 기능을 설계하세요.


5. 인성 면접

지원자가 이 회사와 팀 문화에 잘 맞는지 평가하는 면접입니다. 지원자의 성향을 파악하기 위한 질문이 다양하게 출제됩니다. 실제 경험에 기반한 질문을 묻기도 하고, 있을 법한 상황을 가정하는 질문을 묻기도 합니다. 일반적으로 이 면접에서 기술적인 문제가 나오지는 않습니다.

질문 예제:
  • 동료와 의견이 달랐던 적이 있다면 그 의견 차이를 어떻게 해결했는지 설명해 주세요. (경험 기반)
  • 만약 동료가 팀원들의 공을 가로채서 상사에게 잘 보이려고 한다면 어떻게 할 것인가요? (상황 가정)


개발자 면접은 길고 어렵습니다. 하지만 그렇다고 지레 겁먹을 필요는 없어요. 준비만 잘하면 누구나 좋은 결과를 볼 수 있습니다. 처음 이직 시도를 했을 때 면접에서 장렬히 전사했던 제가 얼마 전 세 번째 이직에 성공한 것이 그 증거입니다. ‘지피지기면 백전불태’라는 말처럼, 적을 알고 나를 알면 백번 싸워도 위태롭지 않습니다. 여기서 우리의 적은 면접입니다. 위태롭지 않게 면접에서 승리하기 위해서 우리는 준비해야 합니다. 앞으로의 글을 따라 함께 준비해 보아요!

ⓒ 셔터스톡


코딩 테스트 4단계 공부법

코딩 테스트는 개발자 면접의 꽃입니다. 기술 면접에서 가장 흔하게 볼 수 있는 방식이지만, 동시에 가장 어려운 방식이기도 하죠. 코딩 테스트에 나오는 알고리즘 문제는 그냥 혼자서 풀기도 힘든데, 짧은 제한 시간 내에 풀어야 한다는 압박까지 더해지니 어려울 수밖에요. 특히 라이브 코딩 테스트의 경우 면접관이 지켜보고 있다는 부담감 때문에 더 힘겹게 느껴집니다. 그러나 앞서 말씀드렸다시피, 준비만 잘하시면 이렇게 어려운 코딩 테스트에서도 좋은 결과를 보실 수 있습니다! 

코딩 테스트를 준비하는 방법을 4단계로 나누어 소개드립니다.

1단계: 자료구조 및 알고리즘 개념 공부하기

코딩 테스트에 제대로 대비하기 위해서는 연습 문제를 풀기에 앞서 이론을 탄탄히 다지는 단계가 필요합니다. 이론을 공부하지 않고 닥치는 대로 연습 문제만 푸는 것은 부실한 토지에 건물을 올리는 것과 같습니다. 건물을 높게 쌓을수록 토지의 부실함이 드러나 모든 게 무너지겠죠. 반면에 이론이라는 토지를 탄탄히 다져놓으면 그 위에 어떤 높은 건물을 쌓아도 든든히 버텨줄 것입니다.

코딩 테스트에서는 보통 단시간 안에 풀 수 있는 알고리즘 문제가 출제되는데요, 이런 유형의 문제를 풀기 위해서는 기본 자료구조 및 자주 사용되는 알고리즘 개념을 알아두어야 합니다. 수많은 자료구조와 알고리즘 개념 중 반드시 공부해야 하는 주제 몇 가지를 선정해 보았습니다.


자료구조
  • 배열 (Array)
  • 해시 테이블 (Hash Table)
  • 연결 리스트 (Linked List)
  • 스택 (Stack)
  • 큐 (Queue)
  • 힙 (Heap)
  • 트리 & 그래프 (Tree & Graph)


알고리즘
  • 이진 탐색 (Binary Search)
  • 정렬 (Sorting)
  • 재귀 (Recursion)
  • 너비 우선 탐색 (BFS)
  • 깊이 우선 탐색 (DFS)
  • 백트래킹 (Backtracking)
  • 동적 계획법 (Dynamic Programming)

각 주제에 관한 설명은 수많은 책, 블로그, 영상 강의에 자세히 나와 있으니 각자 잘 맞는 방식을 선택해서 공부하시면 됩니다. 참고로 제가 자료구조와 알고리즘에 관해 공부할 때 개인적으로 많은 도움을 받았던 건 HackerRank의 유튜브 채널(영문)이었습니다. 이 채널에서는 코딩 면접의 바이블이라 불리는 <코딩 인터뷰 완전정복(원제: Cracking the Coding Interview)>의 저자 Gayle Laakmann McDowell이 직접 자료구조에 대한 설명을 해줍니다. 더불어 어떤 알고리즘 문제를 풀 때 해당 자료구조를 쓰면 좋은지 실질적인 예제를 통해 보여주기 때문에, 실제 문제를 풀 때 참고하기 좋습니다. (자료구조 영상 / 알고리즘 영상)


2단계: 빅오 표기법 마스터하기

알고리즘 문제를 푸는 방식은 딱 한 가지로 정해져 있지 않습니다. 하나의 문제도 여러 방식으로 풀 수 있기 때문에 어느 한 가지 방식만이 정답이라고 할 수는 없습니다. 답이 여러 개 있는 셈이죠. 그러나 더 효율적인 답을 가려낼 수는 있습니다. 일반적으로는 더 짧은 시간 안에(시간 복잡도), 더 적은 메모리를 사용하면서(공간 복잡도) 문제를 해결하는 코드가 더 효율적인 답입니다.

이러한 시간 및 공간 복잡도를 나타내는 대표적인 방법이 빅오 표기법(Big-O Notation)입니다. 개발자는 본인이 구현한 코드를 빅오 표기법을 이용해 분석할 수 있어야 합니다. 라이브 코딩 테스트 때 면접관이 “이 코드의 시간 복잡도는 어떻게 되나요?”라는 질문을 하면 막힘없이 대답할 수 있어야 하며, 시간 복잡도와 공간 복잡도의 거래 관계(trade-off)를 이해해야 합니다. 아직 이게 익숙지 않다면 충분한 연습을 통해 빅오 표기법을 마스터하시기 바랍니다.

참고 자료:


3단계: 알고리즘 문제 풀어보기

기본 자료구조와 자주 쓰이는 알고리즘, 빅오 표기법까지 공부했다면 이제 알고리즘 문제를 풀어볼 차례입니다. 코딩 테스트는 문제만 많이 풀어보면 된다고 생각하시는 분들이 많습니다. 그런데 어느 문제를, 무슨 프로그래밍 언어를 사용해서, 어떤 순서로 풀어야 할까요? 본격적으로 문제를 풀기 전에 아래 세 가지를 정하고 시작하시길 권장드립니다.


1. 프로그래밍 언어 선택하기
면접을 볼 프로그래밍 언어는 본인에게 가장 편하고 익숙한 언어로 선택하시는 게 좋습니다. 우리가 영어를 쓸 때보다 한국어를 쓸 때 더 수월하게 말이 나오듯이, 모국어처럼 편하게 느껴지는 프로그래밍 언어를 사용해야 긴장되는 면접 환경에서도 버벅거리지 않고 코드를 쓸 수 있습니다. 회사마다 사용하는 프로그래밍 언어가 다 다르기는 하지만, 회사에서 지원자가 선택하는 언어로 면접을 보도록 배려해주는 경우가 많습니다. 보통 지원자들이 면접용으로 많이 선택하는 언어로는 Java, Javascript, Python이 있습니다.


2. 알고리즘 기출문제 플랫폼 정하기
국내외 다양한 사이트에서 코딩 테스트에 나올만한 알고리즘 기출문제를 무료로 제공합니다. 이 중에서 자신에게 맞는 플랫폼을 정해서 거기에 나오는 기출문제를 풀어보면 됩니다. 대표적으로 많이 쓰이는 알고리즘 기출문제 플랫폼은 아래와 같습니다.

국내:   

해외:   

각 기출문제 플랫폼 비교: https://lxxyeon.tistory.com/80


3. 스터디 플랜 세우기
프로그래밍 언어도 정하고 기출문제 플랫폼도 정했으니, 이제 문제를 닥치는 대로 풀면 되겠다고 생각하실 수도 있습니다. 하지만 제 경험상 계획 없이 아무 문제나 푸는 것보다는 스터디 플랜을 세웠을 때 훨씬 효과적으로 공부할 수 있었습니다. 아무리 문제를 많이 푼다고 해도 정작 풀었던 내용이 머리에 남지 않으면 무슨 소용일까요? 효과적인 공부를 위해서는 스터디 플랜을 세우는 것이 좋습니다.

가장 추천드리는 방식은 각 주제별로 몇 개의 문제를 풀고, 그 주제를 완전히 이해하고 나서 다음 주제로 넘어가는 것입니다. 1단계에서 공부했던 자료구조와 알고리즘 개념을 이번에는 문제를 직접 풀어보며 이해해보는 겁니다. 같은 주제의 문제를 여러 개 모아 보면 이 문제들의 패턴이 보입니다. 그리고 처음에는 어렵던 문제도 비슷한 유형을 여러 번 풀다 보면 어떻게 풀어야 할지 감이 잡힙니다. 문제의 패턴을 인식하고, 그 문제를 푸는 방식을 이해하는 게 이 방식의 키포인트입니다. 주제별로 최소 5문제는 풀어봐야 제대로 감을 잡을 수 있습니다. 준비 기간이 짧은 편이라면 비교적 자신 있는 주제는 문제량을 줄이고, 다른 주제에 좀 더 집중하는 방식으로 시간을 절약할 수도 있습니다.


4단계: 결과 분석하기

학창 시절에 모의고사를 보고 나면 오답 노트를 작성했던 것 기억나시나요? 모의고사를 푸는 것도 중요하지만, 틀린 문제가 있다면 왜 틀렸는지 분석하는 게 더 중요합니다. 그래야 실제 시험을 볼 때 같은 문제를 또 틀리지 않으니까요. 비슷한 이유로 알고리즘 문제를 풀고 나면 그 결과를 반드시 분석해야 합니다. 그냥 풀고 나면 끝이라고 생각하고 넘어가기보다는, 결과를 면밀히 분석해 보고 어떻게 하면 다음번에 더 잘 풀 수 있을지 고민해 봐야 내 것이 됩니다. 그렇게 내 것으로 만들어야 면접에서도 써먹을 수 있습니다. 결국 우리가 이렇게 힘들게 알고리즘 문제를 푸는 목적은 면접에 대비하기 위해서잖아요.

알고리즘 문제의 답을 분석하는 방법은 크게 세 가지가 있습니다.

1. 빅오 표기법으로 시간 및 공간 복잡도 분석하기
모의고사와 다르게 알고리즘 문제에는 한 가지 정답은 없습니다. 코드가 잘 돌아가면 (문제에서 주어진 테스트를 다 통과하면) 그게 하나의 답이 됩니다. 하지만 더 효율적인 답은 있다고 말씀드렸죠. 면접에서는 이 효율적인 답을 찾는 것이 가장 이상적입니다. 자신의 답이 효율적인지 체크하기 위해서는 2단계에 나왔던 빅오 표기법을 이용해 시간 및 공간 복잡도를 분석해 봐야 합니다.


2. 다른 사람의 답과 비교해 보기
여러분이 이 문제를 충분히 잘 풀었을 수도 있지만, 더 나은 답이 있지는 않은지 찾아보는 게 좋습니다. 다른 사람이 여러분이 생각지도 못한 방법으로 훨씬 효율적인 코드를 썼을 수도 있잖아요. 그렇다고 해서 ‘나는 왜 이렇게 못 풀었을까’ 하고 좌절할 필요는 없습니다. 이걸 보고 배워서 실제 면접에서 잘 보면 되니까요. 대부분의 기출문제 플랫폼에서는 다른 사용자의 답안을 공개하며, 가장 많은 추천을 받은 답안을 상위에 배치합니다. 이 기능을 활용해서 다른 좋은 답안이 있는지 찾아보고 참고하세요.


3. 문제 푸는 데 걸린 시간 재보기
코딩 테스트에는 제한 시간이 있습니다. 그런데 혼자 알고리즘 문제를 풀 때는 시간 상관없이 문제를 푸는 것에만 집중하는 분들이 많습니다. 혼자서 연습할 때 두 시간이 걸려서 푼 문제를 갑자기 면접 때 한 시간 안에 풀 수 있을까요? 면접 시간은 정해져 있고, 아무리 대단한 코드를 쓰더라도 그 시간 안에 다 보여줄 수 없다면 무용지물입니다. 코딩 테스트의 제한 시간에 익숙해지기 위해서는 혼자서 문제를 풀 때도 시간을 재면서 푸는 것이 좋습니다.

ⓒ 셔터스톡


여기까지 코딩 테스트 공부법을 4단계로 나누어 보았습니다. 이 방법은 제가 여러 번 시행착오를 겪으며 터득한 공부법입니다. 이걸 잘 활용하신다면 어려운 코딩 테스트에도 충분히 대비가 되실 것이라 생각합니다. 단언컨대, 코딩 테스트를 처음부터 잘 보는 사람은 없다고 확신합니다. 여러분이 어렵다고 생각하신다면 다른 사람들도 어렵게 느꼈다는 뜻이에요. 다들 연습을 통해 조금씩 나아지는 거죠. 그러니 어렵다고 너무 좌절하지 마시고 하나씩 연습해 보세요. 오늘 공유드린 4단계 공부법을 잘 활용하셔서 코딩 테스트에서 좋은 결과받으시길 바라겠습니다!



▶ <나만 알고 싶은 개발자 취업 치트키> 시리즈 보러 가기



글ㅣ엄지현
런던 Amazon에서 개발자로 일하는 대한영국 직장인. 끊임없이 배우며 함께 성장하는 삶을 지향합니다. 브런치에서 글을 통해 생각을 나눕니다. (https://brunch.co.kr/@jihyun-um)



발행일 2022.11.15