경력직 개발자 커리어 패스 정리

TL;DR

커리어 패스는 만들어가는 것이고 단기간에 가능하지 않다.

커리어 패스가 고민되는데 어떻게 할 지 모른다면 다음과 같이 해보자.

  1. 현재 내 능력과 관계없이 다니고 싶은 회사를 5개 정도 정한다.(예: 구글, 아마존, Valve, AirBnB, github)

  2. 해당 회사들의 Job / Career 란을 본다.

  3. 현재 내 능력과 관계없이 제일 하고 싶은 job 을 목록에서 찾는다.

  4. 해당 job 의 description 을 읽어본다.

  5. 맘에 드는 job description 은 북마크 하고 한두달에 한번씩 다시 읽고 현재 나의 성장 / 업무를 점검한다.

시작하며

최근 직장을 그만두고 취업준비를 하면서 많은 고민을 하고 있다.

이유는 현재의 커리어 패스로는, 내가 보기에 매력적인 회사에 갈 수가 없다는 것

풀스택 SDE 로 어설프게 DevOps 일을 하면서 커리어의 대부분을 보냈는데

막상 취업시장에 뛰어드니 현재 내 커리어는 신입사원과 동일한 수준이라는 사실을 깨닫고 충격을 받았다.

참고로 내 커리어 패스에 대해 고민한 결과 다음과 같은 요구사항을 정리했다.

  1. 소프트웨어 엔지니어 로 취업을 하되경력을 날릴 순 없으니 데이터 엔지니어 로의 업무를 할 수 있어야 한다.

  2. 추가로 사내에 데이터 과학자 또는 데이터 분석가 들도 보유하고 있으면 좋겠다.

  3. 몇년 뒤, 최종적인 커리어는 데이터 과학자 이며 필요하다면 데이터 엔지니어 를 거쳐가야겠다.

이런 데이터 분석가 / 과학자 / 엔지니어 라는 용어는 내가 정한 것이 아니라

실제로 회사들에서 뽑고 있는 업무분야이며

이번 글에서는 웹 쪽에 어떠한 업무분야들이 있는지 종류에 대해 간단히 정리해보려고 한다.

업무분야(Job Description)

대학생때는 좋은 개발자가 되겠어 라는 막연한 꿈을 가지고 닥치는대로 공부했으나

막상 처음 직업을 구해야하는 시점이 되자 개발자도 엄청나게 종류가 많다는 사실을 깨닫게 되었다.

이런 개발자의 업무분야를 나누는 기준은 매우 다양하다.

여기서는 내 머리속의데이터의 흐름에 한번 따라 나눠보겠다.

먼저 서비스가 있어야 한다. 모든 회사는 서비스를 통해 사용자의 요청을 처리하고 적절한 데이터를 쌓게 된다.

서비스를 개발하고 요청을 처리할 수 있는 서비스 스택을 디자인(architect) 하는 것이 서비스 직종이다.

사용자가 성장하면서 서비스가 다루는 데이터의 양도 성장하게 된다.

이렇게 늘어나는 데이터를 처리할 수 있는 적절한 경로(pipeline)를 설계하고 필요하다면 장비(hardware)도 직접 손대는 시스템 직종이 있다.

마지막으로 서비스를 통해 시스템이 잘 쌓아둔 데이터를 이용하여 부가가치를 창출 하거나 문제를 해결하는 데이터 직종이 있다.

실제로는 위의 세 직종은 조금씩 교집합을 가지고 있다.실세계의 데이터로 만든 분류기의 성능이 구린 것이 이해가 되는 순간

하지만 기본적으로는 교집합을 가지고 있더라도 한쪽이 주력이 되고 나머지 한쪽이 보조하는 경우가 대부분이므로 일단 넘어가자.

서비스(Service)

위의 내용은 취업 준비를 하면서 많은 job description 을 읽고

내 나름대로 정리한 내용이므로 완전 정확한 분류라고 보기엔 무리가 있다.

회사의 job description 에 따라 백엔드 엔지니어와 소프트웨어 엔지니어가 거의 같은 경우도 있고

Data Scientist/Data Analyst 대신 Junior Data Scientist/Data Scientist 라고 구분하기도 한다.

큰 그림을 파악하는데 가이드라인으로만 보자.

퍼블리셔(Publisher)

일명 psd 컨버터. psd 파일을 입력하면 html, css 를 출력한다.

국내는 관련 외주회사가 많으니깐종종 있지만 외국은 퍼블리셔만 따로 뽑는 경우가 많이 없는 것 같다.

