- 시스템 설계는 단순해보이지만, 결국 복잡한 것을 설계하게 된다.
- 이러한 복잡한 시스템을 완벽하게 설계하는 것을 기대하지 않는다.
- 결국 모호한 문제를 협력하여 해결해나가는 과정이다.
- 답도 없고, 정해진 결말도 없다.
- 설계 과정에서 내린 결정을 증명하고 방어하는 자리
- 또한, 면접관의 피드백을 건설적으로 처리할 능력을 보여주는 자리
⇒ 시스템 설계 면접은 결국, “협력에 적합한 사람인지, 압박이 심한 상황에서 잘 헤쳐 나갈 자질이 있는지, 모호한 문제를 건설적으로 해결할 능력이 있는지" 를 살펴보는 자리.
효과적 면접을 위한 4단계 접근법
문제 이해 및 설계 범위 확정
- 바로 답을 내지 마라
- 깊이 생각하고 질문하여, 요구사항과 가정을 분명히 하라
- 아래와 같은 질문을 생각해보자.
- 구체적으로 어떤 기능을 만들어야하는가?
- 제품 사용자는 얼마나 되나?
- 회사의 규모는 얼마나 빠르게 커지리 예상하나?
- 회사의 기술 스택은 무엇인가?
개략적인 설계안 제시 및 동의 구하기
- 설계안에 대한 최초 청사진 제시 및 의견 구하기
- 화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그려라
- 설계안이 시스템 규모에 관계된 제약사항들을 만족하는지 개략적으로 계산해보아라
상세 설계
- 시스템에서 전반적으로 달성해야 할 목표와 기능 범위 확인
- 전체 설계의 개략적 청사진 마련
- 해당 청사진에 대한 면접관의 의견 청취
- 상세 설계에서 집중해야 할 영역들 확인
마무리
- 면접관이 시스템 병목구간, 혹은 더 개선 가능한 지점을 찾아낼 주문 가능
- 개선점은 언제나 있기 마련, 비판적으로 사고하고 개선점을 찾아내자.
- 설계를 다시 요약해주는 것도 도움이 될 수 있음.
- 오류가 발생하면 무슨 일이 생기는지 따져보면, 흥미로울 것
- 운영 이슈도 논의해보자
- 메트릭은 어떻게 수집하고, 모니터링 할 것인가.
- 로그는 어떻게 관리하고, 배포할 것인가
- 미래에 닥칠 규모 확장 요구에 대해 어떻게 대처할 것인지
- 필요하지만 다루지 못한 세부적인 사항들도 제안
해야 할 것
- 질문을 통해 확인해라
- 문제의 요구사항을 이해하라
- 정답이나 최선의 답은 없다. 요구사항을 정확하게 이해했는지 확인해라
- 면접관이 사고 흐름을 이해할 수 있도록하라
- 가능하다면 여러 해법을 함께 제시해라
- 개략적 설계에 면접관이 동의하면, 각 컴포넌트의 세부사항을 설명하기 시작하라
- 면접관의 아이디어를 이끌어내라. 면접관이 팀원처럼 협력하도록해라
- 포기하지 마라
하지 말아야 할 것
- 전형적인 문제도 대비하지 않고, 면접장에 가지 않기
- 요구사항이나 가정들을 분명히 하지 않은 상태에서 설계를 제시 X
- 처음부터 특정 컴포넌트의 디테일에 집착 X
- 개략적인 설계를 마친 뒤, 세부사항으로 나아가라
- 다시 말하지만, 소통을 주저 X
- 설계안을 내놓는다고 면접이 끝인게 X
시간 배분
보통 시스템설계 면접은 45분 혹은 1시간이 충분하지 않을 수 있다. 이러한 관점에서 시간관리는 필수적이고, 대략 아래와 같은 시간을 배분하자.
- 문제 이해 및 설계 범위 확정 : 3분 ~ 10분
- 개략적 설계안 제시 및 동의 구하기 : 10분 ~ 15분
- 상세 설계 : 10분에 ~ 25분
- 마무리 : 3분 ~ 5분