'진로'에 관해 많은 글을 검색해 보았습니다..제 궁금증에 구체?

gauri123의 이미지

많은 글들을 검색해 보았습니다.

저역시 리눅스, 유닉스계통을 보고 있으나 여러가지 막막하고 고민이 많이

됩니다.

물론 이것은 현재 이 업종에 종사하고 계신 분들이 아니라면 대부분 그러할

것이라고 생각이 됩니다.

그래서 이 글들에 적힌,

'실력이 뛰어난' '어느정도 하는' '보통의 프로그래머' 등의 의미가 너무 추상

적으로 와 닿아 암담하기에, 다소 불편하실지는 몰라도 제가 질문을 몇자

적어 보기로 하였습니다. 초보가 보기에 좀더 그 지표가 명확해 질수 있다면

도움이 되지 않을까 생각되구요..

답변을 해 주신다면 저를 비롯하여 이곳을 찾는

많은 초보(저를 포함) 분들에게 심적 위안과 진로에 대한 확신, 무엇보다 눈에

보이는 목표를 제시할수가 있을 것이라고 생각이 됩니다.

(에궁... 위의 글이랑 같은 내용을 번복..그래도 ^^)

이 글을 적으면서 너무 주제넘는 글은 아닌지 걱정이 되는군요.

1. '실력이 뛰어난" 프로그래머라는 표현은 어느 정도의 프로젝트를

성공시킬수 있는 사람들을 이야기 하는 것인지 알고 싶습니다. 예를 들면

운영체제하나를 부팅정도까지만 시킬수 있는 정도까지는 만들어 낼 수 있

다고 한다면 이러한 사람은 '실력이 뛰어난'프로그래머라고 할 수 있을까요?

이런 사람들은 수학과 물리학에도 이미 정통하고 각종 자료구조및 운영체제

의 돌아가는 기본원리까지 자세히 알고 있어 그 구조를 구현해 내는데

무리가 전혀 없는 정도의 사람이라면 그 최 하한선 정도가 되는 것인지...

한마디로 많은 고졸자 분들이 궁금해 하시는 '실력만으로 인정받을 가능성

을 지닌 기준'이 어느 선인지 알고 싶습니다.

다시 말씀드려 많은 분들이 보시기에 그 기준이 다르시리라 생각이 됩니다

만, '최 하한선'을 어느정도로 보시는지.. 실제로 현실과 틀린 답들이

나온다고 하여도 현재 제가 가지고 있는 지침보다 정확하리라 생각합니다.

2. '보통의 프로그래머' 라는 표현에 대하여도 궁금점이 남습니다. 이런 것은

일반 소프트웨어를 문제없이 만들어 내는 사람들을 말씀하시는 것인지?

예를 들면 '윈엠프'라던지 '미디어플레이어' 정도 하나쯤은 자기가 척척

만들어 낸다면 보통의 프로그래머 즉, 앞의 많은 글들의 표현을 빌자면

밤낮 고생하고 하루의 반 이상을 의자에 앉아 보내면서도 식소사번한 남는

게 없지만, 그래도 밥먹고는 살수 있는.

정도가 되는 것인지?

이것도 그 최 하한선을 어떻게 보고들 계시는지... 물론 다양한 의견들이

있으실 것이라 생각됩니다.

3. 제가 위에 적은 질문에 요지에 대하여 또 해 주시고 싶으신 말씀이 있다면..

적어 주실수있을까요?

4. 아... 그리고 덤으로 ^^ 저는 시스템프로그래밍을 목표로 하고 있습니다.

개인적으로 제게 도움이 될만한 조언이 있다면 부탁을 ^^

위의 질문의 내용은 길지만 답변자 분들께서 적으시기에

(이것도 쓰시기 나름이겠지만)

간단하리라 생각이 됩니다. 어투가 다소 거만스러워(^^)보이기도 하는데

절대 그렇지 않구요.. 이런 질문을 드리고 싶으나 되지도 않는 어휘력에

표현을 하자니 어찌 해야 할지를 모르겠군요..

그럼 좋은 하루 보내시기를...

ihavnoid의 이미지

저는 전기전자컴퓨터 쪽을 전공하는 대학원생입니다...
전공분야 관련상 많은 양은 아니지만 수천줄 규모의 코딩을 어느 정도는 하는 사람입니다.

'뛰어난 개발자'의 특징은, 학습능력과 문제분석능력이 뛰어나고,
그러면서도 이론에 강한 사람들이라고 생각을 합니다.

'프로그램'을 하나 만드는 과정을 생각해 봅시다.