디자이너가 퍼블리셔 역할을 하는 것이 일반적인 것 같다. UX/UI 디자이너도 분리되어 있지 않은 경우가 많아지고 있는 듯 하다.

프론트엔드 엔지니어(Front-end Engineer)

html, css 를 다루는 퍼블리셔와 프론트엔드 엔지니어를 구분짓는 가장 큰 차이는 연봉 javascript 일 것이다.

프론트엔드 엔지니어는 javascript 를 이용하여 event 와 dom 을 동적으로 제어하고 json, socket.io 같은 기술을 이용해 서버와 통신하게 된다.

즉 js와 browser, v8 엔진의 이해도가 프론트엔드 엔지니어의 내공을 결정한다고 보면 될 것 같다.

최근에는 js heavy 한 서비스들이 많아져서 AngularJS 나 React(Flux, Redux) 를 다룰줄 아는 프론트엔드 개발자를 선호하는 추세인 것 같다.

백엔드 엔지니어(Back-end Engineer)

주로 DB(RDBMS, noSQL) 와 통신하여 데이터를 가져오고 가져온 데이터를 적절히 가공하여 프론트엔드가 통신할 API 를 만든다.

새로운 기능의 구현과 기존 기능의 개선에 가장 큰 가치를 둔다.

언어는 Java, PHP, node.js, 가끔가다RoR, 가뭄에 콩나듯이Python 을 사용하며

언어의 비율은 국내나 해외나 큰 차이가 없는 것 같지만 C#, GO, Elxir, Erlang, Clojure 같은 귀한?언어를 쓰는 경우는 해외가 훨씬 많다.

