본문 바로가기
jisung's 책읽기/기술서

그림으로 개념을 이해하는 알고리즘

by jisungStory 2018. 8. 24.
반응형


그림으로 개념을 이해하는 알고리즘

 나의 오래된 꿈은 해커가 되는 것이다. 중학교때 였던가 고등학교 때였던가 아니다 어쩌면 더 오래된 꿈일지도 모르겠다. 초등학교를 다니던 시절 부터 컴퓨터에 대한 막연한 동경이 있었다. 하지만 내가 다니던 시절에는 정규교육과정에서 컴퓨터가 들어있지 않았다. 그냥 수업시간에 이런거 된다 정도 잠깐 보여준 정도? 중학교때에는 워드 정도는 특별 수업을 편성해서 진행했던것 같은데 그것을 배운다고 해커가 되는 것은 아니었다. 고등학생이 되어서야 나는 나만의 컴퓨터를 가질 수 있었다. 하지만 컴퓨터가 생긴다고 해서 해커가 되는 것도 아니었다. 각종 웹사이트를 돌아 다녀도 정보를 구하기가 쉽지 않았다. 그렇게 대학생이 되고 군대를 다녀오고 현실에 부딛히면서 나의 꿈은 점점 사그러져 추억으로 남게 되었다. 

 사실 해커가 된다고 해서 뭐 대단해 지는 것은 아니다. 해커는 자기만의 창조적인 방법으로 문제를 해결하는 사람들을 일컫는다 그런 사람들에게 컴퓨터는 최고의 도구이다. 사용법만 적절하게 익힌다면 그 가능성이 무궁 무진 하기 때문이다. 요즘 같은 일인 일 스마트폰 시대에 컴퓨터를 통한 문제 해결은 당양한 양상으로 벌어지고 있다. 최근에 재미있게 바라 보는 서비스는 포레스트 이다. 

