DRUNKEN KEVIN

[펌] 프로그래밍의 시작

2011.09.20 16:48

가상


[퍼오는 글]

 최근 프로그래머가 되고 싶다는 몇몇 후배들이 있어서 조언을 해주고 싶다는 생각을 하다가. 과거 내가 감명 깊고 많은 것을 알게 해주었던 선배님의 글이 생각났다. 학교 게시판을 뒤지다가 없어서, 요청을 드렸더니 흔쾌히 올려주셨다. 프로그래머를 꿈꾸는 많은 사람들이 이 글을 보았으면 좋겠다.


아래는 선배님이 학교 게시판에 올려주신 전문이다. 학교 게시판이 외부에 비공개라 퍼왔다. (몇몇 와닿는 문장을 굵게 표시해봤다.)


[원본]

안녕하세요. 이글을 쓴지 벌써 2년이 넘어가는군요.. 
노하우 게시판에 있었는데, 이 글도 같이 사라졌습니다. 안타깝네요.
이 글을 광게에 올리라는 몇몇 분들의 요청이 있었는데, 어떡할까 하다가 최근 졸업생의 요청도 있고해서 광게에 올리게 되었습니다.
요즘 이슈인 스마트 폰 앱들이라든가 최신 기술들에 대한 내용은 없습니다만, 프로그래밍을 하고 싶은데 어떻게 해야 하는지 모를 후배님들을 위해 글을 남깁니다.
사실 계획한게 많았습니다. 글쓰기 노하우, 발표 노하우, 컴퓨터 네크워크 프로그래밍 노하우 등등.. 컴퓨터 네트워크 프로그래밍 노하우는 노하우 게시판에 4화까지 연재하다 그만두었지만.. 
언젠가 다시 시작 해 보려고 합니다.
아래는 원문입니다. 원문에는 신뢰성을 위해 제 이력을 남겼습니다만, 그냥 개발자 10년차라고만 소개하겠습니다.
실력자 분들께서는 볼 필요 없습니다.^^


=====================================================================================
이 글은 다음과 같은 독자를 대상으로 썼습니다. 기준은 일단 C/C++ 로 정했습니다.
- 2학년 이상이거나, 프로그래밍 문법을 대충 아는 학생

- 프로그래밍 입문으로 문법은 대충 땠으나 그 이상으로 실력이 늘지 않는 학생

- 두꺼운 프로그래밍 언어 책을 이번 방학에 한권 독파하려고 마음먹은 학생

- 의욕은 있으나, 뭘 해야할지 감을 못 잡는 학생


저의 짧은 경험이나마 여러분에게 도움이 되었으면 하는 바램으로 글을 남기니, 필요없으시면 버리시고, 달다 느끼시면 자기것으로 만드시기 바랍니다.
먼저, 처음 프로그래밍 입문에 들어가시면 문법이라는 것을 배웁니다. 프로그래밍 언어도 영어/일본어와 같은 언어 이기 때문에, 기초 문법이 중요합니다.
이러한 문법이라는 것을 배우기 위해 한 학기 동안 학교에서 배우고, 그것도 부족해 학원을 다닙니다.
새로운 언어를 공부하기 위해 두꺼운 책 한권을 사놓고 2개월 동안 독파하려는 사람도 있습니다.
하지만.. 얼마 안 있어 엄청나게 많은 분량에 책 몇장 안 읽고 포기하게 됩니다.
오기로 끝까지 보는 사람 여럿 봤습니다만, 제 생각에는 엄청난 시간 낭비입니다.

IT분야는 끊임없이 공부해야 살아남는 곳 입니다. 그 양이 어마어마 합니다.
그러기 위해선 요령있게 시간을 단축하며 익히는 방법을 찾아야 합니다. 

프로그래밍의 중요성을 위해 먼저 학점에 관한 이야기를 해보겠습니다.
컴퓨터 소프트웨어학과 학생들의 예를 들자면(제가 이쪽이다 보니 타과 분들은 이해부탁드립니다.), 1학년에 C 프로그래밍에 대한 기본 문법을 공부합니다. 
그리고 실습이 들어가면서 갑자기 학생들 간 학점의 갭이 발생합니다. 이 갭의 이유는 바로 프로그래밍 때문입니다. 
기초 문법만 알려주다가 갑자기 프로젝트를 하라고 하니, 가슴이 답답하고 조원 얼굴보니 한숨만 쉬고, 서로 미루고 있는 자기 자신의 모습을 발견하게 됩니다.
2학년 때는 그 갭이 조금씩 벌어지다가 3학년에 올라가면서 그 차이는 크게 벌어집니다.
실습 뿐만 아니라 O/S 수업과 같은 이론에서도 가상 메모리 구현, 파일 시스템 구현 등 프로그래밍 능력을 요구하기 때문에 이를 등한시 한 학생들은 A0 이상 받기가 힘들어집니다.
여기서 실습 프로젝트에서 살아남는 학생들은 다음과 같은 조건이 필요합니다.