해당 회사에서 사용하는 언어(Java, C#, PHP 등), DB(PostgresQL, MSSQL, noSQL), 캐시(Redis, memcached) 에 대한 기본적인 이해와 구현능력을 주로 본다.

그리고 요새는 AWS, Azure 같은 클라우드 환경에서 개발하는 경우가 많아서 클라우드 환경에 대한 기본적인 이해가 있는지도 확인한다.

소프트웨어 엔지니어(Software Engineer)

Software Engineer 또는 Software Development Engineer 라고도 부르며,

백엔드 엔지니어에 아키텍트(보통 시스템 디자인 이라고 함)의 능력을 함께 갖추고 있는 경우를 말한다.

백엔드 엔지니어가 Robust 한 서비스를 만들 수 있느냐를 핵심가치로 한다면 소프트웨어 엔지니어는 Scalable (더 나아가서는 Highly Available) 한 서비스를 만들 수 있느냐를 핵심가치로 본다.

대부분의 소프트웨어 엔지니어 면접에는 알고리즘/데이터구조 면접 뿐만 아니라 System Design 면접도 함께 치뤄진다.

풀스택 엔지니어(Fullstack Engineer)

우리나라는 프론트엔드랑 백엔드를 다 할 줄 아는 개발자가성비 좋은 개발자 로 생각하고 있지만

외국은 프론트엔드를 다룰 줄 아는 소프트웨어 엔지니어 로 정의하고 있다는 점이 다르다.

마이크로 서비스 아키텍쳐(MSA) 가 대세인 상황에서 기능적으로 구성된 팀 문화를 가진 회사는 아무래도 풀스택 엔지니어를 선호할 수 밖에 없다.

그리고 해당 팀에서의 엔지니어는 자신이 개발 및 배포를 할 뿐만 아니라, 자신이 배포한 서비스가 기본적인 트래픽에 대한 처리는 할 수 있도록 구성도 해야한다.

따라서 백엔드 엔지니어의 기본적인 능력이 없이 프론트엔드만 하는 것은 의미가 없다.

보통 직무에 아무 설명없이 Fullstack이라고 적혀있으면 당연하게도node.js 가 백엔드인 경우가 많다. 아닌 경우는 대부분 Fullstack Java Developer 처럼 적어둔다.

시스템(System)

시스템 엔지니어(System Engineer)

시스템 엔지니어는 서버나 네트워크 단의 아키텍쳐를 선정하거나 개발하며, 물리적인 서버를 관리하는 역할도 한다.

클라우드 시스템을 안쓰고 IDC 등에서 서버를 직접 운영하는 경우가 많은데 이런 경우 시스템 엔지니어가 서버에 대한 점검직접 스카시 하드를 구입하여 IDC 에 가서 추가/교체하고 온다거나도 직접 하고 한다.

요즘 시스템 엔지니어는 IDC, 클라우드, 보안, 데이터 웨어하우스 같이 회사의 주업무가 하드웨어를 직접 관리하는 경우에만 뽑는 것 같다.

클라우드 서비스 가격이 워낙 싸져서, 클라우드 비용 < 엔지니어 월급 + 하드웨어 + 서비스 다운타임 + 백업 이기 때문인 것 같다.

DevOps

Developer + Operations 의 합성어로 우리나라에서는 혼자서 배포가 가능한 백엔드 개발자 정도로 생각하고 있지만 외국에서는 전혀 그렇지 않은 것 같다.

DevOps 는 기본적으로 배포자동화에 핵심가치를 두고 있으며 배포와 서비스 관리의 처음과 끝이라고 생각하면 된다.

가상화(AWS AMI, Docker 등) 가 인기를 끌면서 마이크로 서비스 아키텍쳐(MSA) 가 대세가 되었는데 수십개의 마이크로 서비스를 관리하려면 자동화가 필요하게 되었다.

가상화를 이용한 다양한 배포 및 관리툴 들이 많이 생겨났고(ACS, Kubernetes, Ansible, Chef) 이러한 툴들을 이용하여

수십개의 마이크로 서비스들을 자동으로 배포하고 관리하는 인력들도 필요로 하게 되었다.

Devops 는 이러한 툴들과 스크립트들을 이용하여 서비스를 배포/관리 하는 역할을 주로 한다.

데이터(Data)

두개로 나눌껄 너무 길다

데이터 엔지니어(Data Engineer)

데이터 엔지니어는 백엔드 개발자 업무에 데이터 플로우에 대한 파이프라인을 설계하는 업무가 추가 된다고 보면 된다.

소프트웨어 엔지니어와의 차이는 바라보는 엔드유저가 다르다는 점 이랄까?

소프트웨어 엔지니어는 사용자와 서비스를 바라보지만 데이터 엔지니어는 개발자와 서비스를 바라본다.

즉, 소프트웨어 엔지니어는 사용자의 요청에 대한 시스템 아키텍쳐를 관장하지만 데이터 엔지니어는 개발자(또는 다른 데이터 전문가)의 요청에 대한 플로우(예를 들면 API -> Hadoop -> Spark -> Tablaue)만 집중한다.

위에서 말했다시피 다른 데이터 관련 업무자들의 쿼리를 알고 있어야 하기 때문에 data query/visualization 쪽에도 어느정도 지식이 요구된다.

데이터 사이언티스트(Data Scientist) / 데이터 분석가(Data Analyst)

두 직군은 사실 좀 애매한데

업무설명을 읽다보면 왠지 애널리스트가 사이언티스트 보다 좀 더 도메인 놀리지에 집중된 느낌이 강하다.사이언티스트가 진화하면 애널리스트가 된다. 대신 엔지니어 능력을 상당히 상실한다.

둘다 통계학 지식을 기본으로 요구하며, 문제 해결을 위해 통계적 지식이나 머신러닝 등의 데이터를 활용한 인사이트 도출이 핵심 가치라고 할 수 있다.

쉽게 말해 데이터를 기반으로 BI 를 만들어내는 업무를 한다. 주로 R, Python, SPSS, Excel 등을 사용한다.

데이터 엔지니어가 만들어둔 시스템을 활용해서 원하는 데이터들을 직접 가져다 분석하기 때문에

RDBMS, noSQL, Spark 같은 소스에서 쿼리를 할 수 있는 언어는(SQL, CQL, Scala 등)는 어느정도 알고 있어야 한다.

마치며

지난 수년간의 어설픈대규모의 서비스를 운영해본 적이 없는 SDE 경력엔 아쉬움이 너무나 크게 남아있다.

많은 job description 을 읽으며 회사가 요구하는 연차의 실력이 있느냐라고 물으면 그렇다고 하기 힘들기 때문이다.

알고리즘에 꽂혀서 탑코더 레드를 찍어본다거나 데이터에 꽂혀서 캐글 상위권에 들어가본다거나 딥러닝에 꽂혀서 이미지넷 같은 경진대회에 나가보거나 하는 경험을 못한 것도 아쉽다.

왜 무언가 하나에 깊이 몰두하지 못하고 여러가지를 조금씩 깨작대고 있는가? 하는 한심함도 있다.

이런저런 생각이 들다가도 결국 이것저것 또 공부하게 된다.

뭐, 컴퓨터가 제일 재밌으니깐...