요즘IT
위시켓
최근 검색어
전체 삭제
최근 검색어가 없습니다.

본문은 요즘IT와 세계 최대 빅데이터 기반의 번역/현지화(Localization) 기업 Sprok DTS에서 함께 만든 해외 번역 콘텐츠입니다. 필자인 Fahim ul Haq는 ‘Educative.io’의 공동 설립자로 개발 팀을 위한 소프트웨어 엔지니어 및 엔지니어링 지원 솔루션에 대한 실습 과정을 만들고 있습니다. 이번 글은 모든 개발자가 왜 시스템 디자인을 배워야 하는지에 대해 설명하고 있습니다.

회원가입을 하면 원하는 문장을
저장할 수 있어요!

다음

회원가입을 하면
성장에 도움이 되는 콘텐츠를
스크랩할 수 있어요!

확인

개발

모든 개발자가 시스템 디자인을 배워야 하는 이유

년차,
어떤 스킬
,
어떤 직무
독자들이 봤을까요?
어떤 독자들이 봤는지 궁금하다면?
로그인

 

본문은 요즘IT와 세계 최대 빅데이터 기반의 번역/현지화(Localization) 기업 Sprok DTS에서 함께 만든 해외 번역 콘텐츠입니다. 필자인 Fahim ul Haq는 ‘Educative.io’의 공동 설립자로 개발 팀을 위한 소프트웨어 엔지니어 및 엔지니어링 지원 솔루션에 대한 실습 과정을 만들고 있습니다. 이번 글은 모든 개발자가 왜 시스템 디자인을 배워야 하는지에 대해 설명하고 있습니다.

 
<출처: Medium>

 

우리는 인터넷과 항상 연결된 기기들에 의존하는 세상에 살고 있습니다. 손목시계, 조명 시스템 또는 스마트 냉장고 등 주변의 수많은 기기가 클라우드와 연결되어 있으며, 휴대폰의 앱과도 바로 연동됩니다. 이 기사를 읽는 것만 해도 와이파이 또는 데이터 기반의 인터넷이 없으면 불가능하죠. 이러한 기능들을 가능하게 해주는 서비스들은 모두 분산 시스템 덕분에 존재합니다.

 

분산 시스템이란 서로 다른 통신 기기에 위치한 요소들로 이루어진 시스템입니다. 제대로 설계된 분산 시스템의 경우 확장이 가능하며, 더 많은 사용자와 기능을 지원하면서, 안정적이고 언제나 사용할 수 있는 서비스를 제공합니다.

 

즉, 시스템 디자인은 분산 시스템을 디자인하는 기술입니다.

 

오늘날 대다수의 애플리케이션은 분산 시스템과 연결되어 있습니다. 그렇기 때문에 시스템 디자인은 능숙한 개발자에게 필수조건과 같은 기술이 되고 있습니다.

 

Educative, Microsoft, 그리고 Facebook에 근무하면서 수백 명에 달하는 지원자를 대상으로 시스템 디자인 면접을 진행한 이력이 있습니다. 요즘에는 시스템 디자인 면접을 통과하지 않고서는 시니어 개발자 직위로 올라서는 경우가 거의 없습니다. 하지만 본인의 실력과 상관없이, 개발자라면 누구나 시스템 디자인을 배워야 한다고 생각합니다. 물론 면접 준비만을 위해 시스템 디자인을 공부하는 것은 아니라고 봅니다.

 

오늘날의 모든 개발직은 분산 시스템에 의존합니다. 따라서 어느 분야의 개발자가 되었든, 시스템 디자인을 배우면 본인 작업의 품질은 향상될 수밖에 없죠. 이제 시스템 디자인 학습을 통해 어떻게 우위를 차지할 수 있는지를 알아보겠습니다.

<출처: Medium>

 

시스템 디자인이 필요한 이유

저는 마이크로소프트와 페이스북에서 8년 동안 분산 시스템을 다루는 일을 했지만, 정작 대학교에서는 분산 시스템에 대한 교육을 받지 못했습니다. 분산 시스템과 시스템 디자인에 대한 지식은 주로 일을 하면서나 백서들을 통해 습득했습니다.

 

