코딩 테스트 준비하기

최근 여기저기 개발자 포지션에 지원을 하고 있습니다. 회사마다 다르지만 개발자는 온라인/오프라인으로 코딩 테스트를 보는 곳이 꽤 많습니다. 그 중 스타트업 어느 곳 에서는 면접을 보고 짝 프로그래밍(Pair Programming)으로 코딩 테스트를 진행하기도 했습니다. 아주 색다른 경험 ㅋㅋ. 이런 테스트는 회사 입장에서는 지원자가 개발 실력이 있는지, 코딩 습관은 어떤지 확인할 수 있는 방법이 되어 줍니다. 지원자 입장에서는 자신의 실력을 보여줄 수 있는 기회가 됩니다.

어느정도 규모가 되는 회사에서는 온라인 사이트를 통해 코딩 테스트를 진행하기도 합니다.
제가 온라인 코딩 테스트를 했던 곳은 Remoteinterview, 프로그래머스, Codility 이렇게 3군데 정도 인 것 같습니다. 보통 이런 온라인 테스트 서비스는 브라우저에 개발을 하고 테스트 케이스를 돌려보고 결과를 확인하는 식으로 진행됩니다.

문제 종류는 보통 퀴즈 형태로 변형된 알고리즘 문제들이 많았습니다. SQL 문제나 텍스트 처리 문제를 접한 적도 있습니다. 제가 일반적인 개발자 포지션으로 지원을 해서 그런 것인지 모르겠지만 특정 분야(소켓 통신, 웹, GUI 등)의 문제들은 아직 못 본 것 같네요. 특정 분야에 종속된 기술적인 문제들은 아마도 오프라인 인터뷰나 전화 인터뷰로 진행되지 않을까 싶습니다.

준비하기

테스트를 보기 적어도 2주 전에 준비를 시작하는게 좋습니다. 채용 프로세스가 빠른 곳이라면 서류 제출하고 다음주에 테스트를 보게 되는 경우도 있기 때문에 서류 제출 전에 스터디를 시작해야 합니다. 온라인 문제들은 어느정도 정형화 되어 있기 때문에 준비를 잘 해두면 충분히 통과할 수 있습니다.
코딩 테스트 자체가 처음이라면 여유 있게 한달 정도는 준비해야 하지 않을까 싶습니다. 학부 수준에서 배우는 알고리즘을 리뷰해보고 시험 제공 사이트 에서 연습을 해보는게 좋습니다.
준비 없이 맞닥뜨리면 당황하기 십상입니다. 저도 한 번은 별 생각없이 시험을 본 적이 있는데 첫 문제 보고 엄청 당황해서 시간을 낭비해 4문제 중에 1문제만 간신히 풀고 나머지는 깔짝거리다 시험 시간이 끝났던 경험이 있습니다. 휴가 중이었는데 호텔에서 컴터를 시간당 만원이나 하는 컴터를 빌려 울면서 시험을 봤었습니다. 당연히 탈락..ㅠ

우선 지원한 회사의 코딩 인터뷰에 대해 사전조사를 해봅시다. 어디에서 하는지, 온라인 이라면 그 사이트를 확인해봅시다. 한글로 하는지 영어로 하는지도 확인해야 합니다. 프로그래밍 언어는 어떤 걸 제공하는지도 체크합시다. 특정 언어를 요구하는 포지션이라면 그 언어로 하고 나머지의 경우에는 가장 자신 있는 언어로 하는게 좋을 것 같습니다.

연습/감각 익히기

보통 알고리즘 관련된 문제들이 많이 나오기 때문에 대표적인 알고리즘들 위주로 한 번 리뷰도 하고 실제로 코딩도 해보는게 좋습니다. 문제들은 조금 응용된 형태 되어 있습니다. Binary Search 를 구현하라. 이런 식으로는 안 나옵니다. 대신 이런 지문이 나오죠. 배열이 있고 오름차순으로 정렬되어 있다. 배열과 검색하려는 숫자를 입력하면 배열상의 위치를 표시하는 효율적인 알고리즘을 작성하라. 이런 식으로 나옵니다. 오름차순으로 정렬되어 있다 는 부분이 Binary Search를 암시하는 힌트 정도로 주어진달까요..그냥 맨 앞 부터 쭉 훑는 알고리즘도 가능합니다. 하지만 효율적인 이라는 말은 더 좋은 알고리즘을 작성하라는 얘기가 됩니다.

