본문 바로가기

프로그래밍 일반

뭘 배워? 언어? 프레임워크? 라이브러리?

자, 이제 돌고 돌아 다시 "뭘 배우지?" 이야기로 돌아왔습니다.
엔트리를 통해서 프로그램에 기본적으로 들어있는 요소들이 무엇인지를 알아보았고,
최근에는 네트워크나 컴퓨터 환경의 발달 때문에 비동기 프로그래밍이 중요하다는 얘기까지 해 봤습니다.
그렇다면, 이제 본격적으로 우리는 뭘 공부해야 할까요?

우리는 공부해야 할 대상을 중구난방으로 부르고 있다

예전에도 잠시 언급했지만, 우리는 프로그래밍을 처음 공부해야 할 대상을 뒤섞어서 부르고 있습니다.
무슨 말인가 하면, 서로 같은 등급이 아닌 것을 마치 비슷한 등급인 것처럼 부르고 있다는 말입니다.

들이의 단위인 리터(L)와 무게의 단위인 킬로그램(kg)을 똑같이 부르는 것같이 말이죠.

'파이썬 공부가 제일 쉽습니다.'
'node.js 코딩을 잘할 줄 알아야 합니다'
'리액트가 요즘 가장 유행하는 기술입니다'
'자바 백엔드는 배우기가 어렵지만 수요가 높습니다'
'안드로이드를 배우면 우리가 사용하는 앱을 만들 수 있습니다'
'웹을 공부해야 취업이 잘 됩니다'

그거 아십니까? 저기서 말하는 대상이 기가 막히게도 모두 다른 수준의 대상을 말하고 있다는 사실 말입니다.

'파이썬'은 여러분이 잘 아는 대로, 프로그래밍 언어(Programming Language)입니다. 하지만, 다른 친구들은 좀 다릅니다.

'node.js'는 지난 포스팅에서 말했듯, 원래 웹에서 돌아가던 자바스크립트를 브라우저 밖에서도 돌아갈 수 있게 만든

런타임 환경(Runtime Environment)입니다.
자바를 배우신 분들은 자바 SDK 처음 설치하실 때 설치하시는 JRE(Java Runtime Environment)를 생각하시면 이해가 쉬우시겠네요.

'리액트'는, node.js 환경을 이용해서 웹 페이지를 SPA(Single Page Application)라는 형태의 애플리케이션으로 만드는 것을 지원하는 라이브러리(Library)입니다.

'백엔드(Backend)'는, 우리가 보통 웹이나 앱을 통해 화면으로 직접 보는 게 아닌,

서버 사이드에서 데이터를 관리하고 제공하는 시스템을 만드는 '기술'입니다.
백엔드를 통해 데이터를 받아서 화면에 보여주는 앱이나 웹 페이지를 구성하는 기술은 프런트엔드(Frontend)라고 하죠.

'안드로이드'는 모바일을 구동시키는 운영체계, 우리가 흔히 OS(Operating System)라고 부르는 녀석입니다.

'윈도 프로그래밍' 이렇게 말하는 기분이겠죠?

'웹(World Wide Web)'은... 좀 모호합니다. 정확히 무엇을 공부하겠다는 건지 말이죠.
HTML/CSS/자바스크립트를 중심으로 웹 페이지를 구성하고 디자인하는 기법을 배우겠다는 것인지,
아니면 웹 사이트를 만드는 방법을 배우겠다는 것인지,
아니면 자바스크립트를 중심으로 무언가를 만드는 방법을 하겠다는 것인지, 매우 모호한 말이죠.

이렇듯, 우리는 서로 계량하는 단위가 다른 말들을 마치 한 가지의 말처럼 뒤섞어서 말하고 있습니다.

아무것도 모르는 사람에겐 확실한 대상을 알려줘야 한다

이런 게 뭐가 중요한가 하고 생각하시는 분들이 계실 수 있는데요.
아무것도 모르고 무엇을 배워야 하나 고민하시는 분들 입장에서는 정말 막막할 수 있는 내용입니다.

이미 어느 정도 내용을 아시는 분들은 그저 마주하다 보면 대충 알 수 있으니 걱정하지 말고 일단 부딪쳐봐라 하고 쉽게 말씀들 하십니다.
하지만 이런 말은, 맞서 싸울 적이 누군지도 모르는 채 총 한 자루만 들고 적진을 향해 뛰어들어라 하는 말과 다를 바 없는 것입니다.
그 후에는 내가 뭘 어찌하고 있는지도 모른 채 허우적대다 결국 흥미도 잃고 진전도 없는 채로 공부만 하다 손을 떼고 말겠죠.

