기타/컴퓨터공학

실력향상의 길

바로이순간 2020. 2. 10. 06:35

실력향상의 길

############

어떻게 하면 프로그래머로서의 능력을 개발할 수 있는가에 대해

필자가 평소에 생각하고 있던 것을 한번 적어 보기로 하겠다.


우선 프로그래머들은 머리를 쓰는 활동을 좋아하는것 같다.

어려운 문제를 풀기를 좋아하고 또 풀지 못했을 때에는 자존심에

상처를 입는다. 꼭 이문제를 풀고야 말리라는 오기를 보인다.

잘 포기하는 사람은 프로그래머가 되기에는 적당하다고 보기힘들다.

끈기와 오기를 발휘해서 무언가를 이루어 낸 사람들은 그것이

무엇이었건 간에 프로그래머로서의 자질을 가지고 있다고 생각된다.


조각맞춤 퍼즐을 좋아하는 사람들은 프로그래머의 자질을 가지고

있을 가능성이 많다. 1000쪽 자리 퍼즐을 완성시켜본 사람들은

가능성이 조금 더 크다고 볼 수 있다.


지뢰찾기 게임을 좋아하는 사람들은 프로그래머의 자질을 가지고

있을 가능성이 많다. 지뢰표시를 하지않고 고급을 풀수 있으면

그 가능성이 조금 더 크다고 볼 수 있다.


푸시푸시 게임를 좋아하는 사람들은 프로그래머의 자질을 가지고

있을 가능성이 많다. 어려운 문제를 만나면 며칠 씩 시간을 보내고

기어이 풀어내고 마는 사람들은 그 가능성이 더 크다고 볼 수 있다.


소마큐브를 아는가? 소마큐브를 모른 다면 한번 인터넷으로 찾아

보도록 하자. 소마큐브에 관심를 가지고 실제로 제작해서 문제를

풀어 본 사람은 프로그래머의 자질을 가지고 있을 가능성이 많다.


탱그램을 아는가? 탱그램은 시중에서 쉽게 구할 수 있다. 탱그램에

관심을 가지고 놀고 또 시간을 많이 투자한 사람은 프로그래머의

자질을 가지고 있을 가능성이 많다.


보통 머리를 쓰는 사람들이 좋아하는 문제는 해결책이 여러가지가

있는 경우가 많다. 그러한 문제가 더 흥미가 있기 때문이다.

해결책이 하나만 있는 문제는 흥미가 덜한 경우가 보통이다.

물론 예외는 항상 있는 법이니까 너무 속단해서는 안될 것이다.



하노이탑과 순환호출(재귀호출)

#######################

재귀호출 또는 순환호출은 초보프로그래머가 부딛치는 심각한 벽 중의

하나이다 재귀호출은 아주 이해하기 어려운 놈이다. 옛날에는 프로그래

밍언어 자체가 재귀호출을 지원하지 않는 언어가 있었다. 그 시절에

프로그램을 처음 시작한 필자는 이 재귀호출을 이해하기 위하여 많은

시간을 보냈다.


이 재귀호출을 제대로 이해하고 구사하기 위해서는 많은 훈련을 쌓아야

하지만 어떤 훈련을 쌓아야 하는지는 알려져 있지 않다. 하지만 그동안

의 경험에 의하면 이 하노이탑 문제야 말로 재귀호출을 이해하는데

필요한 핵심적인 구조를 내포하고 있다고 여겨진다.


그래서 하노이탑 문제에 대한 해법에 매우 익숙해 질 필요가 있는 것

이다. 자동적으로 하노이탑 문제를 풀 수 있게 되면 머리와 몸으로

재귀호출을 구현하고 있는 셈이 되는 것이다. 충분히 하노이 탑에

대한 해법이 몸에 익고 나서 프로그램을 작성해 본다면 프로그램을

쉽게 작성할 수 있게 되리라 본다.


만약 프로그램 작성이 어렵다면 프로그램을 보고서 이해하도록 노력

하는 수 밖에 없다. 처음부터 프로그램을 짤 수 없다고 해서 결코

부끄러워 할 필요는 없다. 어떤 사람에게는 몇년의 시간이 필요한

경우도 있으니까 한 3개월 내지 6개월 정도 프로그래밍을 하고 나서

