[개발] 주니어 개발자가 공부하는 방법

Stark Studio
Prisma Korea
Published in
9 min readFeb 8, 2020

작년, 3월 졸업과 함께 떠난 워킹 홀리데이와 함께 개발 공부를 시작했다. Javascript와 HTML, CSS도 모르는 상태로 시작한 내가 10개월이 지나고 보니 어느새, React, React-Native를 통해 웹과 앱을 만들고, Node.js와 Sequelize를 통해 서버를 구현하고 GraphQL-Seoul에 참여하기 시작해 Dooboolab의 해커톡에 참여하고 있다는 것이 새롭게 느껴진다.

처음 개발자로 진로를 정하고, 일을 시작하기 전 6개월은 유튜브와 블로그, 구글링을 통해 혼자 공부했다. 모르는 것이 있으면 오픈채팅에 들어가 질문하는 방식으로 해결했다. 제로초 블로그(조현영님)노마드코더, Evan’s Tech Blog에서 기초적인 지식을 많이 습득했다. 아직도, 매일 조금씩 새로운 것을배운다.

[그림 1] 공부를 할 때 Notion 앱과 필기를 주로한다. 어느새 6권이나 쌓였다.

기술적인 부분을 위 블로그에서 배운다면, 개발자로서 가져야하는 생각과 동기부여는 주로 포프TV와 같이 일하게 된 개발자 분에게서 배운다. 최근에는 개발도 중요하지만 어떤 개발자가 될 지, 어떤 목적을 가지고 개발을 할 지 고민해보는 중이다.

개인적으로, 개발을 시작하고 나서 직장을 가지기 전까지 엄청 불안해 했다. 매사에 자신감이 넘치고 배우는 것에 겁이 없었지만, 이 시기에는 “내가 할 수 있을까?” 하는 생각을 많이 했다.

그 불안을 이겨내기 위해 그 시간을 연습량으로 채웠다. Typescript를 배우면 우대하기에 기초도 없이 Typescript를 배우고 프로젝트에 도입했다. GraphQL이 요새 뜨고 있다해서 REST API에 대해 깊은 고민 없이 Apollo-Server를 만들었다.

돌이켜보면, 이런 방법도 나쁘진 않았다고 생각한다. 기술의 깊이보다는 너비에 초점을 맞춰 지난 10개월 간 불안해하며 배워나갔다.

이 글은 현재 나와 비슷한 길에서 불안해 하거나, 방황하는 같은 길을 걷는 사람들을 위한 글이다. 이 글을 통해 그 불안과 방황이 사라지지 않겠지만, 용기와 동기, 그리고 좀 더 나은 길을 얻길 바란다.

주니어 개발자가 공부하는 방법

이 글에서는 딱히, 비전공자 개발자와 전공 개발자를 구분하지 않으려 한다. 나는 전자공학을 전공해서 컴퓨터에 대해 조금 메리트가 있을지 모르지만, 다양한 글을 읽어보니 비전공자 개발자 분들 중에도 꾸준히 학습해 뛰어난 시니어 개발자가 된 사람이 많은 것 같다.

어느 분야든 간에 공부를 한다는 것은 넓은 토지에 원목 집을 짓는 것과 같다는 생각을 한다. 이 과정은 크게 3가지로 구분할 수 있다.

  • 비옥한 땅을 만드는 일
  • 원목 집에 쓸 좋은 나무를 만드는 일
  • 자라난 나무를 가공해 좋은 집으로 만드는 일

비옥한 땅을 만드는 일, 공통된 전제 지식을 익히는 일

보통 특정 과목을 4년 동안 전공하면, 자기도 알게 모르게 갖게되는 전제 지식이 생긴다. 가령, 컴퓨터 공학에서는 변수, 함수, 조건문, 반복문은 반드시 알게되며, 전자 공학에서는 P형 반도체, N형 반도체 쯤은 대충 알게된다.

개발을 배우게 되면, 주니어 시절에 이 부분에 대한 토대를 충분히 쌓아야 한다고 생각한다. 종종 프론트 엔드 개발자여서 서버에 대해 관심이 없거나, 배울 생각이 없다는 말을 듣는데, 이 부분이 잘못되었다고 생각한다.