물론, 스스로 길을 잘 찾아서 어찌 됐던 살아남아서 잘 공부하시는 분들도 있을 수 있습니다.
하지만, 이 길이 과연 내 길인가 아닌가 하는 것을 잘 판단하기 위해서는,
먼저 내가 만날 대상이 무엇인지를 잘 알고, 내가 가는 이 길을 왜 가는지, 어떻게 가야 하는지를 명확하게 아는 것이 중요합니다.
남들이 다 이 길을 가기 때문에 나도 이 길을 따라가야 한다는 것은 말도 안 되는 얘기입니다.
분명히 나한테 잘 맞는 분야가 있을 것이고, 또한 내가 몰랐거나 생각지도 못한 길이 있을 수 있기 때문입니다.

그런 것을 판단하기 위해서는, 일단 내 앞에 보이는 것들이 동일한 선상에, 같은 모양으로 줄을 서서 볼 수 있게 해야 한다고 생각합니다.
제가 이 포스팅 시리즈를 시작하면서, 기존의 프로그래밍 언어나 플랫폼을 가지고 시작하지 않은 이유는 여러분에게 편견을 주지 않기 위해서라고 말씀드렸습니다.
이런 편견을 가지게 되는 이유 중 하나는, 우리가 알고 있는 각종 기술들이 중구난방의 모습으로 놓여 있기 때문입니다.
따라서, 일단 저는 여러분들 앞에 위의 기술들을 동일한 레벨로 정리하면서, 어떤 것부터 시작하면 좋을지에 관한 얘기를 해보겠습니다.

일단 보이는 것부터 시작합시다

저는 솔직히 백엔드부터 시작하는 것은 권장하지 않습니다. (단호)

백엔드는 수요가 확실히 많습니다. 그런데, 그만큼 기술을 배우는 것이 쉽지 않습니다.
무엇보다, 결과를 보면서 하는 것이 쉽지 않습니다.
결과물이 프런트엔드에서 무언가를 보여주는 것을 전제로 하기 때문에,

프런트엔드 지식이 반드시라고 해도 좋을 만큼 세트로 따라붙습니다.
백엔드만으로 뭔가를 할 수 있다는 건 솔직히 말도 안 되는 얘깁니다.

백엔드 기술 중 가장 유명한 자바(Java) 언어를 사용하는 스프링(Spring) 프레임워크(Framework)를 예로 들죠.

아, '프레임워크'라고 하는 것은, 개발자가 만든 애플리케이션을 구동하기 위한 여러 종류의 라이브러리가 모여 있고,
이것이 OS 혹은 애플리케이션이 작동하는 플랫폼과 연결하기 위한 인터페이스(Interface)들을 포함한 것을 말합니다.
우리가 앞으로 타깃으로 잡고 공부해야 한다고 제가 주장할 녀석은 바로 이 '프레임워크'입니다.

일단 스프링 프레임워크를 기본적으로 만져 보면서 구조를 파악하고, 그것을 돌리기 위한 자바 프로그래밍 언어를 배웁니다.
그다음, 각각의 기능들과 데이터가 어떻게 연결되는지 살펴보고, 데이터베이스와 연동되는 부분과 데이터베이스 자체를 또 공부합니다.
이제 네트워크로 API를 통해 데이터를 송출해야 하니 네트워크 관련 기능들을 파악합니다.
여기까지 오는 동안 뭔가 화면을 보면서 하려면... 네, 테스트 페이지 정도 일일이 보면서 해야겠죠?
테스트 페이지가 움직이는 기술은 하나도 모르고 해도 괜찮을지 모르겠습니다.

프로그램 구조와 움직이는 방식을 모르시는 분들이 처음부터 덤비기엔 너무 힘들고 고된 작업입니다.
작은 프로그램이 어느 정도 움직이는 것을 경험해 보신 분들이면 모를까,

스프링 프레임워크가 나름 경량화된(농담이 아닙니다) 시스템인데도 저렇습니다.