지금의 소프트웨어 엔지니어링 관리자들이 처음 취업을 하고, 오늘날의 리더들과 강사들이 아직 관리자 직위에 있었던 2010년 이전에는 아마존이나 구글, 마이크로소프트에서 근무하지 않는 이상 분산 시스템에 대한 이야기는 들어볼 수 없었습니다. 그 당시 대다수의 애플리케이션은 클라우드와 연동이 되지 않는 데스크톱 애플리케이션이었기 때문이죠. 그러나 모두가 알다시피 기술이란 빠르게 변화합니다. 이제 사실상 모든 애플리케이션은 분산 시스템에 더욱 의존하고 있습니다. 이러한 트렌드는 앞으로도 지속되기 때문에, 분산 시스템과 상호 작용하는 더 많은 애플리케이션을 기대할 수 있을 것입니다. 이와 같은 이유로 유능한 개발자는 분산 시스템에 대한 지식을 많이 쌓아야 합니다.

 

분산 시스템의 초창기 시절, 엔지니어들은 아무런 사전 지식 없이 분산 시스템을 개발하기 위해 노력하곤 했습니다.

 

저는 운이 좋게도 Microsoft Azure 사전 출시 팀의 일원으로 1세대 시스템 엔지니어가 될 수 있었습니다. 미지의 영역 같았던 분산 시스템 도입을 위해 노력하며, 수많은 도전과 실패, 문제에 직면했습니다. 하지만 저를 포함한 이 세대의 노력으로 시스템 디자인이라는 학문 분야를 갖게 되었습니다.

 

시스템 디자인을 통해 우리는 디자인 패턴[1]과 재사용 가능한 컴포넌트(또는 빌딩 블록)[2]를 사용하여 대규모의 확장 가능한 시스템을 구축할 수 있게 되었습니다.

 

여러분이 열정 있는 개발자라면, 본인이 기여하고 있는 시스템의 더 큰 그림을 이해하는 것이 바람직합니다.

 

시스템의 큰 그림을 이해하는 것이 왜 중요한지는 작고한 대니 소프(Danny Thorpe)의 명언에서도 볼 수 있습니다.

“전체적인 아키텍처나 디자인을 생각하지 않고 프로그래밍을 하는 것은 오로지 손전등만 가지고 동굴을 탐험하는 것과 같습니다. 지금까지 어떤 길을 걸어왔는지, 어디로 가는지, 심지어 본인이 어디에 있는지도 모르죠.” — 대니 소프

 

시스템 디자인이란 분산 시스템의 총체적인 아키텍처를 뜻합니다. 분산 시스템을 기반으로 한 세상에서 시스템 디자인을 아는 프로그래머와 모르는 프로그래머의 차이는 레스토랑의 수석 요리사와 라인 쿡의 차이와 같습니다. 수석 요리사는 시스템의 큰 그림을 이해합니다. 각각의 멤버가 어떻게 일을 진행하고, 멤버가 어떤 방식으로 서로에게 도움이 되는지 잘 숙지하고 있습니다. 각 멤버가 맡은 업무, 사용하는 도구 및 작업 방식을 잘 파악하고 있습니다. 한 명의 멤버가 맡은 업무를 다하지 못할 경우 누가 대신해서 책임을 질 건지도 잘 알고 있죠. 이러한 안목이 없는 요리사는 그저 라인 쿡에 불과합니다. 본인이 맡은 특정한 업무나 방법을 잘 알고 있을지는 몰라도, 본인이 기여하는 시스템에 대한 큰 그림을 제대로 파악하고 있지 못하니까요.

 

시니어 직책이나 리더로 승진하기 위해서 시스템 디자인이 필요한 이유는 이제 충분히 설명한 것 같습니다. 더 높은 직책으로 승진하는 것이 목표가 아니라고 해도, 시스템 디자인에 대해 더 알고 싶어 하는 마음가짐은 중요합니다. 결국에는 여러분이 분산 시스템이란 아키텍처에서 핵심적인 역할을 하기 때문입니다.

 

대다수의 리더들과 마찬가지로 제가 개발자를 채용할 때 가장 주목하는 자질은 바로 본인이 기여하고 있는 세상에 대해 더욱 배우고, 알고 싶어 하는 자세입니다.

 

훌륭한 개발자로 거듭나고 싶다면, 본인의 부족한 지식을 채워나가려 하는 의지가 있어야 합니다. 훌륭한 개발자는 지나칠 정도로 호기심이 많아야 합니다.

<출처: Medium>

 

모든 개발자가 시스템 디자인을 배워야 하는 이유

개발자에게는 언젠간 분산 시스템을 구축해야 하는 때가 옵니다. 그렇지 않다고 해도, 원하는 경험을 쌓기 위해서는 분산 시스템을 기반으로 상호 작용하는 애플리케이션을 다루게 될 것입니다.

 

