안녕하세요. [쿠키런: 오븐브레이크]의 서버 개발자 황재영입니다.
시간이 흐르면서 참 많은 것들이 바래는데요. 저희가 코딩 면접에 사용했던 문제들 또한 마찬가지였습니다. 코딩 면접 문제를 변경하려고 살펴보다 보니, 왜 우리는 코딩 면접을 진행하는 것인가? 라는 근본적인 질문에 대해 생각하게 되었습니다. 이를 위해 코딩 면접을 왜 진행하는지, 그 과정을 통해서 데브시스터즈는 지원자의 어떤 점을 알고 싶은 것인지에 대해 고민하고 논의하였습니다. 논의 이후 곰곰이 생각해보니, 위 질문에 대한 답은 데브시스터즈의 면접관뿐만 아니라, 데브시스터즈의 지원자에게도 유용한 정보가 될 것이라고 생각하였습니다.
본론에 들어가기에 앞서, 이 글은 데브시스터즈 서버 직군의 논의를 통해 작성되었음을 말씀드립니다. 서버 직군이 아닌 다른 개발 직군에서는 다른 면접 절차와 기조를 가지고 있을 수 있으며, 서버 직군 면접 중에서도 진행하는 포지션에 따라 코딩면접이 생략되는 등, 포지션과 지원자에 따라 다르게 적용될 수 있습니다. 이 글은 그러한 면접 지원자분들이, 특히 신입 서버 개발자 포지션으로 지원하시는 분들께서 이 글을 읽고 자신의 강점을 더 잘 어필하고 코딩 면접을 잘 진행할 수 있게 도움을 드리기 위해 작성하게 되었습니다
데브시스터즈 서버 직군의 면접 절차
데브시스터즈 서버 직군의 면접 절차는 일반적으로 아래와 같습니다.
1차 기술 면접에서는 지원자의 기술적인 역량을 확인합니다. 먼저 구술 면접으로 지원자에게 다양한 질문을 드리며, 각각의 기술에 대해 어떤 지식과 관점을 가지고 계신지 확인합니다. 구술 면접이 종료된 후에는 잠시 쉬는 시간을 가진 이후, 주어진 시간 동안 지원자가 문제를 푸는 코딩 면접 시간을 가집니다.
데브시스터즈 서버 직군이 코딩 면접을 통해 알고 싶은 것
데브시스터즈 서버 직군의 코딩 면접은 언어나 라이브러리, 프레임워크 사용에 제한이 없고 웹 검색도 자유롭게 허용합니다. 지원자의 역량을 최대로 펼칠 수 있는 환경에서 진행하는 것이 능력을 더 잘 확인할 수 있다고 생각하기 때문입니다. 그런 환경 속에서 저희가 코딩 면접을 통해 알고 싶은 것은 다음과 같습니다.
먼저 문제를 정의하고 풀어가는 과정입니다. 저희는 완벽한 결과물보다 문제를 풀어나가는 과정에 집중합니다. 문제 풀이 과정의 생각의 흐름과 작성했던 코드를 통해, 지원자에 대해 더 깊게 알 수 있다고 생각하기 때문입니다. 그래서 정답이 정해져 있는 문제가 아닌 사람에 따라 다양하게 생각하고 고민해볼 수 있는 문제들을 사용합니다. 또한 지원자가 문제를 푸는 과정은 면접관들에게 화면 공유되어 전달됩니다. 이렇게 면접관은 지원자가 어떤 고민을 거쳐 해답에 도달하는지를 확인합니다. 이 일련의 과정은 간단하지 않지만, 정답만을 확인하는 것이 아닌 문제 해결에 대한 고민과 난관을 해결하는 모습을 알고자 노력하고 있습니다.
다음은 코드를 이해하고 개선해나가는 과정입니다. 데브시스터즈에서는 코딩 면접 결과물을 제출한 이후, 면접관과 이야기하는 시간을 가집니다. 이 시간 동안 지원자는 작성한 코드에 관해서 설명하고 개선할 수 있는 점 또는 코드의 한계 등에 대해서 자유롭게 이야기 할 수 있습니다. 단순히 지금의 문제만 해결하는 코드가 아니라 코드를 작성하고, 소통하고, 정확히 이해하고 유지 보수하는 것 또한 개발자의 중요한 역량이라고 생각합니다. 그렇기에 이러한 과정에서 지원자가 하는 말과 생각은 단순한 구술 면접에서는 볼 수 없고 코딩 면접에서만 볼 수 있는 중요한 요소입니다. 다만 이 시간은 면접 과정 중 시간이 부족하다거나 코드의 퀄리티가 뛰어나면 생략하는 때도 있으니 면접 과정 중 오해하지 않아 주셨으면 합니다.
위 내용이 글 만으로는 잘 와닿지 않을 수 있을 것 같아 다음으로는 과거에 실제로 사용했던 문제들을 예시로 함께 살펴보겠습니다.
데브시스터즈 서버 직군의 코딩 면접 문제
문제1. 멀티 스레드 그랩
용감한 쿠키는 평소 사용하는 파일 내 문자열 검색 툴 grep보다 더 빠른 속도를 자랑하는 ack나 ag같은 다양한 툴들이 있다는 것을 들었다.
자신만의 dgrep을 만들어 널리 세상을 이롭게 하고 싶다고 생각하게 된 용감한 쿠키는 그 첫 단계로 멀티스레드로 동작하는 grep을 직접 만들어보기로 결심하였다.
원하는 스펙에 맞는 파일 내 문자열 검색 툴을 만들어보자.
입력 형식
- dgrep {keyword} {relative path}
출력 형식
- 파일의 각 line에 keyword가 있는 경우, 해당 파일과 줄 번호를 출력한다.
조건
1. relative path가 디렉토리인 경우 디렉토리 내 모든 파일에 대해 검사를 진행한다.
2. relative path 내에 또 다른 디렉토리가 존재하는 경우, 각 디렉토리 내 모든 파일에 대한 검사 또한 진행한다.
3. 멀티 스레드를 이용하여 최대한 빠르게 작업을 완료하도록 작성한다.
4. 동일한 파일에 대한 검사 결과는 한 번에 출력되어야 한다.
5. Directory 내 symlink는 없다고 가정한다.
6. 파일들은 모두 UTF8 인코딩으로 작성된 Text파일이라고 가정한다.
이 문제의 핵심 풀이 요소는 멀티 스레드를 이용하여 여러 개의 파일을 동시에 처리하는 것입니다.
이 문제를 통해 데 브시스터즈에서 보고 싶은 핵심 요소는 멀티 스레드라는 하나의 기술에 대해 이해하고 응용할 수 있는지 였습니다. 단순히 기술을 사용하여서 문제를 푸는 것이 아닌, 기술을 활용할 때의 장단점 및 유의해야 할 부분에 대해 이해하는지를 보고 싶었습니다. 특히 동시성 프로그래밍은 실제 대규모 서비스에서도 효율적인 처리를 위해 사용되는 중요한 기술 중 하나입니다. 그러나 멀티 스레드 프로그램은 단일 스레드 프로그램에 비해 예측하기 어려운 문제가 발생할 가능성이 높아 세심한 설계가 요구되고, 디버깅에도 깊은 통찰력이 필요합니다. 저희는 지원자에게 이러한 요소를 이해하고 대처하는 모습을 기대하였습니다.
정리하자면, 이 문제에 대해서 기대하는 건 완벽한 멀티 스레드 그랩을 구현하는 것이 아닙니다. 일단 단순한 그랩을 구현하는 것으로 시작하고, 구현한 그랩의 동작을 확인했다면 그다음 멀티 스레드를 적용하는 풀이 과정에 대해 살펴보고 싶었습니다. 정확한 멀티 스레드를 구현하는 것보다, 멀티 스레드를 어떻게 설계하고 발생할 수 있는 문제에 대해서 어떻게 생각하고 해결하는지를 보고 싶었던 문제였습니다.
문제2. 환상의 쿠키쇼
영화 ‘위대한 쇼맨’을 보고 크게 감동을 받은 치즈볼 새는, 쿠키들과 함께 공연을 준비하기로 마음을 먹었다.
매일매일 고된 연습을 강행한 끝에, 공연의 내용은 전부 완성되었고 세계 각국의 전문가들 앞에서 쇼케이스를 펼치게 된다.
결과는 대성공! 치즈볼 새는 자신의 동전 주머니가 가득찰 생각을 하며 행복감에 젖었다.
이윽고 치즈볼 새는 사람들에게 온라 인으로 티켓을 팔기 시작했는데,
예매 사이트를 이용하다보니 수수료를 떼이는 것이 불만인 치즈볼 새는 당신에게 예매 API 서버를 만들어달라고 의뢰를 했다.
치즈볼 새의 돈주머니가 가득찰 수 있게 도와주도록 하자.
공연을 만들고 고객이 예매를 하기까지의 흐름은 다음과 같다.
1. 공연을 서버에 등록한다.
2. 예매 시작 시간이 되면 사람들은 빈 좌석 목록을 보고,
3. 원하는 자리를 ‘찜'한다. 다른 사람이 예매했거나 찜한 자리는 찜할 수 없다.
4. 찜한 자리에 대해서 정해진 시간 내에 결제정보를 마저 등록하여 예매를 완료한다.
이 문제의 핵심 풀이 요소는 API 서버의 구현입니다. 임의의 서버 프레임워크를 통해서 API를 구현하고 비즈니스 로직을 구현해야 합니다.
이 문제를 푸는 과정에서 저희가 관찰하고자 하는 역량은 풀어야 할 요소를 정의하고 설계하는 부분입니다. 실제 서비스 개발에서는 입력과 출력이 정해져 있는 경우가 많지 않습니다. 대부분의 경우에는 이 문제처럼 해결해야 하는 상황만 존재합니다. 이러한 상황에서 명확하게 어떤 요구사항이 있는지를 구체적으로 정의하고, 이를 구현하기 위해 어떤 값들을 사용할지 설계하는 점이 실무와 비슷한 요소가 많은 문제입니다. 실무와 비슷한 문제인 만큼, 동시에 많은 요청이 들어오고 서버가 여러 대일 때도 문제없이 작동하는 등의 구조적인 설계도 고려해볼 수 있었습니다. 그러한 문제 상황을 정의하고 설계하여서 서버를 만드는 모습을 지원자에게 기대하였습니다.
이 문제 또한 완벽한 API 서버를 구현하는 것이 아닌, 서버를 설계하는 과정을 살펴보고 싶었습니다. 공연이나 좌석 등의 데이터를 어떤 형태 로 저장하는지, 동시적인 요청으로 발생할 수 있는 문제들을 예측하고 어떻게 방어하는지의 과정을 확인하고자 하였습니다
글을 마무리하며
데브시스터즈 면접에선 지원자의 완벽한 모습이 아닌, 지원자가 품은 수많은 가능성을 보는 것을 기대합니다 이 글이 지원자에게 와닿는 글이 되고, 코딩 면접에서 지원자의 역량을 최대한으로 확인할 수 있는 기회로 뻗어나갔으면 좋겠습니다. 긴 글 읽어주셔서 감사합니다.