본문 바로가기
스터디-공부/시스템 디자인

3장 시스템 설계 면접 공략법

by 알 수 없는 사용자 2023. 5. 10.

가상 면접 사례로 배우는 대규모 시스템 설계 기초 - System Design Interview

3장 시스템 설계 면접 공략법


시스템 설계 면접이 있는 이유
두 명의 동료가 모호한 문제를 풀기 위해 협력하여 그 해결책을 찾아내는 과정에 대한 시뮬레이션.

 

시스템 설계 면접을 통해 볼 수 있는 것
- 설계 기술 능력
- 설계 과정에서 내린 결정들에 대한 방어 능력
- 면접관의 피드백을 건설적인 방식으로 처리할 수 있는지.
- 협력에 적합한가
- 압박이 심한 상황에서도 잘 헤쳐 나가는가
- 모호한 문제를 건설적으로 해결할 능력이 있는가
- 적절한 타협적 결정(trade off)를 할 수 있는가
- 과도한 엔지니어링(over-engineering)을 하지는 않는가
- 완고함. 편협함은 없는가

효과적 면접을 위한 4가지 접근법

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

요구사항을 완전히 이해하지 않고 답을 말하는건 좋은 점수를 받기 어렵다.

 

속도를 늦춰라. 깊이 생각하고 질문하여 요구사항과 가정들을 분명히 하라.

 

엔지니어가 가져야 할 가장 중요한 기술 중 하나는 올바른 질문은 하는 것, 적절한 가정을 하는 것, 그리고 시스템 구축에 필요한 정보를 모으는 것이다.

 

요구사항을 정확히 이해하는 데 필요한 질문의 예
- 구체적으로 어떤 기능들을 만들어야 하나?
- 제품 사용자 수는 얼마나 되나?
- 회사의 규모는 얼마나 빨리 커지리라 예상하나? 석 달, 여섯 달, 일년 뒤의 규모는 얼마나 되리라 예상하는가?
- 회사가 주로 사용하는 기술 스택(technology stack)은 무엇인가? 설계를 단순화하기 위해 활용할 수 있는 기존 서비스로는 어떤 것들이 있는가?

 

예제 (news feed 를 만든다 가정)
- 모바일 앱과 웹 앱 가운데 어느쪽을 지원해야 하는지? 둘 다 지원해야 하는지?
- 정렬 기준은 무엇인지. (가중치 같은건 없는지)
- 최대 몇 명의 사용자와 친구를 맺을 수 있는지
- 사이트로 오는 트래픽 규모는 어느 정도 인지 (DAU)
- 피드의 형태는 이미지나 비디오도 포함이 되는지. 단순 텍스트인지.

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

설계안을 제시하고 면접관의 동의를 얻기. (면접관과 협력하며 진행하면 좋음)

 

- 설계안에 대한 최초 청사진을 제시하고 의견을 구하라. 면접관을 마치 팀원인 것처럼 대하라. 면접관들은 지원자들과 대화하고 설계 과정에 개입하기를 즐긴다.
- 화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그려라. 클라이언트(모바일/웹), API, 웹 서버, 데이터 저장소, 캐시, CDN 메시지 큐 같은 것들이 포함될 수 있을 것이다.
- 이 최초 설계안이 시스템 규모에 관련된 제약사항들을 만족하는지를 개략적으로 계산해 보라. 계산 과정은 소리를 내어 설명하라. 아울러, 이런 개략적 추정이 필요한지는 면접관에게 미리 물어보도록 하자.
- 가능하다면 시스템의 구체적 사용 사례도 몇 가지 살펴보자. 개력적 설계안을 잡아 나가는데 도움이 되며, 미처 고려하지 못한 에지 케이스(edge case)를 발견하는 데도 도움이 될 것이다.
- 이 단계에서 API의 엔드포인트나 데이터베이스 스키마도 보여야 하는지는 면접관의 의견을 물어보자. 상황에 따라서 지나치게 세부적인 내용일 수 있다.

 

예제 (news feed 를 만든다 가정)

대략적으로 두 가지 처리 플로우로 나눠 생각 해볼 수 있다 : 피드 발행과 피드 생성

 

피드 발행: 사용자가 포스트를 올리면 관련된 데이터가 캐시/데이터베이스에 기록되고, 해당 사용자의 친구(friend) 뉴스 피드에 뜨게 된다.

피드 생성: 어떤 사용자의 뉴스 피드는 해당 사용자 친구들의 포스트를 시간 역순으로(최신 포스트부터 오래된 포스트 순으로) 정렬하여 만든다.

 

이를 개략적으로 그려본다면 다음과 같다.

피드 발행(feed publishing)

 

피드 생성(feed building)

 

3단계) 상세 설계

이 단계로 왔다면 아래의 것을 달성한 것이다.

 

- 시스템에서 전반적으로 달성해야 할 목표와 기능 범위 확인
- 전체 설계의 개략적 청사진 마련
- 해당 청사진에 대한 면접관의 의견 청취
- 상세 설계서 집중해야 할 영역들 확인

 