재귀호출을 이용한 프로그램을 작성할 수 없다고 기죽을 필요가 없다

고 할 수 있다.


여러가지 책에서 하노이탑을 푸는 프로그램을 찾을 수 있을 것이다.

이 프로그램을 이해하도록 노력해 본다. 다음에 기회가 있다면 하노이

탑 프로그램을 이해하기 위한 글을 쓸 수 있을 것이다.



초보자가 공부하는 법

##################

프로그래밍을 할수 있는 능력을 키우는 것은 공부라고 하면 안될 것 같습니다. 


굳이 비유를 해서 이야기 하자면 자전거 타기를 들수 있습니다. 자전거를 잘탈 수 

있기 위해서 공부를 한다고 하면 모두 웃을것입니다. 처음 자전거를 타고 넘어지지 

않고 갈수 있을 때 까지 누군가가 잡아주고 또 넘어지고 다치기도 하고, 이러한 

과정을 거쳐서 갑자기 스스로 쓰러 지지 않고 탈 수 있게 됩니다. 


스스로 탈 수 있다고 해서 잘탈 수 있게 된 것은 아닙니다. 한참 재미를 붙여서 

타고 타고 또 타고 해야만 자전거를 잘 탈수 있게 될 것입니다. 많이 안다고 해서 

자전거를 잘 탈수 있는 것은 아닙니다. 


프로그래밍을 잘할 수 있게 된다는 것과 C언어에 대해서 능숙하게 된다는 것 사이에는 

아주 복잡한 상관관계가 있습니다. 언어를 잘안다고해서 프로그램을 잘짠다고 할수가 

없습니다. 처음에는 언어에 대해서 너무 많이 알고 있는 것이 방해가 될수도 있습니다. 


다른 예를 들어 보겠습니다. 처음에 말을 배우는 아이들은 그냥 말을 사용합니다. 

단어를 많이 아는 것도 아니고 문법을 아는 것도 아닙니다. 그러다가 조금씩 단어도 

늘어가고 사용법에 대해서도 익혀갑니다. 어법이 맞는지 틀리는지도 점차로 배워갑니다. 

아주 나중에야 문법에 대해서 배우게 됩니다. 말을 하는데 있어서 단어를 많이 알아야 

한다, 문법을 알아야 한다. 이것이 꼭 필요한 것은 아니라는 것을 알수가 있습니다. 


그러나 말을 잘할 수 있기 위해서는 단어도 많이 알아야 하고 문법도 잘알고 그래야 

겠지요. 그렇다고 해서 남을 감동시키는 말을 할 수 있다는 보장이 있는 건 물론 아닙니다. 

조리있게 말을 할수있다는 보장이 있는 것도 아닙니다. 이런것들과 말을 잘할 수 있다는

것은 분명히 다르다는 것을 알수 있습니다. 


저는 이런관점에서 어린아이들이 말을 배워나가는 것과 비슷하게 프로그래밍을 배워나가야 

한다고 생각하고 있습니다. 초보과정에서 필요한 만큼만 언어에 대해서 배우고는 프로그램을 

짜보아야 합니다. 자전거타기와 마찬가지라고 생각할 수 있습니다. 처음에는 잘 안됩니다. 

그러니까 누군가가 잡아주었으면 하고 바랍니다. 그러나 남이 항상 잡아 주어야 자전거를 

탈 수 있다면 그사람은 혼자서 자전거를 탈수 있게 되기 어려울 것입니다. 

고집과 근성 꼭 풀고 말겠다는 오기가 가장 필요한 것입니다. 굳은 의지가 필요한 것이 

아니라, 음.. 니가 이기나 내가 이기나 한번 해보자는 승부근성이 필요한 것입니다. 


C프로그래밍 게시판에 가서보면 프로그램과제들과 과제를 풀기 위해서 필요한 C언어의 문법이나 

구성요소들에 대한 설명이 간단히 나와 있습니다. 여기나와 있는 과제들은 10여년의 임상실험

(실제 교육과정에서)을 통해서 그 효과가 입증된 문제들입니다. 비록 이것이 최상의 문제들

이라고 생각하기는 어렵겠지만, 필자가 생각할 때 실력이 늘어가는데 필요한 징검돌들을 효과적

으로 배치하여 스스로 풀어 나갈 수 있도록 짜맞춘 그러한 과제들입니다. 


