3장. 시스템 설계 면접 공략법
1. 시스템 설계 면접의 의미
2. 효과적인 면접을 위한 4단계 접근법
1단계. 문제 이해 및 설계 범위 확정: 요구사항을 이해하고 모호함을 없애는 것
(1) 엔지니어가 가져야 할 가장 중요한 기술
- 올바른 질문을 하는 것 / 적절한 가정을 하는 것 / 시스템 구축에 필요한 정보를 모으는 것
- 예시
- 구체적으로 어떤 기능들을 만들어야 하나?
- 제품 사용자 수는 얼마나 되나?
- 회사의 규모는 얼마나 빨리 커지리라 예상하나?(석 달, 여섯 달, 일년 뒤의 규모는 얼마나 되리라 예상하는가?)
- 회사가 주로 사용하는 기술 스택은 무엇인가?
- 설계를 단순화하기 위해 활용할 수 있는 기존 서비스로는 어떤 것들이 있는가?
(2) 예제 - 뉴스 피드 시스템 설계
-
구체적으로 어떤 기능들을 만들어야 하나?
- 모바일 앱과 웹 앱 가운데 어느 쪽을 지원? 아니면 둘 다?
- 가장 중요한 기능?
- 뉴스 피드의 정렬 기준은? 피드에 올라갈 포스트마다 다른 가중치가 부여되어야 하는 지?
- 피드의 형식은 텍스트? 이미지나 비디오도 포함 가능?
-
제품 사용자 수는 얼마나 되나?
- 한 사용자는 최대 몇 명의 사용자와 친구를 맺을 수 있는가?
- 사이트로 오는 트래픽 규모는 어느 정도 되는가?
2.단계. 개략적인 설계안 제시 및 동의 구하기
(1) 개략적 설계안 제시하고 면접관 의견 청취
- 설계안에 대한 최초 청사진 제시 및 의견 구하기
- 화이트 보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램 그리기
- 클라이언트(모바일/웹), API, 웹 서버, 데이터 저장소, 캐시, CDN, 메세지 큐 등 포함
- 최초 설계안이 시스템 규모에 관계된 제약 사항들을 만족하는 지 개략적으로 계산
- 계산 과정은 소리내어 설명
- 개략적 추적이 필요한 지는 면접관에게 미리 물어보기
- 시스템의 구체적 사용 사례 살펴 보기
- 개략적 설계안을 잡아 나가는데 도움이 됨
- 미처 고려하지 못한 에지 케이스 발견에도 도움 됨
- API 엔드포인트나 데이터베이스 스키마도 보여야 하는가?
(2) 예제
설계의 흐름
개략적으로 봤을 때 이 설계는 두 가지 플로우로 나눠 생각해볼 수 있다
- 피드 발행(feed publishing)
- 사용자가 포스트를 올리면 관련된 데이터가 캐시/DB에 기록되고, 해당 사용자의 친구 뉴스 피드에 뜨게 됨
- 피드 생성(feed building)
- 어떤 사용자의 뉴스 피드는 해당 사용자 친구들의 포스트를 시간 역순으로 정렬하여 만듦
설계 흐름도
- 피드 발행

- 피드 생성

3단계. 상세 설계: 설계 대상 컴포넌트 사이의 우선순위 선정
(1) 상세 설계 시작 전 달성한 상태
- 시스템에서 전반적으로 달성해야 할 목표와 기능 범위 확인
- 전체 설계의 개략적 청사진 마련
- 해당 청사진에 대한 면접관의 의견 청취
- 상세 설계에서 집중해야 할 영역들 확인
(2) 설계 대상 컴포넌트 사이의 우선 순위 정하기
- 시스템 성능 특성에 대한 질문의 경우, 질문 내용은 시스템 병목 구간이나 자원 요구량 추정치에 초점이 맞춰져 있을 것
- 대부분의 면접관은 특정 시스템 컴포넌트들의 세부 사항을 깊이 있게 설명하는 것을 보고 싶어 함
- 예시
- URL 단축기 설계: 해시 함수의 설계
- 채팅 시스템: 지연시간을 줄이는 설계, 사용자의 온/오프라인 상태 표시에 관한 설계
- 시간 관리: 사소한 세부사항이 아니라 규모 확장 가능한 시스템을 설계할 능력이 있다는 것을 입증할만한 사항에 시간을 쓰기
(3) 예제


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분 기준, 평균 값)