이제 면접관과 해야 할 일은 설계 대상 컴포넌트 사이의 우선순위를 정하는 것이다.

 

대부분의 경우 면접관은 여러분이 특정 시스템 컴포넌트들의 세부사항을 깊이 있게 설명하는 것을 보길 원한다.

 

시간 관리에도 주의해야 한다. 불필요한 세부사항에 시간을 쓰지 말라.

규모 확장 가능한 시스템을 설계할 능력이 있다는 것을 입증하는데 집중해라.

 

예제 (news feed 를 만든다 가정)

news feed의 상세 설계에 대한 부분은 11장에서 자세히 설명해준다 한다.

그래프 데이터베이스?

그래프 데이터베이스란 그래프 생성 및 조작이라는 단일 용도로 특별히 설계된 플랫폼을 말합니다. 그래프는 노드, 간선, 속성으로 구성되어 있으며, 이 모든 요소를 활용하여 관계형 데이터베이스에서는 불가능한 방식으로 데이터를 표현하고 저장할 수 있습니다. - oracle -

그래프 데이터베이스의 실제적인 제품을 찾아보다 보니
https://tech.kakao.com/2016/01/29/opensource-1-s2graph/
카카오 테크 블로그에서 이 글을 보게 되었는데 다만 github을 보니 2019년 커밋이 마지막으로 보인다.
 
https://db-engines.com/en/ranking/graph+dbms
neo4j 가 가장 인지도가 있는 것을 보인다.

4단계) 마무리

마무리 단계에서 면접관은 설계 결과물에 관련된 몇 가지 후속 질문을 던질 수도 있고(follow-up questions) 스스로 추가 논의를 진행하도록 할 수도 있다.

 

- 면접관이 시스템 병목구간, 혹은 좀 더 개선 가능한 지점을 찾아내라 주문 할 수 있다. 거기다 대고 여러분의 설계가 완벽했다거나 개선할 부분이 없다는 답은 하지 말자. 개선할 점은 언제나 있기 마련이며 이러한 질문은 비판적 사고 능력과 좋은 인상을 남길 기회이다.
- 설계를 다시 한 번 요약해 주는 것도 도움이 될 수 있다. 여러 해결책을 제시한 경우에는 특히 중요하다. 긴 면접 세션이 끝난 뒤에 면접관의 기억을 환기시켜주는 효과가 있다.
- 오류가 발생하면 무슨 일이 생기는지(서버 오류, 네트워크 장애 등) 따져보면 흥미로울 것이다.
- 운영 이슈도 논의할 가치가 충분하다. 메트릭은 어떻게 수집하고 모니터링 할 것인가? 로그는? 시스템은 어떻게 배포해 나갈 것인가?
- 미래에 닥칠 규모 확장 요구에 어떻게 대처할 것인지도 흥미로운 주제다.
- 시간이 좀 남았다면, 필요하지만 다루지 못했던 세부적 개선사항들을 제안할 수 있다.

 

면접 세션에서 해야할 것

- 질문을 통해 확인하라. (clarification) 스스로 내린 가정이 옳다 믿고 진행하지 말라.
- 문제의 요구사항을 이해하라.
- 정답이나 최선의 답안 같은 것은 없다는 점을 명심하라. 스타트업을 위한 설계안과 수백만 사용자들을 지원해야 하는 중견 기업을 위한 설계안이 같을리 없다. 요구사항을 정확하게 이해했는지 다시 확인하라.
- 면접관이 여러분의 사고 흐름을 이해할 수 있도록 하라. 면접관과 소통하라.
- 가능하다면 여러 해법을 함께 제시하라.
- 개략적 설계에 면접관이 동의하면, 각 컴포넌트의 세부사항을 설명하기 시작하라. 가장 중요한 컴포넌트 부터 진행하라.
- 면접관의 아이디어를 이끌어 내라. 좋은 면접관은 팀원처럼 협력한다.
- 포기하지 마라.

 

면접 세션에서 하지 말아야 할 것 
- 전형적인 면접 문제들에도 대비하지 않은 상태에서 면접장에 가지 마라
- 요구사항이나 가정들을 분명히 하지 않은 상태에서 설계를 제시하지 말라.
- 처음부터 특정 컴포넌트의 세부사항을 너무 깊이 설명하지 말라. 개략적 설계를 마친 뒤에 세부사항으로 나아가라.
- 진행 중에 막혔다면, 힌트 청하기를 주저하지 말라.
- 수통을 주저하지 말라. 침묵 속에 설계를 진행하지 말라.
- 설계안을 내놓는 순간 면접이 끝난다고 생각하지 말라. 면접관이 끝났다고 말하기 전까지는 끝난 것이 아니다. 의견을 일찍, 그리고 자주 구하라.

 

시간 배분

1단계 - 문제 이해 및 설계 범위 확정: 3분~10분
2단계 - 개략적 설계안 제시 및 동의 구하기: 10분에서 15분
3단계 - 상세 설계: 10분에서 25분
4단계 - 마무리: 3분에서 5분

댓글