그래서 저는 일단은 백엔드보다는, 홈페이지가 되었던 모바일 프로그램이 되었던,
무언가 화면에 출력하면서 디자인도 보면서 작은 프로그램을 만들어볼 수 있는 프런트엔드부터 일단 시작해 보시고,
프로그램의 구조에 익숙해지신 후 그 뒤에서 움직이는 백엔드에 관심이 생기신 시점에 넘어가시는 것을 추천드립니다.
그때쯤 되면 저런 움직임이나 자바 언어 같은 언어 습득에도 일단 요령이 생기셨을 테니까요.

웹 관련 기술은 조금 나중에 생각해 보세요

저는 또 리액트 같은 라이브러리나, 혹은 리액트 관련 유명한 프레임워크인 Next.JS,
혹은 그와 유사하면서 유명한 라이브러리인 vue.js 및 관련 프레임워크인 Nuxt.js 등등...
이런 웹 관련 프레임워크도 출발점으로는 한 번 다시 생각해 보시라... 고 말씀드리고 싶습니다.

그 첫째 이유는, 지난 포스팅에서 언급한 비동기 프로그래밍 때문인데요.
웹 관련 기술은 싫든 좋든 그 첫 앱 개발 단계부터 저 비동기 상태를 생각하지 않으면 안 됩니다.
안 할 말로, 내가 처음으로 아무것도 없이 문장 달랑 하나 나오는 페이지를 만들어서 올렸는데,
네트워크 장애가 뜨거나 서버 장애가 떠 버리면 결과를 못 보는 사태가 벌어져요. 내 잘못도 아닌데 말이죠(...)
내가 개발을 잘했냐 못했냐 와 상관없는 외부 요인에 대한 예외 상황과 그에 대한 대비를 하지 않으면 안 됩니다. 시작부터 말이죠.

물론, 대부분의 프레임워크는 저런 것들을 자동으로 해 줍니다. 예를 들면 404 페이지는 다 자동으로 생성해 준다거나 하는 식이죠.
하지만, 내가 개발을 잘하는 것과 못 하는 것과 상관없이 결과가 안 보이거나 지연되어 보일 수 있다? 음...

둘째로, 여러분의 작업 결과물 때문에 추가로 공부해야 할 것들이 생길 수 있습니다.
요즘의 웹 개발은 대부분 node.js 런타임 환경을 기반으로 한 자바스크립트 언어로 웹 페이지를 개발하게 되어 있는데요.
물론 자바스크립트만 알아도 웹 페이지와 서버 구축까지 할 수 있게 되었다는 건 좋은 일이기는 합니다.
하지만, 그 결과물은 어쨌든 HTML로, 디자인은 CSS로, 이벤트 처리만 자바스크립트로 각각 컴파일되어 웹에 올라가요.
그래서 실제 웹에 올라갔을 때 디자인이나 작동을 확인할 때는 어쨌든 기존의 HTML/CSS의 지식이 없이는 힘들 수 있다는 거죠.
자바스크립트 이외에 저것들을 따로 챙기는 건 솔직히. HTML은 별거 아니다 싶어도 CSS는 만만치 않아요.

네. 그래도 자바스크립트가 여러분의 취향에 맞는다! 이러면 눈딱 감고 하셔도 무관하세요.

물론 제가 앞에서 엔트리를 통해 설명드린 프로그래밍 언어의 기본을 잡고 가시는 것은 반드시 필요할 것입니다.

그런 것 없이 순전히 단순한 기술만 따라가시는 것이라면, 이전에 말씀드렸듯 인공지능이 잘하는 시점이 생각보다 빨리 찾아올 것입니다.

 

너도 나도 공부하는 파이썬은...?

파이썬이 쉽다고 하는 말도 저는 받아들이기 어렵습니다.

 

파이썬이 프로그래밍 언어 중 배우기 쉬운 이유는 몇 가지가 있는데요.

일단 기억해야 할 예약어(reserved word), 말하자면 기본적으로 알아야 할 '문법'이 다른 언어에 비해 적습니다. 

또한, 다른 프로그래밍 언어에서 힘들어 구현해야 하는 몇 가지 기능이, 표준 라이브러리 레벨에서 가져다 쓰기 쉽게 구현되어 있습니다.

그리고, 코드 작성의 원칙도 대단히 엄격하게 해 놓아서 코드를 읽는 것도 사람들 간에 오해가 없도록 되어 있습니다.

