개발 분야는 애플리케이션의 계층에 따라 여러 부분으로 나뉩니다. 일반적으로 클라이언트와 직접 연결되는 계층을 담당하는 개발자를 프론트엔드 개발자라고 하며, 서버 계층을 개발하는 개발자를 백엔드 개발자라고 합니다. 이 외에도 데브옵스 엔지니어, 플랫폼 엔지니어 등 다양한 분야가 존재합니다.

 

우리 분야에서는 모든 계층을 다루는 개발자를 풀스택 개발자—넓게는 '제너럴리스트'—라고 부릅니다. (이 글에서는 개발자들이 더 많이 사용하는 '풀스택 개발자'라는 용어를 사용하겠습니다.) 모든 계층을 다룬다는 것이 상위 호환처럼 보일 수 있지만, 반드시 그렇지는 않습니다. 현대 애플리케이션의 각 계층은 충분히 복잡해서 하나의 계층에만 집중해도 공부할 내용이 넘쳐날 뿐 아니라, 개발 분야는 매우 빠르게 변화하기 때문에 매년 새로운 내용을 계속 학습해야 하기 때문입니다.

 

이러한 이유로 개발자들 사이에서 풀스택 개발자에 대한 의견이 분분합니다. 풀스택을 유지하는 것이 현실적으로 어렵고 현업에서는 관심사가 명확히 분리되어 있어서 하나의 분야에만 집중해 소위 '스페셜리스트'가 되는 것이 좋다는 주장이 있는 반면, 개발자라면 모든 계층을 다룰 줄 알아야 한다는 주장도 있습니다.

 

저는 아마추어(학생) 개발자는 풀스택 개발자가 되어야 하며, 프로 개발자가 되어서는 특정 분야에 집중하는 것이 바람직하다고 생각하고, 이를 학생 기간 동안 실천해 왔습니다. 오늘은 이에 대한 제 생각과 그 이유를 공유해보려고 합니다.

 

 

내 생각이 있어야, 가치를 만들 수 있다

우리 모두는 긴 학창시절을 마치고 제야의 종소리가 울리고 덜컥 20살 성인이 되는 순간을 경험했을 것입니다. 그 순간 우리는 정말 어른이 된 걸까요? 경험상 그렇지 않다는 것을 알 수 있습니다. 단지 미성숙한 어제의 나보다 하루가 더 지났을 뿐입니다. 이는 프로가 되는 과정에도 마찬가지라고 생각합니다. 단순히 취업했다고 해서 프로가 되는 것이 아닙니다. 준비가 되어 있지 않다면 절대 프로가 될 수 없습니다. 그렇기 때문에 아마추어 혹은 학생 시절부터 프로가 되기 위한 준비가 필요합니다.

 

그렇다면 프로란 무엇일까요? 프로는 가치를 창출하고 그에 따른 보수를 받는 사람입니다. 즉, 가치를 만들어낼 수 있는 사람이 프로입니다. 이러한 가치 창출을 위해서는 자신만의 생각과 관점이 필수적입니다. 자신의 생각과 관점이 없다면 주도적으로 행동할 수 없게 되고, 단순히 타인의 지시를 따를 수밖에 없습니다. 물론 무언가를 만들어낼 수는 있겠지만, 이는 진정한 의미의 가치 창출이라고 보기 어렵습니다.

 

이런 개발자를 높은 급여로 고용하려는 회사는 아마 없을 겁니다. 따라서 아마추어 시절부터 자신만의 생각과 관점을 형성하기 위해 노력해야 합니다. 이를 위해 다양한 경험을 쌓고, 폭넓은 지식을 습득하며, 충분한 시간을 투자해야 합니다.

 

이것이 바로 아마추어 개발자가 풀스택 개발자를 지향해야 하는 이유입니다. 비록 개발 분야와 계층이 분리되어 있지만, 하나의 제품은 여러 계층이 유기적으로 결합하여 시너지를 발휘하며 작동합니다. 따라서 아마추어 시절부터 한 분야에만 집중하면 전체적인 시야를 확보하기 어렵고, 제한된 사고와 관점을 갖게 됩니다. 이는 궁극적으로 문제 해결 능력을 저하시키고, 주도적인 행동을 하기 어렵게 만들고, 협업 시 원활한 의사소통을 방해할 수 있습니다.

 

 

