[잡생각] 완전체가 되어보자?!? : 제우스님의 글을 트랙백 합니다.
완전체라는 말이 잘 쓰이는 말은 아닌데, 그렇다고 철학에서 플라톤이 언급했다는 철인() 보다야 사람들의 귀에 더 잘 감길 듯 하여 트랙백한 글에서 사용한 표현을 그대로 쓰고 한다.
그냥 월급 받기 위해서 일용직으로 개발자들도 많지만, 그래도 많은 개발자들의 자신의 미래, 나아가야 할 방향에 대해서 고민하기 마련이다. 짧게 말해서, '10년 후에는 뭐 먹고 사냐?' 이거다... 그래서 '수련' 이라는 걸 하기는 해야 겠는데 뭘 해야 할지도 모르겠고, 뭐 그런 거 할 여력도 없는 경우가 태반이다. 그나마 노력하고, 학습한다는 사람들 중 부쩍 눈에 잘 띄는(?) 경우는 기술자 자격증 따거나, 아부의 기술 (꼭 나쁜 건 아니다)을 익히거나, 처세술을 연마하고 인맥을 쌓는 사람들이다. 왠지 자신감 있어 보인다고 할까? 결과의 질을 떠나서, 짧은 시간에 변화가 나타나기 때문에 더욱 잘 눈에 띄는지도 모른다. 허나, 이런 건 나름 선천적인 재능도 필요한 것들이라서, 소위 A형 혈액형 혹은 A형 혈액형의 성격을 타고난 소프트웨어 개발자들에게는 권장할만한 테크 트리가 아니다.
그렇다면... 사람 얼굴 쳐다보기 보다 모니터 바라보는 게 편하고, 애인 얼굴보다 코드를 더 자주 접하며, 마누라 보다 버그랑 더 많이 싸우는 이들에게 권장할 만할 테크 트리(tech tree)는 대체 뭘까?
언어를 열심히 수련해라? 나름 프로그래밍 언어를 십수년 연마해 봤는데, 프로그래밍 언어는 소프트웨어 개발 패러다임이 변화하는데 따라 유형처럼 뜨고 진다. 한가지 언어에 집착하다가는 특정 시대에 박제되어 화석으로 남겨질 뿐이다. 물론 예외는 있다. 코볼의 귀족들은 여전히 귀족이라고 한다. 그런데 코볼 같은 언어가 다시 나타날까? 과거는 과거일 뿐... C 언어를 잘하는 사람은 살아남을 것이다. 그런데 그건 C를 잘해서 살아남는게 아니라, 언어를 학습하면서 익히게 되는 하위 레벨 시스템에 대한 이해도가 높고, 성능 및 자원 관리에 대한 고급 스킬 능력자는 늘 귀하기 때문이다. (C언어로 OOP도 할 수 있다. 하지만, C++f로 만드는 것보다 몇 배의 노력이 필요하다.)
특정 도메인에 대한 지식을 쌓아라? 검색 엔진 개발자 라거나 자연언어 처리 전문가, 보안 전문가 라거나... 한 때 이런 식으로 개발자를 분류하는 이야기를 많이 접한 듯 하다. 이건 순수 개발자 테크 트리는 전혀 아니라고 본다. 물론 소프트웨어 개발자는 오로지 성능과 효율 면에서 우수한 코드만 짤 수 있는 사람이어야 한다는 말도 아니다. 다만, 특정 업무에 대한 지식을 많이 가지고 있다고 해서 유능한 개발자가 되는 것이라고 오해하지 말자는 것이다. 여기서 말하는 개발자는 구현(implement)하는 사람이지, 계획하고 설계 하는 사람들을 말하는 것이 아니다.
요즘 업무에 필요해서 몇가지 오픈 소스 (C++ 로 작성된 있고, Java로 구현된 것들도 있고...)들을 분석하고 있는데, 이런 말을 자주 접하게 된다.
Using *** is quite simple...
좋은 라이브러리나 오픈 소스를 사용해 보면 복잡한 기능 조차들도 정말 단순하면서도 우아한 코드를 작성할 수 있다는 것을 알게 된다. 허나, 그 내면에는 아주 복잡한 장치들이 정교하게 구현되어 있다. 진정한 구루(guru)들의 코드는 복잡한 내면은 감추어 둔 체, 오로지 손쉬운 사용법 만을 드러낸다.
유능한 프로그래머는 추상화(abstraction)를 잘 할 줄 안다. 추상화란 무엇인가? 한 마디로 백조의 호수라고 표현할 수 있다. 물 위를 흘러가듯 나아가는 백조는 편안하고 우아해 보이지만, 그 아래에서는 거친 물갈퀴 짓을 쉼없이 해대고 있는 것이다. 유능한 개발자는 우아한 인터페이스를 이용해서 다른 개발자들을 편안하게 해준다. 하지만, 그 자신은 남들에게 보이지 않는 치열한 고민과 노력을 이어가는 사람이다.
유능한 개발자는 혼자서 전체 시스템을 만들지 않는다. 그들은 혼자서 수십억, 수백억의 프로젝트를 해내는 수퍼맨이 아니다. 혹은 천재적인 재능으로 그 누구도 상상하지 못했던 소프트웨어를 만들어 내는 사람도 아니다. 그런 광기어린(?) 존재들은 그저 구름 위를 떠다니는 사람들이라고 이야기하자. 지금 이야기 하고 있는 주제는 태어날 때부터 창조자의 축복을 받은 사람들에 관한 것이 아니라, 평범한 재능을 바탕으로 더 나은 존재가 되고자 하는 사람들이 나아갈 길이다. 유능한 개발자는 시스템의 내부 관점에서 세상을 바라볼 줄 한다. 하지만, 시스템의 복잡한 내부를 그대로 드러내는 것이 아니라, 아름다운 외관만을 보여줄 뿐이다.
조금 다른 질문을 하나 던져 본다. 소프트웨어 기술은 끊임없이 변화한다. 그렇다면 평생을 공부해야 하는 혹은 평생 변화를 추종해야 하는 소프트웨어 개발자들이 완전한 레벨(혹은 만렙)에 도달하는 것은 어려운 일일까? 그렇지 않다고 본다. 왜냐하면, 소프트웨어 기술 혹은 하드웨어의 아키텍쳐가 어느 날 갑자기 바뀌는 것은 아니기 때문이다. 양자 컴퓨터가 개발되는 날이 언제인지 모르겠지만, 적어도 20년 혹은 앞으로 30년 정도는 폰 노이만 박사가 구축(혹은 발명)해 놓은 하드웨어 패러다임은 변하지 않을 것이다. 병렬 프로그래밍 기법이 중대한 화두가 되는 시점도 있겠지만, 글쎄 아직은 소수만을 위한 기술이 아닐런지... 한마디로 절차적 프로그래밍 기법 자체를 잘 이해하는 것만으로도 수십년은 잘 먹고 잘 살거라 생각한다.
소프트웨어 개발자로서 완전체가 된다는 것. 혼자 모든 걸 다 해내는 사람은 되는 게 아니라고 생각한다. 그럼 무언가? 앞서 이야기한대로 추상화를 잘해내는 사람이 아닐까? 그래서, 타인들과 함께 잘 협력할 수 있고, 팀과 회사 나아가 세상에 기여하는 사람이 된다는 것이 아닐까? 누구라도 그와 함께 일하고 싶어하는 그런 사람이 되는 것이다.
호수를 떠 다니는 백조처럼 우아한 모듈을 만들어 내야 한다. 그러기 위해서는 물 위와 아래를 동시에 볼 수 있어야 한다. 그리고 자연스레 어우러지게 해야 한다. 그가 만들어내는 코드는 사용하기가 쉬어야 하면, 또한 거의 모든 상황에서 잘 동작해야 한다. 또한 가장 기본적인 것이지만, 고객 혹은 사용자의 요구 사항을 충족할 수 있어야 한다. 그 내면은 매우 정교해야 할 것이다. 이런 능력은 단지 지식을 많이 쌓아감으로써 얻어지는 것이 아니다. 자기를 만들어내는 도공의 섬세한 손길은 결코 짧은 세월에 완성될 수 없는 것과 마찬가지다.
P.S. 그냥 대충 떠오르는 대로 두서없이 써내린 글인데... 나중에 다시 쓸지는 모르겠음...