Unknownpgr

어떻게 개발자가 되는가?

2022-12-22 14:13:19 | Korean

가끔 이런 질문을 받습니다. 사실, 좀 자주 받습니다.

또는 이런 질문도 받습니다.

여기에 대한 답변을 정리해두고자 합니다.

애초에 개발자는 뭐 하는 사람인가요?

컴퓨터 개발을 아직 접해보지 않은 사람들은 개발자라고 하면 막연히 프로그램을 만드는 사람, 컴퓨터로 뭔가 어려운 것(?)을 하는 사람, 또는 해커를 떠올립니다. 이것들은 물론 실제 개발자가 하는 일입니다. 그러나 제가 생각하는 개발자의 본질은 이것과는 약간 거리가 있습니다.

제가 생각하는 개발자란, 'IT 기술을 활용하여 문제를 해결하는 사람'입니다.

예를 들자면 카카오톡 서비스를 개발하고 유지보수하는 개발자들은 사람들 사이의 소통이 느리고 복잡하다는 문제를 해결하는 사람들입니다. 게임을 개발하는 사람들은 사람들에게 재미를 주고자 하는 문제를 해결하는 사람들입니다.

여기서 말하고자 하는 것은, 개발자의 본질은 '문제를 해결하는 능력'이지 단순히 많은 프로그래밍 언어, 툴들을 다루는 것이 아니라는 의미입니다. 물론, 일반적으로 많은 프로그래밍 언어를 알거나 여러가지 툴을 잘 다룬다면 문제를 더 잘 해결할 수 있습니다. 그러므로 이력서나 포트폴리오에 자신이 다룰 줄 아는 프로그래밍 언어나 라이브러리들을 적습니다. 그러나 결국 그것은 문제를 해결하기 위한 수단일 뿐, 본질이 아님을 잊으면 안 됩니다.

어떤 사람이 개발자에 잘 맞을까요?

저는 여기에 자신있게 답할 수 있습니다.

'모릅니다. 해 봐야 알 수 있습니다.'

개발자가 되겠다는 사람도, 이미 개발자의 길을 걷고 있는 사람들도 정말 많이 만나 봤습니다. 반대로 개발자가 되려다가 실패하거나 포기하는 사람들도 꽤 많이 만나 봤다고 생각합니다. 그러나 그럼에도 불구하고 그들에게서 어떠한 유의미한 공통점을 발견할 수 없었습니다. 심지어 컴퓨터과학부에 입학해서 공부하는 사람들 중에서도 어떤 사람은 빠르게 학습하고, 어떤 사람은 포기합니다.

애매하기는 하지만, 성공하는 개발자들 사이에서 보이는 유일한 공통점은 그들이 개발하는 것을 좋아하고 즐긴다는 것이었습니다. 그러나 개발을 시작하려는 사람들을 많이 만나 보면서 느낀 것인데, 누가 개발을 즐기고 안 즐기게 될지는 정말 해 봐야 알 수 있습니다. 분명한 목표와 열정을 가지고 진입했는데 해 보니 안 맞아서 포기하는 사람들도 많았고, 반대로 학교에서 시켜서, 아니면 친구가 권해서, 군대에서 할 거 없어서 시작했다가 그게 너무나 잘 맞은 나머지 아예 업으로 삼은 사람들도 많이 봤습니다.

그리고 IT 분야는 정말 빠르게 발전합니다. 다른 분야에서는 수 년, 수십 년에 한 번씩 큰 흐름이 바뀐다면 이 분야에서는 짧게는 3개월에서 6개월이면 새로운 기술이 나옵니다. 그러므로 개발자는 항상 새로운 기술을 습득하면서, 동시에 기초를 단단하게 다져놓아야만 합니다. 이런 공부를 즐길 수 있는 사람이라면 개발자가 잘 맞을 것입니다.

개발자가 되려면 뭘 해야 하나요?

아래와 같은 것들을 공부하시면 됩니다.

하나씩 설명하겠습니다.

프로그래밍 언어

저는 항상 이런 예시를 듭니다.

"개발자와 프로그래밍 언어란, 국제 변호사와 영어같은 관계다."

영어를 못 하는 사람이 국제변호사가 될 수 있을까요? 아마 불가능할겁니다. 그러면 영어만 잘하는 사람이 국제변호사가 될 수 있을까요? 영어를 못 하는 사람보다야 가능성이 높겠지만, 영어만 잘 해서는 국제변호사가 될 수 없습니다. 국제 변호사가 되려는 사람에게 영어가 차지하는 비중이 얼마정도 될까요? 아마 아주 작을 것 같습니다.

