수많은 선구자들은 “기술적 영감- techinical inspiration”이라는 걸 얻어서 컴퓨터-기술역사에 한 획을 긋고 자신의 이름을 후세에 널리 알림과 동시에 저서를 통해 후세들이 먹고 살 기반까지 마련해주는 경우가 종종 있다. 비록 짧은 50년의 역사이긴 하지만, 가장 급속도로 발전한 학문분야라고 할 수 있으며, 수학에 단련된 천재라면 당연한 일이라고 생각될 수 도 있다.
하지만, 소프트웨어 개발자라면 당연히 갖고 있어야 하는 것이 저 영감이다. 소프트웨어는 본질적으로 사람이 하는 일/하고 싶은 일을 어떻게 모사해 놓은 것이다. 이런 관점에서 소프트웨어를 바라볼 경우, 실세계에서 존재하는 로직/구조를 컴퓨터로 어떻게 옮기는 것이 나을지를 고민하는 것은 너무나도 당연해 보인다. 같은 주제/사물을 놓고 사람들이 바라보는 점, 해석하는 점이 다르듯이 소프트웨어 개발자도 당연히 각자 다른 모습으로 실세계를 바라보게 되며, 서로 다른 방식으로 모사를 하게 된다. 여기서 영감이란 무엇을 바라볼 것인지, 어떻게 바라볼 것인지, 선구자들이 해놓은 것을 어떻게 가져다 쓸 것인지에 대한 영감이라 볼 수 있다.
글을 읽어보아도, 같은 내용을 이해하기 쉽게 써놓은 글도 있고, 정말 이해하기 어렵게 꼬아놓은 글도 있다. 소프트웨어 코드도 마찬가지다. 같은 주제를 놓고 자신의 생각을 정리하지 않은채 메모하듯이 짜놓은 코드와 일목요연하게 정리해서 주석까지 달아놓은 코드 중 어느 것이 가치가 높은 코드인지는 자명할 것이며, 되는대로 써놓은 마치 산문시같은 정신없는 코드와 관점을 명확히 보고 철학을 가진 에세이같은 코드중 어느 것이 읽기 쉽고 수정하기 쉬운 코드인지는 너무나도 명확하다.
정신없이 꼬아진 스파게티 같은 코드들은 분명 개발자가 고민이 없었던 것이며, 영감이 없었던 것이다. (그리고 시간이 없었던 것이다.) 그 개발자가 고민이 있었다면, 영감이 있었다면, 작업을 하면서 스파게티를 일목요연하게 풀어냈을 것이며 깨달음과 같이 다가온 영감을 이용해 그 부분에서 적절한 구조를 찾아내 적용했을 것이다. 그리고, 버그를 수정하는 일도, 소프트웨어를 최적화하는 일도 훨씬 쉬웠을 것이다.
일종의 깨달음과 같이 다가오는 영감은 소프트웨어의 구조를 생각해내는데 있어서 매우 중요하다. 그리고, 선구자들이 써놓은 책들은 영감을 얻는데 있어서 최고의 보물섬이라고 볼 수 있다. 지금까지 가장 많은 영감을 얻었던 책인, GoF의 Design Pattern같은 책을 예로 들 수 있다.
GoF의 Design Pattern같은 책은 영감의 원천으로 활용해야 한다. 그들이 만들어놓은 디자인 패턴들이 각각의 소프트웨어 프로젝트에 정확히 맞는다는 보장도 없고, 그대로 가져다 쓸 경우 맞지않는 옷을 억지로 입혀놓은 듯한 모습을 갖게되는 경우가 대부분이기 때문이다. 실제로 Command패턴 같은 경우는 대부분 복잡하게 클래스를 만들지 않아도 boost::function과 boost::bind로 간단하게 해결이 될 수 있다. 물론 이런 일들을 하기 위해서는 Command 패턴에 대한 이해가 충분히 되고, 이 패턴에서 영감을 얻었을 때만 가능한 일이다.
선구자들의 기술을 그대로 기억하고 따라하지 말라. 그들이 무엇을 했는지는 중요하지 않다. 그들이 왜 그렇게 했는지가 중요하며, 어떤 철학과 패러다임으로 그렇게 했는지가 중요하다. 그리고 그들이 어떻게 영감을 얻었는지를 고민해야 한다. 그것을 이해하고 체화했을때 비로소 재생산이 가능해지며, 자신의 철학/패러다임을 찾아갈 수 있다. 물론, 자신의 철학/패러다임은 시간이란 변수에 종속된 함수가 되어야 하겠지만 말이다.
+1 교조주의는 언제나 타파되어야 합니다. 🙂
+2 코딩은 언제나 즐겁게. 설계는 언제나 아름답게.
+3 영감은 언제 어디서나 얻을 수 있어야 하겠지요.
코딩도 이런글 쓰듯 열심히 하면 된다는 좋은 교훈이네.
what 보다는 how 를 아는게 중요하고,
본질을 파악하는게 중요하며,
글쓸때에나 코딩할때는 장인정신으로 교정작업을 필요로 하고.. 🙂
그런거지.
안다라는 것을 체득한다는 것이 영감의 일부가 되는 것이고. 🙂
근데 사실보면 쓸모없는 장인정신일때도 많은듯. orz
폴 그라함은 대부분의 디자인 패턴이 객체지향 언어의 구조적 한계 때문에 발생한 것으로 보더군요.
아직은 수긍도 부정도 하지 않지만 더 공부해보고 싶습니다. 안드레이는 여기에 대해서 어떻게 생각할려나요.
객체지향 언어의 구조적 한계때문에 디자인 패턴이 발생했다는 폴 그라함의 이야기는 어느정도 수긍이 갑니다만, (사고가 언어에 의해 제한된 케이스겠지요.) 디자인 패턴을 OOP라는 패러다임 내에서 실세계를 모델링하는 잘 만든 예제정도로 취급하고 있는 저로서는.. 음;
안드레이씨는 패러다임에 자유로운 사람이란 생각이 종종 들어서.. (제가 오버하는 걸 수도 있습니다. 그리고 안드레이씨 글 너무 어렵게 써요. -ㅅ-)
프로그래밍 언어에 존재하는 패러다임을 실세계를 모사하는 방법/단계로 생각해본다면, 그 층위가 더욱 높아질 가능성은 농후하다고 봅니다. 다만, 절차적 프로그래밍이 아직도 특정 도메인에 남아있는걸 생각해본다면, 객체지향 프로그래밍도 역시 그런 절차를 밟지 않을까 생각되네요. 🙂
+ boost::lambda공부해보고 있는데.. 역시 C++의 한계가 좀 느껴지더군요. 으흑.