"프로그래밍을 잘 한다"는 것은 무슨 뜻일까? 혹은 "좋은 프로그래머"라는 것을 어떤 프로그래머를 뜻할까?
개인적인 생각은 이렇다. 프로그래밍을 잘 한다는 것은
1. 알고리즘 천재
2. 어플리케이션 천재
3. 프로젝트 수행 능력 천재
우선, 일을 하려면 프로그래밍을 알아야한다. 그것이 C/C++이든 Java든, 타겟 언어가 있으면 그것을 익혀야 함.
그런데, 프로그래밍 언어를 보면 기초/중급/고급 내용이 있음. 기초는 누구나 알아야 할 것, 중급은 프로그래밍을
꽤 한다고 하면 알아야 할 것, 고급은 그 프로그래밍 언어를 꿰뚫고 있는 것 (개인적인 분류임).
일반적으로 중급까지만 알고 있으면 "프로그래밍을 잘 함"에 있어 아무 문제가 없다.
그럼 고급은 누가 알아야할까?
그 언어를 만들거나 기초 라이브러리 코드를 만들거나 등등 일반 프로그래머들이라면 거의 상관이 없을 그런 부분들을 건드려야 하는 사람들.
프로그래밍 언어의 기초/중급 수준을 다루고 나면, 크게 두갈래 길이 보임.
하나는 어플리케이션에 중점을 두는 것이고, 다른 하나는 알고리즘에 중점을 두는 것임.
당연히 전자도 후자는 알아야 하고, 후자도 전자를 알아야 하나, 중점이 다르다는 것이다.
조금 더 풀어쓰면, 전자는 산업현장 중심이고 후자는 학계 중심이라고 보면 좋을듯.
초고급 알고리즘, 이론적인 측면 등등은 사실 산업 현장에서는 그다지 쓸모가 없음.
그런게 필요한 일도 거의 없고, 그런게 필요한 분야는 그런거 만들 용도로 박사들을 가져다 쓰기 때문에,
어플리케이션 만드는 사람들은 사실 그런 알고리즘을 알 필요도 없고, 안다고 해서 큰 도움도 안된다.
1. 알고리즘 천재
이건 학계에 중점을 두고 쓰는 것임. 학계로 나아가면 (대학원 -> 포닥 -> 교수) 알고리즘 (혹은 더 큰 분야로
theoretical computer science, TCS)쪽에 학회도 많고 저널도 많고, 또한 많은 사람들이 이론적인 측면도 많은
연구를 하고 있다는 것을 알게됨. 특히 단계가 올라가면 올라갈수록 수학쪽 지식도 엄청나게 필요해짐.
어플리케이션 하는 사람들과는 가는 길 자체가 달라지고, 졸업후 진로도 크게 겹치진 않음.
물론 구글/페이스북 이런데서 어플리케이션 하는 사람들과 다시 만날수도 있으나, 그런 곳에서도 실제 하는 일은 확 다름.
요약하면, 알고리즘 (TCS)쪽 하는 사람들은 높은 수준의 이론 지식이 필수고, 이를 위해선 당연히 상위권 대학/대학원을 가야함.
2. 어플리케이션 천재
많은 사람들이 의문을 가지는게 "알고리즘을 잘 하면 (일반적으로 말하는) 프로그래밍도 잘 하나?" 인데, 그건 아님.
여기서 프로그래밍이란, 하나의 주어진 알고리즘을 짜는것일수도 있지만, 더 크게 얘기하면 하나의 어플리케이션 (그 프로젝트가
크던 작던..) 을 완성하는 것임. 알고리즘은 정말 수학적/컴과(컴퓨터과학)적인 머리를 요구한다면, 어플리케이션을
완성한다는 것은 대개 간단한 알고리즘을 짜는 능력 + 널리 쓰이는 알고리즘에 대한 지식 + 전체 시스템 이해
+ 프로그램 조직 능력 + 최적화 능력 등을 종합적으로 필요로 함.
간단한 (정말 간단한) 게임같은걸 만들어 본 사람들은 알겠지만, 우리가 흔히 말하는 객체지향 프로그래밍,
이거는 진짜 어플리케이션의 핵심 부분에만 해당됨. 그 외의 것들은 온갖 지저분한 (잘 정리되지 못하는) 코드로
처리하게 될 수 밖에 없음. 그런거 할 때 고급 알고리즘을 만드는 능력이 필요할까? 전혀 아님.
어플리케이션을 만드는 것은 고급 알고리즘을 만드는 것과는 또다른 문제임 (난이도가 다르다기 보단 일의 성격 자체가 다르다는 것).
따라서 대학/대학원에서 알고리즘 성적을 잘 받는 애들이 회사에 가서 큰 프로젝트를 리드하는 역할을 맡았다가
좌절하는 경우가 있는데, 이건 대개 그런 사람들이 어플리케이션을 만드는 것에 대한 이해가 부족하기 때문임.
물론 알고리즘을 잘 하면 어플리케이션도 잘 만들 확률이 높지만, 여기서 말하고자 하는 바는,
"어플리케이션을 잘 만드는 것은 많은 경험과 깊은 고찰을 필요로 한다"임.
알고리즘 지식만 많고, 주어지는 알고리즘을 프로그램으로 잘 변환시킨다고 해서 어플리케이션을 잘 만드는 것은 아니라는 것.
3. 프로젝트 수행 능력 천재
이는 어플리케이션 천재와는 조금 다름. 2번은 자기가 현재 가지고있는 지식을 가지고 주어진 어플리케이션을 완성하는
능력이라고 본다면, 3번은 프로젝트가 주어졌을 때 내가 잘 모르는 분야가 포함되어 있을 경우 그 분야를 빠르게 습득하여
정해진 시간 내에 프로젝트를 끝내는 능력을 의미함.
예를 들어, 나는 C/C++로 짜는 대부분의 어플리케이션은 잘 하는데 갑자기 DB를 연결해서 뭘 처리해야한다고 가정해봄.
그런데, DB+SQL에 관한 지식이 없다? 그러면 이를 재빠르게 습득 (역시 고급까지는 필요없음, 초급 혹은 가능하면
초급+초중급까지)하여 구현을 하고 동작하게 만드는 것임.
똑같은 배경지식을 가진 두 사람에게, 그 배경지식과는 조금 떨어진 분야의 프로젝트를 줄 경우 한 사람은 꽤 잘 해내는데 반해
다른 사람은 정말 엉망으로 만드는 경우가 있음. 이 때 전자는 프로젝트 수행 능력이 뛰어난 것임. 물론 후자에게 충분한 시간을
준다면 그 사람도 전자처럼 어느정도 해낼 수는 있다고 봄. 하지만, 프로젝트라는게 대부분 시간이 타이트하게 주어지므로,
그 시간안에 어떻게든 동작시키게 만드는 능력은 다른 문제임. 내가 본 한가지 예는, 고객이 갑자기 예쁜 GUI를 요구함.
평소에는 그 업계에서는 GUI는 크게 신경을 안쓰고 다들 기능에만 집중을 했는데, 어느 고객이 갑자기 요구를 한 것임.
두 사람이 이를 진행했는데, 한 사람은 온갖 구글링을 통해 빠르게 GUI의 동작 원리를 익히고나서 구현을 한 반면,
다른 사람은 그 원리를 빠르게 파악하지 못해 다양한 버그가 발생함 (화면이 리프레시가 안되는 등).
이것은 아주 작은 한 예일 뿐이고, 정말 다양한 경우를 보아왔음.
결론
좋은 프로그래머가 되려면 어떻게 해야하는가?
여기 오는 대부분의 사람들은 1. 알고리즘 천재의 길을 걷지는 않을 것이므로 결국 2나 3의 길을 걸을텐데, 그렇다면
1) 기본적으로 언어 하나를 초급+중급까지 익히고 (문법을 익힌다는 뜻임. 이는 사람에 따라 다양한 프로그래밍 경험을
요구할수도 있고, 짜잘한 예시 프로그램을 많이 만들어보는 경험을 요구할수도 있음)
2) 작더라도 여러개의 어플리케이션을 혼자서 처음부터 끝까지 만들어보고 (여기서 어플은 커맨드라인 어플 뿐만이
아니고 어느정도 GUI도 포함하고, 파일 입출력(세이브/로드), 사운드 처리 등등 짜잘한것도 포함) => 많은 사람들이 여기까지함
3) 2)와 동시에 알고리즘을 공부하고, 많이 쓰이는 알고리즘은 당연히 공부해서 알아놔야 하고
(공부한다는 것은 당연히 구현을 해보는 것도 포함함)
4) 그 후, 컴퓨터 과학 커리큘럼을 보고 실무적으로 이용되는 것들을 좀 더 공부하고 (DB, 네트웍 등등)
5) 본인이 관심있는 분야를 파고들어 관련 회사에 입사.
하면됨. 참고로, 그냥 프로그래머에서 머무는게 아니라 종합적인 능력을 키우고 싶다면, 이것저것 다양하게
공부하는 것도 필요함. 컴파일러, OS, 소프트웨어공학 등등 책을 읽다보면 시야가 넓어지고 특히 3번, 프로젝트 수행 능력이 올라감.
다들 알다시피 우리나라에서 악명높은 프로젝트중에 하나가 바로 "대형 병원" 프로젝트임.
온갖 난다긴다 하는 사람들이 와서 죄다 실패하는게 대형 병원 프로젝트인데, 그 사람들이 알고리즘 능력이 없어서 실패할까?
대형 병원 프로젝트는 복잡한 알고리즘 능력같은거 하나 필요 없음.
결국 있는 지식을 잘 활용해서 잘 만드는 2번과 3번의 능력이 필요한건데, 우리나라에서 그런 사람 구하기는 하늘의 별따기..
암튼 다들 열공해서 좋은 프로그래머가 됩시다.
좋은 얘기하다가 갑자기 SI땔깜프로젝트 얘기나와서 비추
그리고 알고리즘 능력이라고하면 너무 협소해보이니까 연구능력 이라고하는게 낫지않을까
ㅇㅇ 연구능력. 글고 많은 사람들이 (특히 학생들이) "백준 마스터하면 난 최고급 프로그래머가 될 수 있을것" 이라고 생각하는데, 백준 마스터는 오히려 1번 알고리즘쪽이고.. 2/3번과는 전혀 관련이 없음. 물론 얘기했듯이, 알고리즘을 잘 하면 2/3번도 잘 할 확률이 높지만, 반드시 양의 상관관계가 있는 것은 아님.
정성추
훌륭한 글 감사
요약 - 알고리즘 : 건축공학 애플리케이션 프로젝트 : 토목공학
어쩔
휼륭하다 - dc App
시스템프로그래밍 같은건 어느분야냐
진짜 좋은글이네요 ㅇㅅㅇ
유익한 정리군. 나는 1번과 2번을 못하고 3번을 잘 하는 셈이군
맞말 ㅇㅂ
3번 잘하는새끼들이 만든 코드는 유지보수하기 좆같은 경우가많던데ㅋㅋ기한 맞추려고 하드코딩 존나박고 코드도 개판이고 - dc App
잘 썼는데 2,3은 같다고봄 주로 2를 잘하면 3을 못할수가 없음.