위의 사이트들 중 일부는 레슨 형태로 문제들을 공개해놓는 곳도 있습니다. 그 문제가 내가 테스트를 받을 때 실제로 나오리라는 보장은 없습니다만. 하지만 비슷한 유형이 나올 수 있고 연습을 통해 감각을 익혀두면 실전에서 훨씬 수월해집니다.

실전

일단 몇 시간 정도 시간이 걸리기 때문에 집중할 수 있는 장소가 필요합니다. 시간 내기가 어려우면 지원한 회사에 연락하여 시간을 조정해 달라고 요청합시다. 아래는 실전에서 신경써야 할 몇 가지 팁들 입니다.

  • 환경 준비하기 : 집중할 수 있는 장소를 고릅시다.
  • 될 만한 문제 부터 : 무조건 모든 문제를 풀어야 하는건 아닙니다. 5~10분 내에 답안이 안 떠오르면 다른 문제를 고릅시다.
  • 시간배분 : 시간이 오래 걸리는 문제들도 있을 겁니다. 텍스트 처리를 복잡하게 하는 문제라면 기본적으로 기계적인 코드가 많이 들어가게 될 거니까요. 그런 문제에 너무 시간을 들이는 것은 좋지 않습니다. 풀 수 있는 다른 문제를 포기하면 안됩니다.
  • 종이에 써보기 : 알고리즘 문제인데 풀이 방법이 잘 안 떠오른다면 진리표 라던가 종이에 직접 쓰고 그려가며 답안을 찾아보는게 도움이 됩니다. 화면에서 봤을 때는 규칙성이 잘 안보이는 종이에 쓰다 보면 패턴이 영감으로 떠오르기도 합니다.
  • 정리하기 : 그냥 문제를 다 풀었다고 끝이 아닙니다. 깔끔한 코드로 깔끔한 인상을 남깁시다. 변수명/메서드명/클래스명 등을 정리해주고 불필요한 코드가 있다면 삭제해줍시다. 입력 에러를 체크해주는 방어적인 코딩은 보다 세심하게 보일 수 있기 때문에 권장됩니다.
  • 주석 : 변수명/메서드명 등에 주석을 간략히 달아줍니다. 중요한 부분에도 주석을 달아줍니다. 나중에 인터뷰어가 코드를 확인하는 경우도 있기 때문에 보기 편하게 만들어 주는게 좋습니다.
  • 안티 패턴에 주의 : 언어 마다 안티 패턴들이 있습니다. 객체 지향 언어라면 한 클래스에 너무 많은 것을 넣거나 인스턴스의 변수에 바로 접근하는 것, 예외로 제어하는 것 등이 있겠습니다. 좋은 패턴들은 사용하고 안티 패턴들은 안 쓰도록 주의합시다. 자바 라면 이펙티브 자바를 봐두는 것이 좋습니다.
  • 하나 이상의 솔루션이 떠오른다면 그것도 쓰자 : 문제를 풀다 보면 더 좋은 방법이 떠오르기도 합니다. 효율성/명료성 면에서 더 좋은 방법이 생각났다면 그걸로 답을 써주고 기존 것은 메서드로 빼내서 이런 방법도 있다고 써줍시다. 아까운 코드를 버리기보다는 하나 이상의 솔루션을 떠올릴 수 있는 개발자라는 인상을 줄 수 있을겁니다.
  • 로컬 IDE 사용하기 : 로컬에서 개발을 하고 올리는게 시간을 줄여줄 수 있습니다. 허용 된다면 활용합시다. 온라인 테스트 사이트 중에는 코드가 실행될 때 마다 버전 관리? 비슷하게 레코딩을 하는 곳도 있습니다(codility). 이렇게 되면 결과와는 관계 없이 코딩 되는 과정도 나타나기 때문에 IDE로 다 만들어서 올리면 조금 이상하지 않을까 싶습니다. 중간 중간 몇 번 정도는 로컬에서 개발된 코드를 올리며 진행했습니다.

