[개발] 비전공자 개발자가 다른 언어를 배워야 하는 이유

최근 영어 공부의 필요성을 다시 느끼면서 유튜브에 영어 관련 콘텐츠를 찾아보았다. 다양한 콘텐츠들 속에서 우연히 새로운 언어를 배워야 하는 네 가지 이유라는 TED의 강연을 보게되었다

[그림 01] TED 강연 <새로운 언어를 배워야 하는 네 가지 이유> 시간이 괜찮다면 보는 것을 추천한다.

이 강연의 골자는 각 언어에는 그 사회의 구성원이 생각하는 문화가 담겨있고, 그 언어를 배우면서 그 문화를 이해할 수 있다는 것이다. 즉, 새로운 언어를 배우는 과정에서 세상을 이해하는 새로운 관점을 배울 수 있다는 것이다.

최근 <철학은 어떻게 삶의 무기가 되는가?>라는 책을 읽으며 시니피앙(signifiant)과 시니피에(signifié)라는 개념을 알았다. 시니피앙“의미하는 것”이라는 뜻이고, 시니피에“의미되고 있는 것”이라는 뜻이다.

이 개념은 우리가 쓰는 단어들은 우리가 어떤 현상을 이해하기 위한 것임을 표현한 개념이다. 예를들면 우리가 “노란색”이란 단어를 보면 떠올리는 그 느낌은 “노란색”이란 단어와 실질적인 연관이 없으며, 사실은 “노란색”이라는 단어에 붙인 시니피에(의미)라는 것이다.

이는 우리가 사용하는 언어가 기본적으로 우리의 사고체계에 영향을 미친다는 사실을 의미한다. 개인적으로 언어의 이런 성질이 소프트웨어 분야에서도 적용된다고 생각한다.

소프트웨어는 기본적으로 소스 코드라는 설계도를 통해서 작성된다. 소프트웨어를 공부하며 누구나 알고 있는 이 사실이 체감이 되었을 때 소프트웨어에 대해 한 단계 더 깊게 이해했다는 생각이 들었다.

나는 지식을 안다는 것과 느끼는 것을 구분하는 편이다. 내가 알고만 있는 지식에서는 항상 불안함을 느끼고 부족함을 느끼지만 내가 느낀다고 표현한 지식에 대해서는 확신을 할 수 있고 그 원리를 명확하게 파악하고 있다.

소프트웨어는 내부적으로 기계어로 동작하지만, 우리는 이를 소스 코드라는 언어로 설계를 한다. 그렇기에 이 언어를 통해서만 소프트웨어를 이해할 수 있다.

객체 지향 언어를 쓰는 사람은 소프트웨어를 설계하거나 보는 방식을 객체 지향적인 사고로 이해할 것이며 절차 지향 프로그래밍을 하는 사람은 소프트웨어를 절차 지향적으로 해석할 것이다.

결국, 우리는 사용하는 언어에 따라 소프트웨어를 보는 관점이 다르다는 사실을 알 수 있다. 이는 언어 뿐만 아니라 프레임워크, 분야에 대해서도 동일하게 적용된다고 생각한다.

나는 이 같은 사실이 비전공자 개발자인 내가 소프트웨어를 더 깊게 이해하기 위해 필요한 사실이라는 생각이 들었다. 소프트웨어를 더 깊이있게 이해하기 위해서는 내가 쓰는 기술에만 몰두하지 말고 다양한 분야로 눈을 돌려보는 것도 방법이지 않을까?

이 글은 지식을 많이 배워야 함에 대해서 말하고 싶은 것은 아니다. 그저 내가 쓰고, 만들고, 삶에서 마주하는 소프트웨어라는 것을 좀 더 잘하고, 잘 알고 싶어서 이를 위한 내가 생각하는 방법에 대해 쓰는 글이다.

다른 프레임워크를 배운다는 것

[그림02] Nest.js를 통해 SOLID 원칙의 Dependency Inversion 개념에 대해 공감하게 되었다.

현재 동료 개발자와 함께 만들고 있는 팀 두두닷의 서버는 Nest 프레임워크로 개발되었다. 사실 Nest를 쓸 정도로 큰 시스템이 아니고 간단한 시스템이지만 개인적인 욕심으로 Nest를 썼다.

팀 두두닷 사이트에서 백엔드는 외부 글이 아니라 자체 에디터에서 제작한 글을 작성하고 보관하기 위함이다. 아직 에디터 부분을 개발하지 못해 자체적 콘텐츠가 없지만 처음으로 동료 개발자와 만든 결과물임에 의미를 둔다.

실제 비즈니스 환경에서 무작정적인 프레임워크의 도입을 배제해야 한다고 생각하지만, 평소에 새로운 프레임워크를 배우는 것은 개발자에게 많은 도움이 된다고 생각한다.