예를 들어, 모바일 앱 개발자의 경우, 개발 중인 애플리케이션은 시작부터 여러 개의 분산 시스템을 기반으로 작동할 것입니다.

 

우버와 같은 승차 공유 서비스를 개발한다고 생각해 보세요. 오늘날 우버와 같은 서비스를 개발할 경우, 적어도 다음과 같은 여러 개의 서비스를 사용해야 할 것입니다.

  • 문자 메시지를 보내기 위한 Trillio
  • 결제 처리를 위한 Stripe
  • 길 안내를 위한 구글 지도
  • 근처에 있는 사용자의 위치를 찾기 위한 Yelp

 

이러한 과정에서 타 시스템을 이용할 뿐만 아니라, 본인이 개발하고자 하는 모바일 애플리케이션을 통해 본인만의 분산 시스템을 구축하게 됩니다. 이러한 승차 공유 서비스 앱은 다음과 같은 시스템 디자인의 여러 구성 요소 또한 응용하게 될 것입니다.

  • 앱이 제공하는 서비스 간 읽기/쓰기 요청을 분배하기 위한 로드 밸런서
  • 메타데이터[3] 저장을 위한 데이터베이스
  • 흔히 요청되는 데이터를 저장하기 위한 캐시

 

분산 시스템은 게임 개발에도 매우 핵심적인 역할을 합니다. 오늘날 가장 인기 있는 게임들 중 상당수가 클라우드를 기반으로 한 게임이고, 수천 명의 사용자들을 동시에 지원할 수 있는 것도 확장 가능성 덕분에 가능하죠. 이런 분류에 해당하는 게임은 Fate Grand Order와 같은 모바일 퍼스트 가챠(gacha)[4] 게임과 Pokémon Go와 같이 사회성을 가진 게임부터 League of Legends와 Halo Multiplayer과 같은 AAA 게임까지 있습니다.

 

분산 시스템은 게이밍에 필요한 속도와 안정성을 유지하는 데 있어서 매우 핵심적인 역할을 하지만, 멀티플레이어 게임을 구축하는 것이란 분산 시스템이 겪는 가장 어려운 문제 중 하나입니다. 여기서 가장 핵심적인 요소는 레이턴시(또는 속도)이며, 50ms/100ms를 초과하는 레이턴시나 지연은 사용자가 게임에 몰입을 할 수 없게 만듭니다. 게다가 서버는 속도에 큰 지장 없이 어마어마한 수의 사용자들을 동시에 지원해야 합니다.

<출처: Medium>

프론트엔드 개발자의 작업은 격리된 것 마냥 분리된 공간에서 진행되지 않습니다. 웹 페이지를 렌더링하는 과정조차도 API를 통해 여러 개의 서로 다른 분산 시스템과 상호 작용합니다.

 

구글의 홈 화면을 생각해봅시다. 구축하기 이렇게 쉬운 홈페이지는 없죠. 로고 아래에다 검색창 하나를 띄운 셈이니까요. 그러나 검색창에 글자를 치기 시작할 때부터 엔터키를 누를 때까지 브라우저는 분산 시스템을 통해 무려 수십만 개의 서버와 상호 작용을 합니다. 불과 몇 초 만에 다음과 같은 과정이 이루어집니다.

  • 사용자가 검색창에 검색어를 입력하고, 각 문자는 API를 통해 Typeahead 시스템[5]에 보내집니다. 문자가 추가로 입력될 때마다 Typeahead는 출력을 변경하여 몇 밀리 초(milliseconds) 만에 사용자의 의도를 파악합니다.
  • 사용자가 엔터키를 누른 후 수많은 시스템이 작동하기 시작합니다. 관련 웹 페이지를 찾기 위해 인덱스로 검색 쿼리가 보내집니다. 또 다른 검색 쿼리는 관련 비디오를 찾아내기 위해 유튜브로 보내집니다. 검색어가 영화 또는 레스토랑, 서적의 제목과 동일할 경우, 더욱 특화된 시스템을 거쳐 완전히 다른 경험을 제공하죠. 여기에 더해, 검색어에 따라서 결과 위에 몇 개의 링크를 추가적으로 표시하는 광고 서비스까지 존재합니다.

 

프론트엔드 엔지니어로서 마치 마술처럼 진행되는 이런 과정에 대해 호기심이 있어야 하며, 구축하고 싶은 경험을 만들기 위해 시스템과 상호 작용하는 여러 요소에 대한 지식을 갖추고 있어야 합니다.

 

