> For the complete documentation index, see [llms.txt](https://real-dev.gitbook.io/real-library/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://real-dev.gitbook.io/real-library/learn_large_scale_system_design_fundamentals_with_virtual_interview_examples/readme/chapter3..md).

# Chapter3. 시스템 설계 면접 공략법

#### 부정적 시그널

* 설계 문제를 너무 커다랗게 생각하지 말자. 구글 검색 기능을 설계해보라고 한다해서 진짜 그 설계를 사용할 일은 없다.
* 너무 섣부르게 결정을 내리지 말아야 한다. 요구사항을 충분히 살필 시간을 갖지 않는 것은 심각하게 부정적인 시그널로 전달된다.
* 설계 과정에서 내린 결정들에 대해 충분한 근거를 통한 방어능력을 보여줘야 한다.
* 설계가 매끄럽게 수행되었더라도 면접관은 지원자가 협업에 능한 사람인지, 압박이 심한 상황도 잘 헤쳐나가는지 보고싶어한다.
* 설계의 순수성에 집착한 나머지 오버 엔지니어링을 겪지 않도록 주의해야한다.

### 효과적 면접을 위한 4단계

#### 1단계. 요구사항 탐색

* 올바른 질문을 통해 면접관이 제시한 과제의 요구사항을 파악해야 한다.

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

  #### 뉴스 피드 시스템 설계를 위한 질문 담화 예시

<figure><img src="/files/QiK9GhKOexV6KGIwOftH" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/vUrszaZA3MeYF6RPW6YN" alt=""><figcaption></figcaption></figure>

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

* 최초 청사진을 구성하고 이에 대한 면접관의 견해를 확인해라. 이 단계는 면접관과 협력하는 단계라고 인식하는 쪽이 적합하다.
* 화이트보드나 종이를 적극 활용해라. 클라이언트, API, 웹 서버, DB, Cache, CDN, 메시지 큐 같은 것들을 종이에 적고 설명하면 좋다.
* 최초 설계안이 요구 조건에 어떻게 부합하는지를 개략적으로 계산하고 설명하라. DAU, QPS가 얼마이기에 이 정도 옵션이면 충분히 서비스를 구성할 수 있을거라 생각했다는 근거를 들자.

#### 3단계. 상세 설계

* 2단계에서 청사진의 확인 및 조율을 마쳤다면 시스템 목표와 설계 및 상세 설계에서 집중해야 할 영역을 확인한 상태일 것이다.
* 이 단계에서 면접관은 2단계 결과물에 대해 더 뾰족한 질문을 하게 된다. 예를 들어 병목이 생길 수 있는 지점과 대응법은 어떤 것일지, 특정 기능을 구현하는데 더 신경써야 할 부분에 대한 질문을 할 수도 있다. 이건 정말 *케바케다.*

#### 4단계. 마무리

* 면접관의 추가적인 질문이나 요구 사항에 응답하거나 추가 개선을 요구할 수도 있다. MAU가 백만인 설계를 천만인 설계로 바꾸려면 지금 구조에서 어떻게 개선할 것인지 등
* 최종적인 설계를 다시 한번 요약해주는 것도 매우 긍정적인 시그널을 전달할 수 있다. 특히 청자는 제작자보다 설계에 대한 이해도가 낮을 수 밖에 없다는 점을 인지하자
* 운영 이슈, 메트릭, 로그 관리, 배포 전략같은 부분도 좋은 이야기 거리다.

***

#### 해야할 것

* 질문을 통해 확인하고, 검증하라. 스스로의 가정을 100% 신뢰해선 안 된다.
* 정답은 없다. 요구사항에 적합한지를 염두에 둬야 한다.
* 면접관이 당신이 뭘 생각하고 구상하는지 이해할 수 있어야 한다.
* 개략적인 설계가 컨펌되면 가장 중요한 세부 컴포넌트를 설명해라.
* 진행이 막힌다면 힌트를 요구해라

#### 하지 말아야 할 것

* 전형적인 면접 문제조차 대비하지 않은 상태로 면접장에 가지 마라
* 요구사항이나 가정들을 분명히 하지 않은 상태에서 설계를 제시하지 마라
* 처음부터 너무 작은 컴포넌트를 설명하지 마라
* 소통을 주저하지 마라. 침묵 속에서 설계를 진행하지 말라.
* 설계안을 내놓는 순간 면접이 끝났다고 생각하지 마라. 면접관이 끝났다고 하기 전까지 의견을 일찍, 그리고 자주 구하라
* 포기하지 마라

#### 시간 배분

* 총 45분을 기준으로 다음과 같이 시간을 배분하라.

1. 문제 이해 및 설계 범위 확정: 3\~10분
2. 개략적인 설계안 제시 및 컨펌: 10\~15분
3. 상세 설계: 10\~25분
4. 마무리: 3\~5분
