반응형

이번 장에서는 시스템 설계 면접에 관한 유용한 팁들을 살펴보고 시스템 설계 문제를 공략하는 효과적 접근법을 알아보겠습니다

효과적 면접을 위한 4단계 접근법

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

시스템 설계 면접을 볼 때는 생각 없이 바로 답을 내서는 좋은 점수를 받기 어렵습니다.

요구사항을 완전히 이해하지 않고 답을 내놓는 행위는 아주 엄청난 부정적 신호이기 때문입니다.

면접은 퀴즈 쇼가 아니고, 정답 따위는 없다는 것을 상기해야합니다.

따라서 답부터 들이밀지 말고, 속도를 늦추는 것이 좋습니다.

최대한 깊게 생각하고 질문하여 요구사항과 가정들을 분명히 해야 합니다

우리는 보통 빠르게 답을 내놓고 싶어합니다.

그러나 잘못된 시스템을 설계할 가능성이 높아집니다

엔지니어가 가져야할 가장 중요한 기술 중 하나는 올바른 질문을 하는 것입니다.

또한 적절한 가정을 하고 설계에 필요한 정보를 모아야 합니다.

그렇다면 요구사항을 정확히 이해하기 위해선 올바른 질문을 해야하는데 어떤 질문들을 할 수 있을까요?

  • 구체적으로 어떤 기능을 만들어야하나?
  • 제품 사용자 수는 얼마나 되나?
  • 회사의 규모는 얼마나 빨리 커지리라 예상하나? 석 달, 여섯 달, 일 년 뒤의 규모가 어떻게 되리라 예상하는가?
  • 회사가 주로 사용하는 기술 스택은 무엇인가? 설계를 단순하기 위해 활용할 수 있는 기존 서비스로는 무엇이 있는가?

예제로 알아보기

뉴스 피드 시스템을 설계하라는 요구를 받았다 해 봅시다.

요구사항을 분명히 하기 위한 질문을 던져야 할 것입니다.

여러분과 면접관 사이에 오갈 대화는 다음과 비슷할 것입니다.

지원자: 모바일 앱과 웹 앱 가운데 어느 쪽을 지원해야 하나요? 아니면 둘 다일까요?

면접관: 둘 다 지원해야 합니다.

지원자: 가장 중요한 기능은 무엇인가요?

면접관: 새로운 포스트를 올리고, 다른 친구의 뉴스 피드를 볼 수 있도록 하는 기능입니다.

지원자: 이 뉴스 피드는 시간 역순으로 정렬이 되어야하는지, 아니면 특별한 기준이 있는지? 피드마다 특별한 다른 가중치가 필요한지?

면접관: 문제를 단순하게 만들기 위해 일단 시간 역순으로 정렬된다고 가정합니다

지원자: 한 사용자는 최대 몇 명의 사용자와 친구를 맺을 수 있나요?

면접관: 5000명입니다

지원자: 사이트로 오는 트래픽 규모는 어느정도입니까?

면접관: 일간 능동 사용자는 천만명입니다

지원자: 피드에 이미지나 동영상도 올릴 수 있나요? 아니면 텍스트만 가능한가요?

면접관: 이미지나 비디오같은 미디어 파일도 올릴 수 있어야합니다

이 단계에선 이런 질문과 대답 흐름을 통해 요구사항을 이해하고 모호함을 없애는 게 가장 중요합니다

 

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

이번 단계에서는 초점을 맞추어야 할 것은 개략적인 설계안을 제시하고 면접관의 동의를 얻는 것입니다.

이 과정에는 면접관과 협력하며 진행하면 좋습니다.

  • 설계안에 최종 설계를 제시하고 의견을 구합니다. 면접관을 같은 팀원이라고 생각하고 함께 설계를 진행한다고 생각하면 좋습니다
  • 화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그리면 좋습니다. 예를 들면 db, cdn, 캐시, api등이 될 수 있습니다
  • 이 최초 설계안이 시스템 규모에 관계된 제약 사항들을 만족하는지 개략적으로 계산해봐야합니다. 이 계산과정은 속으로 생각하지말고 소리내어 설명해야 하고 이 과정이 필요한지는 사전에 면접관에 미리 물어보도록 합시다

