시스템 디자인 인터뷰 공부법입니다.
소프트웨어 엔지니어들이 보는 인터뷰 중 시스템 디자인은 간단한 요구사항을 주고, 시스템을 자유롭게 만드는 문제입니다. 예를 들어 보면 공연 티켓 구매 서비스(티켓마스터)를 디자인해 보아라, 페이스북 홈 화면을 디자인해 보아라, 유튜브 검색을 디자인해 보아라라는 식입니다.
<티켓마스터 시스템 디자인 결과>
이를 어떻게 푸는지 자세한 설명은 Hello Interview라는 곳이 좋습니다. 저도 이곳을 통해서 공부하기도 했고, 제가 설명하는 것보다 잘하기 때문에 이곳을 참고하시면 좋습니다.
- https://www.youtube.com/watch?v=fhdPyoO6aXI&list=PL5q3E8eRUieWtYLmRU3z94-vGRcwKr9tM
전 이 글에선 시스템 디자인 인터뷰를 어떻게 잘 푸는지 보다는 주의할 점과 공부하는 방법에 초점을 맞추겠습니다.
먼저 시스템 디자인 인터뷰에서 주의할 점입니다.
1. 문제를 받고 너무 많은 요구사항을 뽑지 않습니다. 인터뷰 시간은 한 시간 이내이고, 이 안에 다른 일들도 해야 하는데, 요구사항 뽑는데 너무 오랫동안, 너무 많이 뽑으면 그걸 다 못하기도 하고, 그 요구사항을 만족하기 위해서, 시스템 디자인이 너무 복잡해질 수 있습니다. 그래서 문제에서 핵심 되는 요구사항만 추려내고, 그렇지 않은 요구사항은 빠르게 이번 인터뷰에서는 범위 밖이라서 제외하겠다고 말하고 안 하는 게 좋습니다.
그리고 요구사항을 잘 추렸다고 해도, 바로 시작하지 말고, 요구사항의 순서를 사용자의 사용 흐름에 따라서 미리 정렬해 놓으면 좋습니다. 그래서 첫 번째 요구사항부터 하나씩 따라 하다 보면 전체 흐름이 이어지게 하는 것입니다.
예를 들어보면, 위 Hello Interview에서 요구사항을 뽑을 때도, Below the line 즉, 이런 요구사항도 뽑을 수 있는데, 이건 이번 인터뷰에서 다루지 않겠다고 말하는 것입니다. 그리고 이번 인터뷰에서 다루려는 것들도 1, 2, 3 이렇게 순서대로 보여줘서 흐름을 만듭니다.
2. 디자인할 때 미리부터 너무 디테일에 들어가면 요구사항을 다 만족하지 못하고 시간이 끝날 수 있습니다. 처음에 디자인 그림을 그릴 때는 요구사항 순서대로 단순하게 전체 그림부터 차근차근 그립니다. 그러니 요구사항을 우선 만족하는 전체 큰 그림을 그리는데 집중합니다. 이후에 시간이 날 때 그중에서도 몇 개의 요구사항만 집중적으로 자세하게 디자인합니다.
3. 인터뷰와 커뮤니케이션을 계속합니다. 뭘 하든 혼자 결정하지 말고, 인터뷰어와 상의 후 결정합니다. 예를 들어서 위에서 요구사항에 이걸 넣을지 말지, 여기서 어떤 가정을 해도 되는지, 어떤 요구사항이 더 우선순위가 높은지, 인터뷰 시간이 얼마 안 남았다면 이 중에서 어떤 걸 집중적으로 다루고 싶은지, 이런 결정들은 인터뷰와 상의하고 결정합니다.
다음으로 시스템 디자인 인터뷰를 어떻게 준비하면 좋을지입니다.
먼저 Hellow Interview를 강력 추천합니다. Meta에서 인터뷰어였던 소프트웨어 엔지니어가 나와서 만든 유튜브로, 어떻게 하면 되는지 실제로 자주 나오는 문제를 가지고 아주 자세하게 영상으로 이야기합니다. 책보다는 영상이 좋은 게, 순서대로 따라가면서 생각의 흐름을 볼 수 있습니다. 그리고 영어로 나오는데, 영어나 한국어 자막을 켜고 보셔도 됩니다.
- https://www.youtube.com/@hello_interview
공부 방법은,
(1) Hellow Interview 강의를 하나 전체 다 봅니다. 한 시간 정도 걸립니다.
(2) 이제 처음으로 돌아와서 강의 앞부분에 요구사항 추출까지만 다시 봅니다. 한 10분 정도입니다.
(3) Excalidraw로 그 요구사항을 자기가 디자인해 봅니다. 앞에 (1)에서 봤던 것과 똑같이 외워서 하기보다는 자신이 이해한 바대로 우선 끝까지는 해보는 게 좋습니다.
(4) 강의에서 요구사항 뒷부분의 답이랑 자신의 답이랑 비교합니다.
(5) 완전히 꼭 맞출 필요는 없지만 비슷하게 가는 걸 추천합니다.
(6) 그리고 시스템 디자인에서 잘 쓰는 컴포넌트는 따로 공부합니다. 레디스, 카프카, 카산드라, NoSQL, SQL, LB 질문 들어올 때 답할 수 있게 공부해야 합니다.
(7) 추가적인 질문에 답 할 수도 있어야 합니다.
- 가용성(Availablity): 각각의 컴포넌트나 서비스가 죽으면, 어떻게 되는지, 이에 대한 대책(fallback)에 대해서 답을 할 수 있어야 합니다.
- 확장성(Scaleability): 성능 개선할 수 있는 지도 확인 합니다. 점점 커지는 또는 갑자기 많은 트래픽이 오면 어떻게 할 건지에 대한 답을 할 수 있어야 합니다.
(8) 목 인터뷰(가상 면접)를 많이 합니다.
- 먼저 Pramp: https://www.pramp.com/ 에서 목 인터뷰를 할 수 있습니다. 다른 인터뷰 준비하는 사람과 1:1 매칭을 해주며, 1시간은 내가 인터뷰어, 1시간은 바꿔서 인터뷰이가 되어서 목 인터뷰를 합니다.
- 기부 멘토링에 소프트웨어 엔지니어들이 많이 있습니다. 이들에게 목 인터뷰를 요청해도 됩니다. https://donation-mentoring.org/
혹시, 이론적인 게 부족하다 싶으면 System Design Interview 책도 추천합니다. 책의 앞 100페이지 정도에 이론이 있습니다. https://a.co/d/0MadAn6
한국어 번역책도 있습니다. https://www.yes24.com/product/goods/102819435
부족한 이론은 AI에게 물어보면서 공부하시면 됩니다. 예를 들어 레디스라는 컴포넌트를 잘 모르면, 아래와 같은 질문을 하면 잘 알려줍니다.
레디스를 공부하고 싶은데 어떻게 공부하면 될까?
레디스를 실제 사용할 간단한 프로젝트는 어떤 게 있을까?
레디스가 인터뷰에 나온다면 무슨 문제를 물어볼까?
마지막으로, Hellow Interview에서도 사용하는 툴이기도 한 Excalidraw를 손에 익히시는 게 좋습니다. 시스템 디자인 인터뷰에서 자주 사용하는 툴입니다. 단축키 몇 개도 외워두시고요. 그럼 조금이라도 시간을 아낄 수 있습니다.