좋은 집을 짓기 전, 좋은 나무를 만들기 위해서는 좋은 땅이 선행해야 한다. 개발에서 좋은 소프트웨어를 만들기 위해서는 다양한 패러다임을 이해하고, 컨셉을 이해할 충분한 기본 지식이 필요한 것 같다.

REST API의 설계방식을 모르는데, GraphQL을 하게되면 GraphQL과 REST API가 다른 체계처럼 보인다. 결국, 둘 다 HTTP 프로토콜을 어떤 방식으로 사용하는가에 대한 패러다임이라는 것을 알게되면, 장단점 및 어느 시점에 필요한가에 대해 빠르게 익힐 수 있을 것이다.

[그림 2] 웹 소켓을 처음 배웠을 때, 혼자 웹으로 채팅을 구현해 봤다. 스타일 북을 처음 도입해 보았다.

개발을 시작한지 10개월 동안에도, Vue.js(뷰)와 Svelt.js(스벨트) 등 새로운 프레임워크와 구조적 프로그래밍, 객체 지향적 프로그래밍, 함수형 프로그래밍 등 다양한 패러다임을 마주한다. 이 패러다임을 빠르게 이해하고 장단점에 대해 알기 위해서 소프트웨어 공학에서 기본적으로 전제하는 지식은 시간을 내서 조금씩 공부하길 바란다.

큰 틀에서 알고리즘, 자료구조, 네트워크, 리눅스, 운영체제 , 데이터베이스 그리고 자기 플랫폼(웹, 앱, 서버)과 언어(Javascript, Python 등)의 내재된 동작 원리는 깊게 이해해두자. 1~2달에 하나씩 배운다고 생각하고 진행중이다.

원목 집에 쓸 좋은 나무를 만드는 일, 패턴 및 디자인을 익히는 일

좋은 땅을 만드는 일을 하다보면, 그 땅에 좋은 나무를 심어야 한다. 내 생각에 좋은 나무를 기르는 방법은 다양한 생각, 컨셉, 패러다임을 익히는 일이다. 프로그래밍을 배우고 개발을 진행하다보면 다양한 컨셉과 패러다임을 마주하게 된다.

웹과 앱을 개발하다보면, MVC패턴, MVVM 패턴 등등 역할(기능)을 분리하는 패러다임 부터 구조적 프로그래밍, 객체 지향적 프로그래밍, 함수형 프로그래밍 등 프로그래밍에 대해 어떤 관점을 가질 것인지에 대한 패러다임을 마주하게 된다.

개인적으로 모든 패러다임은 프로그래밍이나 문제 해결을 진행하면서 발생하는 고민을 좀 더 나은 방법으로 해결하기 위해 생겨난다고 생각한다. 즉, 패러다임이 생기기 위해 3가지 맥락이 있다.

  • 문제 : 패러다임이 목적을 두는 상황, 문제, 주제
  • 컨셉 : 패러다임의 주축을 이루는 생각, 생각의 흐름, 프로세스의 플로우
  • 실제 해결책 : 해당 패러다임으로 문제를 해결하는 예시

위의 3가지 맥락은 GoF의 디자인 패턴의 책을 읽으며 깨닫게 된 맥락이다. 개발을 시작하다 보면, 다양한 패러다임을 마주하고 거기에서 많은 영감을 받게 된다. 좋은 오픈소스를 공부하다보면, 배울 점이 많다는 생각이 드는 코드는 대부분 어떤 패러다임의 생각이 녹아드는 경우가 많다.

나 같은 경우에 디자인 패턴을 모를 때, 회사의 코드를 보며 디자인 패턴이 왜 필요하고 어떤 경우에 유용한가에 대해 알게 되었다. 또한, Git Flow를 통해 협업을 하며 버전 관리 시 발생하는 문제와 이를 어떻게 해결하는 가에 대해 알게 되었다.

다만, 패러다임을 배울 때, 패러다임 자체에 몰두하는 것은 피했으면 좋겠다. 결국 패러다임은 문제를 풀기 위해 접근하는 관점이나 생각하는 방법을 제시하는 것이지 반드시 그래야 하는 것은 아닌 것 같다.

