메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

강력한 아이디어와 패러다임을 통한 문제해결법 찾기(상)

한빛미디어

|

2003-10-14

|

by HANBIT

5,173

릴레이 칼럼 1탄에서는 내공이란 무엇일까하는 질문을 던져보고, 2탄에서 패러다임을 소개하며, 마지막으로 사고법을 소개하겠다.

전문가와 초보자의 차이

전문 개발자이든 초보 개발자이든 깊이 우선탐색(DFS)과 너비 우선탐색(BFS)을 들어 알고 있다. 모두 나무형 자료구조를 탐사하는 순서를 나타낸다. 땅 속에 묻힌 보물을 찾을 때를 예로 들어 설명하면, 전자의 경우 일단 되건 안되건 끝이 보일 때까지 계속 파내려가는 방법이라 할 수 있고, 후자는 여기저기 넓게 파헤쳐 보고 없으면 조금 더 깊이 파내려가는 식이다.

이 구분은 자료구조 탐색뿐만 아니라 일상의 문제해결에도 적용될 수 있다. 예컨대, 대형서점에서 원하는 정보를 찾을 때 한 서가에서 책 한 권씩 철저히 마스터해 가는 방식이 DFS라면 일단, 전체 분류를 살피고 점차 세분화된 서가 그리고 서적 순으로 살피는 방식이 BFS에 가깝다고 할 수 있다.

개발자가 프로그램을 작성하거나 할 때에도 DFS 혹은 BFS를 사용하게 된다. 여기에서 흥미로운 질문을 하나 던져보자. 뛰어난 개발자들은 개발할 때 DFS로 사고할까, BFS로 사고할까. 연구결과에 따르면 뛰어난 개발자들일수록 BFS적으로 사고한다고 한다. 다시 말해, 뛰어난 개발자는 시스템을 설계할 때, 먼저 전반적인 그림을 그린 후 세부로 들어가는 반면, 그렇지 못한 개발자들은 처음부터 매우 세부적인 사항을 붙들고 늘어진다.

도대체 누가 이런 연구를 할까? 심리학자들이다. 특히 인지심리학, 그 중에서도 전문성(expertise)을 연구하는 사람들은 대표적으로 의사, 변호사, 음악가, 과학자 그리고 프로그래머 등을 몰모트로 삼는다. 전문성의 대표자들이기 때문이다. 이런 전문가들 간에는 공통점도 있지만 차이점도 존재한다. 예를 들어, 과학자들의 경우, 전문성이 높은 사람일수록 순방향 사고를 하는 반면, 개발자는 전문성이 높은 사람일수록 역방향 사고를 하는 경향이 있다. 순방향 사고는 미로를 입구에서부터 찾아가는 방식이고, 역방향 사고는 미로를 출구에서부터 거슬러 내려오는 방식이다.

어떤 물리학자에게 문제를 내어주면 그는 "열역학 제2법칙" 같은 아주 근본적인 법칙에서 출발, 연역을 통해 문제의 해에 도달한다. 하지만 물리학을 공부하는 학생은 거꾸로, "마지막으로 이 수식만 적용하면 풀릴텐데"에서 출발해 거슬러 내려온다. 반면, 개발자는 정반대의 경향을 보인다. 뛰어난 개발자일수록 프로그래밍할 때 오히려 최종 해에서부터 내려오는 경우가 많고, 초보 개발자는 밑에서부터 하나씩 쌓아 올려서 해에 도달하려고 한다.

이런 전문가와 초보자의 차이, 특히 전문가의 사고방식을 잘 이해하고 연습한다면 전문가가 되는 데 많은 도움이 되지 않을까? 우리는 종종 과정을 너무 쉽게 무시한다. 선생님이 어떤 문제를 내어준다. 그리고 그걸 풀게 한다. 아무도 풀지 못한다. 선생님은 모범답을 보여준다. 아! 기발하다! 나라면 저런 답은 정말 생각도 못했을 것이다! 그리고는 학생들은 그 답을 외운다? 과연 이 학생들의 문제해결능력에 나아진 점이 있을까? 필자는 그런 기발한 사고를 가능케 한 사고의 과정을 가르치고, 또 배워야 한다고 생각한다. 아이디어보다 더 가치있는 것은 아이디어를 지속적으로 생산해 낼 수 있는 프레임워크이다.

내공과 문제해결력

