1. 개요
•
설계의 순수성에 집착한 나머지 타협적 결정을 도외시하고 과도한 엔지니어링을 하고 마는 엔지니어들이 현업에도 많다.
•
과도한 엔지니어링의 결과로 시스템 전반의 비용이 올라간다는 사실을 알아채지 못하는 일이 많은데, 그 결과 상당수 회사들은 값 비싼 대가를 치르고 있다.
•
이번 장에서는 시스템 설계 면접에 관한 유용한 팁들을 살펴보고 시스템 설계 문제를 공략하는 효과적 접근법을 배울것이다.
2. 효과적 면접을 위한 4단계 접근법
2.1. 1단계 - 문제 이해 및 설계 범위 확정
•
시스템 설계 면접을 볼 때는 생각없이 바로 답을 내서는 좋은 점수를 받기 어렵다.
•
요구사항을 완전히 이해하지 않고 답을 내놓는 행위는 아주 엄청난 부정적 신호다.
◦
!!면접은 정답이 없다!!
•
답부터 들이밀지 말고 속도를 늦춰 깊이 생각하고 질문하여 요구사항과 가정들을 분명히 하라.
•
정말정말 중요한 단계기 때문에 몇 번을 강조해도 모자람이 없다.
•
우리가 가져야할 태도는 올바르게 질문하고, 적절한 가정을 하여 시스템 구축에 필요한 정보를 모으는 것이다.
•
그렇다면 어떤 질문을 해야할까?
◦
구체적으로 어떤 기능들을 만들어야 하나?
◦
제품 사용자 수는 얼마나 되나?
◦
회사의 규모는 얼마나 빨리 커지라 예상하나
◦
회사가 주로 사용하는 기술 스택은 무엇인가?
▪
설계 단순화를 위해 활용할 수 있는 기존 서비스로는 어떤 것들이 있는가?
2.2. 2단계 - 개략적인 설계안 제시 및 동의 구하기
•
이번 단계에서 초점을 맞추어야 할 것은 개략적인 설계안을 제시하고 면접관의 동의를 얻는 것이다.
•
설계안에 대한 최초 청사진을 제시하고 의견을 구하라.
◦
면접관이 팀원인 것처럼 대화하자
•
화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그려라
◦
클라이언트, API, 웹 서버, 데이터 저장소, 캐시, CDN, 메시지 큐 등등
•
이 최소 설계안이 시스템 규모에 관계된 제약사항들을 만족하는지를 개략적으로 계산해 보라
◦
계산 과정은 소리내어 설명하며, 개략적 측정이 필요한지는 면접관에게 물어보도록하자
•
가능하다면 시스템의 구체적 사용 사례도 살펴보자
◦
개략적 설계안을 잡아가는데 도움이 될 것이다.
◦
에지 케이스 발견에도 도움을 준다.
2.3. 3단계 - 상세 설계
•
이제 해야할 일은 설계 대상 컴포넌트 사이의 우선순위를 정하는 것 이다.
•
면접관에 따라 맞춰야하는 초점이 다를 수 있다.
•
면접 시에는 시간관리에도 특별히 주의를 기울여야 한다.
◦
사소한 세부사항을 설명하느라 정작 여러분의 능력을 보일 기회를 놓쳐버릴 수 있다.
•
불필요한 세부사항에 시간을 쓰지말라
2.4. 4단계 - 마무리
•
이 단계에서 면접관은 설계 결과물에 관련된 몇 가지 후속 질문을 던질 수도 있고 스스로 추가 논의를 진행하도록 할 수도 있다.
•
면접관이 시스템 병목구간, 혹은 좀 더 개선 가능한 지점을 찾아내라 주문할 수 있다.
◦
이런 질문은 면접자의 비판적 사고 능력을 보이고, 마지막으로 좋은 인상을 남길 기회다.
•
만든 설계를 다시 요약해주는 것도 도움이 될 수 있다.
◦
여러 해결책을 제시한 경우에는 특히 중요하다.
•
오류가 발생하면 무슨 일이 생기는지 따져보면 흥미로울 것이다.
•
운영 이슈도 논의할 가치가 충분하다
•
미래에 닥칠 규모 확장 요구에 어떻게 대응할 것인지도 흥미로운 주제다.
•
시간이 남는다면 다루지 못했던 세부적 개선 사항도 제안할 수 있다.
2.4.1. 해야 할 것
•
질문을 통해서 확인하라.
•
문제의 요구사항을 이해하라
•
정답이나 최선의 답안 같은 것은 없다는 점을 명심하자
•
면접관이 우리의 사고 흐름을 이해할 수 있도록 하라
•
가능하다면 여러 해법을 함께 제시하라
2.4.2. 하지 말아야 할 것
•
전형적인 면접 문제들에도 대비하지 않은 상태에서 면접장에 가지 말라
•
요구사항이나 가정들을 분명히 하지 않은 상태에서 설계를 제시하지 말라
•
처음부터 특정 컴포넌트의 세부사항을 너무 깊이 설명하지 말라
◦
개략적 설계를 마친 후 세부사항을 해야한다.
•
진행 중 막힌다면 힌트 청하기를 주저하지 말라
•
소통을 주저하며 침묵 속에 설계를 진행하지 말라
•
면접관이 끝났다고 말하기 전까지 끝난것이 아니다. 의견을 자주 일찍 구하자
2.5. 시간 배분
•
1단계 - 문제 이해 및 설계 범위 확정 = 3분에서 10분
•
2단계 - 개략적 설계안 제시 및 동의 구하기 = 10분에서 15분
•
3단계 - 상세 설계 = 10분에서 25분
•
4단계 - 마무리 = 3분에서 5분