포스팅에 사용된 그림은 책에서 제공하는 그림들 입니다.
시스템 설계 면접은 정해진 결말도 없고, 정답도 없는 모호한 면접이다. 이 면접의 핵심은 설계 기술을 시연하는 자리이고, 설계 과정에서 내린 결정들에 대한 방어 능력을 보이는 자리이며, 면접관의 피드백을 ‘건설적인’방식으로 처리할 자질이 있음을 보이는 자리이다.
시스템 설계에서 평가하고자 하는 것은
- 지원자가 협력에 적합한 사람인가?
- 압박이 심한 상황도 잘 헤쳐 나갈 자질이 있는가?
- 모호한 문제를 건설적으로 해결할 능력이 있는가?
- 좋은 질문을 던질 능력이 있는가?
훌륭한 면접관은 부정적인 신호도 놓치지않는다. 설계의 순수성에 집착한 나머지 타협적 결정을 도외시하고 과도한 엔지니어링을 하고 마는 엔지니어가 현업에도 많기 때문이다. 그런 엔지니어들은 과도한 엔지니어링의 결과로 시스템 전반의 비용이 올라간다는 사실을 알아 채지 못한다 이런 경향이 있다는 것을 보이고 싶지 않을것이고, 이것 외에도 부정적 신호로는 완고함, 편헙함같은 것들도 있다.
효과적 면접을 위한 4단계 접근법
1단계 문제 이해 및 설계 범위 확정
요구사항을 완전히 이해하고 답을 내놓아라.
요구사항을 정확히 이해하는 데 필요한 질문을하라. 예를들면,
- 구체적으로 어떤 기능들을 만들어야 하나?
- 제품 사용자 수는 얼마나 되나?
- 회사의 규모는 얼마나 빨리 커지리라 예상하나? 석 달, 여섯 달, 일년 뒤의 규모는 얼마가 되리라 예상하는가?
- 회사가 주로 사용하는 기술 스택(technology stack)은 무엇인가? 설계를 단순화하기 위해 활용할 수 있는 기존 서비스로는 어떤 것들이 있는가?
2단계 개략적인 설계안 제시 및 동의 구하기
면접관과 협력하며 진행하면 좋다.
- 설계안에 대한 청사진을 제시하고 의견을 구하라. 면접관을 팀원인 것처럼 대하라. 훌륭한 면접관들은 지원자들과 대화하고 설계 과정에 개입하기를 즐긴다.
- 화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그려라. 클라이언트(모바일/웹), API, 웹 서버, 데이터 저장소, 캐시, CDN, 메시지 큐 같은 것들이 포함될 수 있을 것이다.
- 이 최초 설계안이 시스템 규모에 관계된 제약사항들을 만족하는지 개략적으로 계산해 보라. 계산 과정은 소리 내어 설명하라. 아울러, 이런 개략적 추정이 필요한지는 면접관에게 미리 물어보도록 하자.
이 단계에서 API 엔드포인트나 뎅티ㅓ베이스 스키마보 보여야하는가? 이건 물어보자.
3단계 상세 설계
- 시스템에서 전반적으로 달성해야 할 목표와 기능 범위 확인
- 전체 설계의 개략적 청사진 마련
- 해당 청사진에 대한 면접관의 의견 청취
- 상세 설계에서 집중해야 할 영역들 확인
위 목표는 달성한 상태일것이다.
면접 시에는 시간 관리에도 특별히 주의를 기울여야 한다. 사소한 세부사항을 설명하느라 정작 여러분의 능력을 보일 기회를 놓쳐버릴 수도 있기 때문이다.
4단계 마무리
이 마지막 단계에선 면접관은 설계 결과물에 관련된 몇 가지 후속 질문을 던질 수도 있고 여러분 스스로 추가 논의를 진행하도록 할 수 도 있다.
- 면접이 끝나고 시스템 병목구간, 혹은 좀 더 개선 가능한 지점을 찾아내라 주문할 수 있다. 완벽한 설계라고 하지말고, 개선할 점은 언제나 있다. 이런 질문은 여러분의 비판적 사고 능력을 보이고, 마지막으로 좋은 인상을 남길 기회다.
- 만든 설계를 다시 한번 요약해주는 것도 도움이 될 수 있다. 면접관의 기억을 환기시켜주는 효과가 있을 것 이다.
- 오류가 발생하면 무슨 일이(서버 오류, 네트워크 장애 등) 따져보면 흥미로울 것이다.
- 운영 이슈도 논의할 가치가 충분하다. 메틝은 어떻게 수집하고 모니터링 할 것인가? 로그는? 시스템은 어떻게 배포해 나갈 것인가?
- 미래에 닥칠 규모 확장 요구에 어떻게 대처할 것인지도 흥미로운 주제다.
- 시간이 좀 남았다면, 필요하지만 다루지 못했던 세부적 개선사항들을 제안할 수 있다.
해야 할것
- 질문을 통해 확인해라. 스스로 내린 가정이 옳다 믿고 진행하지 말라.
- 문제의 요구사항을 이해하라.
- 정답이나 최선의 답안 같은 것은 없다는 점을 명심하라. 스타트업을 위한 설계안과 수백만 사용자를 지원해야 하는 중견 깅버을 위한 설계안이 같을리가 없다.
- 면접관이 여러분의 사고 흐름을 이해할 수 있도록 하라.
- 가능하다면 여러 해법을 함께 제시하라.
- 가능하다면 여러 해법을 함께 제시하라.
- 개략적 설계에 면접관이 동의하면, 각 컴포넌트의 세부사항을 설명하기 시작하라.
- 면접관의 아이디어를 이끌어 내라. 좋은 면접관은 여러분과 같은 팀원처럼 협력하라.
- 포기하지 말라.
하지 말아야 할것
- 전형적인 면접 문제들에도 대비하지 않은 상태에서 면접장에 가지 마라.
- 요구사항이나 가정들을 분명히 하지 않은 상태에서 설계를 제시하지 마라.
- 처음부터 특정 컴포넌트의 세부사항을 너무 깊이 생각하지마라.
- 진행 중에 막혔다면, 힌트를 청하기를 주저하지 말라.
- 다시 말하지만, 소통을 주저하지 말라. 침묵 속에 설계를 진행하지 말라.
- 설계안을 내놓는 순간 면접이 끝난다고 생각 하지말라.
시간 배분
대략적인 추정치일 뿐이다.
- 문제 이해 및 설계 범위 확정: 3분에서 10분
- 개략적 설계안 제시 및 동의 구하기: 10분에서 15분
- 상세 설계: 10분에서 25분
- 마무리: 3분에서 5분