[책]생각하는 프로그래밍

2008. 1. 11. 15:42나의 서재

 

생각하는 프로그래밍 - 10점
존 벤틀리 지음, 윤성준 외 옮김/인사이트



 

1996년이라고 기억되는데요.

당시 병역특례로 모 증권사의 차트 프로그램을 개발 중이었는데 아래에 있는 그림과 같은 문제 때문에 며칠을 고민한 적이 있었습니다.

사용자 삽입 이미지

 

위 그림에서처럼 여러 직선이 놓여져 있을 때 사용자가 특정 지점에 마우스를 클릭하면, 클릭한 점과 가장 가까이 있는 직선을 구하는 문제였습니다.

일반적으로 그래픽 프로그램에서 이런 경우가 많은데, 클릭된 곳이 어느 직선 위에 있는 지 또는 허공에 클릭한 것인지 구해야 하는 문제였습니다.

요 문제를 해결하려면, 점과 직선들 사이의 거리를 구한다음 그 중 가장 가까운 거리에 있는 직선을 찾으면 되는, 지금 생각하면, 참 간단한 문제네요.

하지만 당시에는 수학적 지식(중학교 수준 수학인데도!)도 짧고, 망망대해에 떠 있는 직선과 점 사이의 거리를 구하는 게 며칠을 고민하게 만들 정도로 안 풀리는 문제였습니다.

고민만 하고 해결이 되지 않아 우울하던 어느 날, 여느 날처럼 꾸뻑꾸뻑 졸면서 버스를 타고 출근하는데 꿈인지 생시인지 허공에 직선과 점이 나타나서 둘 사이에 직각이 되는 선을 하나 긋는 그림이 생각났습니다.

아하! (이 책의 주제가 되는 단어)

하나의 점과, 직선과의 최단 거리는 점에서 시작해서 직선에 직각이 되는 선을 하나 그어 만나는 두 점 사이의 거리라는 생각이 문득 들었습니다.

그렇다면, 직선에 직각이 되는 선을 하나 그으면 되고, 직각이 되는 선은 이미 알고 있는 직선과 기울기와의 곱이 -1 이 되는 라인이라는 생각까지 미쳤습니다.

사용자 삽입 이미지


기존 직선의 기울기 A = (Y2 Y1) / (X2 X1)

y = Ax + b

에서

(x1, y1) 을 각각 대입해서 b를 구할 수 있었습니다.

 

이제 남은 건 (x3, y3) 를 지나고 기울기는 직선과 직각이 되는, 즉 –(1/A) 인 직선을 구해야 하는데

y = A(x x3) + y3

이고

A = -1/A 니까.

y = -1/A(x x3) + y3

 

두 직선이 교차하는 점 (x4, y4) 는 아래 두 식에 대입해서 구하면 됩니다.

 

y = Ax + b

y = -1/A(x x3) + y3

 

x4 = (x3 + y3a ba) / (1 + a2)

y4 = (ax3) + b

 

그런 다음 (x3, y3) ~ (x4, y4) 의 거리를 구하는 식으로 구하게 되었습니다.

별것도 아닌데 공연히 설명이 길었습니다 ^^;

 

요기까지 적고 있는데, 수학과를 졸업한 저희 와이프가 낄낄하고 웃더니, 왜 그렇게 어렵게 구하냐고, 직선과 점 사이의 거리를 간단한 공식이 있는데 왜 삽질하냐고 한마디 하는군요 ㅠ_;

아니나 다를까 네이버에서 직선과 점 사이의 거리라고 검색하면 무수히 많은 아래와 같은 답변을 쉽게 구할 수 있습니다.

 

(x3, y3) 에서 직선 ax+by+c=0 까지의 거리 d

사용자 삽입 이미지

 

명세코, 그 당시에는 네이버라는 훌륭한(정말 훌륭합니다. ) 지식검색이 없었습니다. 게다가 똑똑한 와이프도 없었고요.

 

프로그램을 하다 보면 위와 같이 “아하!” 하고 잘 떠오르지 않은 명쾌한 답변이 갑자기 떠오르는 경우가 많습니다.

이 책  “생각하는 프로그래밍” 은 이처럼 쉽지(?) 않은 문제에 봉착했을 때 “아하!” 하고 명쾌한 답변을 구할 수 있도록 알고리즘 구현에 대한 생각거리를 제시하고 있습니다.

책 이름으로만 본다면 이 책은 네이밍 센스가 아주 좋았던 거 같습니다.

만약 이 책의 원서 제목인 “Programming Pearls 2/E”를 그대로 사용했다면 저 같은 사람은 일단 Pearl 에 대한 책인 줄 알고 구입을 망설였을 것입니다.

그리고 이 책의 주제와 연관된 “알고리즘 극복하기”나 “10일만에 끝내는 알고리즘” 과 같은 식의 제목이었대도 아마 사지 않았을 겁니다. 

생각만 해도 머리 아픈 알고리즘 책을 돈 주고 사 볼 용기가 나지 않았을 테니까요.