감상

  • 채용 포지션에 맞는 기초적인 IT 상식 문제도 봐야 하지 않을까? Linux 를 많이 쓰는 곳이라면 쉘 사용법 정도는 객관식 문제로 풀어도 서로에게 좋을 것 같은데..네모 채우기 라던가..
  • 알고리즘 문제로 편향 : 알고리즘을 알아야 할 필요성은 있다고 생각하지만 SW가 발달함에 따라 알고리즘도 가져다 쓰는 경우가 더 많아졌다고 생각합니다. 어떤 포지션에 있는지에 따라 다르겠지만 직접 알고리즘을 구현할 일은 사실 잘 없는 것 같습니다. 알고리즘은 기본이고, 그것 보다는 좋은 디자인이 더 중요해진 시대라고 생각합니다. 알고리즘 이라는게 금방 풀수 있는 것도 아니라 문제 하나에 한 시간 가량 걸리기도 합니다. 3 ~ 4 문제라면 반나절 가량 초집중을 해야 하는 꽤 피곤한 일입니다. 특정 알고리즘에 관한 문제를 못 풀었다고 해당 직무에 disqualified라고 보는 것은 너무하다고 생각합니다. 대신 일반적인 애플리케이션 개발자라면 기본기에 가까운 문제들이 더 적당하다고 생각합니다. 대략 프로그래밍 언어 책의 연습문제 수준으로 Java 라면 컬렉션, 예외, 클래스/인터페이스 사용에 관한 것 등등..

참고할 만한 곳

시험 제공 사이트

  • Codility(영어) : 실제로 시험도 보고 강좌도 제공하는 곳입니다. 알고리즘 레슨 자료(Reading materials)도 pdf로 제공하며 꽤 읽을만 합니다. 강추!
  • 프로그래머스(한글) : 시험도 보고 강좌도 제공하고 모의고사? 처럼 자체 시험도 보는 곳입니다. 연습문제 설명이 종종 이상한 경우가 있기도 하지만 여러가지 언어를 지원하고 무엇보다도 한글이라는 점에서 추천드립니다!
  • tests4geeks : 객관식 문제들과 코딩 문제들이 함께 있음.
  • leetcode : 여긴 아예 회사별 인터뷰 준비 강좌가 있다. medium 블로그에서 알게 된 곳. 블로그에 따르면 꽤 어려운 문제들이 있는듯.

  • 코딩 인터뷰 완전 분석 : 엄청 두꺼운 책. 코딩 인터뷰에서 나올법한 문제들이 소개되어 있고 모든 문제에 상세한 해설이 되어 있습니다(그래서 겁나 두껍다). 약한 부분 위주로 공부하기 좋습니다.
  • Elements of Programming Interviews : Medium 에서 읽은 글에 소개되어 있던 책. 위의 책을 어느정도 보고 나서 이 책으로 옮겼다고. 이쪽이 더 어렵다고 하며 코딩 인터뷰에 실질적인 도움이 되었다고 합니다.

학습 사이트

이런 문제들에 익숙하지 않고 시간 여유가 있다면 MOOC 라고 하나..온라인 강좌를 제공하는 곳이 상당히 많다. 너무 많아서 뭘 봐야 할지 모를 정도인데 한 군데 정해서 파보는 것도 좋겠다..

  • 인프런(유료, 한글) : 알고리즘 강좌도 제공하고 있습니다. 그 외에 여러 실무 강좌도 있습니다.
  • Coursera
  • Codecademy
  • Freecodecamp : 아예 Coding Interview Prep (코딩 인터뷰 준비) 라는 커리큘럼이 있습니다;;
  • Khanacademy : 무료 MOOC로 유명한 칸 아케데미에도 알고리즘 강좌가 있습니다.
  • Udacity

블로그

기타

  • 알고리즘 잡스 : 코딩 테스트 코칭과 교육을 제공하는 곳. 역시 사교육 천국. 경험과 시간이 부족하다면 이쪽을 알아보는 것도 좋을 것 같습니다.

여러가지 잡소리

  • 다른 직업군에도 이런 식의 온라인 테스트가 많이 적용된 곳이 있을까?
  • 개발자라는 직업은 온라인으로 실력을 보여줄 수 있는 곳이 많다. 블로그를 하거나 github 등 오픈소스, stackoverflow 등 QnA 사이트, 각종 커뮤니티 활동 등등.. 시간이 된다면 하나 두개 정도는 꾸준히 하는게 장기적으로 좋을 것 같다.
  • 알고리즘이란 공학이나 수학의 영역에만 있다고 생각하지 않음. 실생활에도 알고리즘은 알게 모르게 많이 사용됨. 대표적으로 도서관에서 책을 찾는 것. 내가 찾는 책의 색인을 알고 있고 대략 서가의 중간 쯤에 있는 책의 색일을 보고 앞뒤로 움직이게 된다. 정확히 Binary Search라고 보기는 어렵지만 원리는 유사하다. 사실 우리가 하는 여러가지 지적 활동도 쪼개고 쪼개다 보면 기계적인 순서로 정의할 수 있고 그것을 기술해놓으면 알고리즘이 될 수 있다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다