2008/10/06 10:25

프로그래머가 알아야 할 것

  필자는 이 글에서‘프로그래머’라는 단어를 꽤 폭 넓은 의미(소프트웨어 전문가, software professional)로 재정의해 사용했지만, 실제로는 그렇지 못하고 그 역할이 프로그램 개발 전체과정의 극히 일부분, 즉 소프트웨어 구축에 머무는 경우가 많고, 또 개발자 스스로도 자신이 해야하고 알아야 할 것은 그것이 전부라고 여기는 것을 많이 볼 수 있다. 더 나아가 어떤 이들은 자바나 C++, 마이크로소프트 윈도우 NT 등과 같은구체적인 지식이 자신이 알아야 할 모든 것이고 그것을 알면 전문가가 될 수 있다고 생각하는 경우도 있는 것 같다.

  한 사람이 소프트웨어를 개발하기 위해 알아야하는 모든 지식의 절반이 약 삼 년이면 모두 퇴물이 된다고들 한다. 하지만, 어떤 분야가 좀 더 발전하고 성숙해지면서 그런 종류의 지식들과 동시에 수십 년간 변하지 않는 원칙과 원리도 늘어난다. 이런 원칙은 구체적인 기술이 바뀌어도 늘 적용된다. 「No Silver Bullets-Essence andAccident in Software Engineering」을 쓴 프레드 브룩스는 본질(essence)과 비본질(accident)적 성질을 구분하고 있다. 양자는 서양철학의 용어로, 예컨대 자동차에서 기어 변속이 자동이라거나 혹은 수동, 차의 색깔이 어떤 색이라는 것, 타이어의 폭과 같은 것은 비교적‘우연적이고 비본질적’인 성질이라는 것이다. 반면 자동차가 되기 위해 반드시 갖춰야 할 성질을‘본질적 성질’이라고 할 수 있다. 엔진을 갖는다든지 하는 것들 말이다.

  그렇다면 소프트웨어 개발에 있어 비교적 오래 지속될 본질적인‘핵심’지식은 어떤 것일까. 이런 집합을 정의할 수 있을까.

  ACM과 IEEE를 비롯한 학계와 산업계의 수많은 참여자들과 함께, UQAM(Universite du Quebec a Montreal)이라는 대학에서 주도적으로 진행하는 연구가 있는데, 여기선 소프트웨어 엔지니어링에서 일반적으로 받아들여지는 소위 핵심 지식을 찾는 작업을 하고 있다. SWEBOK(Soft ware Engineering Body of Knowledge, http://www.swebok.org)이라고 하는 이 프로젝트는 한마디로 소프트웨어 전문가가‘알아야만 할‘ 내용을 찾는 노력을 하고 있는 것이다.

  SWEBOK에서 정한 핵심 지식을 크게 보면, 소프트웨어 설계(Design), 구축(Construction), 테스팅(Testing), 형상 관리(Configuration),품질 공학(Quality Engineering), 프로세스(Process) 관리 등이 있다(이 큰 줄기에서 좀더 구체적인 부분들로 세분화된다). 여기서 프로그램을 구체적으로 설계하고, 코딩하고, 디버깅을 하며, 성능 최적화을 수행하는 것 등은 개발자가자신이 하는 모든 일이란 거의 소프트웨어 구축이라는 한 가지 지식일 뿐이다. 혹시 자신이 해야 하는 일이 아니라고 생각하는 사람에게는 스티브 맥코넬이 말한“소프트웨어 전문가라면 모든 분야에 대해 최소한 개론적 지식을 갖춰야 할 것이고, 대부분에 대해 어느 정도의 능력을 가져야 하며, 이 중 일부에 대해서는 거의 통달할 수 있어야 한다”를 전하고 싶다.


  그런데 이쯤 되면 이런 것들의 실효용에 대해 의문을 제기하는 사람이 있을 것이다. 작년 IEEE Computer 저널에 흥미로운 연구 결과가 발표됐다(What Knowledge Is Important to aSoftware Professinal?, Lethbridge, Timothy C., IEEE Computer, May 2000). SWEBOK과 대학의 커리큘럼에서 75개의 주제를 선택해 각각에 대해, 북미지역 및 유럽의 소프트웨어 전문가(평균 10년 정도 종사한 사람들로 프로젝트 관리자나 프로그래머들) 200여명에게 몇 가지 질문을 하고 그 결과를 분석했다.

  이 분야의 전문가라고 할 만한 사람들이 생각하는 가장 중요한 주제는 무엇이었을까. 특정 지식이 주는 유용성과 자신의 사고에의 영향 등의 측면에서 중요성을 평가했는데, 중요 항목 20개를 뽑으면 다음과 같다[주: 어떤 분야의 전문가라고 자처하는 사람이 본인이 생각하는 중요한 지식, 기술을 얘기하는 것은 개인체험의 한계를 가질 수밖에 없다. 따라서 이런 통계적인 연구를 통해 검증된 자료가 중요한 가치를 갖는다].

 01. 특정 프로그래밍 언어들
 02. 자료 구조
 03. 소프트웨어 디자인과 패턴
 04. 소프트웨어 아키텍처
 05. 요구사항 수집 및 분석
 06. HCI(Human Computer Interaction) 및 유저 인터페이스
 07. 객체 지향 기술 및 개념
 08. 직업윤리와 프로페셔널리즘
 09. 분석 및 디자인 방법
 10. 청중에게 프레젠테이션하는 것
 11. 프로젝트 관리
 12. 테스팅, 검증 및 QA(Quality Assurance)
 13. 알고리즘 설계
 14. 기술적 글쓰기(Technical Writing)
 15. 운영체제
 16. 데이터베이스
 17. 리더쉽
 18. 형상 및 릴리즈 관리
 19. 데이터 전송과 네트워크
 20. 경영

  대학을 졸업하고 실제 일을 하면서 중요한 것으로(학교에서 가르쳐 주지 않았지만 실전에서 중요한 것) 소프트웨어 디자인과 패턴, 소프트웨어 아키텍처, 요구사항 분석, HCI 및 유저 인터페이스, 프로젝트 관리, 테스팅 및 QA, 형상관리 등을 꼽았다. 그리고 현재 업계에 종사하면서 중요하다고 여겨지는 것 중 자신의 지식이 부족한 것으로는 협상(Negotiation), 리더십, 유저 인터페이스, 요구분석, 직업윤리와 프로페셔널리즘 등을 뽑았다. 이 조사에서 컴퓨터 관련 전공자들은 62%(아주 폭넓은 범위의 참가자에 의해 조사가 수행됐기에 이 비율이 IT 관련 업계에서 전공자들의 평균 비율과 매우 근접하다)였는데, 비전공자들이 일을 해오면서‘전문가’가 되기 위해 자신들이 가장 많이 배워야 했던 것은 무엇이었을까. 특정 프로그래밍 언어들, 자료 구조, 테스팅, 검증 및 QA, 운영체제, 소프트웨어 디자인 및 패턴, 객체지향 기술 및 개념, 데이터베이스, 형상관리, 직업윤리 및 프로페셔널리즘 등이었다.

  전문가가 되길 꿈꾸는 학생이나, 이미 업계에 종사중인 실무자들은 이런 전체 그림을 항상 염두에 두고 자신의 지식을 관리하며, 구체적인 지식과 동시에 일반적이고 좀더 오래 지속할‘핵심’을 함께 구유하는 데 힘써야 할 것이다.

출처 : 프로그래머로 가는 길 - 마이크로소프트 2001.4, 김창준

크리에이티브 커먼즈 라이선스
Creative Commons License

'Tips & Etc.' 카테고리의 다른 글

프로그래머가 알아야 할 것  (0) 2008/10/06
WPF(Windows Presentation Foundation) 개요  (0) 2008/10/02
Trackback 0 Comment 0