잘못된 생각을 가지면 어떡하지?

많은 개발자들은 자신만의 생각과 관점을 갖는 것이 중요하다는 사실을 알고 있습니다. 하지만 제 주변을 보면 이를 실천하는 사람들은 드뭅니다. 여러 이유가 있겠지만, 제 경험상 관념적인 오해가 이를 가로막는 경우가 많습니다. 그중 대표적인 것은 "아직 충분히 알지 못하기 때문에 잘못된 생각을 가질까 봐" 자신의 생각이나 관점 형성을 미루는 것입니다. 이에 대해 몇 가지 말씀드리고 싶습니다.

 

첫째, 이는 완전히 틀린 말은 아닙니다. 충분한 지식 없이 생각을 형성하면 오류의 가능성이 높아지는 것은 사실입니다. 그러나 잘못된 생각이 무의미한 것은 아닙니다. 우리의 생각과 관점은 고정적이지 않으며, 누구나 잘못된 생각을 할 수 있습니다. 중요한 것은 오류가 드러났을 때 이를 인정하고 개선하는 것입니다. 반면, 생각과 관점이 전혀 없다면 이를 바로잡을 기회조차 없어집니다. 따라서 잘못된 생각이라면 저는 차라리 빨리 드러내서 산산이 부서지는 것이 더 낫다고 생각합니다.

 

둘째, 현대 사회에는 좋은 조언자가 넘쳐납니다. 이소룡이 스승 엽문을 만나 새로운 사람으로 거듭난 것처럼, 참된 스승을 만나는 것은 큰 축복이지만 쉽지 않은 일입니다. 그러나 "언젠가 참된 스승이 나타날 것"이라는 생각으로 수동적으로 기다릴 수는 없습니다. 현대 사회에서는 온라인 기술과 유통의 발전으로 누구나 집에서 다양한 생각을 접할 수 있습니다. 유튜브에서 유명인을 검색하면 그들의 인터뷰를 수십 개 찾아볼 수 있죠. 스승을 기다리는 대신 스승을 찾아가는 것이 가능해진 겁니다. 제가 가장 추천하는 것은 종이책입니다. 한 권의 책에는 동영상으로는 담기 힘든 작가의 깊은 사상과 정수가 담겨 있어 훌륭한 스승 역할을 합니다. 이런 자원들을 활용하면 완전히 잘못된 생각을 갖는 것에 대한 걱정은 크게 줄일 수 있습니다.

 

 

제너럴리스트

풀스택이라는 표현을 사용했지만, 사실 제너럴리스트가 되어야 한다는 것이 더 정확한 표현일 것입니다. 개발자로서 성장하려면 제너럴리스트가 되는 것이 중요하다고 앞서 주장했는데, 이는 기술적인 문제 해결을 위해서도 필요합니다. 개발자는 문제를 해결하여 가치를 창출하는 직업이며, 이 문제 해결의 핵심 로직을 우리는 '비즈니스 로직'이라고 부릅니다. 그렇다면 이 비즈니스 로직은 백엔드에 위치해야 할까요, 아니면 프론트엔드에 위치해야 할까요?

 

정답은 상황에 따라 다릅니다. 어떤 상황에서는 프론트엔드에, 어떤 상황에서는 백엔드에 비즈니스 로직이 위치하는 것이 적절할 수 있습니다. 비즈니스 로직이 가장 적합한 위치에 있어야 코드가 덜 복잡해지고 사용자에게 올바른 가치를 전달할 수 있습니다. 그런데 만약 백엔드만 다룰 수 있다면 어떨까요? 선택의 여지 없이 해당 로직은 백엔드에 작성될 것입니다. 이처럼 백엔드와 프론트엔드로만 나누는 것이 아니라, 제너럴리스트가 되는 것은 문제 해결을 위한 선택지가 늘어난다는 것을 의미합니다.

 