각 프레임워크에는 그 프레임워크를 지탱하는 컨셉이 있다. 예를들어, 위에서 언급한 Nest는 객체 지향 프로그래밍(OOP)을 선호하는 개발자가 공감하는 설계원칙 SOLID에 기반해 설계된 프레임워크이다.

React는 HTML in Js 컨셉을 기반으로 한 JSX와 선언형(Declarative), 가상돔이 프레임워크를 지탱하고 있으며, React Native는 브리지 인터페이스를 통해 메시지 기반이 프레임워크를 지탱하고 있다고 생각한다.

즉, 모든 프레임워크에는 소프트웨어를 만들고 연구하는 많은 사람들이 공감하는 컨셉이 들어있다. 다른 프레임워크를 배운다는 것은 자신이 아는 컨셉 외에 다른 컨셉을 배울 수 있다는 것이다.

다른 컨셉을 배우는 것은 소프트웨어를 보는 새로운 시각을 가질 수 있게 한다. 이런 컨셉을 두루 배우면 새로운 프레임워크를 배울 때 학습 속도에 영향을 미치기도 하고, 실제로 비즈니스 문제를 해결할 때 다양한 가능성을 볼 수 있게 한다.

예를들어 Nest를 쓰기 전에는 동작만 하는 프로그래밍에 만족을 했다면, Nest를 사용하며 배운 DI(Dependency Inversion)나 IoC(Inversion of Control)를 통해 기능의 수정에서 오는 변동성에 대한 리스크를 조금 배제하는 코드를 작성할 수 있게 되었다.

또한 OOP의 관점에서 코드를 하나의 역할로 분리를 하여 마치 여러 명의 책임을 가지는 객체로 만드는 방식을 이해하며 이전에 이해했다고 생각하는 다양한 시스템들을 새로운 관점으로 바라볼 수 있었다.

새로운 프레임워크를 배우며 소프트웨어의 다양한 컨셉을 배울 수 있다.

다만, 너무 새로운 프레임워크에 몰두하는 태도는 스스로 경계하려고 노력중이다. 프레임워크를 통해 소프트웨어를 이해하는 방식을 기르고자 하는거지 새로운 프레임워크를 쓰는데 집착하는 태도를 스스로 경계한다.

다른 언어를 배운다는 것

최근에 퇴사를 하고 예비 창업 패키지를 준비하면서 쉬는 시간마다 CS 기초에 대해서 공부하기 시작했다. 특히 리눅스 프로그래밍을 공부하며 프로세스나 스레드, IPC기법에 대해 알게되었다.

독학으로 개발을 할 때의 취업 전략은 실제 현업에서 쓰는 툴을 최대한 넓게 알아두고 왜 쓰는지, 어떻게 쓰는지에 대해 업계 선배들의 생각을 깊이있게 이해하려고 노력하였다. 그 결과 기초가 부족하다는 생각을 많이 했다.

리눅스 프로그래밍이 기본적으로 C언어를 기반으로 해 C언어를 공부해야 했는데, 이를 통해 내가 쓰는 자바스크립트를 새로운 관점으로 볼 수 있게 되었다.

각 언어에는 그 언어를 구성하는 소프트웨어의 단위들이 있다. 이는 보통 예약어라고 표현하는데 이런 개념들에 대해 폭 넓게 알아둘수록 새로운 언어를 접해도 큰 두려움이 없이 개발을 할 수 있는 것 같다.

새로운 언어를 배운다는 것은 항상 두려움이 따르는 것 같다. 하지만, 새로운 언어를 배우다보면 프로그래밍 언어가 기본적으로 공통된 개념하에 약간의 컨셉들이 있다는 사실을 알 수 있다.

최근에 쉘 파일로 Nest 프로젝트를 도커 이미지로 빌드해 EC2로 자동으로 배포하는 스크립트를 작성해보았는데 만약 프로그래밍 언어에서 주로 다루는 개념들에 대해 폭 넓게 알기 위한 경험이 없었다면 새로운 언어를 마주하고 덜컥 겁을 먹었을 것 같다는 생각이 들었다.

새로운 언어를 배우면 소스코드를 구성하는 다양한 요소들을 더 깊게 이해할 수 있다.

다른 분야를 배운다는 것

[그림03] 최근에 DBA라는 직군을 알고 데이터 모델링에 재미를 느끼는 중이다. 좋은 모델은 비즈니스를 지탱한다.

개발자로 지내면서 느끼는 재밌는 사실은 개발자가 아닌 사람이 보기엔 모두 같은 개발자지만 “개발”이라는 카테고리 안에 참 다양한 분야가 있다는 점이다.

