공부론
필자는 월간 마이크로소프트웨어 2002년 6월호에 "어떻게 공부할까 : 프로그래머를 위한 공부론"(
http://www.zdnet.co.kr/hotissue/devcolumn/article.jsp?id=49399)이라는 글을 썼다. 그 글에서 알고리즘 공부법 중 특별히 패러다임에 대해 한 섹션을 할애해 그 중요성과 공부법을 설명하고 있다. 일부를 인용해 보았다.
알고리즘을 공부하면 큰 줄기들을 알아야 합니다. 개별 테크닉도 중요하지만 "패러다임"이라고 할만한 것들을 알아야 합니다. 이것에 대해서는 튜링상을 수상한 로버트 플로이드(Robert Floyd)의 튜링상 수상 강연(The Paradigms of Programming, 1978)을 추천합니다. 패러다임을 알아야 알고리즘을 상황에 맞게 마음대로 변통할 수 있습니다. 그리고 자신만의 분류법을 만들어야 합니다. 구체적인 문제들을 케이스 바이 케이스로 여럿 접하는 동안 그냥 지나쳐 버리면 개별자는 영원히 개별자로 남을 뿐입니다. 비슷한 문제들을 서로 묶어서 일반화해야 합니다.
이 다음에는 이런 패러다임 공부법으로 "다시 하기"를 소개하고 있다. 여기에서 패러다임을 공부하는 것의 장점을 한가지 언급하고 있다: ""비슷한 문제"를 모두 풀 능력이 생깁니다." 패러다임을 알면 하나를 배워 열을 아는 효과를 얻을 수 있다는 것이다.
이와 관련해 위에서 언급한 플로이드의 튜링상 수상 강연의 일부를 인용해 보자.
제가 어려운 알고리즘을 디자인하는 경험을 생각해 볼 때, 제 능력을 넓히는 데 가장 도움이 되는 특정한 테크닉이 있습니다. 어려운 문제를 푼 후에, 저는 그것을 처음부터 완전히 새로 풉니다. 좀 전에 얻은 해법의 통찰(insight)만을 유지하면서 말이죠. 해법이 제가 희망하는 만큼 명료하고 직접적인 것이 될 때까지 반복합니다. 그런 다음, 비슷한 문제들을 공략할 어떤 일반적인 룰을 찾습니다. 아까 주어진 문제를 아예 처음부터 최고로 효율적인 방향에서 접근하도록 이끌어줬을 그런 룰을 찾는 거죠. 많은 경우에 그런 룰은 불변의 가치가 있습니다. … 포트란의 룰은 몇 시간 내에 배울 수 있습니다. 하지만 관련 패러다임은 훨씬 더 많은 시간이 걸립니다. 배우거나(learn) 배운 것을 잊거나(unlearn) 하는 데 모두.
알고리즘의 패러다임들
잘 감이 오지 않을 것이다. 우선 알고리즘에 어떤 패러다임들이 있는지 살펴보도록 하자.
애너니 레비틴은 알고리즘 디자인 테크닉을 다음 네가지로 크게 나눈다. 자세한 내용은 레비틴의 A NEW ROAD MAP OF ALGORITHM DESIGN TECHNIQUES, DDJ, 2000 Apr와 Do We Teach the Right Algorithm Design Techniques?(
http://www.csc.vill.edu/~levitin/paper.html), 그리고 Introduction to the Design and Analysis of Algorithms, Pearson Addison Wesley, 2002을 참고하라.
- brute force
- divide-and-conquer
- decrease-and-conquer
- transform-and-conquer
이 네가지 설계 기법 밑에 수십개가 넘는 알고리즘이 따라오게 된다. 또한 이 설계 기법을 응용하면 새로운 알고리즘을 발견하거나 기존의 것을 변경하기도 용이하다. 레비틴은 이런 패러다임을 가르치는 것이 알고리즘 교육에 있어 아주 중요하다고 역설한다.
강력한 아이디어
로고를 개발했고 인공지능 연구에 지대한 영향을 미친 세이모 페퍼트(Seymour Papert)가 쓴 책 중에 "Mindstorms: Children, Computers and Powerful Ideas"가 있다. 이 책은 어린이 교육에 있어 컴퓨터의 중요성과 어떻게 컴퓨터를 교육적으로 활용할 수 있는지, 그리고 "강력한 아이디어"가 무엇이고 왜 중요하며 이것을 얻는 데에 컴퓨터가 어떻게 도움을 주는지를 설명하고 있다. 수 천 명이 넘는 교사들이 이 책에서 많은 영감을 얻었다. 레고사는 세이모와 이 책의 업적을 기려 그들의 제품에 같은 이름을 붙이기까지 했다.
페퍼트는 자신의 책에서 "강력한 아이디어"는 복잡한 아이디어를 훨씬 이해하기 쉽게 만들어 주며, 여러 지식영역에 두루 적용될 수 있는 힘이 있다고 했다. 예를 들어 "increase-by"(얼마만큼 증가시키기)라는 개념을 생각해 보자. 우리가 컴퓨터 프로그래밍을 처음 배울 때 a=a+1 등을 통해 접하는 간단한 개념이다. 하지만 이 개념을 잘 이해하면 미적분의 개념까지 쉽게 이해할 수 있다.
필자는 올해 초 일본에서 페퍼트의 제자이자 동료인 앨런 케이를 만나 그의 발표를 볼 기회가 있었다. 동영상 속에서 10살이 안되는 아이가 이 개념을 응용해서 중력가속도 모델을 이해하고, 이를 시뮬레이션해 보이는 것을 보고는 엄청난 충격을 받았다. 그는 "increase-by"를 두번 적용해서 가속도의 개념을 이해했고, 이를 시뮬레이션하기도 했던 것이다.
이런 강력한 아이디어는 필자가 생각컨데 앞서 언급한 패러다임과 유사한 것이다. 생각의 도구요 재료가 되는 것들이고, 자신의 사고력을 증강시키는 비밀무기가 되는 것이다. 이것들을 프로그래밍에서 찾아볼 수도 있다.
프로그래밍
공학을 한 사람이라면 잘 아는 매트랩의 경우, 어레이의 개념을 잘 이해하면 매트랩이 무척 쉽다. 또 효율적이고 더 간단한 프로그램을 만들 수 있다. 시뮬레이션 프로그램인 랩뷰나 매트랩의 시뮤링크, 혹은 토니 호아의 CSP 같은 경우에는 데이타 플로우 프로그래밍과 모듈라 프로그래밍 개념을 잘 이해하면 역시 같은 효과를 볼 수 있다.
이런 강력한 아이디어들과 패러다임들을 잘 이해, 적용해 만든 프로그램은 일반적으로 이해하기 쉽고, 더 효율적이고, 더 간단하며, 따라서 더 아름답다. 이렇게 되면 그 프로그램은 관리나 수정, 재사용도 쉬워진다.
프로그래밍에 있어 강력한 아이디어와 다양한 패러다임을 익히는 것이 내공증강의 핵심코스임을 의심할 수 없다.