프로그래밍 언어도 마찬가지입니다. 언어를 몰라서야 코딩을 전혀 할 수 없을 것이고, 남이 작성한 코드를 이해할 수도 없을 것이므로 개발자가 될 수 없습니다. 그러나 프로그래밍 언어만을 안다고 해서 개발자가 될 수 있는 것은 절대로 아닙니다.

많은 사람들이 어떤 프로그래밍 언어를 공부해야 하냐고 묻습니다. 저는 아래 네 가지 언어를 순서대로 배우기를 권장드립니다.

먼저 파이썬은 문법이 간단하고, 시작하기 쉽고, 해볼 수 있는 재미있는 것들이 많습니다. 그래서 컴퓨터 분야에 흥미를 붙이는 데 좋은 언어입니다. 다른 언어들은 초기 개발 환경 설정부터 복잡하여 금방 흥미를 잃을 수 있습니다.

C는 모든 언어의 근본입니다. C 언어, 특히 포인터를 이해하지 못하고서는 프로그래밍을 한다라고 말할 수 없습니다.

JAVA는 객체지향언어의 대표 사례입니다. 객체지향으로 개발하는 경우가 많으므로 JAVA를 알 필요가 있습니다. C#도 나쁘지 않습니다.

JS는 최근 개발의 대부분을 차지한다고 볼 수 있는 웹에서, 특히 프론트에서 대단히 많이 쓰이는 언어입니다. 개발 환경 설정의 편의성만 따지면 JS만한 언어가 없지만, 가장 나중에 추천하는 이유는 JS로 올바르게 개발하려면 프론트-백 구조를 이해해야만 하기 때문입니다. 이 구조를 모르고 그냥 추상적으로 JS에 진입하는 경우 많이 헤매게 됩니다. Node.js 환경과 브라우저 환경을 헷갈리는 경우도 꽤 자주 봤습니다.

컴퓨터 과학

컴퓨터 그 자체에 관한 학문을 통틀어서 컴퓨터과학이라 부릅니다. 일반적으로 컴퓨터과학, 컴퓨터 공학 학과에서 배우는 학문들이 여기에 해당합니다. 아래는 개발자가 되기 위하여 반드시 배워야 할 필수적인 과목들입니다.

이 학문들은 컴퓨터를 다루기 위해 알아야 할 필수적인 학문들이라 볼 수 있습니다. 물론 이 학문들을 잘 알지 못하더라도 개발을 할 수는 있습니다. 그러나 이러한 학문을 모르는 경우와 아는 경우는 대단히 큰 차이를 보입니다. 일단 효율성 측면에서도 컴퓨터구조나 운영체제, 적절한 알고리즘을 알고 구현하는 경우와 모르고 구현하는 경우는 성능이 수백 배 이상 차이날 수 있으며, 예기치 못한 오류가 발생했을 경우 이러한 컴퓨터과학 지식이 있는 경우 훨씬 빠르고 정확하게 해결할 수 있습니다. 따라서 대부분의 기업 면접에서는 이런 컴퓨터과학 지식을 물어봅니다. 이 과목들 외에도 아래와 같은 수많은 컴퓨터 과학 분야가 있습니다.

위 컴퓨터 과학 분야들은 정말 학문의 분야이고 그 외에도 프로그래밍 언어 그 자체나 라이브러리, 프레임워크에 대해 알아야 할 것들이 많이 있습니다. 아래는 몇 가지 간단한 예시입니다.

협업 방법

개발은 일반적으로 여러 사람이 같이 진행하게 됩니다. 그러므로 협업하는 방법에 대해 잘 알지 못하면 대단히 난감해지는 경우가 많습니다. 특히 각종 컨벤션을 지켜야 하며, Git 등 협업 도구를 잘 다룰 수 있어야만 합니다. 이에 대해서는 제 블로그에 다른 포스트로 정리해둔 것이 있습니다.

아키텍쳐

어떤 서비스를 개발할 때, 그 서비스의 전반적인 구조를 아키텍쳐라고 부릅니다. 예컨대

...등이 크게 볼 때 아키텍쳐에 전부 포함된다고 볼 수 있겠습니다. 이는 말 그대로 서비스의 구조입니다. 이 아키텍쳐를 설계하지 않고 되는대로 개발하는 것은 마치 설계도 없이 되는대로 건축물을 짓고 보는 것과 마찬가지입니다. 처음에는 그런대로 뭔가 만들어지는 것처럼 보일지 몰라도, 수많은 사람들이 사용하게 되면 반드시 문제가 생기게 됩니다.

