시스템 설계 면접 공략법

  • 시스템 설계 면접은 두 명의 동료가 모호한 문제를 풀기 위해 협력하여 그 해결책을 찾아내는 과정에 대한 시뮬레이션.
  • 설계 기술을 시연하는 자리이고, 설계 과정에서 내린 결정들에 대한 방어 능력을 보이는 자리이며, 면접관의 피드백을 건설적인 방식으로 처리할 자질이 있음을 보이는 자리.
  • 설계 능력의 기술적 측면 뿐만 아니라, 협력, 압박 극복 등 여러 면을 봄.
  • 부정적 신호(red flag)도 노출되므로 주의.

효과적 면접을 위한 4단계 접근법

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

  • 요구사항을 완전히 이해하지 않고 답을 내놓는 행위는 부정적 신호(reg flag)다.
  • 올바른 질문, 적절한 가정, 시스템 구축에 필요한 정보를 모으는 것이 우선.
    • 구체적으로 어떤 기능을 만들어야 하나?
    • 제품 사용자 수는 얼마나 되나?
    • 회사의 규모는 얼마나 빨리 커지리라 예상하나?
    • 회사가 주로 사용하는 기술 스택(technology stack)은 무엇인가? 설계를 단순화하기 위해 활용할 수 있는 기존 서비스로는 어떤 것들이 있는가?

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

  • 면접관과 협력하여 진행하면 좋다.
    • 설계안에 대한 최초 청사진을 제시하고 의견을 구하라. 면접관을 마치 팀원인 것처럼 대하라. 휼륭한 면접관들은 지원자들과 대화하고 설계 과정에 개입하기를 즐긴다.
    • 화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그려라. 클라이언트(모바일/웹), API, 웹 서버, 데이터 저장소, 캐시, CDN 메시지 큐 등.
    • 이 최초 설계안이 시스템 규모에 관계된 제약사항들을 만족하는지 개략적으로 계산하고 계산 과정을 소리 내어 설명하라. 개략적 추정이 필요한지는 면접관에게 미리 질문.
  • 가능하다면 시스템의 구체적 사용 사례도 몇 가지 살펴보자. 개략적인 설계안을 잡아 나가는데 도움이 되고, 미처 고려하지 못한 에지 케이스(edge case)를 발견하는 데도 도움이 된다.

3단계 상세 설계

  • 1,2 단계에서 달성한 목표
    • 시스템에서 전반적으로 달성해야 할 목표와 기능 범위 확인
    • 전체 설계의 개략적 청사진 마련
    • 해당 청사진에 대한 면접관의 의견 청취
    • 상세 설계에서 집중해야 할 영역들 확인
  • 다음으로 해야 할 일은 설계 대상 컴포넌트 사이의 우선순위를 정하는 것.
    • 시스템의 성능 특성에 대한 설명(병목 구간, 자원 요구량 추정치).
    • 특정 시스템 컴포넌트들의 세부사항 설명.
  • 면접관에게 긍정적 시그널(signal)를 전달하는 데 집중.

4단계 마무리

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

해야 할 것과 하지 말아야 할 것

해야 할 것

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

하지 말아야 할 것

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

시간 배분

  • 시스템 설계 면접은 보통 매우 광범위한 영역을 다루며 45분 혹은 한 시간은 충분하지 않을 수 있다.
  • 각 단계에 어느 정도 시간을 쓰는 것이 좋을지 정리
    • 1단계 - 문제 이해 및 설계 범위 확정: 3분에서 10분
    • 2단계 - 개략적 설계안 제시 및 동의 구하기: 10분에서 15분
    • 3단계 - 상세 설계: 10분에서 25분
    • 4단계 - 마무리: 3분에서 5분

출처

0개의 댓글