알고리즘의 이해와 오해
알고리즘을 바라보는 시선, 그리고 수학.
알고리즘과 수학
알고리즘이라는 것은 “어떤 문제를 해결하기 위한 절차나 방법.”이란 뜻이다. 알고리즘을 말하기 전에 먼저 수학의 개요를 알아야 하는데, <알고리즘>은 보통 <수학>과 <컴퓨터>에 가장 많이 쓰인다. 그동안에 나에게 있어서 <수학>이라는 과목은 그저 숫자를 다루는 학문에 그치지 않았다. 나는 수학을 좁은 시야로 바라봤던 것이다.
수학이라는 것은 논리에 근거하여 추상화하고 형식화하여 규칙의 발견과 문제의 제시 및 해결 과정으로 이루어진다. 수학을 의미하는 mathematics라는 단어는 고대 그리스어 ‘máthēma’(μάθημα)에서 따온 말로, 아는 모든 것, 배우는 모든 것이라는 뜻에서 유래된 것이다.
이미 고대 학자들은 수학이란 것을 아는 것. 배우는 모든 것이란 것을 알고 있었던 것이다.
우주의 진리에 가장 근접한 학문 = 수학
수학은 형식과학의 한 분류로 구분된다.
일반적인 과학이 현실의 대상을 관찰한 결과를 이론으로 집대성한 학문적 결과라면 수학은 인간의 두뇌에 존재하는 추상적인 이론들을 ‘수’로 이해하기 쉽게 표현한 것이다. 현재 우리의 삶에서 수학이 없는 것은 상상할 수 없는 삶이기도 하다. 즉, 우주의 진리에 가장 근접한 학문이 수학이다.
근대 철학의 아버지 “나는 생각한다, 고로 존재한다”의 르네 데카르트는 수학은 인간의 경험적 오류에 휘둘리지 않는다라고 하였다. 데카르트는 가장 확실하고 의심할 여지가 없는 진리를 수학에서 찾으려 했고 감정이 어떻게 이성의 판단을 방해하는지 깨달은 사람이다. 그는 수학을 이러한 의심의 여지가 없는 기본 신념으로 여겨 철학을 포함한 모든 진리를 수학적인 원리로 해석하기 위해 노력했다. 그는 직교 좌표계를 만들어 해석기하학의 창시자로 알려졌으며 방정식의 미지수에 최초로 x를 사용했다. 개인적으로, 내가 수학이라는 학문의 기점을 나누어 보았을 때, x를 배웠을 때와 배우지 않았을 때의 사고방식으로 나뉘는 것 같다.
수학이 변질 된 교육 과정
현대 과학자들은 수학을 물리학이나 생물학, 경제학, 공학, 의학 등 모든 것을 대상으로 하는, 과학을 풀어나가기 위한 핵심적인 도구로 사용한다. 수학은 이산수학, 대수학, 해석학 등등으로 나뉘는데 특히 해석학중의 하나인 미적분학같은 부분을 배울 때 수포자가 많이 발생한다. 그저 외워서 공식을 대입하기 바빴지만 실제론 이것은 외우면 「어렵다」이다. 외우는 것보다 이해할수 있는 방법을 생각해내는 것이 더 좋은 방법이다. 왜인지도 모른채 이해하기 바빴던 교육 과정에 대해서 안타깝다는 생각이 든다. 이런 부분에서 알고리즘과 수학이 연관된다. 어떠한 문제가 있을때 이 문제를 푸는 해결 방식을 연구하는 것이 수학인 것이고 이 문제를 해결해 내는 방법이 알고리즘인것이다.
그 동안 <컴퓨터 과학>에서 <알고리즘>이라는 학문을 접근할 때, 컴퓨터 과목에 한정된 자료를 구조화 하는 과정이라는 인식을 하고 있었는데 그것이 전혀 아니였던 것이다.
쉽게 말해서 알고리즘이란?
10년 전에만 해도 자료구조와 정렬 등의 고전적인 방식으로만 컴퓨터와 연관지어 설명했으나 지금은 폭이 광범위해지고 대중화 됨에 따라서 더 쉽게 풀어야 할 필요가 생겼다. C언어 문법보다 알고리즘이 더 우선적인 개념이라고 본다. 정말 쉽게 말해서 단순히 내가 어떤 요리를 해야하는데 이 요리를 어떤 방식으로 풀어나갈까? 이런 문제를 수학적으로 표현하는 것이 알고리즘이라는 것이다. 가령, 내가 떡볶이를 좋아하므로 떡볶이를 요리하는 과정이 바로 알고리즘인 것이다. 먼저 재료를 준비할 것(선언)이고 준비한 재료를 손질(입력)할 것이고 재료를 어떠한 방법으로 조리를 할 것(판단, 처리)이고 이것을 최종적으로 완성(출력)해 내는 것. 이 떡볶이를 요리하기 위한 과정을 설계하는 자체가 알고리즘의 과정이라고 볼 수 있는 것이다. 이 과정의 정답은 존재하지 않지만 사람마다 빠르고 맛있게 해내는 방법은 존재한다. 그것이 흔히 알고 있는 레시피가 될 수 있다.
수학과 알고리즘, 그리고 컴퓨팅적사고
알고리즘이 조건들을 모두 만족한다면 문제를 풀 수 있다고 할 수 있지만, ‘효과적으로’ 풀어낸다고 할 수는 없다. 위에서 말한 유한한 시간이 몇 달 혹은 몇 년이 될 수도 있기 때문이다. 따라서 우리는 알고리즘을 효율성으로 평가하게 되고, 컴퓨터에서는 시간과 메모리라는 두 자원을 얼마나 소모하는지가 효율성의 중점이 된다. 인간은 이것을 인지능력과 결단력을 통해서 생각해내지만 컴퓨터는 이것을 하나 하나 정해서 할 수 있게 만들어 줘야한다. 이런 것을 컴퓨팅 사고라고 하는데 컴퓨터는 아무런 베이스가 없는 멍청한 상태이기 때문에 모든 것들을 하나하나 정의 해주고 순서에 맞고 논리에 맞게 정리해줘야한다.
그래서 컴퓨터에서의 알고리즘은 효율성과 직결된다. 수학적인 증명, 즉 알고리즘과 컴퓨터 처럼 생각하게 되는 사고가 더해져 더욱 문제 해결하는 방법이 더욱 효율적이게 만들어 준다. 어릴 때 부터 이런 사고 방법을 하게 되면 어떠한 것들도 더 쉽게 다룰 수 있을 것이다.
생각하는 방법
이러한 개념과 학문이 없었던 시절부터 지금 까지 이 모든 것들을 가능하게 만들어 준, 모든 수학자와 철학자들이 존경스럽다. 누군가는 아무렇지 않게 지나갈 현상들을 골똘히 생각하여 규칙을 찾아내고 증명해낸다는것은 굉장히 위대한 일이다.
스티브잡스는 이런 말을 한 적이 있다.
“컴퓨터 프로그래밍은 사고범위를 넓혀 더 나은 생각을 할 수 있게 해 새로운 해결책을 만드는 힘을 만든다. 프로그래밍은 생각하는 방법을 가르쳐주기 때문에 모든 사람들은 컴퓨터 프로그래밍을 배워야 한다.”
생각하는 방법을 아는 사람이 다르게 생각했을 때
스티븐잡스가 애플의 core value를 <Think different> 라고 내세웠는지 조금은 알 수 있을 것 같다. “사물을 다르게 보는 사람, 현실에 부적응자, 말썽꾸러기. 모든 사람들은 규율을 좋아하지 않고 현상을 존중하지 않는다. 그들은 세상을 바꾸기 때문이다. 그들은 인류가 앞으로 나아가도록 한다. 세상을 바꿀 수 있다고 생각할 정도로 미친 사람들이야 말로 그렇게 할 수 있기 때문이다…” 그래서 스티븐 잡스가 바꿔놓은 이전에 존재 하지 않던 완전히 다른 새로운 세상이 되었다. 생각한다는 것, 다르게 생각한다는 것.
사고력과 논리력이 창의력과 만나게 된다면…