풀어가다가 어려운점이 있으면 질문,답변을 통해서 도움을 받을 수도 있을 것입니다. 하지만 

스스로 도저히 길이 더이상 없다고 생각될 때까지 노력을 한 후에,,그래도 길이 안보일 때 

그럴때 도움을 청하는 자세를 가져야 한다고 생각합니다. 




쉬운 길(王道)이 있는가?

######################

실력향상의 길에 쉬운길 혹은 왕도가 있는지 찾는 사람들이 많다.

필자는 어릴때 부터 수십년 동안 쉬운길을 찾아 왔다. 그리고 결론을

내린것이 있다.


쉬운길은 없다.


만약 쉬운 길이 있다면 모두 그길을 갔을 것이고 그렇게해서 얻어진

능력이나 실력은 모두가 평범하다고 느끼는 것이 될 것이다.

"남과 다른 구별이 되는 실력은 결코 쉽게 얻어지지 않는다"는 것이다.

이것은 세월이 흘러가도 변하지 않고 남아있는 법칙이리라 생각한다.


건강한 육체를 가지기 위해서는 타고난 건강도 중요하지만 건강한

생활습관이 매우 중요하다. 이점에 대해서 의문을 가지고 있는 사람

은 없으리라 본다. 마찬가지로 실력을 가진 사람이 되기 위해서는

타고난 자질도 중요하지만 실력있는 사람이 되기위한 습관이 중요

하다고 생각한다.


실력향상의 길에 대한 책을 읽어보고 읽어보아도 강조하는 것은 바로

이 '습관을 바꾼다'는 것에 있다. 물론 효과적인 습관이나 생각하는

방법이 있다. 이러한 습관이나 방법들은 짧은 시간에 작은 노력을

들여서 바꾸거나 얻을 수 있는 것들이 아니다. 그렇기 때문데 실력

향상을 도와준다는 책을 읽고나면 허망해 지는 것이다. 좀 쉬운 길이

있는가 싶어 읽어 보니까, 쉬운길이 없다는 사실을 다시 한번 이야기

해주는 것을 보기 때문이다.


이정도로 서론을 이야기했으니까 그래도 필자가 체득한 생각하는

방법, 문제를 해결하는 방법에 대한 이야기를 하고자 한다.

이어지는 글들에서 하나씩 그 방법들을 알아보기로 하자.



상상력의 중요함

#################


문제를 이해하고 푸는데 있어서 처음부터 모든 부분을 자세히 잘 이해하기는 

어려운것이 보통이다.


이때 가장 요구되는 것이 상상력이다. 여기서 이야기 하는 상상력이란 그냥 

마음내키는 대로 생각한다는 뜻이 아니다. 자기가 잘 이해하지 못하고 있는 

부분을 자기 나름대로 가정하고 이러 이러하게 되어 있으리라고 생각하고 

전체를 이해하기 위한 과정으로 가는 것을 의미한다.


물론 자기가 나름대로 가정한 부분에 대해서 항상 제대로된 가정이었는지 

평가하고 수정할 준비가 되어있어야 하겠다.


이와 같은 지적 상상력이 부족하다면 문제를 이해하는데 걸리는 시간이 10배로 

불어 날수도 있다. 이경우에도 문제를 이해하기 위해서 문제를 바라보는 높이

[혹은 거리]를 높였다가 낮추었다가 할 필요가 있다.


자세히 보기위해서는 가까이 가서 보아야 하고 전체의 모양을 보기위해서는 

멀리서 보는 편이 낫다. 때로는 위에서 보아야 할수도 있으며, 때로는 아래에서 

보아야 할때도 있고, 때로는 내부에서 보아야 한다.


이와 같이 문제를 바라보는 시점[곳]과 시야[각도] 그리고 거리를 달리 해봄

으로써 문제에 대한 전체적인 이해를 할수 있으리라고 본다.

 



시작이 반

#############

우리속담에 시작이 반이라는 말이 있다.


여러가지 경우에 이 속담을 사용할수 있지만 프로그래밍을 하는데

있어서 다음과 같이 해석을 해볼수 있다고 본다.


우선 초보자들이 흔히 범하는 실수가 너무 자기의 능력에 넘치는

부분까지도 한꺼번에 해결할려고 하는것이다.

