시스템 설계 면접 가이드
시스템 설계 면접 가이드
1. 시스템 설계 면접을 하는 이유
시스템 설계 면접은 “널리 알려진 제품 X를 설계해 보라”는 식으로 막연한 문제가 나올 때도 있다. 이런 질문들은 모호하고, 범위도 지나치게 넓다. 어떻게 한 시간 안에 설계한단 말인가? 불편하게 느끼는 것이 당연하다.
좋은 소식 하나는, 그런 시스템을 한 사람이 완벽하게 설계할 수 있으리라 아무도 기대하지 않는다는 것이다. 그렇다면, 대체 시스템 설계 면접이 있는 이유는 무엇일까?
시스템 설계 면접은 두 명의 동료가 모호한 문제를 풀기 위해 협력하여 그 해결책을 찾아내는 과정을 시뮬레이션하는 것이다. 이 문제에는 정해진 결말도 정답도 없다.
즉, 시스템 설계 면접은 여러분의 설계 기술을 시연하는 자리이고, 설계 과정에서 내린 결정들에 대한 방어 능력을 보이는 자리이며, 면접관의 피드백을 건설적으로 처리할 자질이 있음을 보여주는 자리이다.
(물론, 설계에 사용된 기술에 대한 기본적인 이해는 필수이며, 깊이 있는 지식이 있으면 더 좋다.)
면접관이 시스템 설계에서 확인하고자 하는 것은 다음과 같다.
- 지원자가 협력에 적합한 사람인지,
- 압박이 심한 상황도 잘 헤쳐 나갈 자질이 있는지,
- 모호한 문제를 건설적으로 해결할 능력이 있는지,
- 좋은 질문을 던질 능력이 있는지
또한 설계의 순수성에 집착한 나머지 trade-off를 무시하거나, 불필요하게 과설계(over-engineering)하는지도 살펴본다.
2. 효과적인 면접을 위한 4단계 접근
- 1단계: 문제 이해 및 설계 범위 확정 (3분 ~ 10분)
- 2단계: 개략적인 설계안 제시 및 동의 구하기 (10분 ~ 15분)
- 3단계: 상세 설계 (10분 ~ 25분)
- 4단계: 마무리 (3분 ~ 5분)
1단계 - 문제 이해 및 설계 범위 확정
- 요구사항을 완전히 이해하지 않고 답을 내놓는 행위는 매우 부정적인 신호다.
- 속도를 늦추고, 깊이 생각하며 질문하여 요구사항과 가정을 분명히 하라.
- 엔지니어가 가져야 할 가장 중요한 기술은
올바른 질문,적절한 가정,시스템 구축에 필요한 정보 수집이다. - 요구사항은 반드시 화이트보드나 종이에 정리해 두어야 한다.
- 어떤 질문을 해야 할까? 요구사항을 정확히 이해하기 위한 질문을 던져야 한다.
- 데이터를 수집해야 할 소스는 어디인가요?
- 얼마나 많은 사용자가 얼마나 많은 TPS를 발생시키나요?
- HA(고가용성)와 DR(재해 복구) 구성이 필수인가요?
- 수집된 데이터는 어떻게 활용되나요?
- 사용자에게 어떤 데이터를 어느 정도의 지연(latency)으로 제공해야 하나요?
- 주로 사용하는 기술 스택을 기반으로 해야 하나요?
- 데이터 처리 고려사항 및 제약 사항
- 멱등성
- 업데이트 처리
- 데이터 정합성 문제 해결책
- 데이터 정합성 검증
- 중복 처리
2단계: 개략적인 설계안 제시 및 동의 구하기
- 설계안에 대한 최초 청사진을 제시하고 의견을 구하라.
- 면접관을 팀원처럼 대화하라.
- 훌륭한 면접관들은 지원자와 대화하며 설계 과정에 개입하기를 즐긴다.
- 설계안의 세부 범위는 면접관의 질문 방향에 따라 달라질 수 있다.
(규모가 크면 큰 그림을, 작으면 세부적인 내용을 더 깊게 설명하면 된다.)
3단계: 상세 설계
- 시스템에서 달성해야 할 목표와 기능 범위를 확인하라.
- 전체 설계의 개략적 청사진을 마련하고 면접관의 의견을 들어라.
- 상세 설계에서 집중해야 할 영역을 확인하라.
- 면접관은 설계 대상의 우선순위를 정할 것이다.
- 짧은 시간 안에 모든 것을 다룰 수 없기 때문이다.
- 시스템 성능 관련 질문이라면, 병목 구간이나 자원 요구량 추정에 집중해야 한다.
- 사소한 세부사항을 설명하느라 면접관이 원하는 포인트를 놓칠 수 있다.
- 면접관에게 긍정적인 신호를 전달하는 데 집중해야 한다.
- 불필요한 세부사항에 시간을 쓰지 말라.
4단계: 마무리
- 설계 결과물과 관련해 후속 질문이 있을 수 있다.
- 지원자 스스로 추가 논의를 제안할 수도 있다.
- 면접관이 시스템 병목 구간이나 개선 가능한 지점을 찾도록 주문할 수도 있다.
- 이때 설계가 완벽하다거나 개선할 부분이 없다고 답하지 말라.
- 개선점은 항상 존재한다.
- 이는 비판적 사고 능력을 보여줄 수 있는 기회이자 마지막으로 좋은 인상을 남길 기회다.
- 자신이 만든 설계를 다시 요약해 주는 것도 효과적이다.
- 여러 해결책을 제시했다면, 긴 면접 후 면접관의 기억을 환기시켜 주는 효과가 있다.
- 오류 발생 시 어떤 일이 생기는지(서버 장애, 네트워크 장애 등)를 따져보는 것도 흥미로운 논의 주제다.
- 운영 이슈도 반드시 다룰 가치가 있다.
- 메트릭은 어떻게 수집하고 모니터링할 것인가?
- 로그 관리 방식은?
- 시스템 배포 전략은?
- 미래에 닥칠 규모 확장 요구에 어떻게 대응할지도 흥미로운 주제가 될 수 있다.
3. 해야 할 것과 하지 말아야 할 것
해야 할 것
- 질문을 통해 확인하라. 스스로 내린 가정이 옳다고 믿고 진행하지 마라.
- 문제의 요구사항을 이해하라.
- 정답이나 최선의 답은 없다. 요구사항을 정확히 이해했는지 다시 확인하라.
- 면접관이 여러분의 사고 흐름을 이해할 수 있도록 설명하라.
- 면접관과 적극적으로 소통하라.
- 가능하다면 여러 해법을 함께 제시하라.
- 개략적 설계에 면접관이 동의하면, 가장 중요한 컴포넌트부터 세부사항을 설명하라.
- 포기하지 마라.
하지 말아야 할 것
- 전형적인 면접 문제들에 대비하지 않은 상태에서 면접장에 가지 마라.
- 요구사항과 가정이 분명하지 않은 상태에서 설계를 제시하지 마라.
- 처음부터 특정 컴포넌트의 세부사항을 너무 깊게 설명하지 마라.
- 개략적인 설계를 마친 뒤 세부사항으로 나아가라.
- 진행 중 막히면 힌트를 청하는 것을 주저하지 마라.
- 다시 말하지만, 소통을 주저하지 마라. 침묵 속에서 설계를 진행하지 마라.
- 설계안을 내놓는 순간 면접이 끝났다고 생각하지 마라. 면접관이 끝났다고 말하기 전까지는 끝난 것이 아니다. 의견을 일찍, 그리고 자주 구하라.
This post is licensed under CC BY 4.0 by the author.