시스템 설계 면접 성공
A complex system has many parts working together. Image by Timelab Pro from Unsplash

시스템 설계 면접 성공

이 글은 영어에서 자동으로 기계 번역되었으며 부정확한 내용이 포함될 수 있습니다. 자세히 보기
원본 보기

오랜만에 글을 썼습니다만, 작년은 시스템 디자인 인터뷰를 많이 했습니다. 나는 이러한 인터뷰가 제가 실제로 하는 일과 매우 유사할 수 있고 후보자가 자신의 강점을 발휘할 수 있을 만큼 충분히 개방적이기 때문에 약간의 개선이 필요하더라도 정말 좋아합니다.

많은 후보자를 인터뷰한 결과, 면접관이 귀하의 강점을 평가하는 데 필요한 신호를 정확하게 제공할 수 있도록 몇 가지 중요한 팁을 정리했습니다. 시스템 설계는 경험이 필요한 기술이지만, 경험이 있는 사람에게는 어쨌든 그 기술은 일상의 업무에서 활용하고 있는 것이 되어야 합니다. 다음은 면접 긴장을 해소하고 그 한 시간 동안의 경험을 보여주기 위한 체크리스트입니다.

기능 및 비기능 요구 사항 수집

앞서 요구 사항 수집 에 대해 이야기했지만 시스템 설계 면접에서는 특히 중요합니다. 제한된 알고리즘과 달리 대규모 시스템에는 요구 사항에 따라 다양한 결정을 내릴 수 있는 영역이 더 많습니다. 명확히 해야 할 요구 사항에는 두 가지 유형이 있습니다.

  • 기능 요구 사항: 시스템은 실제로 무엇을 해야 합니까? 하다? 예를 들어, URL 단축기를 디자인할 때 물어봐야 할 중요한 질문 중 하나는 역방향 조회를 지원할지 여부입니다 (긴 URL에서 기존 짧은 URL로)또는 동일한 긴 URL이 두 가지 다른 방식으로 단축되는 것을 허용할 수 있는 경우. 여기에서 사용자가 실제로 시스템과 상호 작용하는 방식을 이해할 수 있습니다.
  • 비기능 요구 사항: 시스템이 기술적으로 작동하는 방식입니다. 시스템의 규모를 이해하고 싶을 것입니다 (사용자 수, 동시 요청, 처리 또는 저장 중인 데이터의 양). 명확히 해야 할 또 다른 일반적인 요소는 예상 대기 시간, 특히 전체 시스템에 대한 종단 간 대기 시간으로, 여기에는 쓰기 후 읽기 일관성 요구 사항이 포함될 수 있습니다.

시스템을 설계하는 동안 이러한 요구 사항 중 일부를 자세히 살펴보고 어떤 절충안을 해야 하는지 파악하는 것은 괜찮습니다. 그러나 경험이 많을수록 이러한 요구 사항을 더 많이 미리 인식할 수 있으므로 면접의 이 부분에서 경험 수준이 드러납니다.

그러나 무엇을 하든 디자인에 바로 뛰어들지 마십시오. 먼저 무엇을 디자인하고 있는지 파악하십시오.

엔드 투 엔드 솔루션 제시

제가 보는 가장 큰 문제는 후보자가 아키텍처의 일부 부분에 대해 너무 자세히 설명하고 면접이 끝날 때 엔드투엔드 솔루션이 없는 경우입니다. 아마도 그들은 데이터 저장에 너무 집중하고 데이터 처리 방식에 대해 손을 흔들었을 수도 있습니다. 또는 그들은 데이터, 심지어 어떤 데이터가 실제로 시스템에 어떻게 저장되는지에 대해 이야기하지 않았습니다.

다른 것이 없다면 제안된 시스템의 모든 다양한 구성 요소를 명확하게 보여주는 높은 수준의 블록 다이어그램이 있는지 확인하십시오. 대부분의 솔루션은 다음과 같은 공통 부분으로 구성됩니다.

  • 데이터 소스: 애플리케이션 서버, 클라이언트 장치 등
  • 데이터 저장소: 관계형, 시계열 및 키-값 데이터베이스, 메모리 내 캐시 등
  • 데이터 전송: 메시지 대기열, REST API 등
  • 데이터 처리 : 처리가 발생하는 위치, 필요한 데이터 및 처리가 수행하는 작업.
  • 의미가 있는 경우 보조 서비스: 방화벽, 로드 밸런서 등 내가 제시하는 문제에서 이것들은 일반적으로 주어진 것이며 언급할 필요는 없지만 다른 응용 프로그램의 중심이 될 수 있습니다.