물론 협업을 진행하는 이유도 이와 같은 상황 때문입니다. 누군가는 백엔드에 집중하고, 다른 사람은 프론트엔드에 집중함으로써 상황에 따라 필요한 로직을 적절한 위치에 배치할 수 있습니다. 그러나 항상 수많은 우수한 개발자들과 함께 협업할 수 있는 것은 아닙니다. 사이드 프로젝트를 진행하거나, 언젠가 창업을 하게 될 수도 있습니다. 따라서 너무 이른 시점에서 자신의 한계를 제한할 필요는 없다고 생각합니다.

 

나는 어떻게 살았나?

마지막으로 자신을 돌아보며 이번 포스팅을 마무리하고자 합니다. 현재 저는 프론트엔드 개발자로 대학을 졸업하고 군복무 중입니다. 전역 후에는 취업을 통해 아마추어 개발자에서 프로 개발자로 전환할 것 같습니다. 대학 시절부터 군복무 기간 동안 위에서 언급한 내용을 실천하려 노력해 왔습니다.

 

  1. 프론트엔드를 전문 분야로 선택했지만, 백엔드와 클라우드 인프라에 대한 공부도 소홀히 하지 않았습니다. 실제 프로젝트에서도 역할을 수행할 수 있을 정도로 실력을 발전시켜 왔습니다.
    • 현재 진행 중인 프로젝트에서는 백엔드 코드 리뷰어로 참여하고 있으며, 인프라 구성을 담당하고 있습니다. 백엔드를 전문으로 하는 개발자들에 비해 실제 코드 작성 경험은 적지만, 아키텍처 수준의 이론적인 부분과 JS 기반 서버 프레임워크인 NestJS를 능숙하게 다룰 수 있어 이러한 역할 수행이 가능했습니다.
    • 과거에는 클라우드 인프라에 대한 흥미로 AWS Solution Architect - Associate 자격증을 취득하기도 했습니다.
  2. 자신의 생각을 표현하는 것을 두려워하지 않고 계속 시도했습니다.
    • 이 블로그도 그러한 활동 중 하나입니다. 이 내용조차 틀릴 수 있지만, 잘못된 생각이라면 빠르게 부서지는 게 낫다고 믿습니다.
    • 동료 개발자들과 토론하는 것을 즐깁니다. 토론을 좋아하는 동료 개발자를 찾기는 어렵지만, 이런 활동을 통해 많이 성장했습니다.
    • 코드 리뷰 시에도 항상 생각을 명확하게 표현하려 노력했습니다. 특히 반대 의견을 제시하는 것은 쉽지 않지만, 팀을 위해 해야 할 일이라고 생각합니다. 이 과정을 통해 많은 것을 배웠습니다.
    • 사실 한 번 크게 실패한 경험이 있습니다. 그 경험으로 제 대부분의 생각을 바꿔야 했습니다. 그때는 정말 힘들었지만, 덕분에 지금은 모든 면에서 훨씬 더 나아졌음을 느낍니다.
  3. 스승이 있다면 감사히 배우고, 없다면 찾아 나섰습니다.
    • 먼저 저는 좋은 시기에 여러 훌륭한 스승을 만났습니다. 그들은 모두 자신의 노하우를 아끼지 않고 공유했고, 진심으로 제 발전을 바랐습니다. 그들 덕분에 저는 더 높은 수준으로 성장할 수 있었습니다. 그들에게 감사의 마음을 전하고 싶습니다. 저는 정말 운이 좋은 사람이라는 것을 느낍니다.
    • 때로는 스승이 없는 시기도 있었습니다. 군 생활이 그 예입니다. 대부분의 사람들이 컴퓨터와 관련이 없어 스승을 찾기 쉽지 않았습니다(물론, 이곳의 사람들로부터 개발 외의 다른 분야에서 많이 배웠습니다). 그럴 때에는 기다리지 않고 스승을 찾아 나섰습니다. 군 생활 동안에는 여러 훌륭한 개발 관련 책을 읽었고, 그로부터 정말 많은 것을 배울 수 있었습니다. 그 결과, 그 어느 때보다 크게 성장할 수 있었습니다.

 

위와 같은 행동을 실천하면서 얻은 가장 큰 소득은 자신감인 것 같습니다. 여전히 저는 제가 부족한 부분이 많다는 것을 알고 있습니다. 그러나 동시에 언제든지 부족한 점을 받아들이고, 얼마든지 더욱 성장할 수 있다는 것도 알고 있습니다.