시스템 설계 면접은 두 명의 동료가 모호한 문제를 풀기 위해 협력하여 그 해결책을 찾아내는 과정에 대한 시뮬레이션이다.
1단계 : 문제 이해 및 설계 범위 확정
요구사항을 완전히 이해하지 않고 답을 내놓는 행위 - 부정적 신호 (red flag)
깊이 생각하고 질문하여 요구사항과 가정들을 분명히 해야 함
→ 요구사항을 정확히 이해하는 데에 필요한 질문들
- 구체적으로 어떤 기능들을 만들어야 하는가?
- 제품 사용자 수는 얼마나 되나?
- 회사의 규모는 얼마나 빨리 커지리라 예상하나? - 석 달, 여섯 달, 일년 뒤의 규모는 얼마가 되리라 예상하는가?
- 회사가 주로 사용하는 기술 스택은 무엇인가? - 설계를 단순화하기 위해 활용할 수 있는 기존 서비스로는 어떤 것들이 있는가?
2단계 : 개략적인 설계안 제시 및 동의 구하기
- 설계안에 대한 최초 청사진을 제시하고 의견을 구한다. 면접관을 마치 팀원인 것처럼 대한다.
- 화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그린다. (클라이언트(모바일/웹), API, 웹 서버, 데이터 저장소, 캐시, CDN, 메시지 큐 포함)
- 최초 설계안이 시스템 규모에 관계된 제약사항들을 만족하는지를 개략적으로 계산하고, 그 과정을 소리내어 설명한다.
- 시스템의 구체적 사용 사례도 살펴본다. 미처 고려하지 못한 에지 케이스를 발견하는 데에 도움이 될 것.
3단계 : 상세 설계
- 설계 대상 컴포넌트 사이의 우선순위를 정해야 한다.
- 시스템의 성능 특성에 대한 질문 (시스템의 병목 구간, 자원 요구량 추정치 등)에서 컴포넌트들의 깊이 있는 설명이 필요하다.
- 시간 관리에 주의를 기울여, 긍정적 신호를 전달하는 데에 집중해야 한다.
4단계 : 마무리
- 시스템 설계가 완벽하다거나, 개선할 부분이 없다는 답은 하지 않는다.
- 만든 설계를 다시 한 번 요약한다.
- 오류가 발생하면 무슨 일이 생기는지 따져본다.
- 운영 이슈(메트릭 수집, 모니터링 , 로그 배포 등)에 대해 논의한다.
- 미래의 규모 확장 요구에 대처할 방안을 논의한다.
- 필요하지만 다루지 못했던 세부적 개선사항들을 제안한다.
- 질문을 통해 확인하라(clarification). 스스로 내린 가정이 옮다 믿고 진행하지 않는다
- 문제의 요구사항을 이해하라
- 정답/최선의 답안 같은 건 없다
- 면접관이 사고 흐름을 이해할 수 있도록 하라
- 가능하다면 여러 해법을 제시하라
- 개략적 설계에 면접관이 동의하면, 각 컴포넌트의 세부사항을 설명하기 시작하라 (가장 중요한 컴포넌트부터)
- 전형적인 면접 문제에도 대비하지 않은 상태로 면접장에 가지 마라
- 요구사항이나 가정들을 분명히 하지 않은 상테에서 설계를 제시하지 말라
- 처음부터 특정 컴포넌트의 세부사항을 너무 깊게 설명하지 말라
- 진행 중 막혔다면, 힌트 청하기를 주저하지 말라
- 소통을 주저하지 말라, 침묵 속에 설계를 진행하지 말라
- 설계안을 내놓는 순간 면접이 끝난다고 생각하지 말라