블로그 계에서 검색엔진 최적화를 위해 제목을 수십 번 심사 숙고해서 짓는 것과 같이 “생각하는 프로그래밍” 이라는 멋진 책 이름이 구입해서 보고 싶게 만든 주 원인 중에 하나였습니다.

 

책의 전반적인 내용은 전산 학부 시절에 자료구조 같은 과목으로 한번씩 구현해 봤거나 적어도 이름은 들어 본 내용들이 주를 이루고 있습니다.

학교 교재로나 쓰일만한 이러한 내용을 책으로 편 저의(?)가 무엇일까요?

 

역자 서문에 이런 내용이 나옵니다.

알고리즘과 데이터 구조는 물론 그 자체로도 중요하겠지만, 더욱 중요한 것은 프로그래머로 하여금 문제에 접근하는 방법과 그 문제를 어떻게 해결할지에 대한 방향을 제시한다는데 있다고 할 수 있다

 

사실 이 책에서 전달하고자 하는 내용은 책에서 구구절절 심도 깊게 파 들어가고 머리 아프게 최적화 하는 코드 그 자체가 아니라, 유한 된 리소스를 어떻게 하면 최대한 활용해서 최고의 성능을 가져올 지 늘 고민하는 프로그래머가 되라는 점입니다.

생각하는 프로그래머가 되기 위해 각 장에서는 훈련을 위한 어려운 질문들이 놓여 있고, 저 같은 허접한 프로그래머가 생각의 과정 없이 자동 반작용으로 선택하게 되는 알고리즘의 문제점을 짚어주고, 조금만 더 깊게 생각하면 메모리를 1/10 만 사용하면서, 속도는 수십, 수백 배가 빨라지는 멋진 알고리즘을 만들 수 있음을 보여줍니다.

 

책이 워낙 구석기 시대에 나와서 그런지 책에 있는 문제들은 사실 현실과 맞지 않는 부분이 꽤 많습니다.

지금처럼 개인 사용자 PC 의 메모리가 이미 2기가를 넘는 경우도 많은 현실에서, MB 의 메모리는 예전과 같이 용서받지 못할 정도로 문제가 되지 않기 때문에, 이 책의 예제에 조금 공감이 안가는 부분도 많습니다.

게다가 책에서 소개하는 새로운 검색 기법이나 복잡한 알고리즘들은 실제 코딩으로 했을 때 그 복잡성으로 인해 훗날 유지 보수하는 이가 이해할 수 없다고 전혀 손을 댈 수 없거나, 없어질 지도 모르는 문제도 있어 보였습니다. (책에서도 물론, 이러한 알고리즘을 사용할 때 프로파일링을 통해 꼭 필요한 경우인지 여부를 먼저 확인하라고 친절히 설명되어 있긴 합니다만)

 

책을 읽으면서 제가 그 동안 얼마나 STL 의 편리함에 푹 파묻혀 살았는지 깨닫게 되었습니다.

책에서 질문을 읽자 마자 머리 속에 그려지는 해답은 대부분 STL 에서 제공하는 기본 Container를 사용해서 제 나름대로의 해결책을 생각했었거든요. 물론 저자의 답을 보면, STL 을 사용할때보다 훨씬 나은 성능을 보여주는 코드를 만나게 되어 곧잘 좌절하게 됩니다만, 저같이 업무용 프로그램을 만드는 사람이라면 STL 정도로도 일반적인 문제를 해결하는데 별 어려움이 없어 보였습니다.

 

대학졸업하고 처음으로 이진 검색과 QSort 의 소스를 본 것 같습니다. ^^;

오랜만에 보니 예전 기억이 떠오르면서 반갑기도 하고, 여전히 쉽지 않은 알고리즘이라는 생각이 들더군요.

 

이 책에 나오는 내용이 모든 프로그래머에서 큰 도움이 되지는 않겠지만, 누구나 할 수 있는 일반적인 해결책보다, 예술가에 가까운 멋지고, 아하! 소리 나는 생각하는 프로그래머가 되고 싶은 분들이면 도서관에서 연필 붙잡고 이 책을 읽어 보세요 :-)

 

그리고 이 책을 읽다 보니 어딘가에서 본 아래 문구가 계속 떠오르더군요. 구글 뉴스 그룹에선가 답변을 다는 친구가 늘 답변의 끝에 붙이는 내용인데, 혹시 정확한 의미를 해석해 주실 분 계신가요?

영어가 짧아 마지막 and wrong 을 어떤 식으로 받아 들여야 할지 난감하더군요.  앞 구절(모든 복잡한 문제에는 간단하고 멋진 해결책이 있다는)만 보면 참 멋진 말 같은데 and wrong 때문에 뭐가 뭔지 잘 모르겠습니다

 

For every complex problem, there is a solution that is simple, neat, and wrong.