요즘엔 여기저기서 기초와 내공이 중요하다는 이야기를 한다. 특히 비전공자들 경우 이런 기초에 대한 갈증을 늘 갖고 있다. 전공을 한 실무자 역시도 하루하루의 업무에 치여 지내느라 더 이상 내공을 쌓을 틈이 없다며 불안해 한다. 몇 년 동안 자신의 진짜배기 실력은 그 자리에 정체해 있거나 혹은 더 퇴보한 것만 같다. 기초가 제대로 되어 있지 않으면 아무리 그 위에 요란한 치장을 해도 높이는 그대로라고 한다. 그런데 프로그래밍에서 기초는 무엇일까? 알고리즘일까? 자료구조일까? 이산수학일까? 아니면 논리학일까?

정렬 알고리즘을 하나 더 알고 있다고 해서 그 사람의 업무에 큰 도움이 될 것 같지는 않다. 어제 나온 따끈따끈한 새로운 프레임워크나 라이브러리 사용법을 익히면 내공이 증가할까? 남들 다 기초라고 하는 것들을 공부해도 자신의 프로그래밍 능력에는 별반 차이가 없는 것 같고, 뭔가 허전함을 느끼게 되지는 않는가?

필자는 대신 문제해결능력을 내공의 잣대로 보고 싶다. 문제해결능력이라는 것은 알고리즘 하나를 더 안다고 나아지지 않는다. 이것은 사고능력과 실행능력의 총체이다.

우리는 보통 "문제 해결"(Problem Solving)이라고 하면 수학문제나 시험문제를 푸는 것을 연상하기 쉽다. 하지만 문제해결은 훨씬 더 광범위하고 포괄적인 개념이다. 노벨 경제학상과 튜링상을 수상했고, 인공지능의 아버지로 불리우는 허버트 사이먼은 "문제"를 다음과 같이 정의한다:
어떤 사람이 뭔가를 원하는데, 그것을 얻기 위해 행하여야 할 일련의 행동을 즉각적으로 알지 못하는 경우 그 사람은 문제에 직면한 것이다("A person is confronted with a problem when he wants something and does not know immediately what series of actions he can perform to get it.")
고로, 문제 해결은 현 상태와 목적 상태의 차이를 최소화하기 위한 일련의 행동으로 이루어진다. 배가 고플 때도 문제해결이 필요하고, 국가 정책을 결정할 때도 문제해결이 필요하며, 컴퓨터 게임을 하는 것에도 문제해결이 필요하다.

최근 하우석이라는 스타 기획자의 "100억짜리 기획력"이란 서적을 보았다. 그 책에서는 기획을 다음과 같이 정의해 놓았다:
어떤 특정 과제 및 문제를 정확히 파악하고 -> 그 과제의 완수 또는 그 문제해결을 달성하기 위하여 -> 일정한 대상물들에 대하여 -> 일정기간 동안 벌어질 수 있는 주요상황을 파악하고 -> 미리 예측하 여 -> 일정 의도에 따라 목표한 결과를 얻을 수 있도록 하는 -> 일련의 사고과정 및 행동양식 -> 또는 사고과정 및 행동양식을 개념화하는 것 -> 그 개념화에 따른 실행과 실행 후 평가까지 -> 이상의 총체 적 과정을 "기획"이라 부른다.
이 과정은 일반적인 문제해결의 과정과 큰 차이가 없다. 우리가 하는 거의 대부분의 인지 활동에서 문제해결은 도무지 빠질 수 없는 것이다. 이는 개발 활동에도 그대로 적용되며, 하루에도 수십, 수백 가지의 문제를 해결하고 있다. 디버깅하거나, 설계하거나, 혹은 남의 눈을 피해 채팅하거나...

내공 수련법?

그렇다면 이렇게 중요한 문제해결 능력을 어떻게 향상시킬 수 있을까? 필자는 두 가지 정도를 이야기하고 싶다. 하나는 다양한 해(혹은 그 구성요소들)를 아는 것이고, 다른 하나는 다양한 해를 도출해 내는 다양한 방법을 아는 것이다. 알고리즘은 전자에 속할 것이다. 앞서 BFS나 역행 사고 같은 것은 후자에 속할 것이다.

특히, 다양한 해에 있어서 필자는 알고리즘과 같은 기본적인 단위에서 한 걸음 더 나아가야 한다고 생각한다. 알고리즘보다 상위 차원으로 패러다임이라는 것이 있다.

이 패러다임이 무엇인지는 다음 칼럼에서 구체적으로 살펴보도록 하겠다.
TAG :
댓글 입력
자료실