어느 분야에서 일하든 시스템 디자인에 대한 지식은 더욱 다재다능한 엔지니어로 거듭나게 해주며, 경력에도 큰 도움이 될 것입니다. 시스템 내부적으로 무슨 일이 일어나고 있는지 알게 되면, 개발하고 있는 시스템의 필요사항이나 한계점에 맞는 솔루션을 더욱 잘 구축할 수 있을 것입니다.

 

하지만, 시스템 디자인 학습의 중요성은 개발자에게만 해당하는 교훈이 아닙니다.

 

최신 기술 제품을 다루는 직종의 종사자라면 시스템 디자인의 원리를 제대로 숙지함으로써 기술 담당자들과 문제없이 의사소통해야 합니다. 이러한 직종에는 기술 지원 엔지니어 및 기술 제품 관리자, 그리고 엔지니어링 관리자가 포함됩니다.

<출처: Medium>

 

면접을 위해 공부하지 마세요

면접관이 봤을 때 지원자의 가장 치명적인 단점은 바로 지식의 부족함입니다. 많은 개발자가 면접을 위해 시스템 디자인을 공부하기 시작한다는 점을 고려하면, 당연히 지식이 부족할 수밖에 없습니다. 이것이 틀렸다는 것은 아닙니다. 하지만 면접을 통과하기 위해 시스템 디자인을 공부해도 실제 상황에서 응용할 수 있을 만큼의 풍부한 지식을 습득하기는 어렵습니다. 이러한 이유로 시스템 디자인 면접을 보기 훨씬 전부터 미리 공부를 시작하는 것이 좋습니다.

 

시스템 디자인 면접만을 위해 공부하지 마세요. 시스템 디자인 자체를 위해 공부하세요!

 

시스템 디자인 공부는 최대한 일찍, 첫 직장에 근무하기 전부터 시작하는 것이 좋습니다. 초급 개발자든, 현재 프로그래밍을 배우고 있는 학생이든, 시스템 디자인에 대한 지식은 큰 이점이 됩니다.

 

중급 엔지니어인 경우, 시스템 디자인 공부를 미루지 마세요. 시스템 디자인에 대한 지식 없이 시니어 직책을 목표로 면접에 응시할 경우, 부족한 견해로 인해 지원했던 것보다 낮은 위치의 직책을 제안받을 수도 있기 때문입니다.


[1] 소프트웨어 디자인 패턴은 소프트웨어 공학의 소프트웨어 디자인에서 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책이다. 소스나 기계 코드로 바로 전환할 수 있는 완성된 디자인은 아니며, 다른 상황에 맞게 사용할 수 있는 문제들을 해결하는 데 쓰이는 서술이나 템플릿이다.
[2] 프로그래밍에서 컴포넌트란 재사용이 가능한 각각의 독립된 모듈을 뜻한다.
[3] 메타데이터는 데이터에 대한 데이터이다. 캐런 코일(Karen Coyle)에 의하면 ‘어떤 목적을 가지고 만들어진 데이터(Constructed data with a purpose)’라고도 정의한다.
[4] 가챠(gacha)란, 확률적으로 아이템을 뽑는 시스템이 들어간 게임을 말한다.
[5]  ‘자동 완성’이라고도 하며, 시스템이 사용자가 입력하는 것을 토대로 나머지 단어를 추측하는 기능을 말한다.

 

<원문>

Why every developer should learn System Design

 

위 번역글의 원 저작권은 Fahim ul Haq에게 있으며, 요즘IT는 해당 글로 수익을 창출하지 않습니다.

좋아요

댓글

공유

공유

댓글 0
작가
414
명 알림 받는 중

작가 홈

작가
414
명 알림 받는 중
요즘 해외 개발자들은 어떻게 일할까요? 기획자나 디자이너는요? 그래서 준비했습니다. 읽어볼만한 해외 소식들을 번역해 전합니다. We are the world.

좋아요

댓글

스크랩

공유

공유

지금 회원가입하고,
요즘IT가 PICK한 뉴스레터를 받아보세요!

회원가입하기
요즘IT의 멤버가 되어주세요! 요즘IT의 멤버가 되어주세요!
요즘IT의 멤버가 되어주세요!
모든 콘텐츠를 편하게 보고 스크랩해요.
모든 콘텐츠를 편하게 보고 스크랩 하기
매주 PICK한 콘텐츠를 뉴스레터로 받아요.
매주 PICK한 콘텐츠를 뉴스레터로 받기
로그인하고 무료로 사용하기