담당하는 분야에 따라 프론트 개발자, iOS 개발자, Android 개발자,백엔드 개발자, 머신러닝 개발자, 빅데이터 개발자가 있으며 플랫폼에 따라서 웹 개발자, 앱 개발자, 데스크톱 어플리케이션 개발자 등이 있다.

개인적으로 나는 스스로를 서비스 개발자(Service Developer)라고 정의한다. 같이 일했던 현구형의 소개에서 인상 깊은 소개이며, 서비스를 만들고 운영하기 위해 필요한 것을 배우는데 경계를 두고 싶지 않다는 소망 때문이다.

우리는 이런 구분 아래에서 일을 하지만 소프트웨어를 좀 더 잘 알기 위해서는 분야를 넘나드는 도전을 해야한다고 생각한다. 다른 분야를 배우며 같은 개념에 대해서 생각하더라도 서로 관점이 다름을 알 수 있다.

이외에도 새로운 분야를 배우면 소프트웨어를 지탱하는 구조에 대한 관점이 성장할 수 있다. 서버에서 비즈니스 로직을 처리하고 데이터를 어떤 방식으로 보관하는지, 그 데이터를 외부의 위협없이 관리하기 위해서 기본적으로 어떤 보안 체계를 쓰는지 배우면서 소프트웨어 전체 구조에 대해 배울 수 있다.

소프트웨어 전체 구조를 이해하는 것은 내가 짜는 소프트웨어에 직접적으로 영향을 미치기에 다른 분야를 배우는 것을 통해 소프트웨어를 설계하는 구조를 배우는 것은 소프트웨어를 더 잘 이해하기 위해 도움이 될 것이다.

새로운 분야를 배우면 소프트웨어 전체 구조를 보는 관점이 성장한다.

최근에 데이터 모델링 분야를 배우고 있는데 웹의 뷰 단에서 설계되는 데이터와 실제 데이터베이스의 데이터 모델을 분리하는 것이 중요하다는 사실을 알 수 있었다. 이외에도 이력을 데이터로 처리하는 방법, 주문과 주문상세를 분리하여 설계하는 것 등에 대해 배울 수 있었다.

맺음말

개발과 인문학을 엮는 글이나 혹은 개발 관련 글을 쓸 때 나 스스로를 환기하기 위한 목적으로 쓸 때가 많다. 개발 공부를 하면 배워도 배워도 아는 것이 없다고 느끼는 한계를 마주할 때마다 글을 쓰는 것 같다.

내가 알고 있다고 생각하던 개념을 새로운 개념을 배우고 다시보면 나의 무지로 인해 가려진 사실들이 다시금 보일 때가 많다. 개발에 대해 종종 이야기를 즐기는 지인이 말하는 더닝-크루거 효과가 공감된다.

다른 분야를 배우는 것이 중요하다고 말했지만 무작정 새로운 것을 쫓는 것을 경계하는 태도도 중요하다. 개발자는 어떻게 보면 과학자이면서도 경영자의 마인드를 가져야 하는 직업인 것 같다. 현재의 IT는 비즈니스를 지탱하기 위해 만들어지기에 일을 할 때는 일이 먼저임을 기억하자.

[그림04] 개념적 모델링을 실제로 했다. 실제 개발을 들어가기 전에 왜 이런 작업을 하는지 공감하게 되었다.

최근 예비 창업 패키지를 준비하면서 서비스의 시장조사, 와이어프레임, 사업계획서, 데이터 베이스 설계를 진행하고 있다. 하나 하나 진행하면서 학교에 다닐 때 배워둔 다양한 지식을 접목하고 있지만 그 디테일에서 부족한 점이 많다는 생각을 한다.

특히, 전 직장의 동료분이 빌려준 책 <아는 만큼 보이는 데이터 베이스 설계와 구축>을 읽으며 데이터 베이스를 설계할 때 필요한 디테일을 많이 배우게 되는 것 같다.

이를 통해 학교에서 배우지 못한 정규화(Normalizaion) 이론이나 데이터를 설계하는 방법론, 비즈니스에 필요한 로직을 검증하는 방법론(CRUD Matrix, 트랜잭션 분석도)을 배우며 소프트웨어를 보는 새로운 관점을 얻을 수 있었다.

새로운 지식을 배울 때 마다 새로운 관점으로 생각할 수 있는게 좋으면서도, 스스로의 한계를 느끼는 것이 슬픔으로 다가올 때가 많다.

현상을 바라보는 다양한 관점을 가져야 현상을 제대로 볼 수 있다.

관련글

--

--

Nestjs를 사용하는 한국 개발자들을 위한 커뮤니티입니다. 좋은 글을 나누고 공유하여 더 나은 Nestjs 생태계를 만들어 봅시다.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store