2009.06.15 10:49

코더(Coder), 프로그래머(Programmer), 소프트웨어 아키텍트(Software Architect), 그리고 구루(Guru)


최근 친구를 만나서 이런 저런 이야기를 나누더 중 코더(Coder)에 관한 이야기가 나왔습니다. 이야기를 나누면서 저 나름대로의 정의를 설명해 주었는데, 여러분과도 함께 나누고 싶어서 글을 올립니다.

 

코더(Coder)란 무엇일까요?

소프트웨어 업종에서 개발하는 사람들에게 코더란 의미는 상당히 나쁜 의미로 받아들어지고 있습니다.

 

사전 상에서도 Coder란 뜻은 "코딩(Coding)하는 사람"이란 뜻입니다. 하지만 프로그래머(Programmer)도 코딩을하고 소프트웨어 아키텍트(Software Architect)도 코딩을 합니다. 그리고 우리가 가장 존경하는 구루(Guru)도 코딩을 합니다. 우리가 잘 알고 있는 유명한 구루(Guru)인 리처드 스톨만(Richard Stallman)도 코딩을 합니다.

과연 코더와 프로그래머와 소프트웨어 아키텍트 및 구루를 나누는 기준은 무었일까요?

 

개인적으로 코더와 프로그래머와 소프트웨어 아키텍트 및 구루의 차이는 가지고 있는 사상의 차이라고 생각합니다.

어떠한 소프트웨어를 개발하면서 소프트웨어의 설계문서를 보면서 저는 자신의 사상보다는 다른 사람들의 사상을 바탕으로 소프트웨어를 개발하는 사람들을 코더라고봅니다.

즉 소프트웨어의 근본적인 사상이나 본래의 기능등에 대한 깊이있는 고민이나 사상이 없이 소프트웨어 디자이너(Software Designer)나 프로젝트 매니저(Project Manager; PM)나 프로젝트 리더(Project Leader; PL)가 시키는 일을 하며 소프트웨어를 개발하는 사람들을 코더라고 볼 수 있습니다.

하지만 코더를 나쁜 의미로 볼 필요는 없습니다.

왜냐하면 전문 코더(Professional Coder)는 소프트웨어 개발에 관련된 전문적인 지식을 바탕으로 소프트웨어가 필요로하는 기술(Technology)를 제공하여, 소프트웨어가 훌륭하게 구현될 수 있도록 지원하는 사람이라고 볼 수 있습니다.

일예로 Java 진영에서 가장 많이 사용하는 Eclipse의 경우 전문 코더의 헌신적인 노력으로 구현된 최고의 IDE입니다. 전문 코더에 대한 인터뷰를 나중에 올리겠습니다.

따라서 전문 코더(Professional Coder)는 소프트웨어 업계에서 나름대로 존중하여야 할 직종이라고 생각합니다.

이를 위해서는 코더 자신이 소프트웨어 설계 문서를 면밀하게 분석할 줄 알아야하며, 최적의 로직을 구현하기 위하여 알고리즘(Algorithm)이나 자료구조(Data Structure) 및 각종 개발 스킬 등을 잘 알고 있어야 합니다.

이렇게 종합적으로 개발 관련된 지식들을 잘 알고 계신 분들이 있어야 소프트웨어가 더욱 탄탄하게 구현될 수 있으며, 이런 분들이 다양한 소프트웨어를 구현하면서 쌓은 경험이나 지식을 계속 소프트웨어의 발전을 위하여 쏟을 수 있는 환경을 제공할 필요가 있습니다.

아직 우리나라에서는 이러한 전문 코더에 대한 이해나 직업상의 인정이 부족한 것이 사실이지만, 개발하여야 할 소프트웨어가 많아지고 기술적인 난이도가 높아질수록  전문 코더의 필요성이 커질 것이라고 예상합니다.

 

그렇다면 프로그래머(Programmer)란 무었일까요?

프로그램(Program)을 창조하는 사람(someone whose job is to create computer programs)을 프로그래머(Programmer)라고 합니다. 여기서 코더와 프로그래머를 나누는 기준이 생기는데 창조하는 것입니다.

소프트웨어를 창조하려면 소프트웨어에 대한 이해나 사상이 있어야 합니다.

즉, 프로그래머의 경우 자신의 사상을 바탕으로 소프트웨어를 만드는 사람을 의미하며, 이러한 사상이 있다면 프로그래머라고 생각합니다.

대부분의 모든 개발자들이 프로그래머라고 볼 수 있습니다. 프로그래머 역시 코더와 마찬가지로 소프트웨어를 훌륭하게 개발할 수 있는 개발 기술을 갖추고 있어야하며, 더 나아가 소프트웨어를 설계할 수 있는 설계 능력이 있어야 한다고 생각합니다.

소프트웨어의 기능정의부터 각종 설계서를 작성할 줄 알아야 합니다. 왜냐하면 자신의 사상을 논리적으로 표현하고 이를 다른 사람들에게 공유할 수 있어야 하기 때문입니다. 자신의 사상을 기술하고 이를 바탕으로 소프트웨어가 개발될 수 있도록 좋은 설계문서를 만드는 일은 프로그래머에게 중요한 일이라고 생각합니다.

