|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1750 [복사]
새로운 스터디가 올라왔나하고 기대하셨을지도 모를 분들께는 죄송합니다만... 정규 스터디는 아닙니다 ^^;;(혹시.. 저 혼자 그런 분들이 계실꺼라고 착각하는건가요?;;;;;)
몇몇분은 이미 알고 계시는 것처럼 저는 미국에서 다른 전공을 공부고 있...었는데요... 다시 전산학을 공부해야겠다는 생각이 들어서 얼마전부터 전산학 수업을 듣기 시작했습니다. '선수과목(prerequisite)'이라는 이유 때문에 프로그래밍 컨셉/알고리즘이라는 강의를 듣고 있는데, C++로 진행되는 강의더군요. 프로그래밍에서 손을 뗀 지가 워낙 오래 되었던 터라(한... 4년? 5년 됐나요?) 기초부터 다시 다진다는 마음으로 시작했습니다만, 문법은 잊어버렸어도 컨셉까지 잊어먹지 않았다는 걸 확인 하는 하루하루(?)를 보내고 있네요 ^^;;
아무래도 유경험자(?)인 덕에 강의가 끝나면 이것저것 물어오는 친구들이 꽤 있는데(미국이라도 학생은 다 똑같나 봅니다. 질문이 생기면 교수나 강사보다는 같은 학생이라는 이유로 제게 더 많이 물어보더군요) 그때마다 새삼 놀라는 것이... 수학적 기본바탕이 얼마나 중요한가라는 사실입니다.
수업이 수업이다보니 if문과 switch문 같은 기본적인 문법을 많이 다루게 됩니다. 그런데 문제는... 학생들 중 적지 않은 수가 기초적인 비교 조건조차 찾아내지 못하더라는 사실입니다. 특히 그 학생들이 어려워 하는 부분이 >와 >=, <와 <=의 차이입니다.
아마 초/중등 과정에서던가요? 집합과 범위 문제를 다루는 부분에서 경계의 포함과 비포함의 개념이 제대로 잡혀있지 않기 때문에 생기는 문제지요. 또, 교집합과 합집합, 역집합, 드모르간의 법칙 등이 다뤄지는 부분을 이해하지 못하고 있다면
if( !flag && x>y && !( z==10 || a*z < 5 ) )
과 같이 복잡한 비교 조건을 찾아낸다는 건 사실상 거의 불가능합니다. 또, 프로그래밍을 처음 배울 때 자주 등장하는 학점 구하기 문제 역시 범위의 개념 없이는 적당한 비교조건을 찾을 수 없지요. 방정식과 항등식, 함수를 이해하지 못하면 역시 올바른 프로그램을 구현한다는 것 자체가 어불성설입니다. 예를 들어보죠.
y = 5x^2 + 3x + 7
이런 수학식이 있다고 합시다. 여러분도 잘 아시는 2차함수죠. 우리는 보통 수학시간에 근을 구한다고 해서 y=0 이 되는 x를 구하는 것이 주된 목적이었지만, 프로그래밍에서는 어떤 x를 입력했을 때 어떤 y가 나오는가에 주된 초점이 있습니다. 그래서 함수의 형태도
int function( int x )
{
return 5*x*x + 3*x + 7;
}
이라는 식으로 함수를 만들게 되는겁니다. 이 함수의 signature(반환형, 함수명, 매개변수 리스트)를 수학식 형태로 바꾸게 되면 이렇게 되는데요
return = function( x )
어디서 많이 본 형태 아닌가요? 네
y = 5x^2 + 3x + 7 ≡ f(x) = 5x^2 + 3x + 7 ≡ y = f(x)
이겁니다. 만약 변수가 2, 3개 이상 되는 아래와 같은 함수식이 있다면
y = a^7 + b*a^4 - c/z^2 + logx
결국 이것도
double func(double a, double b, double c, double x, double z)
{
return ......;
}
이런 식의 함수를 만들 수 있다는 거에요.
컴퓨터는 여러분도 잘 아시다시피 0과 1이라는 숫자로만 운영되는 기계입니다. 즉, 아무리 화려한 화면효과나 멋진 음악이 나온다고 해도, 결국 모든 프로그램의 내부는 모두 수학함수로 구성이 되어있다는 뜻입니다. 그래서 수학과 프로그래밍은 절대적인 불가분(不可分)의 관계에 있습니다.
분기문의 조건 역시 수학의 부등식과 항등식의 연장선입니다.
배열과 포인터를 이해하는데에는 수열에 대한 이해가 필요하고,
재귀 함수를 이해하는 데에는 수열과 극한, 수열의 합 등의 이해가 우선됩니다.
게다가 올바른 재귀함수를 만들려면 수학적 증명 논리를 필요로합니다.
이에 앞서, 수열과 극한을 이해하려면 집합을 알고있어야 한다는 것은 당연한 이야기겠지요?
삼각함수는 음향, 시각, 지리 정보를 처리하는데 필수이고, 대부분 게임 속에 내장되어 있는 AI 프로그램의 핵심이 됩니다.
AI 프로그래밍에는 확률과 통계도 큰 부분을 차지하고 있습니다. 또, 고급 통계 처리에는 지수함수가 따라오지요.
미분과 적분 역시 1 클럭 또는 1 사이클 단위로 실행되는 프로그램 루틴에서, 각 루틴마다 처리되어야 하는 데이터를 결정하는 데 핵심적인 수학 지식입니다.
이 정도쯤 되면.. 초/중/고교 과정에서 나오는 수학 범위 중에 프로그래밍과 연관이 없다고 할 수 있는 부분은 하나도 없지 않나 생각됩니다.
프로그래밍을 갓 시작해 '뭘 어떻게 해야 할 지 모르겠어요'라고 하소연하시는 분들이 갖는 거의 공통적인 약점을 취합해 보면... 거의 십중팔구 수학적 기반이 부족하다는 겁니다. 제가 이 곳(미국)에서 몇 몇 친구들을 가르쳐 보면서 얻게 된 최종 결론(?)이라고 할 수 있지요. 실제로 그 친구들 몇몇은 책을 외울만큼 읽어대서 웬만한 함수는 다 꿰고 있을 정도인 경우도 있습니다. 함수도 다 알고 if, while, for 등등등 문법적으로 부족한 부분이 없는데, 막상 프로그램을 만들려고만 하면 눈앞이 캄캄해지는 원인에는.. '수학을 체계적으로 배운 적이 없다'라는 사실이 자리잡고 있었던 거죠.
프로그래밍을 배우려고 하시는 분들 중 '난 수학은 영 꽝인데.'라고 하시는 분들이라고 프로그래밍을 할 수 없다는 건 물론 아닙니다. 하지만... 그만큼 쉽지 않고, 시간도 많이 걸리겠지요.
아무리해도 프로그래밍의 감이 잡히시지 않는 분들... '난 프로그래밍엔 재능이 없나봐...'라고 비관하지 마시고, 중/고등 과정의 수학책을 잠깐 들춰보시면 어떨까요? 금방 되지는 않겠지만, 하나씩 둘씩, 연관성을 찾아나가다보면 어느새 프로그래밍도 쓱싹쓱싹 해 치우고 있는 자신을 발견할 수 있을겁니다.
그럼 힘내세요!
[출처] [잡담] 수학과 프로그래밍의 연관관계 (C언어를 배우자) |작성자 때릴꺼야
|
Hit : 9231 Date : 2011/05/01 11:42
|