어흥
[대규모 시스템 설계] 3. 시스템 설계 면접 공략법 본문
명심할 점: 정해진 결말이나 정답은 없다
1단계: 문제 이해 및 설계 범위 확정
- 깊이 생각하고 질문하여 요구사항과 가정들을 분명히 하라
- 올바른 질문, 적절한 가정 그리고 시스템 구축에 필요한 정보를 모아라. 가정을 한다면 종이나 화이트보드에 꼭 메모해둔다
올바른 질문 예시
1. 구체적으로 어떤 기능을 만들어야 하는가?
2. 제품 사용자 수는 얼마나 되는가?
3. 회사의 규모는 얼마나 빨리 커지는가? 3,6,12개월 뒤의 규모는 어느정도인가?
4. 회사가 주로 사용하는 기술 스택은 무엇인가? 설계를 단순화하기 위해 활용할 수 있는 기존 서비스로는 어떤 것이 있는가?
예제
뉴스 피드(news feed) 시스템을 설계하라는 요구를 받았다. 이때 다음과 같은 순서로 질문 할 수 있다
1. 모바일 앱 웹 앱중 어느정도를 지원해야 하는가?
2. 가장 중요한 기능은 무엇인가?
3. 뉴스 피드는 시간 역순으로 정렬하는가? 또는 피드가 올라갈때마다 특정 가정치가 부여되어 그에 따른 정렬하는가?
4. 한 사용자는 최대 몇 명의 사용자와 친구를 맺을 수 있는가?
5. 사이트로 오는 트래픽 규모는?
6. 피드에 이미지나 비디오도 올라올 수 있는가?
면접관 대답
1. 둘다 지원
2. 새로운 포스트를 올리고, 다른 친구의 뉴스 피드를 볼 수 있도록 하는 기능
3. 시간 역순으로 정렬
4. 3000명
5. 일간 능동 사용자(DAU)는 천만 명
6. 이미지나 비디오 같은 미디어 파일도 포스트 가능해야 한다
이 단계에선 요구사항을 이해하고 모호함을 없애는게 가장 중요
2단계: 개략적인 설계안 제시 및 동의 구하기
개략적인 설계안을 제시하고 면접관의 동의를 얻는다. 이 과정은 면접관과 협력하며 진행하면 좋다
- 설계안에 대한 최초 청사진 제시하고 의견 구한다. 면접관을 팀원과 같이 대하라
- 화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그려라. 클라이언트(모바일/웹), API, 웹 서버, 데이터 저장소, 캐시, CDN, 메시지 큐와 같은 것들이 포함될 수 있다
- 최초 설계안이 시스템 규모에 관계된 제약사항들을 만족하는지를 개략적으로 계산하라. 면접관에게 물어봐서 개략적 추정이 필요하다고 하면 계산 과정은 소리 내어 설명한다
- 가능하다면 시스템의 구체적 사용 사례도 살펴서 에지 케이스를 발견할 수 있도록 한다
- API 엔드포인트나 DB 스키마는 대형 규모가 아닐 때 보여준다
1번의 예시를 그대로 사용하면 크게 2가지 설계 Flow로 나뉜다
1. 피드 발행: 사용자가 포스트를 올리면 관련된 데이터가 캐시/DB에 기록되고, 해당 사용자의 친구 뉴스 피드에 뜬다
2. 피드 생성: 어떤 사용자의 뉴스 피드는 해당 사용자 친구들의 포스트를 시간 역순으로 정렬하여 만든다
3단계: 상세 설계
1,2 단계를 통해 다음 목표를 달성한 상태다
- 시스템에서 전반적으로 달성해야 할 목표와 기능 범위 확인
- 전체 설계의 개략적 청사진 마련
- 해당 청사진에 대한 면접관의 의견 청취
- 상세 설계에서 집중해야 할 영역들 확인
3단계에서 진행해야 하는 사항은 설계 대상 컴포넌트 사이의 우선순위를 정하거나 물어본다
위 예시를 그대로 활용하면, 2가지 중요한 용례를 깊게 탐구한다
1. 피드 발행(인증, 처리율 제한, 포스팅 전송 서비스 강화)
2. 뉴스 피드 가져오기(인증, 처리율 제한, 사용자 정보, 포스팅 캐시 및 DB 추가)
4단계: 마무리
설계 결과물에 관련된 몇 가지 후속 질문을 던지거나 스스로 추가 논의를 진행한다. 다음과 같은 질문을 받거나 논의 할 수 있다
1. 시스템 병목구간 혹은 좀 더 개선 가능한 지점을 찾는다
2. 여러 해결책을 제시한 경우, 설계 재요약도 좋은 선택
3. 서버/네트워크와 같은 오류가 발생하면 무슨 일이 생기는가
4. 운영 이슈: 메트릭 수집 및 모니터링/로그 처리 그리고 배포 방법은?
5. 미래에 닥칠 규모 확장 요구 대응
6. 필요하지만 다루지 못했던 세부적 개선사항 제안
해야 할 것
- 질문을 통해 확인한다. 스스로 내린 가정이 옳다고 믿고 진행하지 않는다
- 문제의 요구사항 이해
- 면접관과 소통하라
- 가능하다면 여러 해법을 제시하라
- 개략적 설계에 면접관의 동의라면, 각 컴포넌트의 세부사항을 중요한 순서대로 설명하라
- 면접관의 아이디어를 끌어내라. 팀원이라고 생각하고
- 포기하지 않는다
- 시간 배분을 잘 한다
하지 말아야 할 것
- 요구사항이나 가정들을 분명히 하지 않고 설계하지 않는다
- 처음부터 특정 컴포넌트의 세부사항을 너무 깊이 설명하지 않는다
- 힌트 청하기를 주저하지 말라
출처: 가상 면접 사례로 배우는 대규모 시스템 설계 기초
'개발 > 대규모 시스템 설계' 카테고리의 다른 글
[대규모 시스템 설계] 6. 키-값 저장소 설계 - 1 (0) | 2023.08.16 |
---|---|
[대규모 시스템 설계] 5. 안정 해시 설계 (0) | 2023.08.14 |
[대규모 시스템 설계] 4. 처리율 제한 장치의 설계 - 2 (0) | 2023.08.08 |
[대규모 시스템 설계] 4. 처리율 제한 장치의 설계 - 1 (0) | 2023.08.02 |
[대규모 시스템 설계] 2. 개략적인 규모 추정 (0) | 2023.07.31 |