Read Book/대규모 시스템 설계 기초
3장. 시스템 설계 면접 공략법
nowwater
2023. 8. 3. 19:35
728x90
시스템 설계 면접
두 명의 동료가 모호한 문제를 풀기 위해 협력하여 그 해결책을 찾아내는 과정에 대한 시뮬레이션으로, 정해진 결말도 없고 정답도 없다. 하지만 그 절차나 범위에는 공통적인 부분이 있다.
나의 설계 기술을 시연하는 자리이고, 설계 과정에서 내린 결정들에 대한 방어 능력을 보이는 자리이다.
보통 지원자의 설계 능력의 기술적 측면을 평가하는 자리일 거라 생각하지만, 사실은 그 이상이다.
면접관이 주로 보는 긍정적 신호
- 지원자가 협력에 적합한 사람인지
- 압박이 심한 상황도 잘 헤쳐 나갈 자질이 있는지
- 모호한 문제를 건설적으로 해결할 능력이 있는지
- 좋은 질문을 던질 능력이 있는지
면접관이 주로 보는 부정적 신호
- 설계의 순수성(pureity)에 집착한 나머지 타협적 결정(tradeoff)을 도외시하고 과도한 엔지니어링을 하는가
- 완고함 / 편협함
효과적 면접을 위한 4단계 접근법
1단계. 문제 이해 및 설계 범위 확정 (3 ~ 10분 / 45분)
요구사항을 완전히 이해하지 않고 답을 내놓는 행위는 아주 엄청난 부정적 신호다. → 왜냐하면 시스템 설계 면접에는 정답이 없기 때문
깊이 생각하고 질문하여 요구사항과 가정들을 분명히 하자
엔지니어가 가져야 할 가장 중요한 기술
- 올바른 질문을 하는 것
- 적절한 가정을 하는 것
- 시스템 구축에 필요한 정보를 모으는 것
질문 예시
- 어떤 기능을 구현해야하나?
- 사용자가 몇명이나 되나?
- 얼마나 빨리 시스템이 확장해야하는가?
- 회사의 기술 스택이 어떻게 되는가? 어떤 사내 서비스들이 사용 가능한가?
예제
- 면접자: 모웹? 웹앱? 둘 다?
- 면접관: 둘 다
- 면접자: 제일 중요한 기능이 무엇인가?
- 면접관: 포스트를 올리고 친구들의 뉴스피드를 보는 것
- 면접자: 뉴스 피드는 시간 역순으로 정렬되는가? 아니면 특별한 순서가 있나? 특별한 순서라 함은 특정 포스트에 가중치를 주는 것을 뜻한다
- 면접관: 단순하게 하기 위해 시간 역순으로 한다고 가정하자
- 면접자: 한명의 유저는 몇명의 친구를 가질 수 있나?
- 면접관: 5000명
- 면접자: 트래픽은 얼마나 되나?
- 면접관: 천만 DAU
- 면접자: 피드는 어떤 걸 포함할 수 있나? 이미지? 비디오? 그냥 텍스트?
- 면접관: 이미지나 비디오도 포함 가능하다
핵심은 요구사항을 이해하고 모호함을 없애는 것
2단계. 개략적인 설계안 제시 및 동의 구하기 (10 ~ 15분 / 45분)
개략적 설계안 제시 후 면접관의 동의 얻기 (면접관과 협력하며 진행)
- 설계안에 대한 최초 청사진을 제시하고 의견 구하기 (면접관을 마치 팀원인 것처럼 대하기)
- 화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그리기 (e.g. 클라이언트, API, 웹서버, 데이터 저장소, 캐시, CDN, 메시지 큐 등)
- 최초 설계안이 시스템 규모에 관계된 제약사항들을 만족하는지를 개략적으로 계산
- 가능하다면 시스템의 구체적 사용 사례도 몇 가지 살펴보기 → 미처 고려하지 못한 엣지 케이스를 발견하는데 도움이 될 수도
예제
- 뉴스 피드 시스템
- 피드 발행: 사용자가 포스트를 올리면 캐시, DB 에 해당 정보를 올리고 친구의 뉴스 피드에 넣는다
- 피드 생성: 친구들의 포스트를 시간 역순으로 정렬해서 만들어진다
3단계. 상세 설계 (10~25분 / 45분)
이제 면접관과 해야할 일은 설계 대상 컴포넌트 사이의 우선순위를 정하는 것.
대부분의 면접관은 내가 특정 시스템의 컴포넌트들의 세부사항을 깊이 있게 설명하는 것을 보길 원한다.
예를 들어
- 단축 URL 생성자: 해시 함수 관련 컴포넌트의 설계 질문
- 채팅 시스템: 응답시간 단축이나 사용자가 온라인/오프라인인지 여부 확인하는 컴포넌트 설계 질문
면접 시 시간 관리도 특별히 주의를 기울여야 하는데, 사소한 세부사항을 설명하느라 정작 나의 능력을 보일 기회를 놓쳐버리게 될 수도 있기 떄문이다.
따라서 불필요한 세부사항에 시간을 쓰지 말고, 면접관에게 긍정적 신호를 전달하는데 집중해야 한다.
예제
- 뉴스 피드 시스템
- 피드 발행
- 뉴스 피드 가져오기(news feed retrieval)
4단계. 마무리 (3~5분 / 45분)
마지막 단계에서 면접관은 설계 결과물에 관련된 몇 가지 후속 질문을 던질 수도 있고, 스스로 추가 논의를 진행하도록 할 수도 있다.
- 시스템 병목 구간
- 더 개선 가능한 지점
- 만든 설계를 한번 다시 요약해주는 것
- 오류가 발생할 경우 무슨 일이 생길지
- 운영 이슈 (메트릭 수집, 모니터링, 로그, 시스템 배포 등)
- 규모 확장 요구에 대처 방안 제안
- 필요하지만 다루지 못했던 세부적 개선사항 제안 (성능 튜닝 포인트도 좋을 듯)
해야 할 것
- 애매한 부분이 있다면 스스로 내린 가정이 옳다 믿지 말고 질문을 해서 확실히 해라
- 문제의 요구사항을 이해하라
- 정답도 없고 최선의 답도 없다. 또한 회사의 규모에 따라 맞는 답이 다르니 요구사항을 이해해야 한다
- 면접관과 소통하라 → 면접자가 생각하는 것을 계속 얘기해서 면접관이 면접자가 무슨 생각을 하고 있는지 알게하라.
- 가능하다면 여러 해법을 함께 제시하라
- 개략적 설계에 면접관이 동의하면, 각 컴포넌트의 세부사항을 설명하라. + 가장 중요한 컴포넌트 먼저 설계하자
- 아이디어를 계속 주고 받자. 좋은 면접관이라면 동료처럼 잘 소통할 것이다
하지 말아야 할 것
- 일반적인 면접 질문들에 대해 준비되지 않은 상태
- 요구사항이나 가정을 분명히 하지 않고 설계를 제시하는 것
- 처음부터 특정 컴포넌트의 세부사항에 너무 집착하는 것. 개략적 설계를 먼저 한 뒤 세부사항으로 가야한다
- 진행 중 막히는 부분이 있을 때 힌트를 물어보지 않는 것
- 적막한 상태로 있는 것. 생각을 하던 설계를 하던 계속 얘기해라
- 면접관이 끝났다고 할 때까지 끝난게 아니니 계속 피드백을 요청해라