[대규모 시스템 설계 기초] 03. 시스템 설계 면접 공략법
03. 시스템 설계 면접 공략법
해당 면접은 정말 시스템을 하나 만들라는것이 아니다, 두 명의 동료가 모호한 문제를 풀기 위해 협력하여 그 해결책을 찾아내는 과정에 대한 시뮬레이션이다.
나의 설계 기술을 시연하는 자리이다. 설계 과정에서 내린 결정들에 대한 방어 능력을 보여주고, 면접관의 피드백을 건설적인 방식으로 받아들여 처리하는 자질을 보여주는 자리인 것이다.
기술적 측면을 평가하는 자리가 아닌 협력에 적합한 사람인지, 압박이 심한상황도 잘 헤쳐나갈 수 있는지, 모호한 문제를 건설적으로 해결할 능력이 있는지 등을 살펴본다. (오버 엔지니어링을 하는지도)
효과적 면접을 위한 4단계 접근법
1단계. 문제 이해 및 설계 범위 확정
이 단계에서는 요구사항을 이해하고 모호함을 없애는게 이 단계에서 가장 중요하다
깊이 생각하고 질문하여 요구사항과 가정들을 분명히 한 다음 답을 내놓자. 급박하게 생각하면 잘못된 시스템을 설계할 가능성이 높아진다.
- 올바른 질문을 하자.
- 적절한 가정을 하자.
- 시스템 구축에 필요한 정보를 모으자.
어떤 질문을 해야하는가? 아래를 참고하자.
- 구체적으로 어떤 기능들을 만들어야 하는가?
- 제품 사용자 수는 얼마나 되는가?
- 회사의 규모는 얼마나 빨리 커지리라 예상하는가? 3달, 6달, 1년뒤의 규모는 얼마가 될 것인가?
- 회사가 주로 사용하는 기술 스택은 무엇인가?
- 설계를 단순화하기 위해 활용할 수 있는 기존 서비스는 어떤것이 있는가?
예제
뉴스피드 시스템 설계하는 예제이다.
- Q. 모바일 앱과 웹 앱 가운데 어떤걸 지원해야하나?
- A. 둘다 지원해야 한다.
- Q. 가장 중요한 기능은 무엇인가?
- A. 새로운 포스트를 올리고, 다른 친구의 뉴스 피드를 볼 수 있도록 하는 기능이다.
- Q. 뉴스피드는 어떻게 정렬되어야 하나? 묻는 이유는 포스트마다 다른 가중치가 부여되어야 하는지 알고싶어서이다. 가령 가까운 친구의 포스트가 사용자 그룹에 올라가는 포스트보다 더 중요하다거나.
- A. 문제를 단순하게 하기 위해 시간 역순으로 정렬된다고 가정한다.
- Q. 한 사용자는 최대 몇명의 사용자와 친구를 맺을 수 있는가?
- A. 5000명이다.
- Q. 사이트로 오는 트래픽 규모는?
- A. DAU는 천만명이다.
- Q. 피드에 미디어도 올라오는가?
- A. 그렇다.
2단계. 개략적인 설계안 제시 및 동의 구하기
이 단계에서는 개략적인 설계안을 제시하고 면접관의 동의를 얻는것이다.
- 설계안에 대한 최초 청사진을 제시하고 의견을 구하라.
- 면접관을 마치 팀원인 것처럼 대하라. 훌륭한 면접관은 설계 과정에 개입하길 즐긴다.
- 화이트보드나 종이에 핵심 컴포넌트를 포함하는 아키텍처 다이어그램을 그려라.
- 설계안이 시스템 규모에 관계된 제약사항들을 만족하는지 개략적으로 계산해보자.
- 계산과정은 소리내에 설명하고, 이런 추정이 필요한진 면접관에게 미리 물어보자.
- 시스템의 구체적 사용사례도 몇가지 살펴본다면 엣지 케이스를 발견하는데 도움 될 것이다.
- 세부적인 API 엔드포인트나 DB 스키마까지 보여야 하는지는 규모에 따라 다르다.
- 큰 규모의 경우는 지나치게 세부적이고, 간단한 서비스정도라면 괜찮을 것이다. 면접관에게 물어보자.
예제
개략적으로 피드 발행(feed publishing)과 피드 생성(feed building)이라는 두가지 처리 플로우로 나눠 생각해 볼 수 있다.
피드 발행
- 사용자가 포스트를 올리면 관련된 데이터가 캐시/데이터베이스에 기록되고, 해당 사용자의 친구 뉴스피드에 뜨게 됨.
피드 생성
- 어떤 사용자의 뉴스피드는 해당 사용자 친구들의 포스트를 시간 역순으로 정렬하여 만든다.
3단계. 상세 설계
이 단계에서 중요한 것은 설계 대상 컴포넌트 사이의 우선순위를 정하는 것이다.
- 어떤 때엔 면접관은 지원자가 집중했으면 하는 영역을 알려주기도 한다. 대부분의 면접관은 특정 시스템 컴포넌트들의 세부사항을 깊이 있게 설명하는 걸 보길 원한다.
- 시간 관리에 특별히 주의를 기울여야 한다. 불필요한 세부사항에 시간을 쓰지 말라.
예제
- 피드발행
- 뉴스 피드 가져오기
4단계. 마무리
면접관은 결과물에 관련된 몇 가지 후속 질문을 던질 수 있고, 스스로 추가 논의를 진행하도록 할 수도 있다.
- 면접관이 병목구간 혹은 개선 지점을 찾아내라 주문할 때 완벽하다거나 개선할 부분이 없다는 답은 하지말자.
- 개선할 점은 언제나 있다. 당신의 비판적 사고를 보여주어라.
- 당신의 설계를 한번 요약해 주는것이 도움이 된다.
- 여러 해결책을 제시 한 경우 면접관의 기억을 환기 시켜주는 효과가 있다.
- 오류 상황을 따져본다면 흥미로울 것이다.
- 운영 이슈도 논의할 가치가 충분하다. (메트릭, 로그, 배포)
- 미래에 닥칠 규모 확장 요구에 어떻게 대처할 것인지도 흥미로운 주제다.
- 시간이 남는다면 세부적 개선사항들을 제안할 수 있다.
해야할 것
- 질문을 통해 확인하라.
- 문제의 요구사항을 이해하라.
- 정답이나 최선의 답안 같은 건 없다.
- 면접관과 소통하라.
- 여러 해법을 함께 제시하라.
- 개략적 설계에 면접관이 동의하면 각 컴포넌트의 세부사항을 설명해라. 가장 중요한 컴포넌트부터.
- 면접관의 아이디어를 이끌어내라.
- 포기하지 말라.
하지 말아야 할 것
- 전형적인 면접문제도 대비하지 않고 면접장에 가지 말라.
- 요구사항이나 가정을 분명히 하지 못한채로 설계를 제시하지 말라.
- 처음부터 특정 컴포넌트의 세부사항을 너무 깊이 설명하지 말라. 개략적 설계 후 세부사항으로 나아가라.
- 진행중에 막혔다면 힌트를 요청해라.
- 소통을 주저하지 말라. 침묵 속에 설계를 진행하지 말라.
- 설계를 내놓은 순간 면접이 끝난다고 생각하지 말라.
- 의견을 일찍, 그리고 자주 구하라.