(사실 인터프리팅을 쉽고 신속하게 하기 위해 그렇게 한 것 같지만요 ^^)

 

그런데, 저는 저것을 뒤집어 이해해야 한다고 생각합니다. '사용하기 쉬운' 것이지, '이해하기 쉬운' 것이 아니라고요.

그게 그거 아니냐고 말씀하실 수도 있는데요.

뭐 파이썬 하나만 가지고 프로그래밍 경력의 시작과 끝을 함께 하실 수 있다고 생각하신다면 큰 문제가 없겠습니다.

 

하지만, 그런 단순화된 기능들이 과연 내부에선 어떤 원리로 작동하는 것인지,

파이썬이 내부적으로 어떻게 처리하는지 고민하면서 사용할 사람들이 몇이나 될까요?

나중에 파이썬이 아닌 다른 프로그래밍 언어나 다른 환경에서 같은 문제를 해결해야 할 때,

과연 그 문제에 대한 해법을 원리에서부터 찾을 수 있을까요?

 

좀 중언부언한 말이 되었습니다만, 전 파이썬은 사실,

 

"어느 정도 프로그래밍 개념이 있는 사람이 프로그램을 이용해 풀 수 있는 문제를 신속하게 해결하게 하기 위한 언어"

 

라고 생각합니다.

 

"아무 것도 모르는 사람이 처음부터 배우게 하기 위한 언어"

 

가 아니라요.

 

프로그래밍 언어부터 출발하는 대신 프레임워크부터

사실 좀 더 과감하게 말씀드리면, 프로그래밍 시작하실 때 언어부터 잡고 시작하시는 건 굉장히 낡은 방식이라고 말씀드립니다.

 

옛날 옛적에 C나 C++처럼 프로그래밍 언어가 있고, OS는 터미널 환경이며,

개발자가 직접 OS에 메모리 영역을 하나하나 요구하면서 밑바닥부터 만들어야 하는 시절이라면 모르겠습니다.

하지만, 지금은 다르죠. 애플리케이션 개발을 위해서 수많은 라이브러리와 프레임워크들을 이용하고 있고,

메모리 관리는 다 런타임 환경에서 알아서 하고 있고 (커널 프로그램은 좀 다릅니다만),

프로그래밍 언어들은 점점 그 용도와 특성에 따라 비슷비슷한 문법 형태로 수렴 진화하고 있습니다.

 

나중에 어떻게 연계해서 공부할 수 있는지를 보여드리겠지만,

프로그래밍 언어를 하나하나 잡고 거기서부터 Bottom-up으로 응용 예제까지 올라가는 기존의 방법은,

솔직히 결과를 볼 때까지 시간도 많이 걸리고, 언어를 공부한 후 다음 단계로 가는 데 장애가 적지 않습니다.

 

자바(Java)를 예로 들어 말씀드리면, 똑같은 자바라고 해도,

위에서 말씀드린 스프링 프레임워크에서 사용하는 자바와,

안드로이드 개발을 위해 사용하는 자바는 그 결이 많이 다릅니다. (요즘 안드로이드는 코틀린으로 개발합니다만, 자바로도 가능합니다)

 

그렇다면, 어떻게 하는 게 좋을까요?

 

이젠 역으로, 사람들이 실제 사용하는 프레임워크로부터 공부를 시작해서,

그 프레임워크를 작성하는 프로그래밍 언어의 기본적인 요소를 중심으로 언어의 특성을 공부한 뒤,

그것과 연계된 다른 언어/다른 프레임워크를 배워 나가고, 확장해 나아가야 한다고 생각합니다.

예전부터 유행했던 '클론 코딩(Clone Coding)'이라는 것도, 결국에는 무언가 보이는 것을 만들어 나가는 것이고,

그러기 위해선 프로그래밍 언어 레벨에서 생짜로 만드는 것이 아니라, 준비된 프레임워크나 라이브러리 레벨에서 시작해야 할 것입니다.

 

정리 및 예고

원래는 위의 반례들을 정리한 다음, 제가 가장 좋다고 생각하는 솔루션까지 제안할 예정이었는데, 글이 예상보다 길어졌습니다.

역시 저는 말이 길어져서 문제네요. 

 

다음 포스팅에서는 제가 제안하는 솔루션과, 왜 그것을 택했는지.

그리고 그것을 하기 위한 각종 준비에 관한 내용을 적어 보겠습니다.