그냥 단순히 예를 들어서, 메신저를 만든다고 생각을 합시다.
(현실적일지 모르지만) MSN을 완전히 꺾어버릴 정도의 메신저를 만들어야 한다고 생각합시다.

생각할 게 많습니다. 사용자가 어떤 모습의 프로그램을 좋아할까, 다양한 요구를 만족시키려면 어떤 식으로 만들어야 할까... 이런 '인터페이스'의 문제가 있고,
내부적으로 어떻게 구현을 하면 해킹에 튼튼하고, 서버의 경우에는 어떻게 하면 적은 수의 서버로 효율적인 처리를 할 수 있을까... 이런 것들도 생각을 해야 합니다. 때로는 여러가지 기능이 서로 상충할 때(어떤 기능을 집어넣게 되면 서버 성능이 너무나도 딸리게 되는 경우라던지, 어떤 기능을 집어넣게 되면 나중에 디버깅이 너무 힘들어서 프로젝트가 망할 것 같다는 등) 이런 것들도 다 고려를 해야 합니다.

그러려면, 일단 뭐가 좋은 것이고, 뭐가 나쁜 것이고, 어떤 기능을 컴퓨터에서 구현할 때 잘 돌아갈 것이고, 어떤 짓은 하게 되면 크나큰 문제가 생길 수 있고, 그런 것들도 생각을 할 능력이 있어야 합니다. 그리고, 모른다면 그런 것들을 즉시즉시 빠르게 습득하여 공부를 할 수 있는 기본지식과 학습능력도 있어야 합니다.

일단 메신저를 만들기로 했으니 TCP/IP를 이용해서 구현을 해야겠죠. TCP/IP의 특성에 대하여 자세히 알아야 할 것입니다. 어떤 경우에 패킷이 갈라지고, 어떤 경우에 성능이 떨어지게 될 수 있는지. 그리고 갑작스럽게 접속이 끊어졌을 때 어떻게 대응을 할 것인지. 자연스레 네트워크에 대하여 (최소한 이론은) 잘 알고 있어야 할 것입니다.

역시나 운영체제 위에서 성능에 민감하게 서버를 돌려야 하기 때문에, 운영체제가 어떻게 돌아가는지, 하드가 어떻게 돌아가는지, 모두 고려를 해야 합니다. 어떻게 프로그램을 만들면 운영체제가 원하는대로 잘 돌아가는지(여기서의 '잘'은 효율적으로 동작하는 걸 말합니다. 그냥 돌아가기만 하는 것은 어림도 없습니다), 어떤 부분이 느리다면, 그 부분을 어떻게 고칠 것인지, 나중에 서버를 만들 때 어떤 형태의 서버를 이용하면 좋을지, 여러 서버로 나누려면 값비싼 서버 하나를 이용할지, 아니면 싸구려 여러대로 분산처리를 할 것인지, 분산처리를 하려면 어떤 데이터를 얼마만큼씩 서로 통신을 해야 시스템 전체가 잘 돌아갈지...

현재 이미 있는 '라이브러리'에 대하여도 이해를 잘 해야 합니다. 어떤 DB를 이용할 것인지, GUI는 직접 만들 것인지 아니면 어떤 다른 toolkit을 선택할 것인지, 원하는 어떤 기능이 있는데 직접 만들려면 너무 힘들다, 그러면 어디서 얼마를 주고 무슨 조건으로 사와야 하는지, 등등....

그런 것들을 분석해야 합니다. 분석이 다 끝나서 어떻게 만들어야 하는지 결정이 되면, 물론 자신이 직접 할 수도 있겠지만, '뛰어난 개발자'는 그러는 것이 시간이 아깝겠죠. 그 시간에 '개발 도중 전체 시스템에서 발생하는 문제점'을 찾아다니고 해결을 해야겠죠.

'뛰어난 개발자'라고 해서 이 모든 것들을 알 수는 없겠죠.
그럴 경우에는 직접 공부를 할 능력이 있어야 할 것입니다.
그리고, 이를 효율적으로 팀 내의 나머지 사람들에게 전달을 시킬 능력이 있어야 합니다.

이런 사람은 혼자서 모든 작업을 해 낼 수 있습니다. 그렇지만 그렇게 안 하죠.
장군이 아무리 세계에서 총을 가장 잘 쏜다고 해도 장군을 최전선으로 내보내서 소총수하라 시키지 않습니다. 장군은 지휘본부 안에서 부대를 통솔해서 나머지 병사들이 효율적으로 잘 움직이도록 해야죠.

