
3장. 시스템 설계 면접 공략법
시스템 설계 면접이 있는 이유는?
- 두 명의 동료가 모호한 문제를 풀기 위해 협력하여 그 해결책을 찾아내는 과정에 대한 시뮬레이션
- 정해진 결말x, 정답x
- 결과물 < 노력
- 설계 과정에서 내린 결정들에 대한 방어 능력을 보이는 자리.
- 면접관의 피드백을 건설적인 방식으로 처리할 자질이 있음을 보이는 자리.
- 좋은 질문을 던질 능력
효과적 면접을 위한 4단계 접근법
Step1. 문제 이해 및 설계 범위 확정
- 바로 답부터 들이지밀지 말고 속도를 늦추자
- 깊이 생각하고 질문하여 요구사항과 가정들을 분명히
- 올바른 질문을 하자
- 적절한 가정
- 시스템 구축에 필요한 정보 모으기
- 요구사항을 정확히 이해하는 데 필요한 질문.
- 구체적으로 어떤 기능?
- 제품 사용자 수는?
- 회사의 규모는 얼마나 빨리 커지리라 예상하나? 일년 뒤의 규모는?
- 주로 사용하는 기술 스택은?
- 설계를 단순화하기 위해 활용할 수 있는 기존 서비스로는 어떤 것들이?
예제. 뉴스 피드 시스템 설계
- 모바일 앱과 웹 앱 중 어느 쪽을 지원해야하나요?
- 가장 중요한 기능은 무엇인가요?
- 뉴스 피드는 시간 역순으로 정렬되어야 하나요?
- 한 사용자는 최대 몇 명의 사용자와 친구를 맺을 수 있나요?
- 사이트로 오는 트래픽 규모는 어느 정도인가요?
- 피드에 이미지나 비디오도 올라올 수 있나요? 포스트는 그저 텍스트인가요?
Step2. 개략적인 설계안 제시 및 동의 구하기
- 설계안에 대한 치초 청사진을 제시하고 의견을 구하기
- 화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램 그리기
- 최초 설계안이 시스템 규모에 관계된 제약사항들을 만족하는지 개략적으로 계산
예제.
- 두가지 flow로 나눌 수 있다.
- 피드 발행
- 사용자가 포스트를 올리면 관련된 데이터가 캐시/데이터베이스에 기록
- 해당 사용자의 친구 뉴스 피드에 뜨게 됨
- 피드 생성
- 어떤 사용자의 뉴스 피드는 해당 사용자 친구들의 포스트를 시간 역순으로 정렬
Step3. 상세 설계
- 면접관과 다음 목표는 달성한 상태
- 시스템에서 전반적으로 달성해야 할 목표와 기능 범위 확인
- 전체 설계의 개략적 청사진 마련
- 해당 청사진에 대한 면접관의 의견 청취
- 상세 설계에서 집중해야 할 영역 확인
- 해야하는 것
- 설계 대상 컴포넌트 간 우선순위 지정
- 불필요한 세부사항에 시간 쓰지 말 것.
- 가장 중요한 컴포넌트부터 진행
Step4. 마무리
- 설계 결과물에 관련된 후속 질문
- 스스로 추가 논의 진행
- 시스템 병목구간, 더 개선 가능한 지점 찾아내라고 할 땐?
- 개선할 부분이 없다는 답은 X. 개선할 점은 언제나 있음.
- 비판적 사고 능력
- 만든 설계 다시 요약
- 긴 면접 세션이 끝난 뒤 면접관의 기억을 환기시켜주는 효과
- 오류가 발생하면 무슨 일이 생기는지 따져보기
- 운영 이슈
- 메트릭은 어떻게 수집, 모니터링?
- 로그는?
- 시스템은 어떻게 배포(roll-out)할 것인가?
- 미래에 닥칠 규모 확장 요구에 어떻게 대처?
- 진행 중 막혔다면, 힌트를 청하기
- 소통 주저하지 말기. 침묵 속에 설계를 진행하기 말기.
- 의견을 일찍, 자주 구하기
시간 배분
- 문제 이해 및 설계 범위 확정: 3M ~ 10M
- 개략적 설계안 제시 및 동의 구하기: 10M ~ 15M
- 상세 설계: 10M ~ 25M
- 마무리: 3M ~ 5M