Blub 레벨 높이기

갑->을이라고 할 때: '갑'는 '을'보다 자신이 더 잘났다고 생각한다.
갑<->을 이라고 할 때: '갑'과 '을'은 둘 다 자신이 더 잘났다고 생각한다.

c0037181_04030621.gif
출처: 프로그래머 서열

.

Beating the Average라는 글에 보면 Blub Paradox라는 말이 있습니다. Blub Paradox를 이해하기 위해서는 먼저 프로그래밍 언어는 모두 가지고 있는 힘이 다르다는 사실을 인정해야 합니다. C언어가 기계어보다 더 강력하듯이 python이나 C++, ruby, java, lisp 등의 고급 언어들 사이에도 이런 서열이 존재한다는 것이죠.

그럼 이제 Blub이라는 가상의 언어를 생각하고 이 언어를 현재 우리가 사용하고 있는 언어라고 합시다. 이 언어가 COBOL보다는 강력한 언어라고 가정하면 서열은 다음과 같습니다.

기계어 < COBOL < Blub < ?


이제 Blub 프로그래머가 아래, 즉 COBOL과 같은 언어를 보면 COBOL이 왜 Blub보다 약한 언어인지를 알 수 있습니다. 자신이 사용하고 있는 Y라는 기능이 COBOL에는 없기 때문이죠. 심지어 어떻게 Y라는 기능도 없는 언어로 프로그래밍을 할 수 있는지 궁금해 합니다.

하지만 반대로 위를 올려다보면 우리는 우리가 보고 있는 것이 무엇인지를 깨닫지 못합니다. 단지 Blub으로도 할 수 있는 일을 이상한 문법이나 방법으로 하고 있다고 생각하기 쉽죠. 결국 그 언어가 왜 Blub보다 강한지 알지 못하는데 이를 Blub Paradox라고 합니다. 이렇게 더 강한 언어의 강력함을 이해하지 못하는 이유는 바로 우리가 현재 Blub의 높이에서만 생각할 수 있기 때문입니다.

위의 내용에서 유추해보면 결국 모든 언어의 장/단점과 차이를 이해하기 위해서는 가장 강력한 언어를 알아야 한다는 결론이 나옵니다. 물론 위에서 언급한 Paul Graham의 글에서는 이 언어가 Lisp이라고 이야기하고 있죠.

얼마전까지 제 Blub은 C++였습니다. 이전엔 python을 그저 C++의 인터프리터 버전으로 간주하고 사용했습니다. 즉, C++로도 할 수 있는 일만 python으로 했던 것이죠. 그런데 지난주에 테스트 자동화 툴을 python으로 작성하다가 실제 테스트 케이스를 작성할 사람들을 위해 자동으로 테스트 케이스가 등록되도록 python의 reflection 기능을 공부하여 사용하게 되었습니다. 이 기능을 사용하다 보니 이런 생각이 들더군요. "reflection 기능도 없는 C++에서 앞으로 이런 작업을 해야 하면 어떻게 하지?"

이를 계기로 제 Blub 레벨이 조금은 올라가지 않았나 생각합니다.

저도 C++이라는 언어에 대해서는 제법 잘 알고 있다고 생각하는데 Lisp이나 Smalltalk같은 언어를 아는 사람을 보면 괜시리 주눅이 들곤 합니다. 아마 저보다 높은 Blub 레벨을 가지고 있어 저보다 넓은 시야를 가지고 있을거라 생각하기 때문이었을 겁니다. 저도 Lisp의 경우엔 몇번 배우기를 시도해 보았는데 매번 더 재밌거나 더 급한 일들이 생겨 실패하곤 했습니다. 올해 다시 한번 Lisp이나 Smalltalk에 도전해서 Blub 레벨을 올려 봐야겠습니다.

그나저나 위의 그림을 보니 Java는 제대로 안습이군요. :-) Java가 제가 별로 좋아하는 언어가 아니라 다행입니다. 아니었다면 상처 받았을 듯.

Comments

  1. 전 template없이 어찌 코드를..

    이란 생각을 할때가 있다는.. 킁;

    ReplyDelete
  2. 저랑 Blub 레벨이 비슷하시군요. :-) template도 그렇지만 전 destructor가 없어서 RAII가 안되는 언어들을 만나면 대략 난감입니다. 보통 그런 언어들이 RAII 대신 사용하는 try~finally 블록은 어딘지 우아하지가 않아 보여요.

    ReplyDelete
  3. 그게.. 신기하게도 실제로 Java 프로그래머들은 이유없이 C#, C, C++ 등의 언어에 대해 열등감을 가진 것 처럼 보입니다.
    반면 Ruby 프로그래머들은 세상에 루비만 있는 줄 알죠.
    잘 작성된 표 같습니다. ㅎㅎ

    ReplyDelete
  4. 음.. 그리고 C++에는 비록 reflection이 없지만, template meta programming이라는 강력한 도구가 있잖아요...

    ReplyDelete
  5. 아마 Ruby 프로그래머들의 자존심은 자신들이 그래도 제일 Lisp의 후계자다라는 생각이 있어서 그런건 아닐까요? Java는 저번에도 한번 썼던 것 같은데 eclipse만 없었더라면 C/C++과 Python, Ruby같은 script 언어들 사이에 끼어서 고생하지 않았을까 싶네요. 언어 자체에 문제가 있다기보다는 언어로써의 위치에 문제가 있는 것 같습니다. 물론 언어 자체가 좀 재미가 없다는 사소한(?) 문제도 있긴 하죠. :-)

    그리고 C++의 template meta programming이 강력하긴 하지만 실제 현장의 프로그래머들이 작성하는 코드에서 얼마나 쓰이고 있는지는 의문입니다. 게다가 기능이 강력한 만큼 readability와 understandability가 떨어져 maintainability가 현저히 낮아지는 문제도 있습니다. 제가 속한 프로젝트에서 template이 쓰인 코드들은 전부 제가 만든 것들인데 이 코드를 본 사람들이 질문이라도 하면 어디서부터 설명해야 할지 막막할 때가 자주 있습니다. template -> template specialization까지만 이해시키려 해도 쉽지 않거든요. 암튼 template meta programming이 누구나 사용할 수 있는 유용한 개발 도구가 될지 아니면 라이브러리 제작자들이나 사용하는 도구가 될지는 좀 더 지켜봐야 할 것 같습니다.

    그리고 bloglines에 한동안 글이 없다 했는데 블로그가 접속이 안되네요. :-| 바쁘신가봐요. 얼른 다시 문 여시길 기다리고 있겠습니다. ;-)

    ReplyDelete

Post a Comment

Popular Posts