3장 시스템 설계 면접 공략법

시스템 설계 면접이 있는 이유

모호한 문제를 훌기 위해 협력하여 그 해결책을 찾아내는 과정에 대한 시뮬레이션

면접을 통해 보여줘야 할 것

  • 설계 능력의 기술적 측면
  • 협력에 적합한 사람
  • 압박이 심한 상황도 잘 헤쳐나가는 자질
  • 모호한 문제를 건설적으로 해결할 능력
  • 좋은 질문을 던질 능력

지양해야할 것

  • 설계의 순수성에 집착한 나머지 트레이드 오프를 도외시하고 오버 엔지니어링을 하는지
    • 오버 엔지니어링으로 시스템 전반의 비용이 올라간다는 것을 눈치채지 못할 수 있다
  • 완고함과 편협함

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

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

깊이 생각하고 질문하여 요구사항과 가정들을 분명히 하라

올바른 질문을 하는 것, 적절한 가정을 하는 것, 그리고 시스템 구축에 필요한 정보를 모으는 것

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

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

면접관과 협력하자

면접관에게 개략적인 설계안을 제시하고, 면접관의 동의를 구하자

  • 설계안에 대한 최초 청사진을 제시하고 의견을 구하라. 힘들겠지만, 마치 팀원처럼
  • 화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그려라
    • 클라이언트(모바일/웹)
    • API(엔드포인트)
    • 웹 서버
    • 데이터 저장소(데이터베이스 스키마)
    • 캐시
    • CDN
    • 메시지 큐
  • 최초 설계안이 시스템 규모에 관계된 제약사항들을 만족하는지 개략적으로 계산해보라
  • 계산/요청 과정을 소리내어 설명하면 좋다
  • 면접관의 의견을 물어보자

3단계 상세 설계

지금까지 달성한 목표

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

이제 해야 할 일

  • 설계 대상 컴포넌트 사이의 우선순위 정하기
  • 면접관이 집중하고 있는 영역을 보자 ex) 단축 URL 생성기라면, 해시 함수의 설계를 구체적으로 설명해야한다. ex) 채팅 시스템이라면, latency를 어떻게 줄이고, 사용자의 온/오프라인 상태를 표시할 것인가?
  • 불필요한 세부사항에 시간을 쓰지말고, 규모 확장 가능한 시스템을 설계할 능력이 있다는 것을 입증하는데 시간을 쓰자.

4단계 마무리

  • 개선 가능한 지점을 찾자. 비판적으로 설계를 바라보자
  • 설계를 다시 한 번 요약해서, 나를 기억시키자
  • 오류가 발생하면 무슨 일(서버 오류, 네트워크 장애)이 생기는지 따져보자
  • 운영 이슈도 논의할 가치가 있다
    • 메트릭 수집
    • 모니터링
    • 로그
    • 시스템 배포 방법
    • 미래에 닥칠 규모 확장 요구에 대처 방법을 생각해보자
  • 시간이 남는다면, 필요하지만 다루지 못했던 세부적 개선사항들을 제안하자

정리

해야할 것

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

하지 말아야 할 것

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

시간 배분

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