C프로그래밍 공부하는 초보 대학생인데 프로그래밍 고수분들께 물어봅니다.
cartes대학교 컴퓨터과학(computer science)과 1학년과정을 공부하는중인 초보 학생입니다.
질문1. 간단한 코드덩어리 패턴을 많이 쳐봐서 외워서 잘써먹는것이 과연 프로그래밍 잘하는것인가? 프로그래밍하는것을 배우는것이 원래 많은 코드패턴들, 숙어구들에 익숙해지고 외우게되는것일까요?
예를들면, 배열에 들어있는 값들의 최대값구하기 같은것들.
/*
for(i=0; i 알려진 알고리즘들을 키보드로 많이 쳐봐서 외우게되어 잘써먹는것이 프로그래밍을 잘하는것일까요? 아니면 알려진 해결법(알고리즘)을 모르는상태에서 혼자서 해결법을 잘 찾아낼수있는것이 프로그래밍을 잘한다고 할수있는것일까요? 질문2. 지금 연습하고 있는게 알려진 패턴들을 손에 익히려고 자꾸 비슷한류의 코드들을 쳐보고 구현하고 있습니다. 책을 읽고 코드를 본 후에 바로 응용 프로그래밍문제들을 푸는것이 쉽지않아서, 머리에 떠오르는 것들을 바로바로 코드로 컴퓨터에 치는 연습을 합니다.
제방법이 잘하고 있는 걸까요? 질문3. 다른분들은 프로그래밍의 어떤점에 재미를 느끼시나요?
알고리즘이나 자료 구조의 구현은 상당히 저수준(low-level)의 작업이라고 생각합니다. 이런 걸 굳이 외워서 할 필요가 있을까요? 대개는 이미 구현된 것을 사용하게 될텐데요. 만약 필요하다면 그때그때 인터넷이나 책을 찾아보면 되겠죠. (구글 만세!)
낮은 부분을 만드는 것이 아주 재미 없는 일은 아니지만, 저는 그것보다는 어떤 체계(시스템)를 만들고 그것이 잘 작동하는 것을 보는 게 가장 재미있습니다. 물론 그 '체계'는 웹 사이트가 될 수도 있고, 데스크탑 애플리케이션, 운영체제(!)던 간에 뭐든지 될 수 있을 것입니다.
아무튼 세부적인 구현보다는 구조를 볼 수 있는 넓은 시야를 가지는 게 좋다고 생각합니다. (어쩌면 C를 쓰기 때문에 그런 것일수도 있겠네요. 예제 코드가 잘려서 잘 모르겠지만, 파이썬에서는
max함수를 쓰면 단번에 해결됩니다.)추가: 글을 대충 읽었더니 딴소리를 해버렸네요. 알아서 이해해주셔요.
고수는 아니지만, 1번 항목에 대한 답변만 해보겠습니다.
스스로 해결법을 찾아내는 것도 중요하고, 선인들의 해결법을 배우는 것도 중요한 것 같습니다. 수학이랑 비슷한 것 같습니다. 페르마도 정수론부터 새로 만들지는 않았겠지요? 바퀴를 두번 발명할 필요는 없습니다. 다만, 가져다 쓰면서 이게 왜 굴러가는지는 알아야 할 것 같습니다. 반대로, 바퀴 기능을 하는게 없으면 만들어낼 능력도 있어야 할 것 같습니다.
선인들의 지혜를 많이 알아서 나쁠 것은 없습니다. 예를 들어, 한 점이 삼각형 내부에 들어가는지 판별하고자 할 때에, 중고등학교 수학으로도 머릴 굴리면 해결은 가능하지만, 선형대수의 외적을 배웠으면 훨씬 쉽고 빠르게 해결되니깐요. (코드도 빠르고..)
요즘, 학교에서 Problem Solving에 관련된 과목을 듣고 있는데, 과제로 ACM문제들이 매주 2개씩 나오는데요. "아.. 신발.. 많이 아는 놈이 장땡이구나." 하는 생각도 듭니다. -_-;;; 저는 한 문제에 하루 걸리는데, 비슷한 걸 공부했던 사람들은 30분만에도 풀더라고요.
일단 문제의 패턴을 알고 적용하는 것은 프로그래밍을 할때 매우 중요한 일입니다. 설계든 구현이든 만들려고 하는 대상이 무엇인지 인지하고 부터 시작합니다. 하지만 이것을 "외운다"라고 할 수는 없을 것 같습니다. 많은 문제를 풀다보면 자연스럽게 "느낀다"라고 해야할까요? 잘못된 코딩을 하게될 때 본능적으로(?) 손가락이 움직이지 않습니다. 하지만 이 느낌도 어쨌든 지식과 경험의 산물이기때문에 꾸준히 지식과 경험습득을 위한 노력을 해야겠지요.
패턴을 익히는데 가장 좋은 방법은 꾸준히 문제를 "풀어"보는 것입니다. 당연히 답안지를 보는 것은 그리 좋은 방법이 아닙니다. 왜냐하면 "내가 문제를 어떻게 해석하는가"라는 것이 바로 내가 문제를 푸는 "패턴"이기 때문입니다. 남이 풀어놓은 것을 가져다 쓴다면 "지식"은 늘겠지만 "경험"은 늘지 않습니다. 스스로가 어느정도 능력을 가졌는지 깨닫게 되면 앞으로 발전하기가 더 쉽다고 생각합니다.
저같은 경우는 "프로그래밍"자체에도 재미를 느끼지만, "새로운 분야"를 공부하는 것을 더 좋아하고, 이 공부보다는 "마음맞는 사람들과 대화"를 하는 것을 더 좋아합니다. 물론 주제는 프로그래밍 관련된 이야기구요. 세상에서 가장 재밌는 일은 사람과의 관계이고 세상에서 가장 힘든 일도 사람과의 관계더군요.
많은 패턴들을 자유자재로 활용하는것. 이것이 프로그래밍 잘하기 의 기본 열쇠라고 생각합니다.
그 패턴들이라는것은 이미 개발된, 잘 알려진 알고리즘들과 프레임워크들의 서고들입니다.
그러니까 그런 서고들을 누가 더 많이 알고있는가에 따라서 승/패가 오고가지요.
한편 그런 서고들을 자유자재로 활용하자면 프로그래밍을 시작할 때 의문점들을 제힘으로 풀어나가본 경험이 많은 이들은 서고를 잘 파악하고 아주 재치있게 활용합니다.
그러니 배우는 첫 단계에서는 자기 힘으로 많이 해보는것이 너무 중요해요.
그리고 실제 응용측면에 놓여있다면 그 때는 세계적인 유명코드들을 찾아보고 조립하는 기술이죠. 바로 그 때 자기힘으로 많이 해본것이 너무 큰 힘을 발휘합니다.
프로그래밍은 레고 조립과 비슷한 것 같습니다. 특정한 구조물을 만드는데 어떤 블록을 사용하는게 더 좋을지 미리 알고 있다면 더 빨리 만들 수 있겠죠. 그 블록이 있는지몰랐다면, 다른 블록으로 그블록을 비슷하게 만들다보면 조금 느릴 수도 있겠구요. 필요할 것 같은 부품들을 먼저 만들어 놓고 나서 조립은 나중에 할 수도 있겠죠. ^^; 아마도 레고 블럭 만드는사람보고 레고 조립 잘한다고 하진 않을꺼라고 생각합니다. ^^;
ps. 아마도 레고를 계속 조립하게 되는 이유는... 꿈꾸던 그것이 실체화 되었을때의 성취감이랄까.. 아침해를 보며 두다리 쭉뻗고 잘 때의 그맛? ㅎㅎ (그리고 레고 블럭까지 직접 만들다보면 조립에 흥미를 잃게 되기도하죠. ^^;)