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


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

  • 시스템 설계 면접을 볼 때는 생각 없이 바로 답을 내서는 좋은 점수를 받기 어려움

  • 요구사항을 완전히 이해하지 않고 답을 내놓는 행위는 아주 엄청난 부정적 신호(red flag)

  • 면접은 퀴즈 쇼가 아니며, 정답 따위는 없다는 걸 상기하기

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

    • 엔지니어인 우리에겐 어려운 문제를 풀고 최종 설계를 바로 내놓고 싶은 요구가 있지만, 잘못된 시스템을 설계할 가능성이 높아짐.
    • 엔지니어가 가져야 할 가장 중요한 기술
      • 올바른 질문을 하는 것
      • 적절한 가정을 하는 것
      • 시스템 구축에 필요한 정보를 모으는 것
  • 질문을 던지면 면접관은 여러분이 질문에 대한 답을 바로 내놓거나, 아니면 여러분 스스로 어떤 가정을 하기를 주문할 것

    • 후자의 경우, 그 가정을 화이트보드나 종이에 적어두어야 함(나중에 필요해질 때가 있음)
  • 질문은 어떻게?: 요구사항을 정확히 이해하는 데 필요한 질문

    • 구체적으로 어떤 기능들을 만들어야 하나?
    • 제품 사용자 수는 얼마나 되나?
    • 회사의 규모는 얼마나 빨리 커지리라 예상하나? 석 달, 여섯 달, 일년 뒤의 규모는 얼마가 되리라 예상하는가?
    • 회사가 주로 사용하는 기술 스택(technology stack)은 무엇인가? 설계를 단순화하기 위해 활용할 수 있는 기존 서비스로는 어떤 것들이 있는가?
  • 예제: News feed(뉴스 피드) 시스템을 설계하라는 요구를 받았다면?

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

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

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

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

    • 지원자 : 이 뉴스 피드는 시간 역순으로 정렬되어야 하나요? 아니면 다른 특별한 정렬 기준이 있습니까?

      제가 특별한 정렬 기준이 있느냐고 묻는 이유는, 피드에 올라갈 포스트마다 다른 가중치가 부여되어야 하는지 알고 싶어서 인데요.

      가령 가까운 친구의 포스트가 사용자 그룹(user group)에 올라가는 포스트보다 더 중요하다거나.

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

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

    • 면접관 : 5000명입니다.

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

    • 면접관 : 일간 능동 사용자(daliy active user, DAU)는 천만 명입니다.

    • 지원자 : 피드에 이미지나 비디오도 올라올 수 있나요? 아니면 포스트는 그저 텍스트입니까?

    • 면접관 : 이미지나 비디오 같은 미디어 파일도 포스트 할 수 있어야 합니다.

      → 요구 사항을 이해하고 모호함을 없애는 게 이 단계에서 가장 중요함!


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

  • 이번 단계의 초점 → 개략적인 설계안을 제시하고 면접관의 동의를 얻는 것

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

    • 미처 고려하지 못한 에지 케이스(edge case) 발견에 도움이 됨
  • API 엔드포인트(endpoint)나 데이터베이스 스키마도 보여야 하는가?

    • 질문에 따라 다름
    • “구글 검색 엔진을 설계하라”와 같은 큰 규모의 설계 문제라면 이 단계에서 다루기는 지나치게 세부적
    • 멀티플레이어 포커 게임의 백엔드를 설계하라는 질문이라면 괜찮을 것
    • 면접관의 의견을 물어보기!
  • 예제: “뉴스 피드 시스템을 설계하라”를 이용해 개략적 설계는 어떻게 만들어 내는지 살펴보기

    • 시스템이 실제로 어떻게 동작하는지 지금 당장 이해할 필요는 X
    • 개략적으로 보자면 이 설계는 두가지 처리 플로(flow)로 나눠 생각해 볼 수 있음
    • 피드 발행(feed publishing)과 피드 생성(feed building)이 그것임
      • 피드 발행: 사용자가 피드를 올리면 → 관련된 데이터가 캐시/데이터베이스에 기록되고 → 해당 사용자의 친구(friend) 피드에 뜨게 됨
      • 피드 생성: 어떤 사용자의 뉴스 피드는 해당 사용자 친구들의 포스트를 시간 역순으로(최신 포스트부터 오래된 포스트 순으로) 정렬해 만듦
    • 피드 발생 및 피드 생성 플로의 개략적 설계