"프로그래밍을 잘 하는 학생이 조원 중에 한 명이라도 있는 경우"

그렇습니다. 한 명만 있으면 그래도 성공의 조건이 됩니다.
이 순간 눈에 보이지 않는 계급이 생기면서 주변 조원은 들러리가 됩니다. 여기서의 주변 조원들은 두 가지 타입이 있습니다. 
잘 하는 학생의 지식을 최대한 얻기 위해 프로젝트에 참여하여 노력하는 사람 

혹은 

학점만 잘 받으면 된다고 생각하며 밥 사기, 같이 밤 새기 등으로 헌신하는 사람 입니다.
전자의 경우는 다음 학기에 자기 자신이 조원을 이끌고 있는 모습을 발견하게 될 겁니다. 조원 모두가 경험이 없는 학생들인 경우는 서로 협력하여 성공적으로 프로젝트를 완수할 때가 종종 있습니다.
이 경우, 서로간 실력이 비슷하니 계급이 없어지고 서로 열심히 하려는 의지가 실력을 압도합니다.

이것은 정말 하늘에 별따기 만큼 어렵습니다. 

학생들은 불만을 가집니다. 
'기초 문법 조금 알려주고, 실습 시간에도 제대로 알려주는 것도 없으면서, 프로젝트를 하라니 무책임한거 아니냐'고 말이죠.
네, 맞습니다. 무책임 하다고 할 수 있습니다. 하지만, 제 경험상 이런건 백날 알려줘도 소용이 없습니다.

내용이 방대하여 학기 중에 모든 것을 가르쳐 주기란 불가능하며, 개발은 응용이기 때문에 경우의 수가 너무 많기 때문입니다.
메신저 만들 때의 필요 기술이 다르고, 게임 만들때 필요한 기술이 다르다는 겁니다. 그렇기 때문에, 여러분은 프로그래밍 감각을 익히기 위한 경험을 쌓아야 합니다.
제가 실무경력을 쌓으면서 미루어 보건데 프로그래밍의 실력은 "프로그래밍 경험의 양" 입니다. 불만 갖지 마시고, 경험을 쌓기 위한 노력을 해야 합니다.
이러한 공부 방법을 알기 위해 유명한 소프트웨어 개발 학원들이 어떤식으로 진행하는지 한번 살펴보겠습니다. 
여러분이 과연 이렇게 공부한 비전공자 학생들을 이길 수 있는지 곰곰히 생각해 보십시오. 

- 오전 9시에 가서 저녁 9시~12시까지 강의 및 개발

- 매일 방대한 양의 과제

- 일정 기간이 지나면, 강사가 멘토가 되어 프로젝트를 진행

- 전체 과정은 300~500만원 6개월 마스터

- 수료하면 개발 업체를 알선


제가 경험하면서 사용된 방법이 여기서도 그대로 사용되고 있었습니다.

주요 내용은 "강사가 멘토가 되어 프로젝트를 진행" 한다는 겁니다.
제가 제시하는 프로그래밍 방법론은 다음과 같습니다.

윈도우 프로그래밍이든 뭐든 본인에게 흥미로운 주제의 프로그램을 찾습니다.
예를 들어, 저 같은 경우 학부 때 영어공부를 하는데 '받아쓰기'가 효율적이라는 이야기를 들었습니다.

