오늘 무엇인가 정리하다가 도대체 프로그래머가 알아야하는 기본 지식은 어디까지일까라는 의문이 들었다. 물론 컴퓨터 기본 구조, 네트워크, 자료 구조, 알고리즘, C, C++, 자바, 다양한 프레임워크 등등 모든 영역을 잘하면 좋겠지만 모든 영역을 학습하기에는 지금의 지식이 너무 방대하기 때문이다.
그렇다면 프로그래머로 일반화해서 이야기하기는 힘들테니 웹 프로그래머 관점에서 이야기해보자. 내가 처음 웹 프로그래밍을 시작할 때는 웹 프로그래밍은 누구나 할 수 있는 것으로 인식되었다. 웹 프로그래밍이 등장하기 이전의 선배 프로그래머들은 웹 프로그래밍을 하는 프로그래머를 무시하는 경우가 많았다. C도 할 줄 모르고, 자료 구조나 알고리즘도 모르는 놈들이 무슨 프로그래밍을 한다고 설치냐는 인식이 팽배해 있었다. 프로그래머를 하려면 C는 기본으로 할 줄 알아야 하는데 자바부터 시작해서 무슨 프로그래밍을 하겠냐는 인식이 있었다.
그로부터 10년 이상이 지난 지금의 현실을 보면 어떠한가? 10년 전에 자바 기반으로 웹 프로그래밍을 처음 시작한 선배 개발자들은 후배 개발자들을 무시한다. 자바, JSP, Servlet, Jdbc, 쿼리에 대한 개념도 제대로 가지고 있지 않은 놈들이 무슨 프로그래밍을 하느냐고... 요즘 친구들은 처음부터 Spring, myBatis와 같은 프레임워크 기반에서 개발하다보니 웹에 대한 기본 개념도 모르고 있다면서 말이다. 나도 10년 전부터 시작한 개발자로서 새롭게 시작하는 후배 개발자에게 비슷한 인식을 가지고 있는 것이 사실이다.
그렇다면 내가 처음 웹 프로그래머의 길을 걷기 시작했을 때의 선배들이 했던 이야기들이 맞는 것인가? 그 선배들의 조언에 따라 나는 C를 배우고, 자료구조와 알고리즘에 많은 시간을 투자했어야 하나? 그렇다면 지금 후배 개발자들은 어느 수준까지 지식을 쌓아야 하는 것인가? 이렇게 거슬러 올라가면 어셈블리까지 알아야 되는 것인가?
나는 자바와 웹으로부터 프로그래밍을 시작하면서 기존의 선배들과는 다른 접근 방식으로 프로그래밍을 할 수 있었다고 생각한다. 그렇다면 지금 시작하는 후배 개발자들은 Ruby On Rails와 같이 Full Stack으로 갖추어져 있는 프레임워크로부터 시작한다면 우리와는 완전히 다른 접근 방식을 취할 수도 있지 않을까? 자바 개발자의 경우 수 많은 프레임워크를 학습하고 가장 좋은 조합을 만들기 위해 프레임워크 설정 파일과 싸우는 동안 Ruby On Rails와 같이 Full Stack으로 갖추어진 프레임워크에 익숙한 개발자들은 프레임워크 자체에 대한 관심보다는 서비스 자체에 대한 관심도가 더 높아지지 않을까라는 생각을 해봤다. 자바 기반 웹 개발과 같이 다양한 프레임워크를 조합하고 최상의 조합을 찾는데 시간을 투자하다보니 기술적인 측면에 초점이 맞춰지는 경우가 많은데 Ruby On Rails와 같은 경우에는 사용자 요구사항, 빌드, 배포, 유지보수 등 그 다음 단계에 대한 고민을 하는데 더 많은 시간을 투자할 수 있지 않을까라는 생각을 해봤다. 내가 처음 자바로 시작했을 때 C의 포인터 때문에 머리 아파하지 않고 객체 지향에 좀 더 초점을 맞추면서 프로그래밍을 할 수 있었던 것처럼 말이다.
지금 시점에 우리가 가져야할 태도는 무엇일까? 능력이 된다면 더 많은 지식을 습득하면 좋겠지만 미래를 생각한다면 과거의 너무 많은 지식이 독이 될 수도 있지 않을까?
저는 웹프로그래머란 HTML과 HTTP를 이해하고 다룰 줄 아는 프로그래머라고 생각합니다.
17개의 의견 from SLiPP
저는 웹프로그래머란 HTML과 HTTP를 이해하고 다룰 줄 아는 프로그래머라고 생각합니다.
이산수학, 선형대수, 수치해석학, C언어, 자바 또는 C#, C++, 스크립트 언어 1종(파이썬, 펄, bash), HTML, 자바스크립트, CSS, 자료구조 알고리즘, 운영체제, 시스템 프로그래밍, 데이터베이스, 컴파일러, 네트워크, 암호학, 객체지향 프로그래밍, 프로그래밍 언어론 정도 알면 좋겠지만요, 그것보다 중요한 건 논리적인 사고력과 문제해결 능력, 그리고 협업을 할 수 있는 마음가짐인 것 같습니다. 요즘엔 그래도 꼭 한과목 꼽으라면 자료구조와 알고리즘은 알았으면 좋겠습니다. 그 외에는 다 옵션.
@호수 와 교수님까지 오셔서 답변 남겨주시고 감사합니다. 자료구조와 알고리즘의 중요성은 예전부터 많은 선배 프로그래머들이 강조를 하고 있잖아요. 하지만 접근하지 쉽지 않은 것이 자료구조와 알고리즘인데요. 자료구조와 알고리즘을 왜 공부해야하는지와 어떻게 공부하면 좋을지에 대한 조언을 해주실 수 있을까요?
그리고 최근에 대학 정규 과정을 거치지 않고 프로그래머로 사회에 진출하는 친구들이 많은데요. 이 경우에는 특히 자료구조와 알고리즘을 학습할 기회가 적고 필요성을 느끼지 못하는 경우가 많습니다. 이런 친구들은 어떻게 접근하면 좋을까요? 이미 이에 대한 필요성을 느끼고 있는 선배 개발자들이야 당연히 해야된다고 생각할 수 있겠지만 지금 시작하는 친구들에게는 그 필요성이 피부로 느껴지지 않는 것이 사실이잖아요.
@자바지기 요즘은 전공생도 알고리즘은 많이 공부를 안하는 경우도 많은데요. 알고리즘을 배우고 안 배운 거에 따라 삶이 달라지지 않을까 생각합니다. 디자인 패턴을 배우고 안 배운게 자바에 영향을 끼친다고 하잖아요. 알고리즘은 생각하는 방법의 디자인 패턴이라 불릴만 합니다. 대표적으로 디바이드앤퀀쿼ㄹ, 다이나믹, 그리디 세 가지 방법만 알아도 매우 많은 문제를 보다 쉽게 해결이 가능합니다.
그리고 자료구조는 코딩의 효율성 측면에서 중요합니다. 예를 들어 얼마전에 친한 개발자 분이 아파치의 콜렉션 라이브러리를 사용하는게 정말 편하다고 하는데요. 제가 잠깐 봐도 JDK의 기본 콜렉션보다 매우 편해 보였습니다. 그걸 안 쓰고 기본 맵류를 썼으면 코딩의 양이 10배는 늘었을 겁니다. 자료구조를 잘 배웠다면 내가 제안한 문제해결 방법을 구현하기 위해 어떤 자료구조가 적절한지를 조금 더 쉽게 선택할 수 있습니다.
참고로 주변의 고수 개발자/엔지니어 분들 중 비전공이신 분들은 앞에서 이야기한 자료구조, 알고리즘 하나도 안 배워도 이미 체득하신 경우가 많았습니다. 아마 많은 시행착오를 겪었을 테구요. 배우면 안 배운 거보다 조금 더 편하게 레벨업을 할 수 있습니다.
공부방법은 일단 쉬운 기본서적 한두권 침대에서 자기 전에 읽는 것을 추천하구요. 가뜩이나 개발자 분들은 바쁘고 피곤한데, 깊게 공부하지 않아도 되니깐 맛만 보는 것도 좋은 방법인 것 같습니다.
나중에 시간이 된다면 JDK 라던가 안드로이드의 달빅이나 바이오닉 같은 것들에 들어있는 라이브러리 쪽 중 간단한 파트 한번 열어보는 것도 좋을 것 같습니다.
http://zedshaw.com/essays/programmer_stats.html : 개발자가 알아야할 지식의 다른 측면을 이야기하는 Kenny가 보라고 추천한 글.
Kenny는 완전히 다른 측면의 지식을 이야기하고 있다. 우리들이 알아야할 지식은 끝이 없네.
저는 질문에 있는 "기본지식"이란 무엇을 말하는 걸까? 에 막혀 글을 못쓰고 있네요...
@ezblog 무슨 표현을 쓰는 것이 좋을까 고민하다가 그렇게 표현했다. 웹 프로그래머라면 알아야될 지식의 범위는 어디까지일까라고 해야할까? 많이 알면 좋기는 하겠지만 그럴 수 없는 상황이기 때문에 기본적으로 이 정도 지식은 갖추어야 되지 않을까라고 생각하는 수준이랄까? 암튼 의문이 들기는 하는데 어떤 방식으로 질문을 던져야 될지 몰라서 막연한 용어를 쓰게 됐다. 네가 더 좋은 용어로 정리해 주라. ㅋㅋ
여러가지 의견들이 나올수 있겠지만, 프로그래머가 어떤 일을 하는 사람인가에 따라 크게 답변이 엇갈릴 수 있는 듯하다. 단순 Coder(여기서는 프로그램만 잘 한다는 의미로 사용했다)라면 현실적으로 해당 프레임워크의 구조나 설정만 잘 알고 코드를 잘 작성할 수 있으면 된다고 생각하기 때문에 밑바닥에 관련된 기본 지식을 필요없을 수 있다. 그러나 어느 정도 레벨로 진입하게 되면 전체적인 아키텍처나 성능에 대한 부분, 구조적 측면에 집중하게 되면서 경계가 무너질 수 밖에 없다. 프레임워크에 대한 구조나 설정을 잘하는 것과 이 구조가 어떻게 효율적이고, 이런 설정이 어떤 부분에 영향을 주는지 파악하고 이해하는 것은 전혀 다른 주제이다. 사실 단순히 웹 사이트를 개발하는 사람이라면 알고리즘, 자료구조와 같은 필수(?) 항목을 알아야 한다. 그리고 이를 잘 활용하여 현재 제공된 프레임워크를 잘 사용하고 이를 통해 프로그램을 잘 작성한다면 만사 OK가 될 수 있다. 그런데, 그런 프레임워크를 만들고, 일부를 자신의 코드로 수정하려고 한다면 저변이 넓어져야만 한다. 자바로 한정짓더라도, 기본적인 레퍼런스의 구조와 메모리, 가지비 컬렉터의 구조와 한계, IO에 관련되어 나오는 수많은 이슈, 통신에 있어서의 효율과 활용, HTTP 프로토콜과 그 기초가 되는 TCP/IP 구조등...
이 내용들은 흔히 말하는 컴퓨터과 전공과목에 포함된 것들이다.
회사에서 원하는 신입사원은 바로 실전에 투입할 수 있는 인력이다. 빠른 기간에 필수적인 지식으로 무장하여 현장에 투입하려면 단순 Coder로써의 가치가 필요하다. 그러나 이들이 성장하여 매니저의 입장이 되면 필요한 것은 Coder로써의 지식이 아니다.
자바지기가 언급한 프로그래머가 비 전공자 출신으로 Coder 및 프로그래머로 진입하려는 사람이고, 목표가 Skilled Programmer 라고 한다면 자료구조, 알고리즘 두개의 필수적 지식을 기준으로 하여 전문적인 하나의 언어와 프레임워크에 익숙하도록 접근하는 것이 가장 빠른 방법이 될 수 있다. 그러나 진정 마스터로써의 프로그래머를 뜻한다면 적어도 통신, 데이터베이스, 특히 컴퓨터 구조론(하드웨도 + 메모리)등과 같은 내용도 필수가 될 수 밖에 없을것이다.
자바 프로그램을 작성하고 잘 짜는 사람도 실제로 C의 포인터와 자바의 레퍼런스의 차이점을 명확하게 메모리상의 구조로 표현할 줄 아는 사람은 의외로 많지 않다. 왜? 몰라도 프로그램을 짜는데 문제가 없으니까. 이처럼 어느 단계까지가 목표이고 정의냐에 따라 선택적이 될 수 밖에 없다는 것. 매우 무책임한 말처럼 들리겠지만, 코더 -> 프로그래머 -> 아키텍쳐 및 모델러 -> 프로젝트 리더 및 매니저로 진화하는데는 그만큼의 배경지식이 필요하다는 것은 어쩔 수 없는 듯하다. 특히 기초를 교육하는 강사나 교수들의 입장이라면....
@taiseung.lee.3 교수님 좋은 의견 감사합니다. 저도 경력이 많아지고 경험이 쌓이면서 기본적으로 알아야할 배경지식이 정말 중요하다는 것을 느낍니다. 특히 지금은 학생들을 가르쳐야 하는 상황이다보니 이 같은 부분의 부족함이 더 크다는 것을 느끼고 있습니다. 그래서 좀 더 학습하고 배우려고 노력하고 있습니다. 하지만 생각보다 쉽지는 않네요.
제가 이 글에서 이야기하려던 부분은 지금과 같은 논의도 있지만 약간 다른 관점에서 이야기해보려 했습니다. 우리가 프로그래머로서 기본적으로 알아야하는 기술적인 지식이 있습니다. 그런데 선배들이 후배들에게 조언하는 기본적인 기술에 집착하는 경우 미래를 보지 못하는 경우를 종종 보아왔기 때문에 글을 썼습니다. 물론 그렇지 않은 프로그래머도 많겠지만 기본이라고 하는 기술 속에 갖혀, 다른 관점을 보지 못하고, 새로운 접근 방식을 보지 못하는 아쉬움 때문입니다. 현재 국내의 소프트웨어 개발 현실이 약간 그런 측면이 있지 않나라는 생각이 듭니다. 물론 산업 구조적인 문제 때문에 소프트웨어 발전에 한계가 있는 것 또한 사실이지만 그 현장에 몸담고 있는 우리 프로그래머들의 소극적인 자세 또한 지금과 같은 상황을 초래한 것은 아닌가라는 생각이 듭니다. 현 시점에 우리가 기본적으로 가져야할 지식들은 선배 프로그래머들이 강조했던 지식도 물론 중요하지만 다른 측면의 자세, 지식들을 더 강조해야할 때가 아닌가라는 생각입니다.
아직 저도 그것이 무엇이라 명확하게 이야기할 수는 없지만 프로그래머들이 새로운 관점을 볼 수 있도록 하려면 새로운 접근 방식도 필요하지 않을까라는 생각을 해봤습니다. 접근 방식에서 자바 기반 웹 프로그래머니까 jsp, servlet은 기본으로 해야되고, html과 http는 당근 기본으로 깔아야지도 맞지만 그런 이야기들 보다는 다른 접근 방식으로 다가가야되지 않을까라는 생각을 해 봤습니다.
제가 생각하는 기본 지식은... http, html(css, javascript)의 이해. 특히 http는 좀 심도 깊게 왜냐하면 웹 개발자이기 때문에... java와 같은 객체지향언어를 선택한다면 객체지향 프로그래밍의 이해... bash shell, 파이선/루비/펄 같은 쉘스크립트 언어 하나정도는 잘 다루기... 두뇌개발을 위해서 알고리즘과 자료구조... 과학적인 방법론을 위해서 통계분석방법...
음... 적어놓고 보니.. 역시 난 기초가 부족해..ㅠㅠ
사실 살면서 느끼는거지만. 우리 하는 프로그램이라는 지식은 삶에 도구일뿐 배움에 있어서는 어느게 더 좋다고 보기는 힘들다고 생각됩니다.
기본적인것은 그때 그때 상황에 맞춰 변할것이고 그래서 항상 배움에 자세를 가지고 새로운것을 찾아야 하겠지요.
저도 델파이로 시작해 웹 자바 스프링까정 하고 있지만, 근본적인 일에 대한 자세라던지 내가 책임감. 꼼꼼함.
이런것들이 중요하다고 생각합니다.
프로그램이라는 것으로만 삶을 살수 있는건 아니니 삶을 위해서는 다른 분야 예를 들어 영어라던지 바리스타라던지 야구코치라던지 .. 새로운 영역을 도전해 보는것이 삶의 지평을 넒힐 수 있다고 생각하니 할게 많네요 ^^
웹 입문자인데 많은 것을 배우고 갑니다
오래된 글이지만 지금도 유효한 좋은 질문이네요. 이런 질문을 던질 수 있는 자바지기에 경의를 표합니다. 질문을 바꾸면 어떻까요?
"어떤 프로그래머가 되고 싶은지?" 세상을 바꾸고 싶은 프로그래머의 기본 지식은 다르겠지요. 프로그래머는 단순한 코더는 아니겠지요. 신이 모든 사람을 보살필 수 없어 "엄마"를 보냈다고 합니다. 천지창조의 프로토타입 프래그램의 벅이 너무 많아 디버깅을 위해 프로그래머를 지상에 보냈다고 생각하는 안드로이드앱 초고령 개발자입니다.(정확하게 조사는 안했지니만, 추측으로...)
이 글을 읽어보니 배울것이 정말 많아 보이는군요. 항상 생각하는 것이지만 웹 프로그래밍이란 쉬우면서도 달리보면 끝이 없는것 같습니다. 프론트엔드와 백엔드의 구별도 안지 얼마 안되었고 이런 글을 읽어보니 앞으로 제가 무엇을 해야할지 고민도 됩니다. 아직 고등학생이라고 안심해 보아도 어찌보면 곧 성인이니 제 밥그릇 챙기려면 안심할 수도 없군요.. 이제 곧 회사에 가게될텐데 가서 무엇을 배우게 될지 기대됩니다.. 가서 민폐만 끼치지 않았으면!
그저 공장에서 찍어내는 기계적 관점이 아닌, 지적이고 창조적인 새로운 일을 할 수 있는 변화가 필요하다는 것으로 생각합니다. 근데 꼭 그런 일을 하는데 "프로그래머가 필요한가?" 라는 의문에 앞서 "인류에게 정말 컴퓨터라는 전자기기가 필요했을까?" 라는 의문을 먼저 해봅니다. 매우 간단한 질문이고 비슷한 많은 답이 나올 겁니다. 결국, 프로그래머도 그저 필요에 의한 직종일 뿐이고, 언제 어떻게 역사의 뒤안길로 사라질지 모르는 직종이라고 생각합니다. 이런 점에서 세상은 점점 더 프로그래머의 필요성에서 벗어나고 있다는 생각도 들 수 있지 않을까요? 아직까지야 프로그래머의 직업이 사라진다고 생각하는 사람은 없겠지만, 알고리즘이니 자료구조니 포인트 개념이니 이러한 기술적인 것을 모르는 일반인들의 논리적인 생각만으로도 프로그래밍이 되는 그런 시대도 오리라 생각합니다. (직접 손가락으로 지금처럼 코딩하는 것은 박물관에서나..) 그런 시기 중간마다 에니악 컴퓨터가 나왔을 때처럼 집채만한 양자컴퓨터의 등장 이후로 양자컴퓨터가 일반 PC를 보완하는 수준으로 발전한다면, 그동안 경험했던 기술개발의 역사에 한 획을 긋는 일이 되겠지요, 그리고 그 양자화에 맞춰서 반도체와 CPU도 대체되겠고, 여지없이 프로그램 언어도 다 혁신기를 거치고, 인공지능 분야도 크게 탄력을 받게 될 겁니다. 아무튼, 미래의 일이고, 프로그래머의 필요성이 더 많아질지 어떨지는 예측하기 어렵지만, 인공지능의 발전 혹은 소프트웨어의 발전은 프로그래머와 일반인들의 장벽을 지금보다 많이 허물 것으로 생각합니다. 프로그래머들에게는 불행한 일이지만, 사람은 더욱 편리한 것을 추구하려는 것은 미래에도 마찬가지 아니겠습니까.. 물론 그러한 과도기에서 프로그래머의 직종과 역량이 우후죽순처럼 커졌다가 줄어들 수도 있고, 프로그래머라는 직업이 지금 우리가 생각하는 관점과 다른 진화된 직업으로 변화될 여지도 있기에 섣불리 판단하기는 그러네요. 자바지기님은 이러한 정해지지도 않은 미래적인 이야기가 아니라 현실적인 이야기를 하고 싶으셨던 것으로 생각됩니다. 그 새로운 접근방식이 어떠한 지식 혹은 기술을 열어나갈 수 있는 그 무엇이 될는지는 모르겠지만, 그것이 프로그래머가 사회적으로 대접받고, 행복해질 수 있는 길이었으면 좋겠습니다.
많은 것을 느끼고 가요. 어떤걸 공부해야하는지 다시 한번 머리속으로 정리하게 되네요.
이 글을 쓴지도 7년이 넘게 지났네요. 개발한 지 얼마 안 된 입장으로서 선배 프로그래머 분께서 현업에 있으면서 어떤 환경의 변화가 있게 됐는지 체감할 수 있는 글이라서 평소에 지녔던 궁금증이 해소되어서 정말 좋았습니다. 웹 프로그래밍에 대해서 관심이 있는데 글을 쓸 때와 지금을 비교했을 때 환경이 또 많이 바뀌었는지 궁금합니다. React와 Vue, ASP.NET으로 넘어갔나요? 아니면 기존의 것에 플러스알파느낌으로 얹어진건가요? 어떤가요?
의견을 남기기 위해서는 SLiPP 계정이 필요합니다.
안심하세요! 회원가입/로그인 후에도 작성하시던 내용은 안전하게 보존됩니다.
SLiPP 계정으로 로그인하세요.
또는, SNS 계정으로 로그인하세요.