[시스템 디자인] 3장. 시스템 설계 면접 공략법

혀어어언·2025년 9월 15일
0

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

1. 시스템 설계 면접의 의미

  • 시스템 설계 면접은 두 명의 동료가 모호한 문제를 풀기 위해 협력하여 그 해결책을 찾아내는 과정에 대한 시뮬레이션

  • 면접은

    • 설계 기술을 시연하는 자리
    • 설계 과정에서 내린 결정들에 대한 방어 능력을 보이는 자리
    • 면접관의 피드백을 건설적인 방식으로 처리할 자질이 있음을 보이는 자리
  • 면접관이 면접자에게 평가하고자 하는 부분

    • 지원자의 설계 능력의 기술적 측면
    • 협력
    • 압박
    • 문제 해결 능력
    • 좋은 질문을 던질 능력
    • 부정적 신호
      • 타협적 결정 도외시, 과도한 엔지니어링, 완고함, 편협함 등

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

1단계. 문제 이해 및 설계 범위 확정: 요구사항을 이해하고 모호함을 없애는 것

(1) 엔지니어가 가져야 할 가장 중요한 기술

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

(2) 예제 - 뉴스 피드 시스템 설계

  • 구체적으로 어떤 기능들을 만들어야 하나?

    • 모바일 앱과 웹 앱 가운데 어느 쪽을 지원? 아니면 둘 다?
    • 가장 중요한 기능?
    • 뉴스 피드의 정렬 기준은? 피드에 올라갈 포스트마다 다른 가중치가 부여되어야 하는 지?
    • 피드의 형식은 텍스트? 이미지나 비디오도 포함 가능?
  • 제품 사용자 수는 얼마나 되나?

    • 한 사용자는 최대 몇 명의 사용자와 친구를 맺을 수 있는가?
    • 사이트로 오는 트래픽 규모는 어느 정도 되는가?

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

(1) 개략적 설계안 제시하고 면접관 의견 청취

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

(2) 예제

설계의 흐름

개략적으로 봤을 때 이 설계는 두 가지 플로우로 나눠 생각해볼 수 있다

  • 피드 발행(feed publishing)
    • 사용자가 포스트를 올리면 관련된 데이터가 캐시/DB에 기록되고, 해당 사용자의 친구 뉴스 피드에 뜨게 됨
  • 피드 생성(feed building)
    • 어떤 사용자의 뉴스 피드는 해당 사용자 친구들의 포스트를 시간 역순으로 정렬하여 만듦
설계 흐름도
  • 피드 발행
  • 피드 생성

3단계. 상세 설계: 설계 대상 컴포넌트 사이의 우선순위 선정

(1) 상세 설계 시작 전 달성한 상태

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

(2) 설계 대상 컴포넌트 사이의 우선 순위 정하기

  • 시스템 성능 특성에 대한 질문의 경우, 질문 내용은 시스템 병목 구간이나 자원 요구량 추정치에 초점이 맞춰져 있을 것
  • 대부분의 면접관은 특정 시스템 컴포넌트들의 세부 사항을 깊이 있게 설명하는 것을 보고 싶어 함
    • 예시
      • URL 단축기 설계: 해시 함수의 설계
      • 채팅 시스템: 지연시간을 줄이는 설계, 사용자의 온/오프라인 상태 표시에 관한 설계
  • 시간 관리: 사소한 세부사항이 아니라 규모 확장 가능한 시스템을 설계할 능력이 있다는 것을 입증할만한 사항에 시간을 쓰기

(3) 예제

  • 뉴스 피드 설계에서 우선순위가 높은 컴포넌트 선정

    • 피드 발행(feed publishing)
    • 뉴스 피드 가져오기(news feed retrieval)
  • 피드 발행

  • 뉴스 피드 가져오기

4단계. 마무리

(1) 지침 활용

  • 시스템 병목 구간 혹은 좀 더 개선 가능한 지점 파악
    • 개선할 점은 언제나 있음
    • 비판적 사고 능력을 보이고, 마지막으로 좋은 인상을 남길 기회
  • 만든 설계를 다시 한번 요약하면 면접관의 기억을 환기시켜줌
    • 특히 여러 해결책을 제시한 경우 중요함
  • 오류 발생 시 발생이 예상되는 일
    • 서버 오류, 네트워크 장애
  • 운영 이슈
    • 메트릭은 수집 방법, 모니터링 방법, 로깅 방법, 배포 방법 등
  • 미래에 닥칠 규모 확장 요구에 대한 대처
  • 필요하지만 다루지 못했떤 세부적 개선 사항들 제안

(2) 면접장에서 해야 할것

  • 질문을 통한 확인
  • 문제의 요구사항 이해
  • 면접관이 내 사고의 흐름을 이해할 수 있도록 면접관과 소통
  • 가능하다면 여러 해법을 함꼐 제시
  • 개략적 설계에 면접관이 동의하고 난 후, 가장 중요한 컴포넌트부터 각 컴포넌트의 세부사항 설명 시작
  • 면접 관의 아이디어를 이끌어 내며 마치 면접관과 팀원인 것처럼 협력

(4) 하지 말아야 할 것

  • 요구 사항이나 가정들이 분명하지 않은 상태에서 설계 제시
  • 처음부터 특정 컴포넌트의 세부사항을 너무 깊이 설명하는 것
    • 개략적 설계를 마친 뒤 세부사항으로 나아갈 것
  • 진행 중에 막혔다면 힌트를 요청할 것
  • 면접관의 의견을 일찍, 그리고 자주 구할 것

3. 시간배분

3-1. 면접 시간이 45분이라면?

(1) 단계별 시간 배분

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

(2) 단계별 시간 배분 비율(45분 기준, 평균 값)

0개의 댓글