이러한 요건을 갖추었다면, 저는 프로그래머라고 생각합니다.

 

 

그렇다면 소프트웨어 아키텍트(Software Architect)란 무엇일까요?

소프트웨어 아키텍트는 프로그래머의 사상을 더욱 확장해서 생각할 수 있는 사람을 의미합니다. 소프트웨어에 필요한 계획이나 정책을 세울 수 있으며, 이를 구체적으로 실행할 수 있는 사람(the person who has the idea for something such as a plan or policy and makes it happen)을 의미합니다.

특히 소프트웨어 아키텍트는 소프트웨어의 전체적인 구조를 결정하고 소프트웨어 전반에 영향을 미치는 부분들을 책임지고 결정하는 사람입니다. 따라서 넓은 안목을 가지고 있어야 하며, 가장 핵심이 되는 부분에 대한 결정적인 방향을 제시할 수 있어야 합니다.

마치 CEO와 같은 안목을 가지고 있어야하는데, 소프트웨어 아키텍트의 결정에 따라 소프트웨어 개발이 쉬워질 수 도 있고 어려워질수도 있기 때문입니다.

잘못된 소프트웨어 아키텍쳐(Software Architecture)를 제시하는 화성인 아키텍트의 경우 잘못된 소프트웨어 아키텍쳐를 제시하여 소프트웨어 관련 프로젝트에 종사하는 사람들을 수령에 빠뜨리며, 결국 관련된 모든 사람들이 "죽음의 행진(Death March)"을 하게 만듭니다.

아울러 분명히 코더나 프로그래머들은 36시간 연속 코딩을하면서 죽어라고 고생하였음에도 불구하고, 고객(혹은 사용자)에게 혹평을 받는 소프트웨어를 만들어 냅니다.

우리나라에는 수 없이 많은 화성이 아키텍트들이 존재합니다. 물론 이분들의 노력이 헛되었다는 것은 아닙니다. 하지만 올바르지 못한 사상을 가진 아키텍트가 만들어내는 결과는 너무나도 끔찍합니다.

그래서 전 소프트웨어 아키텍트는 정말로 올바른 사상을 바탕으로 소프트웨어를 올바르게 설계 및 구현될 수 있도록 모든 과정을 책임질 수 있는 사람이라고 정의하고 싶습니다.

특히 올바른 사상이 없거나 자신의 결과에 대한 당당한 책임을 지지 않는 소프트웨어 아키텍트는 화성인이라고 부르고 싶습니다.

화성인 아키텍트에 관한 자세한 내용은 조엘 온 소프트웨어란 책을 참고하세요~

 

마지막으로 구루(Guru)란 무엇일까요?

마지막으로 우리가 존경에 마지않는 구루(Guru)는 소프트웨어 아키텍트의 사상과 책임은 물론 자신의 믿음을 행동으로 실천하는 깨어있는 사람을 의미합니다.

여기서 코더나 프로그래머나 소프트웨어 아키텍트와는 다른 기준이 적용됩니다. 바로 믿음을 실천하는 것입니다.

원래 구루라는 용어는 인도에서 유래된 용어입니다. 구루는 힌두교에서는 랍비와 비슷한 의미이며, 자신의 믿음을 실천하고 이를 널리 알리어 진실한 깨달음으로 이르게 하는 사람을 의미합니다.

공통적으로 인도에서 사용하는 구루의 의미는 위와 같지만, 인도내 여러 종교마다 약간씩 구루의 의미가 다릅니다.

대체로 소프트웨어 업계에서 구루라는 의미는 해당 소프트웨어 분야에 많은 지식과 경험을 가지고 있는 사람을 의미하지만, 진정한 구루는 지식과 경험을 바탕으로 자신의 사상을 실천하는 사람이라고 생각합니다.

소프트웨어 업계에서 가장 많이 알려져있는 대표적인 구루가 리처드 스톨만(Richard Stallman)인데, GNU 운동을 실천하여 오픈소스 진영에 지대한 사상적인 영향을 미쳤으며, 소프트웨어를 모두 함께 나눌 수 있는 사상을 제공하고 실천하는 사람입니다.

이렇게 구루는 단순히 많은 지식과 경험을 가지고 있는 사람이 아니라 자신의 사상을 실천하는 사람이 진정한 그루라고 생각합니다.

 

이렇게 소프트웨어 분야에서 대표적인 직종에 대한 나름대로의 구분점을 정리하였습니다.

생각하기에 따라서 여러분들도 각기 다른 정의를 하실 수 있습니다만, 사상의 크기와 이를 얼마나 실천할 수 있고 책임질 수 있는가에 따라 구분하는 것이 가장 명확한 구분요소라고 생각합니다.

끝까지 읽어주셔서 감사합니다. ;-)

[참고]http://blog.java2game.com/213?srchid=BR1http%3A%2F%2Fblog.java2game.com%2F213

Trackback 0 Comment 1
  1. HoOHoO 2009.06.21 19:39 신고 address edit & del reply

    역시 컴퓨터 내용은 어려운거같아요 ㅜ
    그래도 좋은 정보 감사합니다^^