10월의 첫번째 독서는 알렉스 쉬가 지은 가상 면접 사례로 배우는 대규모 시스템 설계 기초
이다.
이 책을 읽으면서 들은 생각은, 프론트엔드 개발이 전체 프로그램 설계 구조에서 차지하는 부분은 매우 일 부분이 될수 있다라는 생각이 들었다. 이 책은 다음과 같은 여러 주제가 시스템 면접에서의 문제로 출제되었다라는 가정하에 답안을 만들어가는 과정을 설명한다.
처리율 제한장치의 설계
안정 해시 설계
키-값 저장소설계
분산 시스템을 위한 유일 ID 생성기설계
URL 단축기 설계
웹 크롤러 설계
알림 시스템설계
뉴스피드 시스템설계
채팅 시스템설계
검색어 자동완성 시스템
유튜브 설계
구글드라이브 설계
각 주제는 옵티멀한 답안을 내기까지 4단계를 거치는데, 4단계는 다음과 같다.
1. 질문을 통해 문제 이해 및 설계 범위 확정
2. 시스템 동작 설계에 대한 대략적 설계안 제시 및 동의 구하기
3. 개략적 설계안에 살을 붙이는 상세 설계
4. 면접관과 논의하며 마무리
FANG과 같은 대기업의 알고리즘 인터뷰가 어떻게 진행되는지 검색해 보면, 흔히 국내에서 많이 알려진 프로그래머스와 같은 코딩테스트 사이트에서 문제를 빠르게 읽고 요구사항을 묵묵히 구현하는 것과는 다르게,
문제가 주어졌더라도 구체적인 질문을 통해 면접관의 요구 사항을 더 세부적으로 파악한다는 글들이 많이 보인다.
질문을 통해 문제 이해 및 설계 범위 확정
단계 또한 알고리즘 문제를 풀 때 면접관에게 어떤 요구사항을 충족시켜야 하는지 질문을 던지는 것과 동일한 과정을 거친다.
알고리즘 문제와는 다른 점은, 정말 실세계에서 사용되는 프로그램이라는 가정을 두고 현실적인 설계 범위를 확정한다는 것인데, 만약 검색어 자동완성 시스템
을 만든다고 할 때,
구체적인 설계에 앞서 다음과 같은 산술 수치들을 먼저 설정한다면,
월간 능동 사용자 50억명
한 사람당 하루 평균 API 호출 수 2
평균 검색어 길이 5
다음과 같이 서버 스펙 및 데이터베이스 스토리지 필요 용량을 설정해볼 수 있다.
QPS(1초에 평균적으로 발생하는 서버 리퀘스트 수) = xxxx
최대 QPS = QPS * 2
하루당 필요한 DB Storage = 500TB (예시임, 정확한 수치가 아님)
1단계에서 세운 스펙을 기반으로 대략적인 설계안을 만들어 볼 수 있다.
출처: 교보문고 책 표지
이 책의 가장 좋은 장점은 어떤 시스템을 설계할때 필요한 각 컴포넌트에 어떤 것들이 있는지, 그리고 컴포넌트끼리의 관계는 어떠한지에 대해 명확히 그림으로 확인할 수 있다는 것이다.
앞서 살펴본 개략적 설계 그림에서 블록 저장소 서버
가 서비스 제공에 있어서 매우 중요한 역할을 한다고 판단된다면, 해당 컴포넌트를 어떻게 만들 것인지에 대한 상세 설계를 만들어야 한다.
책에서는 논문들을 참고 문헌으로 제시하여 어떤 알고리즘이 일반적인 해결방안으로 사용되는지, 또 대체할 수 있는 방법으로는 어떤 것들이 있는지를 말해준다.
책을 읽으며 또 느낀 점은 CS 기본 지식이 왜 그렇게 중요하다고 사람들이 말하는지 고개가 절로 끄덕여지며 수긍된다는 점이다.
말은 마무리지만 시간이 얼마나 남느냐에 따라 추가적으로 논의해야 할 사항이 있을 수 있다.
예를 들어 개략적 설계에서 데이터 베이스 컴포넌트를 하나만 배치했다면, 자연 재해와 같은 예측할 수 없는 사고에 대비하기 위해서, 혹은 전 세계에서 서비스를 사용한다는 가정하에 여러 개의 데이터베이스를 어떻게 배치할 것인지 면접관에게 말해볼 수 있는 것이다.
Cracking The Coding interview 라는 책의 시스템 디자인 버전이라고 생각하면 좋은 책이다.
프론트 엔드 엔지니어를 넘어서 소프트웨어 엔지니어로 성장하는데 있어서 매우 교과서적인 책이 될 것이라고 생각한다.