그래서 찍찍이를 사다가 한문장씩 들어가면서 받아쓰기를 하는데 여간 귀찮은게 아니었습니다.
만약, mp3와 같은 영어 음성 파일을 입력했을 때, 자동으로 문장을 잘라서 받아쓰기할 수 있는 프로그램이 있으면 매우 좋겠다 싶었습니다.
일단 그런 프로그램이 있는지 찾아봤습니다. 그 때가 2003년 정도 되었는데, 비슷한 의도의 프로그램은 있었으나 2%도 아니고 40%는 부족했습니다. 그래서 이러한 프로그램을 만들기 시작했습니다.이 밖에 자신이 동경하는 프로그램 중에 하나를 벤치마킹하여 만들 수도 있습니다.
넷마블의 테트리스 라든가, 지뢰찾기 라든가, 네이트 온이라든가 뭐든지 대상이 될 수 있습니다. 여기서 가장 중요한 것은 어렵고 쉽고가 아니라 개발하고자 하는 프로그램에 애착을 가장 많이 줄 수 있는 것이어야 합니다.
그 이유는 개인 프로젝트 이기 때문에, 애착이 없으면 중간에 쉽게 포기하기 때문입니다. 이러한 아이템을 잡았으면, 이것을 개발하기 위한 방법을 찾습니다.
이를 위해선 조언자가 필요합니다. 윈도우 프로그래밍이라면 www.devpia.com를 가십시오.
거기 Q/A에서 검색하시면 아마 여러분이 생각하시는 프로그램을 만들기 위한 팁을 줄 겁니다.

예를들어 "MSN 메신저에서 버튼의 이러한 효과는 어떻게 만드나요?" 등과 같은 질문이 있을 수 있습니다.
가장 좋은 방법은 주변에 경력있는 개발자에게 물어보는 겁니다.

모든 사람은 주변에서 아는 사람을 통해 네/다섯 다리를 거치면 모든 사람을 다 알 수 있다고 합니다.
학교니까 선배들도 있고 대학원 생도 있을 겁니다. 

저 같은 경우에는 생판 모르는 학생이 조언을 얻기 위해 찾아와 다른 연구실을 돌다가 저를 추천해서 왔다고 하는 학생도 있었습니다. 
이런식으로 다음과 같은 질문을 해서 답을 얻어 냅니다.

"내가 이런 이런 프로그램을 만들려고 하는데, 어떤 걸 공부하면 되는가?" 입니다.

그래서 요소 기술들을 조사합니다. 그리고 책에서 그 부분만 찾아서 보면 됩니다.
예를 들어 MFC 개발시에 리스트 컨트롤, 에디트 컨트롤, 콤보 박스,... (컨트롤만 20가지가 넘고..) 등을 다 하는 것이 아니라, 내 프로그램에 필요한건 에디트 컨트롤, 리스트 컨트롤이면 이것만 찾아서 갖다 쓰는 겁니다.(다양한 샘플이 있을 겁니다.)
여기서 여러분이 실수(?)하는 것이 있습니다. 이것을 완전히 이해하려고 하는 것 입니다.

제가 추천하는 방법은 일단 갖다 쓰는 법을 익히라는 겁니다.
이 주장에 대해서는 정말 의견이 분분한데, 저의 경험이 이랬으니 참고하시기 바랍니다.

갖다 쓰는 법이라 함은
이 기능을 위해 이러한 코드를 이렇게 저렇게 해서 수정하여 옮기니 되더라.

라는 수준 입니다. 
사실 윈도우 메시지가 어떤 콜백함수를 호출하고 이것이 어떤 오버라이딩 함수를 호출하고 윈도우핸들이

어떻고 하는건 지금 굳이 이해할 필요가 없다는 이야기 입니다.
이것은 어차피 디버깅을 하고 이와 비슷한 코딩 작업을 계속 하다 보면 감각이 생깁니다.

여기서 중요한 여러분의 목표는 내가 설정한 목표를 최대한 빠르게 도달하기 위함 입니다.
빠르게 하지 못하면, 재미가 떨어집니다. 의욕이 상실됩니다. 결국엔 안하게 됩니다.

계속 선배와 후배, 웹에서 도움을 얻어가며 프로젝트를 완성함으로써 얻을 수 있는 가장 중요한 것이 있습니다.
그건 바로 '성취감' 입니다. 

다 만들어진 프로그램을 친구들에게 자랑하십시오.
상용 프로그램만큼 UI가 좋다면 누구에게나 자랑해도 됩니다만,

기능 중심이라면, 전공자 친구들에게만 자랑하십시오.
UI가 별로 안 좋으면, 비전공자들은 그것의 위대함(?)을 모르기 때문에 칭찬이 인색합니다.

