[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 3장 시스템 설계 면접 공략법
3장 시스템 설계 면접 공략법
시스템 설계 면접의 평가 요소
- 설계 능력의 기술적 측면
- 협력에 적합한 사람인지
- 압박이 심한 상황도 잘 헤쳐 나갈 자질이 있는지
- 모호한 문제를 건설적으로 해결할 능력이 있는지
- 좋은 질문을 던질 능력능력이 있는지
- 과도한 엔지니어링을 하는지
효과적 면접을 위한 4단계 접근법
1단계 문제 이해 및 설계 범위 확정
면접 질문에 대해 바로 나의 생각을 답하는 것 보단 시스템 구축에 필요한 정보를 모아야 한다.
아래는 질문 예시이다.
- 구체적으로 어떤 기능들을 만들어야 하나?
- 제품 사용자 수는 얼마나 되나?
- 회사의 규모는 얼마나 빨리 커지리라 예상하나? 석, 달, 여섯 달, 일년 뒤의 규모는 얼마나 되리라 예상하나?
- 회사가 주로 사용하는 기술 스택은 무엇인가?
- 설계를 단순하게하기 위해 활용할 수 있는 기존 서비스로는 어떤 것들이 있는가?
(예제)
뉴스 피드 시스템을 설계한다. 지원자와 면접자 간의 오가는 대화 예시이다.
2단계 개략적인 설계안 제시 및 동의 구하기
개략적인 설계안을 제시하고 면접관의 동의를 얻는 과정이다. 면접관과 협력하며 진행하면 좋다.
- 설계안에 대한 최초 청사진을 제시하고 의견을 구하라.
- 면접관을 팀원이라고 생각하고 대하라.
- 화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그려라. (클라이언트, API, 웹 서버, 데이터 저장소, 캐시, CDN, 메세지 큐)
- 제약사항들을 만족하는지 계산해보라.
뉴스 피드의 예시는 크게 두개의 플로우로 나눠서 생각할 수 있다.
- 피드 발행: 사용자가 포스트를 올리면 관련된 데이터가 캐시나 데이터베이스에 기록되고. 친구의 뉴스 피드에 뜬다.
- 피드 생성: 유저에게 친구들의 포스트를 시간 역순(최슨 포스트부터-> 오래된 포스트 순) 정렬하여 보여준다.
3단계 상세 설계
해당 단계까지 왔다면 아래 목표는 달성한 상태이다.
- 시스템에서 전반적으로 달성해야 할 목표와 기능 범위 확인
- 전체 설계의 개략적 청사진 마련
- 해당 청사진에 대한 면접관의 의견 청취
- 상세 설계에서 집중해야 할 영역들 확인
이제 설계에 대해 좀 더 자세히 이야기 해야 한다.
시니어 개발자 면접이라면
시스템 성능 특성에 대한 질문이 올 것이고, 그에 대한 병목 구간이나 자원 요구량 추정치에 초점이 맞춰져 있을 것임.
대부분의 면접관은
툭정 시스템 컴포넌트의 세부사항을 깊이 설명하길 원할 것임.
예를 들어 출제된 문제가
단축 URL 생성기 설계에 관한 것이라면, 면접관은 해시 함수의 설계를 구체적으로 설명하는 것을 듣고 싶어할 것이고
채팅 시스템 관련 이라면, 지연시간을 줄이는 방법과 사용자의 온/오프라인 상태를 표시할 방법에 대해 듣고자 할 것임.
4단계 마무리
면접관이 후속 질문을 던질 수도 있고, 추가 논의를 진행할 수 도 있다.
- 설계를 한번 다시 요약해주기
- 오류가 발생하면 무슨 일이 생기는지(서버 오류, 네트워크 장애)
- 운영 이슈 (매트릭은 어떻게 수집하고 모니터링 할 것인지? 로그는? 시스템은 어떻게 배포해 나갈 것인지?)
- 규모가 확장되었을 경우(백 만 사용자는 감당가능한데 천만 사용자는 감당하려먼 어캐 해야할지?)
면접시 해야할 것과 하지 말아야 할 것
해야할 것
- 질문을 통해 확인하자
- 문제의 요구사항을 이해하자
- 정답이나 최선의 답안 같은 것은 없다. 스타트업을 위한 설계안과 수백만 사용자를 지원해야 하는 중견 기업을 위한 설계안이 같을 리가 없다. 요구사항을 정확하게 이해했는지 확인하자
- 소통하자. 면접관이 나의 사고 흐름을 이해할 수 있도록 하자.
- 가능하다면 여러 해법을 함께 제시해라.
- 개략적 설계에 면접관이 동의하면, 각 컴포넌트의 세부사항을 설명하기 시작하자. (가장 중요한 부분 부터)
- 면접관의 아이디어를 이끌어 내자. 좋은 면접관은 여러분과 같은 팀원처럼 협력한다
- 포기하지 말자
하지 말아야 할 것
- 준비되지 않은 상태에서 면접장에 가지 마라
- 요구사항이나 가정들을 분명히 하지 않은 상태에서 설계를 제시하지 말자
- 처음부터 특정 컴포넌트에 대해 깊이 설명하지 말자
- 진행 중에 막혔다면, 힌트를 청하기를 주저하지 말라
시간 배분
1단계 - 문제 이해 및 설계 범위 확정: 3분~ 10분
2단계 - 개략적 설계안 제시 및 동의 구하기: 10분 ~ 15분
3단계 - 상세 설계: 10분 ~ 25분
4단계 - 마무리: 3분 ~ 5분
요약 및 느낀 점
- 면접 공략법이라고 나와있지만, 실무에서 팀원과 회의나 커뮤니케이션을 할 때 적용하면 좋을 방안이다.
- 시스템 설계면접에서 어떤 능력을 요구하는지, 어떤 흐름으로 진행되는지 알 수 있었다.