📚 Study

[System Design] 3. 효과적 시스템 설계 면접을 위한 4단계 접근법

date
Jul 6, 2023
slug
book-system-design-interview-3
author
status
Public
category
📚 Study
tags
Book
Server
summary
설계의 순수성에 집착한 나머지 타협적 결정을 도외시하지 말라.
type
Post
thumbnail
notion image
📚
Alex Zu, <System Design Interview(가상 면접 사례로 배우는 대규모 시스템 설계 기초)>를 읽고 정리한 글입니다.
📝
목차
1단계 문제 이해 및 설계 범위 확정요구사항을 이해하고 모호함을 없앨 수 있는 질문을 던져라.2단계 개략적인 설계안 제시 및 동의 구하기설계안에 대한 최초 청사진을 제시하고 의견을 구하라.화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그려라. 최초 설계안이 시스템 규모에 관계된 제약사항을 만족하는지 계산해 보라.3단계 상세 설계설계 대상 컴포넌트 사이의 우선순위를 정하라.불필요한 세부사항에 시간을 쓰지 말라.4단계 마무리개선할 점은 언제나 있다.설계를 다시 한 번 요약하라.오류가 발생하면 무슨 일이 생기는지 따져보아라.운영 이슈(메트릭, 로그, 모니터링, 배포 등)에 대해 논의해 보아라.미래에 닥칠 규모 확장 요구에 대해 어떻게 대처할 것인지 언급하라.해야 할 것질문을 통해 확인하라(clarification).정답이나 최선의 답안 같은 것은 없다.가능하다면 여러 해법을 함께 제시하라.면접관과 소통하라. 면접자의 사고 흐름을 이해할 수 있도록 하라.면접관의 아이디어를 이끌어내라.진행 중에 막혔다면, 힌트를 청하라.포기하지 말라.하지 말아야 할 것전형적인 면접 문제들에도 대비하지 않은 채로 면접장에 가지 말라.요구사항이나 가정을 분명히 하지 않은 상태에서 설계를 제시하지 말라.처음부터 특정 컴포넌트 세부사항을 너무 깊이 설명하지 말라.침묵 속에서 설계를 진행하지 말라.시간 배분(총 45분이 주어진다고 가정)1단계 문제 이해 및 설계 범위 확정 : 3~10분2단계 개략적 설계안 제시 및 동의 구하기 : 10분~15분3단계 상세 설계 : 10분~25분4단계 마무리 : 3~5분
 

1단계 문제 이해 및 설계 범위 확정

요구사항을 완전히 이해하지 않고 답을 내놓는 행위는 엄청난 부정적 신호(red flag)다. 면접은 퀴즈 쇼가 아니며, 정답 따위는 없음을 명심하라.
엔지니어가 가져야 할 가장 중요한 기술 중 하나는 올바른 질문을 하는 것, 적절한 가정을 하는 것, 그리고 시스템 구축에 필요한 정보를 모으는 것이다.

요구사항을 이해하고 모호함을 없앨 수 있는 질문을 던져라.

  • 구체적으로 어떤 기능을 만들어야 하는가?
  • 제품 사용자 수는 얼마나 되는가?
  • 회사의 규모는 얼마나 빨리 커지리라 예상하는가?
  • 회사가 주로 사용하는 기술 스택은 무엇인가?
  • 설계를 단순화하기 위해 활용할 수 있는 기존 서비스로는 어떤 것이 있는가?
 

2단계 개략적인 설계안 제시 및 동의 구하기

이 과정은 면접관과 협력하며 진행하면 좋다.

설계안에 대한 최초 청사진을 제시하고 의견을 구하라.

면접관을 마치 팀원인 것처럼 대하라. 훌륭한 면접관들은 지원자들과 대화하고 설계 과정에 개입하기를 즐긴다.

화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그려라.

클라이언트(모바일/웹), API, 웹 서버, 데이터 저장소, 캐시, CDN, 메시지 큐 같은 것들이 포함될 수 있을 것이다.

최초 설계안이 시스템 규모에 관계된 제약사항을 만족하는지 계산해 보라.

계산 과정은 소리 내어 설명하라. 아울러, 이런 개략적 추정이 필요한지는 면접관에게 미리 물어보도록 하자. 가능하다면 구체적 사용 사례도 몇 가지 살펴보자. 미처 고려하지 못한 엣지 케이스를 발견하는 데도 도움이 될 것이다.
 

3단계 상세 설계

설계 대상 컴포넌트 사이의 우선순위를 정하라.

각각에 대한 상세 설계를 구체적으로 설명하라. 어떻게 하면 지연시간을 줄일 것인지, 어떻게 온/오프라인 상태를 표시할 것인지, 어떻게 해시 함수를 설계할 것인지 등 특정 시스템 컴포넌트의 구조와 흐름에 대해 가능한 깊이 있게 설명하라.

불필요한 세부사항에 시간을 쓰지 말라.

예를 들어, 페이스북에서 뉴스 피드의 순위를 매기는 데 사용되는 EdgeRank 알고리즘에 대해 이야기하는 것은 시간을 너무 많이 쓰게 되는데다, 면접자가 규모 확장 가능한 시스템을 설계할 능력이 있다는 것을 입증하는 데는 도움이 되지 않는다.
 

4단계 마무리

개선할 점은 언제나 있다.

시스템 병목구간, 혹은 좀 더 개선 가능한 지점을 찾아내려 노력하라.
면접자의 비판적 사고 능력을 보이고, 좋은 인상을 남길 기회다.

설계를 다시 한 번 요약하라.

해결책을 제시한 경우에는 특히 중요하다. 긴 면접 세션이 끝난 뒤 면접관의 기억을 환기시켜주도록 하자.

오류가 발생하면 무슨 일이 생기는지 따져보아라.

서버 오류, 네트워크 장애 등이 발생했을 경우에 대해 짧게라도 언급하라.

운영 이슈(메트릭, 로그, 모니터링, 배포 등)에 대해 논의해 보아라.

미래에 닥칠 규모 확장 요구에 대해 어떻게 대처할 것인지 언급하라.

현재 설계로 백만 사요자는 능히 감당할 수 있다고 해보자. 천만 사용자를 감당하기 위해선 어떻게 해야 하는가?
 

해야 할 것

질문을 통해 확인하라(clarification).

정답이나 최선의 답안 같은 것은 없다.

가능하다면 여러 해법을 함께 제시하라.

면접관과 소통하라. 면접자의 사고 흐름을 이해할 수 있도록 하라.

면접관의 아이디어를 이끌어내라.

진행 중에 막혔다면, 힌트를 청하라.

포기하지 말라.

 

하지 말아야 할 것

전형적인 면접 문제들에도 대비하지 않은 채로 면접장에 가지 말라.

요구사항이나 가정을 분명히 하지 않은 상태에서 설계를 제시하지 말라.

처음부터 특정 컴포넌트 세부사항을 너무 깊이 설명하지 말라.

침묵 속에서 설계를 진행하지 말라.

 

시간 배분(총 45분이 주어진다고 가정)

1단계 문제 이해 및 설계 범위 확정 : 3~10분

2단계 개략적 설계안 제시 및 동의 구하기 : 10분~15분

3단계 상세 설계 : 10분~25분

4단계 마무리 : 3~5분