Forest


 최근 지구 온난화에 대한 다양한 문제가 전지구 적으로 벌어지고 있다. 이에 대해서 문제 지적만 하는 사람이 있는 반면 문제를 해결을 위햐 노력하는 사람들이 있다. 포레스트는 사람들에게 나무의 중요성을 알려주는데 그 방식이 매우 독특하다. 이 어플리케이션은 기본적으로 '타이머' 다 사용자가 지정한 시간 동안 앱을 종료하지 않고 자기 할일을 하고 시간을 채우면 나무 한그루를 자신의 숲에 키울 수 있다. 만약 앱을 종료하거나 나무를 키우는 것을 포기 하면 나무는 죽게 되고 포인트도 쌓을 수 없다. 포인트를 쌓아서 일정 양이 모이면 앱내에서 아이템 같이 나무를 구매 할 수도 있지만 나무를 심을 수도 있다. 아프리카의 어느 지역에 나무를 심는 활동을 겸하고 있는 것이다. 정확하게 어떤 사업 모델이 작동하여 이루어지는 지는 알 수 없지만 지구 온난화에 대응하는 이런 접근 방식은 정말 신선하고 긍정적인 해커의 모습을 보여 준다고 생각한다. 


 나도 이런 긍정적인 해커가 되고 싶다. 다른 사람이 힘들게 만들어 놓은 시스템을 파헤치는 사람이 아닌 이 세상을 좀 더 나은 방향으로 만들고 싶다. 그러기 위해서 선택한 것이 컴퓨터 공부 였다. 사람들에게 도움도 되고 세상이 도움도 되는 서비스가 가능 하다는 것을 포레스트를 통해 배울수 있었다. 상상속의 어떤 기획을 혼자의 힘으로 만들어 내가 위해서는 컴퓨터가 가장 적합하다고 생각 했다. 그러기 위해 가장 필요한 것이 컴퓨터 안에서 만나는 수많은 문제를 해결하기 위한 해결 방법론을 배우는 것이 우선이라고 생각했다. 


 다시 책으로 돌아와  현재 우리나라에서 출간되는 알고리즘 책 중에서 가장 쉬운 책에 속한다. 책을 모두 읽는데는 채 하루가 걸리지 않을 정도로 쉽게 개념을 설명하고 있고 그 내용들을 현실에 적용해 볼 수 있게 예시도 친숙하게 설명되어 있다. 프로그램에 익숙하지 않은 사람들도 이해할 수 있도록 우리가 주변에서 흔히 볼 수 있는 사물과 동작 원리들을 비유적으로 표현해 준다. 본격적으로 프로그래밍을 공부한지 일년이 되어가는 지금 나에게 가장 필요 한 것은 기술적인 부분이라기 보다 내가 만들면서 느끼는 다양한 문제들을 어떻게 지혜롭게 해결해 나가느냐 하는 것이다. 이 책 한권으로 그 모든 고민을 해결 할 수는 없겠지만 그 기본 바탕을 다지는데는 도움이 될 것같다. 우선 책이 너무 쉽게 잘 씌여져 있다. 


 우선 첫장에서 다루고 있는 내용은 이진탐색과 빅오 표기법이다. 이진 탐색은 쉽게 말하면 우리가 흔히 하는 게임인 '스무고개'의 컴퓨터 버전인 것 같다. 어떤 값을 찾아야 할때 일번 부터 찾아 나가는 것이 아닌 전체 데이터에서 중간 부터 찾아 나가는 것이다. 그러면 값을 찾는 시간을 반으로 줄일수 있다. 빅오 표기법은 알고리즘이 얼마나 빠른지 표기 하는 방법이라고 한다. 로그를 사용한 표기법인데 그 사용이 독특하다. 기본 표기법은 O(n) 으로 표기 되고 빠른 것 부터 느린것 까지 표기 방법이 크게 다섯가지로 나뉘게 된다. 


 우선 빠른 계산 법과 느린 계산법이 코딩에 있어서 모두 필요 하다는 것이 신선하게 느껴졌다. 프로그램이 빠르기만 하면 된다고 생각했는데 상황에 따라 느린 알고리즘이 필요하다는 것이다. 예를 들면 화면에 어떤 사진이 나타나는데 특정한 조건하에서는 느리게 나타나게 하는 것이 디자인적으로 더 아름답게 느껴진다든지 아니만 게임을 할때 아이템이 등장하는 장면에 일부러 시간의 지연을 일으킬 수도 있을 것이다. 생각해보면 사용자의 필요에 따라 다양한 조건들이 필요하므로 빠르기만을 주장할 수는 없을 것이다. 


 이 책을 공부함에 있어 또 기본으로 이해하고 있어야할 지식이 파이썬에 대한 기본적인 문법에 대한 이해이다. 이 책의 예제 코드들은 파이썬으로 작성되어있고 프로그램을 모른는 사람이라면 이 코드의 의미를 이해하기 쉽지 않을 것이다. 기본적인 분기, 반복, 함수 정의 같은 프로그램에 필요한 기본적인 지식을 갖추고 읽는다면 더 쉽게 이해 할 수 있을 것이다. 나의 경우에는 파이썬에 대한 기본적인 이해도 있지만 주로 SWIFT로 앱을 만들어 와서 인지 몇몇 정의에 대해서는 바로 떠오르지 않는 경우가 있었다. 그럴때를 대비해서 파이썬 Cheet Sheet 를 구글 검색으로 다운받아 출력해 놓고 책상앞에 붙여 놓았다. 생각 안나면 한번씩 그 컨닝 페이퍼를 보고서 다시 책읽기로 돌아오기를 반복하며 알고리즘 공부를 계속 하고 있다. 


 기본적인 알고리즘은 거의 모든 언어에 기본적으로 구현되어있다. 하지만 그 알고리즘이 어떤 원리고 작동하는지 이해하지 못한다면 적절한 상황에서 사용하지 못하기 때문에 라이브러리에서 그냥 눈감고 아웅하듯이 가져다 쓰는 것 보다 원리에 대한 이해를 바탕으로 사용한다면 더 실력있는 프로그래머가 될 수 있을 것이다. 나는 강성태 멘토의 조언을 맹신하는 편이라서 이 책을 다섯번 더 읽을 생각이다. 모든 지식기반 산업에서는 기본 지식이 가장 중요하다. 


 '기술서'라는 카테고리의 첫 글을 쓰면서 잠깐 설레임이 있었다. 내가 어린시절 부터 꿈꿨던 세상에 한걸음을 더 내딛는 기분이 들어서 이다. 아직 꿈을 이루었다 말하기는 이르지만 이 한걸음 한걸음이 내가 원하는 나의 모습에 가까워 지는 과정이라고 생각한다.  그 과정 속에서 부딛히는 많은 어려움들을 지혜롭게 해결해나가고 싶다. 


반응형

댓글