H. L. Menkin

 

 

 

  • 프로필사진
    BlogIcon 뮤프리2008.01.11 18:07

    역시 프로그램 이라는건 프로그래머의 머리속에서 나오는 거죠...

    • 프로필사진
      BlogIcon esstory2008.01.11 20:43 신고

      프로그램이라는게 단순히 코딩하는 기술로 이루어지는 게 아니라, 지고한 사고의 과정에서 나오는 작품이라는 생각이 듭니다. 참 쉽지 않은 직업이지요. 근데 맨날 야근의 굴레에서 못 벗어나는 저를 보면 안습입니다 ^^;

  • 프로필사진
    BlogIcon envia2008.01.11 20:38

    마지막 문장은 제가 보기에는 "모든 복잡한 문제에는 간단하고 멋지지만 잘못된 해결책이 있다."고 해석하는 것이 맞는 것 같습니다. 그러한 해결책은 피하고, 진정한 해결책을 찾아야 한다는 문장인 것 같네요.

    • 프로필사진
      BlogIcon esstory2008.01.11 20:43 신고

      좋은해석 감사합니다.
      아무도 답변 안해주실까봐 걱정하고 있었는데
      좋은 해석 감사합니다 :)

  • 프로필사진
    BlogIcon Hwan2008.01.22 00:06

    마지막 문장은 공감이 가는 듯 하면서도 뭔가 안타깝네요. 결국 복잡한 문제는 복잡하고 지저분한 해결책을 찾아야 하는 건가요?? -_-;;;

    • 프로필사진
      BlogIcon esstory2008.01.22 08:21 신고

      저도 이 문장을 볼 때마다 앞 부분에 끌리다가 뒷부분이 마음에 걸려서요.. 대조가 심해 제가 아는 영어가 맞나 의심이 가더라구요. ^^;
      오랜만에 뵙습니다 ^^; 그동안 많이 바쁘셨나 봐요?.

  • 프로필사진
    BlogIcon Hwan2008.02.03 21:13

    혹시나 해서 댓글 씁니다만... Programming Pearls의 pearl 은 PERL(Practical Extraction and Reporting Language)이 아닌 것은 눈치 채셨죠? 본문 중에 둘 다 pearl이라고 쓰셨길래... ^^ 그냥 진주라는 뜻이니까... 직역하면 '프로그래밍의 보배' 정도가 되지 않을까요? 참고로 원서 표지에는 진주가 그려져 있더군요. ^^

    개인적으로 웹스크립트 언어가 지금처럼 풍부하지 않던 시절 CGI를 구현하는 언어로 Perl이 각광 받아서 조금 배웠었습니다. 당시에는 PC 통신이 유행이었는데 학교 동아리에서 웹 BBS를 만들자고 C로 CGI를 짜는데 POST로 넘겨준 데이터 파싱하는 함수를 만들면서 정말 삽질이라는 걸 느꼈죠. 그래서 배웠던 것인 perl인데 이제는 PHP, ASP, JSP 등등 워낙 좋은 툴이 많으니...

    • 프로필사진
      BlogIcon esstory2008.02.05 12:49 신고

      PERL 이 PEARL 인 줄 알았습니다. -- 무식 ㅠㅠ
      제가 아는 버전은 CGI 가 전성이던 시절 잠시 그런게 있나 보다 했는데 그 사이 한참 뭐가 많이들 생기더라구요.. 웹은 정말로 변화가 심한 분야인듯. 저희 회사도 ASP, JSP 하는 사람들이 섞여 있는데 시너지 효과가 없어서 하나로 합칠까 고민 중이예요. 하지만 각각이 장단점이 있는데다 이전에 워낙 해 놓은 일들이 많타보니 엄두가 나질 않더군요. 어찌 정리될 지 ^^;

  • 프로필사진
    BlogIcon 오스카2008.02.03 21:25

    저같은 경우 2d/3d 이펙트를 구현할 때 항상 선형대수, 물리학 책을 옆에 끼고 봅니다. 가끔 미적분학이 나오긴 합니다만...

    게다가 공식을 그대로 적용할 수 있으면 좋은데, 실제 물리 모델을 적용하는 건 너무 느리고 해서
    적당히 비슷하게 보이도록 간략화 시켜야 하는 것도 문제죠. 사실 이런 간략화 모델이 많이 연구되어 있어서 가져다 쓰지만...

    • 프로필사진
      BlogIcon esstory2008.02.05 12:50 신고

      게임쪽은 위에 제가 적은것과는 비교가 안되는 복잡한 수학이 많겠네요
      저는 머리가 나빠 그쪽에서 개발안하기 정말 다행인것 같습니다 :)

  • 프로필사진
    BlogIcon 맑은독백2008.10.09 14:49 신고

    좋은 글 잘 보고 갑니다.. ^^
    더불어 사진도 잘 보고 가네요...
    사진 찍는 프로그래머를 만나니 괜히 반가워서..
    덧글 남기고 가네요 :)

    • 프로필사진
      BlogIcon esstory2008.10.09 14:53 신고

      저도 프로그래머 분들을 만나는게 제일 기쁘네요
      자주 들르겠습니다. 감사합니다

  • 프로필사진
    BlogIcon namo2011.12.06 09:14

    이 책에 관해 리퍼런스 블로그로 링크 하였습니다.(위치: http://namoda.springnote.com/pages/9849064 ) 문제가 된다면 알려주세요~