본문 바로가기
System Design

[시스템 설계 면접 공략법] 효과적 면접을 위한 4단계 접근법

by 박성민 2021. 9. 29.

1단계) 문제 이해 및 설계 범위 확정

깊이 생각하고 질문하여 요구사항과 가정들을 분명히 해야합니다.

엔지니어가 가져야 할 가장 중요한 기술 중 하나는 올바른 질문을 하는 것, 적절한 가정을 하는 것, 그리고 시스템 구축에 필요한 정보를 모으는 것입니다.

질문을 던지면 면접관은 여러분이 질문에 대한 답을 바로 내놓거나, 아니면 여러분 스스로 어떤 가정을 하기를 주문할 것입니다. 후자의 경우에는 그 가정을 화이트보드나 종이에 적어두어야 합니다.

요구사항을 정확히 이해하는데 필요한 질문

  • 구체적으로 어떤 기능들을 만들어야 하나?
  • 제품 사용자 수는 얼마나 되나?
  • 회사의 규모는 얼마나 빨리 커지리라 예상하나? 석 달, 여섯 달, 일년 뒤의 규모는 얼마가 되리라 예상하는가?
  • 회사가 주로 사용하는 기술 스택(technology stack)은 무엇인가? 설계를 단순화하기 위해 활용할 수 있는 기존 서비스로는 어떤 것들이 있는가?

예제

뉴스 피드(news feed) 시스템을 설계하라는 요구를 받았다 해 봅니다.

지원자: 모바일 앱과 웹 앱 가운데 어느 쪽을 지원해야 하나요? 아니면 둘 다일까요?
면접관: 둘 다 지원해야 합니다.
지원자: 가장 중요한 기능은 무엇인가요?
면접관: 새로운 포스트(post)를 올리고, 다른 친구의 뉴스 피드를 볼 수 있도록 하는 기능입니다.
지원자: 이 뉴스 피드는 시간 역순으로 정렬되어야 하나요? 아니면 다른 특별한 정렬 기준이 있습니까? 제가 특별한 정렬 기준이 있느냐고 묻는 이유는, 피드에 올라갈 포스트마다 다른 가중치가 부여되어야 하는지 알고 싶어서 인데요. 가령 가까운 친구의 포스트가 사용자 그룹(user group)에 올라가는 포스트보다 더 중요하다거나.
면접관: 문제를 단순하게 만들기 위해, 일단 시간 역순으로 정렬된다고 가정합시다.
지원자: 한 사용자는 최대 몇 명의 사용자와 친구를 맺을 수 있나요?
면접관: 5000명입니다.
지원자: 사이트로 오는 트래픽 규모는 어느 정도입니까?
면접관: 일간 능동 사용자(daily active user, DAU)는 천만 명입니다.
지원자: 피드에 이미지나 비디오도 올라올 수 있나요? 아니면 포스트는 그저 텍스트입니까?
면접관: 이미지나 비디오 같은 미디어 파일도 포스트 할 수 있어야 합니다.

2단계) 개략적인 설계안 제시 및 동의 구하기

이번 단계에서 초점을 맞추어야 할 것은 개략적인 설계안을 제시하고 면접관의 동의를 얻는 것입니다. 이 과정은 면접관과 협력하며 진행하면 좋습니다.

  • 설계안에 대한 최초 청사진을 제시하고 의견을 구해야 합니다. 면접관을 마치 팀원인 것처럼 대해야 합니다. 훌륭한 면접관들은 지원자들과 대화하고 설계 과정에서 개입하기를 즐깁니다.
  • 화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그려야 합니다. 클라이언트(모바일/웹), API, 웹 서버, 데이터 저장소, 캐시, CDN, 메시지 큐 같은 것들이 포함될 수 있을 것입니다.
  • 이 최초 설계안이 시스템 규모에 관계된 제약사항들을 만족하는지를 개략적으로 계산해 봐야합니다. 계산 과정은 소리 내어 설명해야 합니다. 아울러, 이런 개략적 추정이 필요한지는 면접관에게 미리 물어보도록 합니다.

가능하다면 시스템의 구체적 사용 사례도 몇 가지 살펴보는 것이 좋습니다. 개략적 설계안을 잡아 나가는데 도움이 될 것입니다. 미처 고려하지 못한 에지 케이스(edge case)를 발견하는 데도 도움이 될 것입니다.

이 단계에서 API 엔드포인트(endpoint)나 데이터베이스 스키마도 보여야 하는지는 면접관의 의견을 물어봐야 합니다.

예제

개략적으로 보자면 이 설계는 두 가지 처리 플로(flow)로 나눠 생각해 볼 수 있습니다. 피드 발행(feed publishing)과 피드 생성(feed building)이 그것입니다.

  • 피드 발행: 사용자가 포스트를 올리면 관련된 데이터가 캐시/데이터베이스에 기록되고, 해당 사용자의 친구(friend) 뉴스 피드에 뜨게 됩니다.
  • 피드 생성: 어떤 사용자의 뉴스 피드는 해당 사용자 친구들의 포스트를 시간 역순으로(최신 포스트부터 오래된 포스트 순으로) 정렬하여 만듭니다.

개략적으로 그린 피드 출력과 피드 생성 플로 그림

1

3단계) 상세 설계

  • 시스템에서 전반적으로 달성해야 할 목표와 기능 범위 확인
  • 전체 설계의 개략적 청사진 마련
  • 해당 청사진에 대한 면접관의 의견 청취
  • 상세 설계에서 집중해야 할 영역들 확인