에 대한 강조에 주목하십시오. 데이터. 이는 적어도 내 경험상 대부분의 대규모 시스템에서 데이터가 시스템의 핵심이기 때문입니다. 시스템에 관한 모든 것, 다양한 부분 및 이들이 서로 연결되는 방식은 데이터가 시스템을 통해 흐르고 사용자에게 가치 있는 방식으로 처리될 수 있도록 하기 위해 존재합니다.

업계 표준 용어 사용

회사에서 사용하는 특정 기술과 용어는 때때로 고유하며 종종 역사의 특정 요구 사항에 따라 결정됩니다. 그러나 그 고유성의 기저에는 회사가 적용하는 공통 패턴 세트가 있으며, 이러한 패턴은 면접관과 공유하는 언어입니다. 해당 패턴을 참조합니다.

예를 들어, 마음에 들면 Kafka 또는 Amazon SQS라는 이름을 자유롭게 지정하되 메시지 대기열을 pub/sub 시스템으로 구성하고 싶다고 언급하십시오. 이 접근 방식에는 다음과 같은 많은 장점이 있습니다.

  • 면접관이 당신과 같은 기술을 모르는 경우 (그들은 큰 것을 알아야 하지만), 당신은 공통 언어를 가지고 있습니다.
  • 동일한 기술이 여러 가지 이유로 사용될 수 있기 때문에 제안된 시스템에 필요한 기능을 정확히 이해하고 있음을 보여줍니다.
  • 마지막으로, 배경에 관계없이 다양한 기술을 사용할 수 있는 새로운 역할에 경험을 적용할 수 있는 충분한 일반 지식을 가지고 있음을 보여줍니다.

특정 기술의 이름을 지정하는 것은 실제 경험이 있음을 보여주는 데 유용하지만 여전히 기본 패턴을 참조해야 합니다.

회사별 용어도 마찬가지입니다. 당신과 면접관이 같은 단어를 다른 개념으로 해석하면 많은 잘못된 의사소통이 생길 것입니다. (흥미롭게도 이 모든 것이 대기업의 다른 팀과 함께 일할 때 적용될 수 있습니다!)

선택 사항으로 어떤 문제를 해결하고 있는지 설명하세요.

저는 역사적으로 이것을 절충안을 제시하는 것으로 생각했지만, 후보자들이 특정 제안에 전념하는 대신 대체 솔루션을 자세히 설명하는 데 너무 많은 시간을 소비하는 경우가 많다는 것을 발견했습니다. 그럼에도 불구하고 절충안은 대규모 시스템을 설계하는 데 중요한 부분이므로 각 선택이 어떤 문제를 해결하는지 설명하는 것이 중요합니다.

예를 들어 메시지 큐를 디자인에 통합하기로 결정한 경우 처리 시간에 대한 타격을 감수할 의향이 있다고 말할 수 있습니다 (처리는 더 이상 주문형이 아니라 대기열 소비자가 해당 데이터 조각에 도달할 때 이루어집니다) 관련 데이터 처리 간의 경쟁 조건에 대한 걱정 없이 모든 데이터가 안정적으로 처리되도록 하기 위해. 또는 키-값 저장소를 통합하는 경우 개별 항목에 대한 짧은 대기 시간 읽기를 원하고 이전에 수집한 기능 요구 사항에 따라 다른 쿼리를 수행할 필요가 없다고 말할 수 있습니다.

이렇게 말하고 계속 진행하는 것은 제안된 시스템에 대한 통일된 내러티브를 고수하면서 문제 공간과 해결 공간 모두에 대한 명확한 이해를 바탕으로 의도적으로 선택을 했다는 것을 보여줍니다.

전문 분야에 대해 자세히 알아볼 준비를 하세요

시스템의 모든 영역에 대한 심층적인 전문 지식이 없는 것은 허용되어야 합니다 (모든 면접관이 그렇게 수용적인 것은 아니라는 것을 알고 있습니다), 하지만 면접관이 당신의 배경을 바탕으로 문제를 선택했다면 당신이 경험이 있는 영역이 있어야 합니다. 특히, 특히 해당 부분이 이력서에 눈에 띄게 언급되어 있는 경우 이전 작업과 일치하는 시스템의 모든 부분에 대해 지능적으로 이야기할 수 있는지 확인하고 싶습니다.