또한 건축물은 한번 짓고 나면 그 구조를 바꾸기가 쉽지 않습니다. 그러나 IT 서비스는 이와 다르게 잘만 설계하면 서비스가 운영되는 도중에도 그 구조를 바꿀 수 있습니다. 그렇게 하면 서비스를 계속 업데이트하면서 가치를 더할 수 있습니다. 그러나 아키텍쳐를 잘못 설계하는 경우 조금만 업데이트하더라도 수많은 문제가 발생할 수 있습니다. 그래서 업데이트 비용이 계속 증가하고, 결국은 오류를 고치는 데 개발보다 더 많은 비용을 투자하게 될 수도 있습니다.

개발방법론

개발방법론은 앞의 협업 방법 및 아키텍쳐와도 맥락을 같이합니다. 어떤 소프트웨어를 개발하기로 결심했을 때, 만약 그 규모가 크다면 개발하는 데 오랜 시간이 걸릴 것입니다. 그러므로 그 개발을 진행하는 방식이 대단히 중요합니다. 다양한 개발 방법론이 있지만 여기서는 주로 사용되는 두 가지를 설명하겠습니다.

프로그래밍이랑 코딩은 뭐가 다른가요?

일반적으로 프로그래밍이란 어떠한 문제를 해결하기 위한 절차를 작성하는 과정을 말합니다. 즉, 프로그래밍은 보통 논리적인 개념을 말하는 것입니다. 반면 코딩은 보통 실제로 코드를 작성하는 과정을 말합니다. 그러므로 어떤 문제를 해결하는 과정을 한국어로 대단히 명확하게 작성한다면 그것은 코딩은 아니겠지만 프로그래밍이라고는 부를 수 있습니다. 반면 뭔가 작성은 하고 있는데 그게 뭔지 자기도 잘 모르면서 어쨌든 코드를 입력하고 있다면 이건 프로그래밍은 아니지만 코딩이라 부를 수 있겠습니다.

그래서 프로그래머라는 표현은 별 문제가 없지만, 코더는 논리적으로 문제를 해결하지는 못하고 단순히 코드 입력만 할 줄 아는 사람이라는 비하적인 표현입니다.

CMD(.bat) / HTML / CSS 는 코딩인가요?

보통 굳이 구분하기 귀찮으니 그렇게 부르기는 합니다. 그러나 일반적으로 코딩이나 프로그래밍이라 하면 '튜링 완전'이라는 특수한 조건을 만족하는 프로그래밍 언어를 사용하여 코드를 작성하는 것을 말하는데 HTML / CSS 는 그러한 조건을 만족하지 못하므로 보통 코딩이나 프로그래밍이라고 부르지는 않습니다. CMD, 혹은 배치파일과 같은 쉘 스크립트는 튜링 완전하기는 하지만, ipconfigecho 등 간단한 명령어 정도를 사용하는 건 보통 코딩이라고 말하진 않습니다.

CSS와 HTML의 조합은 대단히 엄밀히 따지자면 튜링 완전하기는 합니다. 그러나 이는 tricky한 방법을 이용하는 경우고, 일반적으로 사용할 때에는 튜링 완전하지 않습니다.

개발자가 되기 위한 좋은 방법은?

저는 이 방법이 최선이라고 생각합니다. 아마 많은 개발자 분들 역시 동의하실겁니다.

  1. 언어를 하나 선택하여 기초 문법을 공부합니다.
  2. 뭐라도 하나 만듭니다. 본인이 실제로 필요한 것이면 더 좋습니다. 아래는 실제로 제가 해 봤던 것들입니다. 그리고 지금까지 대단히 유용히 사용하고 있습니다.
    • 일기장
    • 메모장
    • 사진을 저장하거나 공유할 수 있는 웹 서비스
    • 블로그
    • 게임
  3. 반복합니다. 가능하면 여러 사람이서 협업도 해 봅니다. 깃도 사용해보고, 이것저것 다 써 봅니다.
  4. 그러면서 앞서 말했던 이론 지식들을 공부합니다.

실제로 프로그램을 작성하지 않으면서 이론만 공부하는 경우를 꽤 봤습니다. 이건 피아노를 공부한다면서 악보와 음악 이론만 보고 있거나 연애를 배우겠다고 심리학 교과서를 읽고 있는 것과 같습니다. 실제로 뭔가 만들어보지 않으면 아무리 이론을 공부해봐야 소용이 없습니다. 그리고 무엇보다 이론만 공부하면 별로 재미 없습니다.

마무리하며

만약 물어볼 것이 있으시다면, 언제든지 unknownpgr@gmail.com으로 메일 주시면 답변해드리겠습니다!


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -