효과적 면접을 위한 4단계 접근법
1. 문제 이해 및 설계 범위 확정
- 시스템 설계 면접을 볼 때는 아무 생각 없이 답을 내서는 좋은 점수를 받기 어렵다. 요구사항을 완전히 이해하지 않고 답을 내놓는 행위는 매우 부정적 신호다. 대신 깊이 생각하고 질문하여 요구사항과 가정들을 명확하게 정의해라.
시스템 설계 시 질문 리스트
- 구체적으로 어떤 기능들을 만들어야 하나?
- 제품 사용자 수는 얼마나 되나?
- 회사의 규모는 얼마나 빨리 커지리라 예상하나? 석 달, 여섯 달, 일년 뒤의 규모는 얼마가 되리라 예상하는가?
- 회사가 주로 사용하는 기술 스택은 무엇인가? 설계를 단순화하기 위해 활용할 수 있는 기존 서비스로는 어떤 것들이 있는가?
2. 개략적인 설계안 제시 및 동의 구하기
- 설계안에 대한 최초 청사진을 제시하고 면접관에게 의견 구하기
- 화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램 그리기. 클라이언트(Mobile/Web), API, 웹 서버, 데이터 저장소, 캐시, CDN, 메시지 큐 같은 것들이 포함될 수 있다.
- 이 설계안이 시스템 규모에 관계된 제약사항들을 만족하는지 개략적으로 계산하고 면접관에게 설명하기. 아울러, 이런 개략적 추정이 필요한지 면접관에게 미리 물어보기.
3. 상세 설계
- 이제 면접관과 해야 할 일은 설계 대상 컴포넌트 사이의 우선순위를 정하는 것이다. 대부분의 경우 면접관은 여러분이 특정 시스템 컴포넌트들의 세부사항을 깊이 있게 설명하는 것을 보기 원한다.
- 가령 출제된 문제가 단축 URL 생성기 설계일 경우에 면접관은 해당 해시 함수의 설계를 구체적으로 설명하는 것을 듣고 싶어할 것이다.
- 채팅 시스템에 관련된 설계라면, 어떻게 지연시간을 줄이고 사용자의 온/오프라인 상태를 표시할 것인지를 듣고자 할 것이다.
4. 마무리
마무리 단계에서 면접관은 설계 결과물에 관련된 몇 가지 후속 질문을 던질 수도 있고(follow-up questions) 스스로 추가 논의를 진행하도록 할 수도 있다.
- 면접관이 시스템 병목구간, 혹은 좀 더 개선 가능한 지점을 찾아내라 주문 할 수 있다. 거기다 대고 여러분의 설계가 완벽했다거나 개선할 부분이 없다는 답은 하지 말자. 개선할 점은 언제나 있기 마련이며 이러한 질문은 비판적 사고 능력과 좋은 인상을 남길 기회이다.
- 설계를 다시 한 번 요약해 주는 것도 도움이 될 수 있다. 여러 해결책을 제시한 경우에는 특히 중요하다. 긴 면접 세션이 끝난 뒤에 면접관의 기억을 환기시켜주는 효과가 있다.
- 오류가 발생하면 무슨 일이 생기는지(서버 오류, 네트워크 장애 등) 따져보면 흥미로울 것이다.
- 운영 이슈도 논의할 가치가 충분하다. 메트릭은 어떻게 수집하고 모니터링 할 것인가? 로그는? 시스템은 어떻게 배포해 나갈 것인가?
- 미래에 닥칠 규모 확장 요구에 어떻게 대처할 것인지도 흥미로운 주제다.
- 시간이 좀 남았다면, 필요하지만 다루지 못했던 세부적 개선사항들을 제안할 수 있다.
면접 세션에서 해야할 것
- 질문을 통해 확인하라. 스스로 내린 가정이 옳다 믿고 진행하지 말라.
- 문제의 요구사항을 이해하라.
- 정답이나 최선의 답안 같은 것은 없다는 점을 명심하라. 스타트업을 위한 설계안과 수백만 사용자들을 지원해야 하는 중견 기업을 위한 설계안이 같을리 없다. 요구사항을 정확하게 이해했는지 다시 확인하라.
- 면접관이 여러분의 사고 흐름을 이해할 수 있도록 하라. 면접관과 소통하라.
- 가능하다면 여러 해법을 함께 제시하라.
- 개략적 설계에 면접관이 동의하면, 각 컴포넌트의 세부사항을 설명하기 시작하라. 가장 중요한 컴포넌트 부터 진행하라.
- 면접관의 아이디어를 이끌어 내라. 좋은 면접관은 팀원처럼 협력한다.
- 포기하지 마라.
면접 세션에서 하지 말아야 할 것
- 전형적인 면접 문제들에도 대비하지 않은 상태에서 면접장에 가지 마라
- 요구사항이나 가정들을 분명히 하지 않은 상태에서 설계를 제시하지 말라.
- 처음부터 특정 컴포넌트의 세부사항을 너무 깊이 설명하지 말라. 개략적 설계를 마친 뒤에 세부사항으로 나아가라.
- 진행 중에 막혔다면, 힌트 청하기를 주저하지 말라.
- 소통을 주저하지 말라. 침묵 속에 설계를 진행하지 말라.
- 설계안을 내놓는 순간 면접이 끝난다고 생각하지 말라. 면접관이 끝났다고 말하기 전까지는 끝난 것이 아니다. 의견을 일찍, 그리고 자주 구하라.
시간 배분
1단계 : 문제 이해 및 설계 범위 확정: 3분~10분
2단계 : 개략적 설계안 제시 및 동의 구하기: 10분에서 15분
3단계 : 상세 설계: 10분에서 25분
4단계 : 마무리: 3분에서 5분
예시: 뉴스 피드 시스템
1. 문제 이해 및 설계 범위 확정
뉴스 피드를 설계한다고 했을 때 면접자는 아래와 같은 질문을 할 수 있다.
- 모바일 앱과 웹 앱 가운데 어느쪽을 지원해야 하는가, 혹은 둘 다 지원해야 하는가?
- 피드의 정렬 기준은 무엇인가?
- 최대 몇 명의 사용자와 친구를 맺을 수 있는?
- 사이트로 오는 트래픽 규모(DAU)
- 피드의 형태는 이미지나 비디오도 포함이 되는지, 아니면 단순 텍스트인지.
2. 개략적인 설계안 제시 및 동의 구하기
- 개략적으로 이 시스템 설계는 피드 발행, 피드 생성 두 개의 flow로 나눠서 생각할 수 있다.
- 피드 발행: 사용자가 포스트를 올리면 관련된 데이터가 캐시/데이터베이스에 기록되고, 해당 사용자의 친구 뉴스 피드에 뜨게 된다.
- 피드 생성: 어떤 사용자의 뉴스 피드는 해당 사용자 친구들의 포스트를 시간 역순으로 정렬하여 만든다.

3. 상세 설계
- 뉴스 피드 시스템의 개략적 설계를 마친 상황이라 한다면 이제 두 가지 Flow를 보다 깊이 설계해야 한다.

