•
시스템 설계 면접은 두 명의 동료가 모호한 문제를 풀기 위해 협력하여 그 해결책을 찾아내는 과정에 대한 시뮬레이션이다.
•
이 문제는 정해진 결말도 없고 정답도 없다. 최종적으로 도출되는 설계안은 당신이 설계 과정에 들인 노력에 비해 중요하지 않다는 것이다.
•
이 면접은 설계 기술을 시연하는 자리며 이 과정에서 내린 결정들에 대해 방어 능력을 보이는 자리이자. 면접관의 피드백을 건설적인 방식으로 처리할 자질이 있음을 보이는 자리이다.
•
주의할 사항은 다음과 같다.
◦
기술적 역량만을 보는 것이 아니다.
▪
협업에 적합한지, 압박에도 잘 헤쳐 나갈 수 있는지, 모호한 문제를 요구사항 분석을 통해 해결할 능력이 있는지, 이 과정에서 내뱉는 질문들은 적절한지 등도 본다.
◦
설계의 순수성의 가치에 집착한 나머지 상충관계를 고려하지 않고 오버 엔지니어링해버릴 수 있다.
효과적 면접을 위한 4단계 접근법
•
시스템 설계 면접의 공통적인 부분이다.
1단계 문제 이해 및 설계 범위 확정
•
이 단계에서의 초점은 문제를 이해하고 적절한 질문을 통해 분석하는 것이다.
•
면접은 퀴즈 쇼가 아니다. 답부터 들이밀지 말고 속도를 늦춰야 한다.
•
가장 먼저 해야하는 것은 내게 주어진 문제가 무엇인지 이해하고 분석하는 것부터다.
•
가정을 하고, 시스템 구축에 필요한 정보를 모으기 위해 질문하라.
◦
구체적으로 어떤 기능들을 만들어야 하나?
◦
제품 사용자 수는 얼마나 되나?
◦
회사의 규모는 얼마나 빨리 커지리라 예상하나? 석 달, 여섯 달, 일년 뒤의 규모는 얼마가 되리라 예상하는가?
◦
회사가 사용중인 기술 스택은 무엇인가? 설계를 단순화하기 위해 사용할 수 있는 기존 서비스는 무엇이 있는가?
2단계 개략적인 설계안 제시 및 동의 구하기
•
이 단계에서의 초점은 개략적인 설계안을 제시하고 면접관의 동의를 얻는 것이다. 이 과정은 면접관과 협력하며 진행하면 좋다.
◦
설계안의 최초 청사진을 제시하고 의견을 구하라.
◦
화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그려라.
◦
이 최초 설계안이 시스템 규모에 관계된 제약사항들을 만족하는지를 개략적으로 계산해보라.
•
가능하다면 시스템의 구체적 사용 사례도 몇 가지 고민하자. 이 과정에서 엣지 케이스를 발견해낼 수도 있을 것이다.
•
어느 단계까지 설계해야하는 가에 대한 물음은 시스템의 규모에 따라 달라진다. 물어봐서 결정하거나 적절히 선택하자.
3단계 상세 설계
•
이 단계에서의 초점은 개략적인 설계안 별로 구체화를 시도하는 것이다.
•
이 단계까지 왔다면 다음의 사항들은 이미 달성한 상태라고 가정한다.
◦
시스템에서 전반적으로 달성해야 할 목표와 기능 범위 확인
◦
전체 설계의 개략적 청사진 마련
◦
해당 청사진에 대한 면접관의 의견 청취
◦
상세 설계에서 집중해야 할 영역들 확인
•
너무 구체적인 사항에 매몰되지 않도록 한다. 시간이 너무 많이 들 뿐더러 우리는 설계해야할 것들이 너무나도 많다.
4단계 마무리
•
이 단계에서 우리는 방어 능력을 시험당한다.
•
면접관 별로 중요시 여기는 가치들에 대해 질문이 들어올 것이며 시스템 병목 구간, 좀 더 개선 가능한 지점들을 찾아내라 주문할 것이다.
•
우리가 만든 설계를 다시 한번 요약해주는 것도 도움이 될 수 있다. 여러 해결책을 제시한 경우에는 특히나 더 좋다.
•
오류가 발생하면 무슨 일이 생기는지, 어떻게 퍼져나가는 지를 따져보는 것도 흥미로울 것이다.
•
운영 이슈도 논의할 가치가 충분한다. 어떻게 로그를 발생시키고 수집하며, 모니터링할 것인가? 시스템은 어떻게 배포할 것인가?
•
미래에 닥쳐올 규모 확장에 대한 논의도 재밌을 것이다.
•
시간이 좀 남는다면 좀 더 세부적인 사항들을 개선시켜도 좋을 것이다.
시스템 면접 세션에서 해야할 것
•
질문을 통해 확인하라. 스스로 내린 가정이 옳다고 믿지 말라.
•
문제의 요구사항을 이해하라.
•
정답이나 최선의 답안 같은 것은 없다는 점을 명심하라. 상충 관계를 고려해서 결정하라.
•
면접관이 우리의 사고 흐름을 잘 이해할 수 있도록 하라. 즉, 소통하라.
•
가능하다면 여러 해법을 함께 제시하라.
•
개략적 설계에 면접관이 동의한다면 각 컴포넌트의 세부 사항을 설명하기 시작하라. 가장 중요한 컴포넌트부터
시스템 면접 세션에서 하지 말아야할 것
•
대비도 안 된 상태에서 임하지 말라.
•
요구사항이나 가정들을 충분히 숙지하지 않은 상태에서 설계를 제시하지 말라.
•
처음부터 특정 컴포넌트의 세부사항을 너무 깊이 설명하지 말라. 개략적 설계를 마친 후 세부사항으로 나아가는 것이 순서다.
•
진행 중에 막혔다면 힌트를 청하기를 주저하지 말라.
•
다시 말하지만 소통을 많이 하자. 침묵 속에 설계를 이어나가지 말자.
•
설계안을 내놓는 순간 면접이 끝난 것이 아니다. 그제서야 시작되는 것이다.
시간 배분
•
보통 45분에서 1시간 정도를 면접에 소요하게 될 것이다. 따라서 시간 관리가 중요하다.
•
각 단계별 대략적 추정치다. 실제로 소모되는 시간은 면접관의 요구사항이나 문제의 범위에 따라 달라질 것이다.
◦
1단계 - 3분에서 10분
◦
2단계 - 10분에서 15분
◦
3단계 - 10분에서 25분
◦
4단계 - 3분에서 5분