이제 면접관과 해야 할 일은 설계 대상 컴포넌트 사이의 우선순위를 정하는 것입니다. 대부분의 경우 면접관은 여러분이 특정 시스템 컴포넌트들의 세부사항을 깊이 있게 설명하는 것을 보길 원합니다.

면접 시에는 시간 관리에도 특별히 주의를 기울여야 합니다. 여러분은 면접관에게 긍정적 신호(signal)을 전달하는데 집중해야 합니다. 불필요한 세부사항에 시간을 쓰지 말아야 합니다.

예제

두 가지 중요한 용례를 보다 깊이 탐구해야 합니다.

  1. 피드 출력
  2. 뉴스 피드 가져오기(news feed retrieval)

각각에 대한 상세 설계

2

3

4단계) 마무리

이 마지막 단계에서 면접관은 설계 결과물에 관련된 몇 가지 후속 질문을 던질수도 있고(follow-up questions) 여러분 스스로 추가 논의를 진행하도록 할 수 있습니다. 다음의 몇 가지 지침을 활용하도록 합니다.

  • 면접관이 시스템 병목구간, 혹은 좀 더 개선 가능한 지점을 찾아내라 주문할 수 있습니다. 거기다 대고 여러분의 설계가 완벽하다거나 개선할 부분이 없다는 답은 하지 않도록 합니다. 개선할 점은 언제나 있게 마련입니다. 이런 질문은 여러분의 비판적 사고 능력을 보이고, 마지막으로 좋은 인상을 남길 기회입니다.
  • 여러분이 만든 설계를 한번 다시 요약해주는 것도 도움이 될 수 있습니다. 여러 해결책을 제시한 경우에는 특히 중요합니다. 긴 면접 세션이 끝난 뒤에 면접관의 기억을 환기시켜주는 효과가 있어서입니다.
  • 오류가 발생하면 무슨 일이 생기는지(서버 오류, 네트워크 장애 등) 따져보면 흥미로울 것입니다.
  • 운영 이슈도 논의할 가치가 충분합니다. 메트릭은 어떻게 수집하고 모니터링 할 것인가? 로그는? 시스템은 어떻게 배포해(roll-out) 나갈 것인가?
  • 미래에 닥칠 규모 확장 요구에 어떻게 대처할 것인지도 흥미로운 주제입니다. 예를 들어, 현재 설계로 백만 사용자는 능히 감당할 수 있다고 해 봅니다. 천만 사용자를 감당하려면 어떻게 해야 하는가?
  • 시간이 좀 남았다면, 필요하지만 다루지 못했던 세부적 개선사항들을 제안할 수 있습니다.

면접 세션에서 해야 할 것

  • 질문을 통해 확인하라(clarification). 스스로 내린 가정이 옳다 믿고 진행해야 합니다.
  • 문제의 요구사항을 이해해야 합니다.
  • 정답이나 최선의 답안 같은 것은 없다는 점을 명심해야 합니다. 스타트업을 위한 설계안과 수백만 사용자를 지원해야 하는 중견 기업을 위한 설계안이 같을리 없습니다. 요구사항을 정확하게 이해했는지 다시 확인해야 합니다.
  • 면접관이 여러분의 사고 흐름을 이해할 수 있도록 합니다. 면접관과 소통해야 합니다.
  • 가능하다면 여러 해법을 함께 제시해야 합니다.
  • 개략적 설계에 면접관이 동의하면, 각 컴포넌트의 세부사항을 설명하기 시작해야 합니다. 가장 중요한 컴포넌트부터 진행해야 합니다.
  • 면접관의 아이디어를 이끌어 내야 합니다. 좋은 면접관은 여러분과 같은 팀원처럼 협력합니다.
  • 포기하지 말아야 합니다.

하지 말아야 할 것

  • 전형적인 면접 문제들에도 대비하지 않은 상태에서 면접장에 가지 말아야 합니다.
  • 요구사항이나 가정들을 분명히 하지 않은 상태에서 설계를 제시하지 말아야 합니다.
  • 처음부터 특정 컴포넌트의 세부사항을 너무 깊이 설명하지 말아야 합니다. 개략적 설계를 마친 뒤에 세부사항으로 나가가야 합니다.
  • 진행 중에 막혔다면, 힌트를 청하기를 주저하지 말아야 합니다.
  • 다시 말하지만, 소통을 주저하지 말아야 합니다. 침묵 속에 설계를 진행하지 말아야 합니다.
  • 설계안을 내놓는 순간 면접이 끝난다고 생각하지 말아야 합니다. 면접관이 끝났다고 말하기 전까지는 끝난 것이 아닙니다. 의견을 일찍, 그리고 자주 구해야 합니다.

시간 배분

시스템 설계 면접은 보통 매우 광범위한 영역을 다루며 45분 혹은 한 시간은 충분하지 않을 수 있습니다. 따라서 시간 관리를 잘 하는 것이 중요합니다.

각 단계 별 배분 시간 추정치

1단계 - 문제 이해 및 설계 범위 확정: 3분에서 10분
2단계 - 개략적 설계안 제시 및 동의 구하기: 10분에서 15분
3단계 - 상세 설계: 10분에서 25분
4단계 - 마무리: 3분에서 5분

참조

댓글