만일 지금 학생이시라면, 일단 영어로 된 컴퓨터 서적 및 문서를 별 불편없이 (한글 책 읽는 속도로) 이해를 할 수준이 되셔야 한다고 봅니다. 그래야 새로운 지식을 빠르게 습득할 수 있습니다. 안그러면 누가 번역을 해 줄때까지 허구한 날 기다려야 합니다. 그리고 그걸 정확하게 이해해서 번역할 능력이 있는 사람이 앉아서 번역을 하 고 있을까요? 그럴 시간 있으면 제품 개발에 조금이라도 더 시간을 쏟을 것입니다. 결국 새로운 정보를 받아들이는 속도가 현저하게 느려집니다.

한술 더 떠서, '읽을 사람이 별로 안 되지만, 꼭 알아야 하는 정보'는 아예 번역이 안 되기도 합니다. 어차피 번역하더라도 읽을 능력이 되는 사람이 몇 안되니깐요. 그런 정보들도 놓쳐서는 안 됩니다.

원서를 자유자재로 읽을 능력이 생긴 다음에는, XXXX 몇일 완성 그런 종류의 책보다는, 깊이있고 많은 생각을 하면서 읽어야 하는 책을 추천합니다. 해당 기술의 '구체적 사용법'에 대하여 자세히 나와있는 책들은 말 그대로 사용해서 뭘 만들 수 있는 수준만 나와있는 경우가 많습니다. 실제로 그게 어떤 식으로 동작하는지, 그렇게 하는 것이 무슨 의미가 있는지, 그런 것들은 잘 안 보입니다.

그리고, 새로운 것을 매일매일 공부할 각오를 하십시오. 학교에서야 공부를 안 하면 학점이 좀 안 나오는 게 전부겠지만, 사회에 나가서 필요할 때 공부를 안 하게 되면 짤립니다. 시간이 없다고 누가 봐주지 않습니다. 옆에 누군가가 시간이 없는 와중에도 지식을 습득했다면, 아무도 안 봐줍니다. 그냥 그 사람보다 '실력이 떨어지는 사람'으로 평가를 받게 될 수 밖에 없습니다.

아, 회사에 다니는 분이라면 어쩔 수 없지만,
현재 공부를 하는 입장이시면, 뭔가를 직접 만들고자 목표를 세우고, 그것을 만들기 위해서 어떻게 해야할까 생각을 해 보시고, 그것에 관하여 공부를 해 보시는 것도 좋을 것 같습니다.

시스템프로그래밍이라라면, 제가 생각나는대로 추천을 해 드리자면,
게임기 플랫폼을 만들어 보세요. (꼭 완성해서 잘 만들 필요는 없습니다.)
뭐 처음부터 끝까지 다 만든다는 생각보다, 있는 것들을 어떻게 조립을 하면 게임기를 만들 수 있을까 생각을 해 보세요.

플스2처럼 프로세서부터 하드웨어까지 다 만드는 것 말고, 하드웨어 및 어느 정도의 소프트웨어를 PC에서 쓰는 것으로 출발해서 생각을 해 보세요.

PC 자체가 이미 하드웨어가 다 있고, OS도 선택을 할 수 있는 여지가 많습니다.
OS를 어떻게 뜯어고쳐서 게임기용으로 개조할 수 있을지, API는 어떤 식으로 제공을 해야할지, 3D 엔진은 어떻게 할 것인지, 컨트롤러는 USB로 받을 것인지, 시리얼로 받을 것인지, 나름대로 다른 것을 이용할지, 드라이버는 어떤 식으로 만들어야 게임 사용자가 불편없이 게임을 할 수 있을지,

게임 미디어는 뭘 이용해야 할 것인지, 복사방지는 어떻게 보장을 할 것인지, 복사방지를 하는 데 다른 상용 제품을 이용한다면 그 제품은 어떻게 복사방지를 보장하고, 깨지기는 쉽지 않은지.

네트워크 플레이는 어떻게 제공할 것이며, 그러기 위해서는 어떤 방식의 인터넷 연결을 제공할지, 그리고 이더넷으로 하면 왜 어떤 칩셋을 이용해야 하는지...

...............................끝없이 고려해야 할 사항이 많습니다.............
직접 공부하면서 상상의 나래를 펼쳐보세요.
물론 '망상의 나래'가 되면 안됩니다. 하나하나의 결정이 이론적인 근거가 있어야 합니다. 간단히 말해서 하나를 결정할 때마다 공부를 다 하셔야 된다는 것입니다.

음... 나름대로 생각나는대로 써 봤습니다. 개인적인 생각입니다.

Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24