다른 패러다임이 이해가 가지 않거나, 효율적이지 않다고 생각해서 내가 가진 패러다임이 맞고 다른 패러다임이 틀린 것은 아니라는 것을 인지하고 최대한 그 패러다임의 장점을 적용할 수 있는 방법을 고민해보자.

결국, 좋은 소프트웨어를 만들고 효율적으로 다른 사람과 함께 일 하기 위해 다양한 패러다임에 관심을 가지고, 좋은 패러다임을 익히고 이를 자신의 개발 프로세스에 도입하는 시도를 하는 것이 좋다고 생각한다.

자라난 나무를 가공해 좋은 집으로 만드는 일, 프레임 워크를 통해 실제 소프트웨어를 만드는 일

비옥한 토양과 좋은 나무가 자랐다면, 이를 이용해 집을 짓는 일은 실제 프레임워크(도구)를 사용하는 방법에 대해 익히는 일이다. 웹을 개발하고 싶으면 화면 개발을 위해 HTML, CSS, JavaScript가 필요하며 생산성이나 유지보수, 재사용성 등을 고려하면 리액트(React), 뷰(Vue), 앵귤러(Angular)같은 프레임 워크를 배울 필요가 있다.

소프트웨어 공학에서 실제 제품(웹, 앱, 데스크톱앱, 서버, 인공지능, 데이터 처리 등 등)을 만드는 일에 처음부터 개발하는 일은 거의 없다. 대부분 특정 문제를 해결하기 위한 프레임워크가 있을 것이고 이를 통한 개발이 대부분이다.

각 프레임워크는 앞에서 말한 패러다임(생각, 컨셉)이 도구로 구현되는 것이다. 가장 쉬운 예를 들면, 소프트웨어를 MVC패턴은 웹 화면을 Model(데이터베이스), View(화면), Controller(서버, 비즈니스 로직) 3단 구조로 구분해서 개발하는 것을 말하는데, 리액트는 이 중 View(화면)을 구현하는 도구, 즉, 프레임워크이다.

[그림 3] 최근에 주말마다 Next.js를 이용해 블로그를 만들고 있다. 스토리 북을 쓰는데 UI 테스트를 할 때 유용하다.

실제 제품(Product)을 만들기 위해 특정 프레임워크에 대해 깊게 이해하는 것이 중요하다. 이때, 앞선 패러다임과 기본 지식에 대한 토대가 도움이 될 것이다. 처음 나는 MVC패턴에 대해 이해가 안되어 리액트를 통해 어떤 것을 할 수 있고, 어떤 것을 할 수 없는지 몰랐고, document.createDocumentFragment()에 대해 알기 전까지 가상 DOM의 개념을 체감하지 못했다.

프레임워크를 깊게 이해하기 위해서 문서를 자주 읽는 것이 도움이 되는 것 같다. 숨겨진 기능이나, 새로운 기능을 파악하고 적용해보며 해당 프레임워크이 성장하는 방향을 파악하자. 이런 경험은 다른 프레임워크을 배울 때 학습 속도를 빠르게 줄여 줄 것이다.

맺음말

나는 개발 공부를 시작하고, 소프트웨어를 만드는 일을 먼저 했다. 지금에 와서야 네트워크, 운영체제 등의 기본지식을 배우며, 좋은 소프트웨어를 만들기 전에 다양한 패러다임에 대해 관심을 가지고 이를 적용해보는 중이다.

10개월 간 개발자로서, 무엇인가 만들고 배우는 것이 즐거워서 쉬지않고 달려온 것 같다. 내가 선택한 길이기 때문에 다른 사람에게 힘들다 말 못하고 혼자 끙끙되었다.

이 글을 통해, 나처럼 개발을 시작해 “내가 할 수 있을까?” 고민하는 사람에게 힘과 도움이 되길 바란다. 나 또한 글을 쓰며, 지난 10개월을 회고하고 앞으로 어떻게 개발을 해나갈 것인가 생각해보는 좋은 시간이 되었다.

지난 10개월 동안 많은 사람들에게 질문하고 답을 얻으며 개발에 대해 많이 배웠다. 앞으로도 갈 길이 멀고 배울 것이 많다고 생각하지만, 이 길에 오기까지 도움을 주신 분들에게 항상 감사함을 느낀다.

--

--