데이터 처리를 위한 스트리밍 아키텍처를 연구했다고 말씀하셨나요? 메시지 대기열에 대해 이야기하고 Apache Spark 또는 Samza와 같은 기술을 언급할 수 있어야 합니다. (또는 이전에 사용한 모든 기술), 스트림 처리와 온라인 또는 오프라인 데이터 처리 간의 장단점 등 데이터 스토리지에 대해 광범위하게 작업한 경우 샤딩, 데이터베이스 선택, 디스크 기반 영구 캐싱과 메모리 내 캐싱 등에 대해 이야기할 수 있어야 합니다.

이것은 경험이 많을수록 지식이 더 넓어질 것으로 예상되는 또 다른 영역입니다. 당신이 충분히 선배라면 위에서 언급한 다양한 영역에 대해 적어도 높은 수준에서 이야기할 수 있어야 합니다. 이는 많은 대규모 시스템에서 등장하는 소프트웨어 엔지니어링의 상당히 표준적인 개념입니다.

시스템 생산화에 대해 이야기하십시오.

마지막으로, 경험이 없는 사람들이 걸려 넘어지는 부분입니다. 면접관이 문제를 제시할 때 이를 명확하게 요청 했기를 바라지만, 그렇지 않은 경우 이 부분이 이야기해야 할 부분인지 명확히 해야 합니다.

여기에서 모니터링 및 로깅, 오류 처리에 대해 이야기합니다. (그 중 일부는 더 일찍 나왔을 수도 있지만,), 캐시 워밍업 기간, 예기치 않은 트래픽 급증 시 정상적인 성능 저하 등과 같은 문제를 해결하기 위한 점진적인 롤아웃 특히 모니터링과 오류 처리는 두 가지 영역입니다 모든 시스템이 다루기 때문에 제가 이끌 것입니다.

인터뷰의 이 부분에서는 이론적 시스템을 설계할 수 있을 뿐만 아니라 그러한 시스템이 프로덕션 시 어떤 문제에 직면하게 될지 알 수 있는 실제 경험이 있음을 보여줍니다. 내가 당신을 기술 책임자로 삼는다면 당신이 이러한 문제에 대해 생각할 것이라고 확신할 수 있습니까? 전에 우리는 시작합니까? 또한 전체 시스템 설계를 간소화해야 하는 이유이기도 하므로 이 섹션을 다룰 시간이 있습니다.

제가 가진 마지막 팁은 사소한 것이지만 간���히 언급할 가치가 있습니다: 디자인을 만들 때 디자인을 보여줄 준비를 하십시오. 직접 면접을 하는 경우 화이트보드에 블록 다이어그램을 그릴 준비를 하십시오. 인터뷰가 가상인 경우 그리기 도구를 선택하고 연습하십시오. 그것은 자신을 위한 화이트보드를 구입하는 것을 의미할 수도 있습니다! 카메라에서 볼 수 있는지 확인하십시오.

올바르게 수행되면 시스템 설계는 숙련된 엔지니어에게 쇼할 수 있는 기회를 제공합니다. (적어도) 프로젝트의 기술 책임자로서의 기술. 그러나 단 한 시간 안에 자신의 경험을 맞추려고 하기 때문에 면접 대본이 있다는 것은 자신의 능력에 대한 자신감을 불러일으키는 기술을 정확하게 보여줄 수 있다는 것을 의미합니다.

이 기사는 원래 Hiring For Tech 웹사이트에 게시되었습니다. 저의 더 많은 콘텐츠를 읽고 싶다면 이메일이나 LinkedIn에서 구독하세요. 내 콘텐츠에 대해 어떤 생각이 있으면 아래에 댓글을 남겨주세요. 그리고 잊지 마세요 따라 오세요 더 많은 콘텐츠를 원하십니까!

Ravi Tandon

DecoverAI팔로워 2만

4년

Well written! Keep up the good work 👏👏

Anna Onyszko

Ministry of Foreign Affairs…팔로워 9천

4년

Super interesting read. Thanks for sharing!

Thank you for publishing this blog! Great tips!

댓글을 보거나 남기려면 로그인

Avik Das의 글 더 보기

  • 공식 면접 교육

    이 뉴스레터의 실행 주제는 훌륭한 소프트웨어 엔지니어가 자동으로 좋은 면접관이 되는 것은 아니라는 생각입니다. 이것은 다음과 같은 생각과 대조됩니다.

    댓글 1
  • 면접 견습

    소프트웨어 엔지니어는 후보자의 기술 능력을 평가하는 데 유리하지만, 면접을 진행하는 것은 단순한 코드 평가 그 이상입니다. 제가 쓴 비기술적 기술이나 심지어 면접에 특화된 기술력도 매우 중요합니다.

    댓글 6

함께 조회된 페이지