3장은 실제 면접의 접근법에 대해 설명해주고 있다. 나는 당장은 면접을 준비하고 있는 것은 아니지만, 실제 업무에서도 마찬가지로 책의 내용대로 사고하는 방식은 좋은 접근일 것 같다는 생각을 했다. 사실 면접이라는 것은 업무를 잘하는 사람을 뽑기 위함이니, 당연한 것이라고도 생각이 든다. 아래 내용에서 면접관을 상사라고 치환하면 동일한 내용일 것이다.
- 시스템 설계 면접은 두 명의 동료가 모호한 문제를 풀기 위해 협력하여 그 해결책을 찾아내는 과정에 대한 시뮬레이션이다.
- 이 문제에는 정해진 결말도, 정답도 없다.
- 면접은 설계 기술을 시연하는 자리이며, 설계 과정에서 내린 결정들에 대한 방어 능력을 보이는 자리이다.
- 기술적 측면을 평가하는 것 이상으로, 협력에 적합한 사람인지, 압박이 심한 상황도 잘 헤쳐 나갈 자질이 있는지, 모호한 문제를 건설적으로 해결할 능력이 있는지 등을 살펴볼 수 있고, 좋은 질문을 던질 능력이 있는지도 중요하다.
- 설계의 순수성(purity)에 집착한 나머지 타협적 결정(tradeoff)을 도외시하고 과도한 엔지니어링(over-engineering)을 하는 엔지니어들이 현업에도 많은 만큼, 이런 엔지니어들과 같은 경향이 있는 것을 원치 않을 것이다.
효과적인 면접을 위한 4단계 접근법
시스템 면접 설계는 전부 제각각이며 정답이 없지만, 그 절차나 범위에는 공통적인 부분이 존재한다.
1단계) 문제 이해 및 설계 범위 확정
시스템 설계 면접에서는 생각 없이 바로 답을 내서는 좋지 않다.
요구사항을 완전히 이해하고 답을 내놓는 것이 좋다.
요구사항을 정확히 이해하는 질문으로는 아래의 질문들을 생각해 볼 수 있다.
- 구체적으로 어떤 기능을 만들어야 하나?
- 제품 사용자 수는 얼마나 되나?
- 회사의 규모는 얼마나 빨리 커지리라 예상하나? 석 달, 여섯 달, 일 년 뒤의 규모는 얼마가 되리라 예상하는가?
- 회사가 주로 사용하는 기술 스택(technology stack)은 무엇인가? 설계를 단순화하기 위해 활용할 수 있는 기존 서비스로는 어떤 것들이 있는가?
2단계) 개략적인 설계안 제시 및 동의 구하기
이 단계에서 초점을 맞추어야 할 것은 개략적인 설계안을 제시하고 면접관의 동의를 얻는 것이다. 이 과정은 면접관과 협력하며 진행하면 좋다.
- 설계안에 대한 최초 청사진을 제시하고 의견을 구하라. 면접관을 마치 팀원인 것처럼 대하라. 훌륭한 면접관들은 지원자들과 대화하고 설계 과정에 개입하기를 즐긴다.
- 화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그려라. 클라이언트(모바일/웹), API, 웹 서버, 데이터 저장소, 캐시, CDN, 메시지 큐 같은 것들이 포함될 수 있을 것이다.
- 이 최초 설계안이 시스템 규모에 관계된 제약사항들을 만족하는지를 개략적으로 계산해 보라. 계산 과정은 소리 내어 설명하라. 아울러, 이런 개략적인 추정이 필요한지는 면접관에게 미리 물어보자.
3단계) 상세 설계
이 단계로 왔다면 다음 목표는 달성한 상태일 것이다.
- 시스템에서 전반적으로 달성해야 할 목표와 기능 범위 확인
- 전체 설계의 개략적인 청사진 마련
- 해당 청사진에 대한 면접관의 의견 청취
- 상세 설계에서 집중해야 할 영역들 확인
이제 면접관과 해야 할 일은 설계 대상 컴포넌트 사이의 우선순위를 정하는 것이다.
똑같은 면접은 없으며, 어떨 때는 면접관이 집중했으면 하는 영역을 알려주기도 한다.
- 시스템 성능 특성에 대한 질문의 경우, 시스템의 병목 구간이나 자원 요구량 추정치에 초점이 맞춰져 있을 것
대부분의 경우 면접관은 우리가 특정 시스템 컴포넌트들의 세부사항을 깊이 있게 설명하는 것을 보길 원한다.
- 단축 URL 생성기(URL shortener) 설계에 관한 것이었다면, 그 해시 함수의 설계를 구체적으로 설명하는 것을 듣고 싶어 할 것
- 채팅 시스템에 관한 문제였다면, 어떻게 하면 지연시간(latency)을 줄이고 사용자의 온/오프라인 상태를 표시할 것인지를 듣고자 할 것
4단계) 마무리
이 마지막 단계에서 면접관은 설계 결과물에 관련된 몇 가지 후속 질문을 던질 수도 있고(follow-up questions), 우리가 스스로 추가 논의를 진행하도록 할 수도 있다.
- 면접관이 좀 더 개선 가능한 지점을 찾아내라 주문할 수 있다. 이때 우리의 설계가 완벽하다거나 개선할 부분이 없다는 답은 하지 않도록 하자. 개선할 점은 언제나 있기 마련. 이런 질문은 비판적 사고 능력을 보이고, 마지막으로 좋은 인상을 남길 기회이다.
- 우리가 만든 설계를 다시 한번 요약해 주는 것도 도움이 될 수 있다. 면접관의 기억을 환기시켜 주는 효과가 있다.
- 오류가 발생하면 무슨 일이 생기는지(서버 오류, 네트워크 장애 등) 따져보면 흥미로울 것이다.
- 운영 이슈도 논의할 가치가 충분하다. 메트릭은 어떻게 수집하고 모니터링할 것인가? 로그는? 시스템은 어떻게 배포해(roll-out) 나갈 것인가?
- 미래에 닥칠 규모 확장 요구에 어떻게 대처할 것인지도 흥미로운 주제이다.
- 시간이 남았다면, 필요하지만 다루지 못했던 세부적인 개선사항들을 제안할 수 있다.
해야 할 것
- 질문을 통해 확인하라(clarification). 스스로 내린 가정이 옳다 믿고 진행하지 말라.
- 문제의 요구사항을 이해하라.
- 정답이나 최선의 답안 같은 것은 없다는 점을 명심하라. 스타트업을 위한 설계안과 수백만 사용자를 지원해야 하는 중견 기업을 위한 설계안이 같을 리 없다. 요구사항을 정확하게 이해했는지 다시 확인하라.
- 면접관이 여러분의 사고 흐름을 이해할 수 있도록 하라. 면접관과 소통하라.
- 가능하다면 여러 해법을 함께 제시하라.
- 개략적 설계에 면접관이 동의하면, 각 컴포넌트의 세부사항을 설명하기 시작하라. 가장 중요한 컴포넌트부터 진행하라.
- 면접관의 아이디어를 이끌어 내라. 좋은 면접관은 여러분과 같은 팀원처럼 협력한다.
- 포기하지 말라.
하지 말아야 할 것
- 전형적인 면접 문제들에도 대비하지 않은 상태에서 면접장에 가지 말라.
- 요구사항이나 가정들은 분명히 하지 않은 상태에서 설계를 제시하지 말라.
- 처음부터 특정 컴포넌트의 세부사항을 너무 깊이 설명하지 말라. 개략적인 설계를 마친 뒤에 세부사항으로 나아가라.
- 진행 중에 막혔다면, 힌트를 청하기를 주저하지 말라.
- 소통을 주저하지 말라. 침묵 속에 설계를 진행하지 말라.
- 설계안을 내놓은 순간 면접이 끝난다고 생각하지 말라. 면접관이 끝났다고 말하기 전까지는 끝난 것이 아니다. 의견을 일찍, 그리고 자주 구하라.
시간 배분
시스템 설계 면접은 보통 매우 광범위한 영역을 다루며 45분 혹은 한 시간은 충분하지 않을 수 있다. 따라서 시간 관리를 잘하는 것이 중요하다. 45분의 시간이 주어진다고 가정하고, 각 단계에 대략적으로 어느 정도 시간을 쓰면 좋을지는 다음과 같다.
- 1단계 - 문제 이해 및 설계 범위 확정 : 3~10분
- 2단계 - 개략적 설계안 제시 및 동의 구하기 : 10~15분
- 3단계 - 상세 설계 : 10~25분
- 4단계 - 마무리 : 3~5분
'IT' 카테고리의 다른 글
[가상면접 사례로 배우는 대규모 시스템 설계 기초] 5장. 안정 해시 설계 (0) | 2024.06.10 |
---|---|
[가상면접 사례로 배우는 대규모 시스템 설계 기초] 4장. 처리율 제한 장치의 설계 (0) | 2024.05.29 |
[가상면접 사례로 배우는 대규모 시스템 설계 기초] 2장. 개략적인 규모 추정 (0) | 2024.05.18 |
[가상면접 사례로 배우는 대규모 시스템 설계 기초] 1장. 사용자 수에 따른 규모 확장성 (0) | 2024.05.16 |
[Pandas] 4. 결측치 처리 (0) | 2024.03.27 |