지금 A가 어떻게 되는지도 모르면서 A+B를 할려고 시도하는 것이다.

이경우 옆에서 보고 있노라면 이런 생각이 든다.


왜 A를 먼저 해보지 않는 것일까?

A를 잘할수 있고나서 A+B를 시도해야 옳지 않을까 하는 생각말이다.


프로그램은 단번에 완성되는 것이 아니다.

여러단계에 걸쳐서 만들어지는 것이 보통이다.

그렇다면 초벌구이에 해당하는 프로그램이 있을수 있다.

초벌구이가 너무 어렵다면 초벌구이의 초벌구이에 해당하는

프로그램도 있을것이다.



풀만한 가치가 있는 문제는 저항함으로써 그 가치를 입증한다.

#################################################

우리속담에 시작이 반이라는 말이 있다.


여러가지 경우에 이 속담을 사용할수 있지만 프로그래밍을 하는데

있어서 다음과 같이 해석을 해볼수 있다고 본다.


우선 초보자들이 흔히 범하는 실수가 너무 자기의 능력에 넘치는

부분까지도 한꺼번에 해결할려고 하는것이다.

지금 A가 어떻게 되는지도 모르면서 A+B를 할려고 시도하는 것이다.

이경우 옆에서 보고 있노라면 이런 생각이 든다.


왜 A를 먼저 해보지 않는 것일까?

A를 잘할수 있고나서 A+B를 시도해야 옳지 않을까 하는 생각말이다.


프로그램은 단번에 완성되는 것이 아니다.

여러단계에 걸쳐서 만들어지는 것이 보통이다.

그렇다면 초벌구이에 해당하는 프로그램이 있을수 있다.

초벌구이가 너무 어렵다면 초벌구이의 초벌구이에 해당하는

프로그램도 있을것이다.



거거거중지(去去去中知) 행행행리각(行行行裏覺)

#########################################

가고 가고 가는 가운데 알게되고

행하고 행하고 행하다 보니 깨닫게 된다.

------------------------------------------------

실력이란 그렇게 쉽게 늘지 않습니다.

한걸음에 십리를 갈려고 하면 안될것입니다.


프로그래밍을 10년동안 배워서 실력자가 된다는 각오로

배우고 익혀나가야 할것입니다.


영어를 10년배웠지만 그렇게 신통하게 잘하지 못하는 것이

보통입니다. 프로그래밍은 영어보다 힘들지 않을까요?


진정한 프로 프로그래머가 될려면 10년정도의 실력을

쌓으려는 각오를 해야할 것이라고 생각합니다.




프로그래밍을 하는데 도움이 되는 자세입니다.

######################################

몇가지 프로그래밍에 도움이 될 방법을 말해보겠습니다.


1. 스스로 예제를 만들어라.

스스로 문제를 만들고 푸는건 남의 문제를 푸는것 보다 몇배의 생각과

노력과 검토가 들어갑니다. 그만큼 효과가 있지요.


2. 끈기 있게 고민하라.

노력없이 얻은 결과는 쉽게 사라집니다. 1주일을 고민하고 푼 문제와

1분도 안되 답지 본 문제와 어느것이 더 오래 갈까요.

전 3년전에 1주일 고민하고 푼 문제를 아직도 기억 합니다.

그때는 정말 \'유레카\' 였지요.


3. 공식에 매달리지 마라.

공식은 말그대로 공식 입니다. 공식이 프로그래밍은 아니지요.

아무것도 모르체 공식만 달달 외우는 그런 앵무새는 되지 맙시다.


4. 이해가 안되면 끝까지 매달려라.

문제든지 이론이든지 아니면 예제 프로그램의 의미 이든지 이해가

안되면 에이~~~~ 그냥 넘어가지 그러지 마시고 선생님이던 누구든

무조건 매달리십시요. 가르쳐 달라는데 마다할 선생 없습니다.

알때 까지 완벽하게 이해 할때까지 무조건 매달리십시요.


5. 궁금한걸 참지 마라.

4번하고 비슷한데 일단 궁금한게 생기면 고민 부터 하시고 아무리

고민해도 안될 것 같으면 꼭 선생님 한테 물어 보십시요.

아마도 좋아 하실 겁니다. 만약 제가 선생님이라면 정말 기특하게

생각 할 겁니다.