3단계: 상세 설계

  • 면접관과 다음과 같은 목표는 달성한 상태일 것

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

    • 설계 대상 컴포넌트 사이의 우선순위를 정하는 것(똑같은 면접이란 있을 수 없기 때문)
      • 면접관이 여러분이 집중했으면 하는 영역을 알려주기도 함
      • 특히 선임급 개발자 면접이라면, 시스템의 성능 특성에 대한 질문을 던질 것이며 그 경우 질문 내용은 시스템의 병목 구간이나 자원 요구량 추정치에 초점이 맞춰져 있을 것
    • 대부분의 경우 면접관은 여러분이 특정 시스템 컴포넌트들의 세부사항을 깊이 있게 설명하는 것을 보길 원함
      • 가령 출제된 문제가 단축 URL 생성기(URL shortener) 설계에 관한 것이었다면?
        • 면접관은 여러분이 그 해시 함수의 설계를 구체적으로 설명하는 것을 듣고 싶어 할 것
      • 채팅 시스템에 관한 문제였다면?
        • 어떻게 하면 지연 시간(latency)을 줄이고 사용자의 온/오프라인 상태를 표시할 것인지를 듣고자 할 것
  • 면접 시에는 시간 관리에도 특별히 주의를 기울여야 함

    • 사소한 세부 사항을 설명하느라 정작 여러분의 능력을 보일 기회를 놓칠 수도 있음
    • 면접관에게 긍정적 신호(signal)를 전달하는 데 집중해야 함(불필요한 세부사항에 시간을 쓰지 말기)
      • 페이스북에서 뉴스 피드의 순위를 매기는 데 사용되는 EdgeRank 알고리즘에 대해 이야기하는 것은 바람직하지 않음 → 시간을 너무 많이 쓰게 됨 + 규모 확장 가능한 시스템을 설계할 능력이 있다는 것을 입증하는 데는 도움이 되지 않기 때문
  • 예제: 뉴스 피드 시스템의 개략적 설계를 마친 상황이라면? 그리고 면접관도 그 설계에 만족하고 있다면?

    • 2가지 용례를 보다 깊이 탐구해야 함
      - 피드 발행
      - 뉴스 피드 가져오기(news feed retrieval)



4단계: 마무리

  • 마지막 단계에서 면접관은 설계 결과물에 관련된 몇 가지 후속 질문을 던질 수도 있고(follow-up questions)

  • 스스로 추가 논의를 진행하도록 할 수도 있음

  • 지침

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

해야 할 것

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

하지 말아야 할 것

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

시간 배분

  • 시스템 설계 면접은 보통 매우 광범위한 영역을 다루며 45분 혹은 한 시간은 충분하지 않을 수 있음 → 시간 관리가 중요!
  • 그렇다면, 상술한 각 단계에 어느 정도의 시간을 쓰는 것이 좋을까?
    • 45분의 시간이 주어진다고 가정
    • 각 단계에 적절한 시간(대략적 추정치임. 실제로 써야 하는 시간은 문제의 범위나 면접관의 요구사항에 따라 달라질 수 있음!!)
      • 1단계 - 문제 이해 및 설계 범위 확정 : 3분 ~ 10분
      • 2단계 - 개략적 설계안 제시 및 동의 구하기 : 10분 ~ 15분
      • 3단계 - 상세 설계 : 10분 ~ 25분
      • 4단계 - 마무리 : 3분 ~ 5분

profile
언젠가 내 코드로 세상에 기여할 수 있도록, BE 개발 기록 노트☘️

0개의 댓글