그러면 성취감도 별로 높지 않습니다. 전공자들은 압니다. 그것이 얼마나 고생을 해야 얻을 수 있는 것인지. 그래서 많은 성취감을 느껴야 됩니다. 다음 프로젝트도 즐겁게 할 수 있도록. 
어떤 학문은 안 그렇겠습니까만은 프로그래밍은 새로운 것을 개발하는것이 기본이 되기 때문에 인내와 고통이 따릅니다. 이를 극복하기 위해선 '성취감'이라는 보상이 필요합니다.

게임을 할 때 폐인이 되는 이유가 뭐라고 생각하시나요?
저는 바로 마약과도 같은 성취감 때문이라고 생각합니다.

레어 아이템을 내뱉는 몬스터를 백번, 천번, 만번 죽여 얻었을 때 얻는 그 희열,쾌감,성취감.. 그것에 사람은 도전합니다.
이것은 모든 곳에 적용됩니다. 프로그래밍도 게임만큼 즐거움을 얻을 수 있습니다.

이러한 성취감이 따라오면 계속 개발하고 싶어지고 경험이 늘어나게 됩니다.

인간은 너무 게을러 시작 자체가 힘들 수도 있습니다. 
이성은 해야 한다는 것을 알고 있지만, 감성적으로는 마음이 가지 않을 겁니다.

우리 뇌에는 의욕을 북돋아 주는 측좌핵이라는 부위가 있다고 합니다. 
이곳이 자극 받으면 하고 싶은 마음이 생긴다고 하네요.

만일 이 부위를 빗으로 두들기면 우리는 필요할 때 얼마든지 하고 싶은 것을 할 테지만, 이 측좌핵은 뇌 속 깊숙한 곳에 자리잡고 있어 물리적으로 자극을 줄 수 없다고 합니다.

방법은 하나, 무엇인가를 하고 있는 사이에 이곳을 자극하게 되고 스스로 흥분하게 되어 집중력도 높아지고 의욕도 높아진다고 합니다.
그 시간은 약 15분에서 20분정도가 소요됩니다.

제 후배 중에 수석을 한 친구가 있는데 그 친구가 말하기를,
도서관에가서 공부를 하는데 집중이 안될때가 있다. 그 때, 내용이 눈에 들어올때까지

처음 페이지를 약 15분까지 계속 반복해서 읽는다 라고 합니다.
그러다 어느 순간이 오면 공부에 집중하고 있더라 라는 겁니다. 이것이 바로 측좌핵이 하는 일 입니다.

그래서 시작이 반이라고 하는 모양입니다.
프로그래밍 공부 방법 요약[농담도 섞여 있으니, 요점만 보시기 바랍니다.]


do

1. 자신이 개발하고 싶고 애착이 가장많이 갈 프로그램 아이템을 찾는다.

2. 이것을 개발하기 위해 공부해야 할 기술들을 정리하고 기간을 정한다.

[이를 위해 선후배, 웹 등을 최대한 활용한다.]

3. 다 만들어졌을 때, 자랑할 즐거움을 상상하며 포기하지 말고 프로그램을 만든다.

4. 적당한 선에서 개발을 완료하고(너무 완벽한 프로그램을 만들기 위해 

엄청난 버그를 다 잡을 생각하지 말라. 그러면 개발 기간 100년이다.), 

주변 사람들 중 칭찬 줄 사람들에게만 자랑한다.

while ( 1 )


p.s : 이 글을 쓰기 전에 제 후배들에게 말 했더니 다들 쓰지 말라고 합니다.

댓글에 대한 상처만 입을 수도 있다고 말이죠. 
별것도 아닌 이야기를 대단한 것인 마냥 썼다고 비웃는 분들도 계실 겁니다.

하지만 제가 많은 학생들과 상담을 하면서 느낀것은 이렇게 별것(?)도 아닌것도 모르는 학생이 많다는 것을 아셨으면 좋겠습니다.

이 글을 보고 어떤 한 학생이라도 마음이 움직여 자기개발에 도움이 된다면 저는 정말 고맙겠습니다.
================================================================================

다시 올리려니 참 두렵군요. 아주 약간 첨부한 부분이 있습니다.
요즘 대학생들이 대기업에 취직 인생을 맞추다 보니, 
전공을 소홀히 하고 공학 인증 포기하고 영어와 SSAT만을 준비하는 학생들이 많습니다. 
저는 이 모습들이 너무 안타깝습니다. 

언제가는 최근 동향에 따라 대처해야 하는 자세에 대해 저의 의견(?)도 올려보겠습니다.