예제로 알아보기

걔략적으로 보면 뉴스피드의 시스템은 두 가지 처리 플로로 나눠서 생각해 볼 수 있습니다

피드 발행과 피드 생성입니다

  • 피드 발행: 사용자가 포스트를 올리면 관련된 데이터가 캐시/데이터베이스에 기록되고, 해당 사용자의 친구 뉴스피드에 뜨게 됩니다
  • 피드 생성: 어떤 사용자의 뉴스 피드는 해당 사용자 친구들의 포스트를 시간 역순으로 정렬하여 만듭니다

3단계 상세 설계

이 단계로 왔다면 여러분들은 다음 목표는 달성한거 입니다

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

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

똑같은 면접이란 있을 수 없기 때문에 면접마다 우선순위가 다를 것임을 명심해야 합니다.

따라서 면접관이 우선순위를 알려줄 수도 있고 여러분들이 면접관가 질문을 통해 알아내야합니다.

예제로 알아보기

뉴스 피드 시스템의 개략적인 설계를 마친 상황이라 해 봅시다. 그리고 면접관도 그 설계에 만족하고 있다고 해봅시다.

이제 두 가지 플로우에 대해 더 깊이 알아봐야 합니다

  • 피드 출력
  • 뉴스 피드 가져오기

 

4단계 마무리

이 단계에서는 면접관이 설계 결과물을 가지고 후속 질문들을 할 수도 있고, 여러분 스스로 추가 논의를 진행하도록 할 수 있습니다. 아래의 지침을 사용하면 좋습니다

  • 면접관이 시스템 병목구간, 혹은 좀 더 개선 가능한 지점을 찾아내라 주문 할 수 있다. 그 때 여러분의 설계가 완벽하다거나 개선할 부분이 없어보인다는 대답은 하지 않아야 합니다.
  • 여러분이 만든 설계를 한번 다시 요약해주는 것도 도움이 될 수 있습니다. 긴 면접이 끝난 뒤에 면접관의 기억을 환기시켜주는 효과가 있습니다
  • 오류가 발생하면 무슨 일이 생기는지 따져보면 흥미롭습니다
  • 운영 이슈도 논의할 가치가 충분합니다. 메트릭은 어떻게 수집하고 모니터링할것인지? 등등
  • 미래에 닥칠 규모 확장 요구에 어떻게 대처할 것인지도 흥미로운 주제입니다
  • 시간이 좀 남았다면, 필요하지만 다루지 못했던 세부적인 개선사항들을 제안할 수 있습니다

마지막으로 아래에는 면접에서 해야할 것들과 하지말아야 할것들의 목록을 정리해 보았습니다

해야할 것

  • 질문을 통해 확인하라. 스스로 내린 가정이 옳다고 생각하면 안됩니다
  • 문제의 요구사항을 정확히 이해해야합니다
  • 정답이나 최선의 답은 없다는 것을 명심해야합니다
  • 면접관이 여러분의 사고 흐름을 이해했는지 다시 확인해야합니다. 면접관과 소통을 해야합니다
  • 가능하다면 여러 해법을 같이 제시하면 좋습니다
  • 면접관의 아이디어를 이끌어내야 합니다.

하지 말아야 할 것

  • 전형적인 면접 문제들도 대비하지 않은 상태에서 면접장에 가면 안됩니다
  • 요구사항이나 가정들을 분명히 하지 않는 상태에서 설계를 제시하면 안됩니다
  • 특정 컴포넌트의 세부사항을 너무 깊이 설명하지말고 개략적으로 설명한 뒤 세부사항으로 가야합니다.
  • 진행 중에 막혔다면, 힌트를 요청하면 좋습니다
  • 혼자 속으로 생각하지말고 소통을 주저하면 안됩니다.

시간 배분

1단계 - 문제이해 및 설계 범위 확정 : 3분에서 10분

2단계 - 개략적 설계안 제시 및 동의 구하기: 10분에서 15분

3단계 - 상세 설계: 10분에서 25분

4단계 - 마무리: 3분에서 5분

이 챕터를 읽어보니 설계면접을 구체적으로 설명을 해줘서 대략적으로 감으로 진행했던 것을 단계적으로 대비할 수 있어서 좋습니다

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기