2009년 1월 28일 수요일

이클립스 프로젝트 필수 유틸리티 개정판 : Subversion, Ant, JUnit, Trac



자바 개발자를 위한 책을 소개합니다.

---------------------------------------------------------------------------

Trac을 비롯한 필수 유틸리티로 프로젝트 환경에 단비를 내리는 책 

이 책은 Trac(위키와 이슈 트래커), Subersion, Mylyn, Subclipse 플러그인, CVS, Ant, JUnit을 사용해서 자바 프로젝트 환경을 개선하는 책이다. 이 책의 내용은 유틸리티의 설치와 사용법 그리고 이클립스에서 유틸리티를 통합해서 사용하는 방법에 중심을 두고 있다. 

마지막 장에서 다루는 프로젝트는 책에서 다루는 모든 유틸리티와 플러그인을 사용해서 실제 개발 프로젝트를 보인다. 어떻게 개발자의 프로젝트 환경을 변화시키는지 직접 확인할 수 있다. 

이클립스 필수 단축키 수록
독자 Q&A 포럼: http://eclipseforum.net/ 

프로젝트 유틸리티란 무엇이고 이 책에서는 무엇을 다루었는가? 

프로젝트 유틸리티(Project Utility)란 말 그대로 프로젝트에 도움을 주는 유틸리티란 얘기다. 그리고 이클립스에 기반을 둔다는 것은 프로젝트 유틸리티가 이클립스에 통합되어 활용이 가능하다는 것을 의미한다. 

다음은 이 책에서 다루는 용도에 따른 프로젝트 유틸리티의 분류다.

  • 버전 관리 시스템: 소스나 문서 등의 파일이나 폴더를 공유하고 이력을 관리하는 시스템
    => CVS, Subversion, Subclipse 플러그인
  • 빌드 자동화 시스템: 빌드, 배포 등의 반복 작업을 자동화하는 시스템
    => Ant
  • 테스팅 시스템: 단위 테스트를 자동화, 정규화하여 코드의 안정성을 확보하는 시스템과 프레임워크
    => JUnit
  • 이슈 관리 시스템: 버그나 이슈 등을 한 곳에 모아 관리하는 시스템
    => Trac용 Issue Tracker, Mylyn
  • 위키: 온라인 협업 문서화 시스템
    => Trac용 Wiki
그리고 이 책의 초판과 달라진 점은 다음과 같다.
  1. CVS, Ant, JUnit의 새로운 버전의 설치와 사용법 그리고 이클립스에서의 사용법
  2. Subversion과 Subclipse 플러그인의 설치와 사용법 그리고 이클립스에서의 사용법
  3. Trac용 Wiki의 설치와 사용법, Wiki 문법 그리고 이클립스에서의 사용법
  4. Trac용 Issue Tracker의 사용법 그리고 이클립스에서의 사용법
  5. Mylyn과 Mylyn Trac connector의 설치와 사용법
  6. TOW를 이용해서 간단히 Trac과 플러그인을 설치 및 설정하는 방법
    (TOW는 오픈 소스 프로젝트로 Trac의 사용 환경을 간단히 구축할 수 있는 패키지다. 현재 저자가 이 프로젝트에 참여하고 있다.)
  7. 이클립스 필수 단축키(잘라서 붙여놓고 볼 수 있다)
이러한 이 책의 내용들이 "유틸리티를 왜 사용하고 또 어떻게 사용할까?"를 궁금해하는 독자들에게 답을 줄 것이다

----

이 책에 대한 A/S는 http://eclipseforum.net/ 에서 한다고 합니다.

예약구매 페이지는 한빛미디어에서 합니다.

우리는 개발자가 테스트해요.

주변의 소프트웨어 회사들을 보면 개발자가 테스트를 하는 회사를 정말로 많이 접하게 됩니다.
물론 개발자도 구현을 하면서 Unit테스트는 일상적으로 하지만, 제품의 기능이 정상적으로 동작하는지 확인하는 시스템 테스트도 개발자가 테스트하는 것을 보는 것은 그리 어려운 일이 아닙니다. 오히려 전문 테스트 인력이나 테스트팀이 있는 회사를 보는 것이 더 어렵습니다. 있다고 하더라도, 테스트팀이 전문적으로 테스트를 수행한다기 보다 개발자의 손을 좀 덜어주는 경우가 흔합니다.

이렇게 개발자가 테스트를 하는 이유는 다양하지만 다음과 같은 것들이 있습니다.
  • 우리는 인력이 너무 적어서 테스터를 별도로 둘 수 없어요.
  • 프로젝트 기간이 너무 짧아서 별도의 테스트 단계를 둬서 테스트를 할 수 없어요.
  • 개발자만이 기능을 속속들이 알아서 테스트를 할 수 있고, 이것을 테스터에게 알려줄 시간이 없어요. 그렇게 하면 중복 낭비예요.
  • 사람들이 테스터를 하기 싫어해서 전부 개발하고 같이 테스트 해요. 테스터는 뽑기도 어렵고, 기존의 개발자중에서 자원자가 없어요.
  • 테스터를 왜 별도로 둬야 하죠원래 개발자가 해도 되는 거 아닌가요?

개발자가 테스트를 하게 될 경우 아래와 같은 큰 문제가 있습니다.
  • 개발자는 제품의 내부 동작 방식을 속속들이 알기 때문에 자신도 모르게 정상적으로 동작하는 방식으로면 테스트를 하려고 합니다.
  • 개발자는 일반 사용자와 비슷한 패턴으로 제품을 사용하지 못합니다.
  • 개발자는 테스트의 전문성이 없기 때문에 테스트를 잘 하지도 못합니다.
  • 체계화된 테스트를 못하기 때문에 테스터를 더 투입하여 테스트 기간을 줄이는 등의 전략은 꿈도 못 꿉니다.
  • 테스트는 항상 대충 이루어지면 나중에 사용자가 버그를 많이 발견합니다.
  • 회귀(Regression)테스트는 무시되면 적당히 수정한 것만 테스트 하여 고쳤던 버그가 다시 살아나기도 합니다.
  • 개발자는 테스터보다 연봉을 더 줘야 하는데, 잘하지도 못하는 테스트를 시키느라고 비싼 돈을 낭비합니다.
  • 테스트 자동화 등의 테스트에 대한 전문적인 연구 및 개선이 이루어지지 않습니다.

한마디로 비싼 돈 주고 개발자는 개발자대로 고생하고 제품의 품질은 떨어지는 겁니다.

설령 1명짜리 회사라고 하더라도, 테스트는 제대로 해야 합니다. 그리고 개발자가 3,4명만 되어도 별도의 테스트를 두는 것이 효율적입니다. 예외적으로 특수한 프로젝트라면 모를까 일반적으로 별도의 테스트를 두는 것이 더 빠르고 적은 비용으로 높은 품질의 소프트웨어를 만드는 한 방법입니다.

물론 무조건 별도의 테스트팀을 두기만 하면 위 문제들이 해결되는 것은 아닙니다. 잘 해야죠. 추가적인 얘기는 다음에 하기로 하죠.

닭이 먼저일까? 달걀이 먼저일까?

소프트웨어 공학은 가르칠 수 없다고 합니다.
단지, 시행착오를 통해서 배우던지, 경험자에게 배우는 방법 밖에 없다고 합니다.

그래서 소프트웨어를 잘 개발하는 방법을 배우는 가장 좋은 방법은 잘 되어 있는 소프트웨어 회사에 들어가서 배우는 것입니다. 잘 되어 있는 회사에서 소프트웨어를 개발하다 보면 자연스럽게 몸에 익히게 되는 겁니다.
소프트웨어 개발이 전체적으로 어떻게 돌아가는지 자연스럽게 몸에 익히게 되며, 각 기능 조직은 어떻게 구분이 되며, 개발에 꼭 필요한 기반 시스템은 어떤 것들이 있으며 어떻게 사용하는지 배우게 됩니다. 따로 공부한다는 생각으로 배우는 것이 아니며 자연스럽게 몸에 익게 됩니다.

그런데 우리의 문제는 여기에 있습니다. 잘 되어 있는 소프트웨어 회사가 별로 없다는 겁니다.
제 컨설팅 경험에 의하면 확실합니다. 제 책에 제안하고 있는 소프트웨어 개발 역량 평가표로 평가를 해보면 20점 만점에서 10점이 안되는 소프트웨어 회사가 95%도 넘는 다는 것입니다.
즉, 학교 시험 기준으로 50점도 안되는 낙제점수를 받은 학생이 95%이상이라는 겁니다.

이러니, 잘 되어 있는 회사에 들어가서 제대로 배우기는 로또 당첨과 비슷하죠. 

잘 갖춰져 있는 소프트웨어 회사도 처음부터 잘 되어 있었던 것은 아닙니다. 뭐든지 처음은 있었겠지요.
뭐가 먼저 일까요? 회사가 먼저 바뀌었을까요? 개발자가 먼저 바뀌었을까요?

이는 닭이 먼저냐? 달걀이 먼저냐? 이슈와 비슷합니다. 이 논쟁은 답이 나와 있기는 합니다. 전문가들은 달걀이 먼저라고 합니다. 왜냐하면 달걀이 더 단순하기 때문이라고 합니다. 진화의 돌연변이가 달걀에서 일어 났고, 그 달걀에서 닭의 모습을 한 조류가 나오게 된 것이지요.

소프트웨어 회사도 수십년 동안 수많은 개발자와 소프트웨어 공학 전문가들이 소프트웨어 회사들을 조금씩 효율적으로 바꿔 나간 겁니다. 그래서 지금의 모습에 이르게 된 것입니다.

그럼, 우리 회사도 효율적인 소프트웨어로 변하고 싶을 때 달걀 전략을 사용해야 할까요? 즉 의식있는 개발자가 회사를 아주 조금씩 서서히 바꿔나가야 할까요?

생물의 진화에는 아주 오랜 시간이 걸렸고, 그 와중에 수많은 종이 멸종을 했듯이 달걀 전략은 많은 시간이 필요하며 그 사이에 회사가 망할지도 모릅니다. 멸종된 수많은 종들과 같이요.

이 때는 닭의 전략이 좀더 효과적입니다. 회사 자체를 먼저 바꿔야 합니다. 그리고 개발자들이 이를 따라오게 해야 합니다. 조직과 프로세스와 시스템을 회사에 알맞게 바꿔 놓고 개발자들을 교육시키고 훈련시켜야 합니다. 

밑바닥에서부터의 조용한 개혁을 꿈꾸고 있는 개발자가 계시다면 그 한계를 깨닫고 경영층을 먼저 설득하시기 바랍니다. 그래야 멀지 않은 미래에 효과적인 조직으로 탈바꿈한 개발조직에서 일을 하실 수 있을 겁니다.

2009년 1월 23일 금요일

프로젝트 시작부터 개발자가 바글바글

소프트웨어 개발 프로젝트가 시작되면 바로 개발팀이 구성되어서 개발자들이 바글바글 한가요?
그렇다면 뭔가 개발 체계에 잘못된 것이 없는지 검토를 해봐야 합니다.

개발을 단계(Stage)구분 없이 마구잡이로 하고 있지 않은지?
개발 업무(분석, 설계, 구현)의 구분 없이 섞여서 하고 있지 않은지?
개발자가 별도의 전문성 없이 모든 업무(분석, 설계, 구현, 빌드, 테스트)를 다 하고 있지 않은지?

프로젝트의 각 단계에 따라서 투입되는 인력이 달라집니다. 
소프트웨어 개발 프로젝트에서 흔히 저지르는 실수 중 하나가 프로젝트가 시작되자마자 모든 프로젝트 인력을 한꺼번에 투입해 놓고 프로젝트 끝날 때까지 그 인원으로 계속 진행하는 경우입니다. 

각 단계 별로 필요한 인력과 인원 수가 달라지는데 프로젝트 초기부터 많은 인원이 투입되면, 개발자들이 별로 할 일이 없게 됩니다. 그렇게 되면 요구분석이 완료되지도 않은 시점에 특별한 계획도 없이 코딩도 해보고 설계도 해보고 이것저것을 개발하기 시작하기도 합니다.



위 그래프의 핵심은 초기부터 많은 개발자를 투입하지 않는다는 것입니다. 요구분석 단계에 투입되는 개발자는 SRS 작성에 필요한 정보를 제공하는 개발자들입니다. 요구사항의 타당성을 점검하고, 필요 시 프로토타입을 만들어 볼 수도 있습니다. 그런 다음, 설계 단계에서는 설계에 참여하는 인원만 추가로 투입하면 됩니다.
 
테스터가 프로젝트 초기부터 테스트에 참여하는 점을 눈 여겨 봅시다. 테스터 역시 SRS작성에 참여하고, 테스트 요구사항을 제시하고, 각 요구사항이 테스트 가능한지 검토합니다. 요구분석단계에 테스터는 실제로 테스트 계획서를 작성하기도 하고 이를 준비만 하기도 합니다. 

이렇듯 각 단계 별로 인원을 효과적으로 투입해야만 비용을 절감할 수 있으며, 성급하게 프로젝트 후반부에 해야 할 일들을 앞에서 미리 함으로써 발생하는 수많은 문제를 방지할 수 있다. 미리 작성해 놓은 코드가 아까워서 어떻게 하든 프로젝트에 사용해보려고 하지 않겠습니까?

그 외에도 고참 개발자나 신입 개발자나 특별한 구분 없이 모두 모여서 서로 비슷한 일들을 나눠서 일을 하고 있다면 개발 조직의 효율성 및 생산성이 떨어지는 경우라고 볼 수 있습니다. 아직 주먹구구 단계를 벗어나지 못한 상태입니다. 이런 경우에도 프로젝트를 시작하면 모두 모여서 그냥 개발을 시작하죠.

이렇게 개발자들이 프로젝트 초기부터 모두 투입되는 경우는 비용이나 개발 인력 활용 면에서 대단히 불리합니다. 프로젝트가 진행되는 단계에 따라서 인원을 적절하게 투입해야 합니다. 물론 그렇게 하기 위해서는 각 기능조직의 전문성이 갖춰져야 하고, 개발에 필요한 시스템과 프로세스가 필요하며, 개발자들이  문서 작성 능력을 필수적으로 갖추고 있어야 합니다.

2009년 1월 22일 목요일

인류멸망 그 후(Life after People)

얼마 전 TV에서 "인류멸망 그 후(Life after People)"를 방영했죠.
인간이 지구에서 당장 사라진다면 어떤 일이 일어날지 살펴보는 프로그램이었습니다.

여기서 인간이 만들어 놓은 건축물이 유지보수를 하지 않는 순간 얼마나 빨리 망가지는지를 확인할 수 있습니다.

소프트웨어 개발도 비슷하다고 생각합니다. 소프트웨어 기본 원리야 항상 변함이 없지만, 회사의 규모와 환경에 따라서 개발 프로세스는 그에 알맞게 절절해야 하고, 회사의 성장과 전략의 변화에 따라서 지속적으로 그에 맞춰줘야 합니다. 

그런데, 어떤 이유에서건 갑자기 회사의 개발 프로세스를 관리하지 않기 시작하면, 서서히 망가져가는 것을 볼 수 있습니다. 개발자들에게 서서히 외면을 받고 피해가기도 하고, 개발을 방해하는 거추장스러운 것이 될 수도 있습니다.

이렇게 망가지는 가장 큰 원인은 아마도 Mind가 다른 경영자로의 교체일 것입니다. 이런 경우 소신있는 개발자라고 하더라도 별 힘을 써보지 못하게 되는 경우가 많은데 이런 경험이 있는 분들도 있을 것으로 생각합니다. 이런 경우에 합리적인 대처 방법은 고민을 해봐야 할 주제입니다.

각설하고, 회사가 꾸준히 성장을 하고 있다면 한번 정해놓은 개발 프로세스가 영원히 가는 것이 아니고 꾸준히 유지보수가 되어야 지속적인 생산성 향상이 가능합니다.

과거의 개발 프로세스가 현재의 상황과 맞지 않는 점이 발견되고 있다면 소프트웨어와 마찬가지로 개발 프로세스도 유지보수를 할 때가 된 것입니다.










2009년 1월 20일 화요일

샘플만 보여주세요.

소프트웨어 개발에서 가장 어려운 것이 "요구사항분석"이라고 여러 차례 언급한 바가 있습니다.

그런데 SRS는 샘플이나 Template을 보고 잘 적는 것은 거의 불가능합니다.

개발자들은 원래 샘플 소스코드를 보고 많은 것들을 배워왔기 때문에 스펙도 샘플을 보면 잘 적을 수 있을 것 같은 착각을 하는 경우가 흔합니다. 샘플 소스코드가 도움이 되는 이유는 개발자들인 소스코드에 대해서는 이미 상당한 지식과 경험이 있기 때문입니다.

샘플만 보고 잘하려고 하는 것은 피아노를 잘 치고 싶다고 유명 피아니스트가 친 것을 몇 번 보고 피아노를 잘 치려 하는 것과 비슷합니다. 심지어는 지금 듣고 있는 피아노 연주가 잘 하는 것인지 못하는 것인지 판단하기도 어렵죠.

그래서 인터넷에서 구한 샘플이 별 도움이 안되거나 심지어는 방해가 되는 이유가 그것입니다. 좋은 샘플을 보여주면 일부 도움이 될 수는 있어도 큰 도움은 되지 못합니다. 나쁜 샘플을 만날지 어떻게 알겠습까? 아마 인터넷에서는 좋은 샘플을 구한다는 것은 거의 불가능할 겁니다.

타이거우즈 골프 스윙을 100번 보는 것보다 자신이 실제로 연습을 많이 하고 배우는 것이 더 빨리 배우는 길 일겁니다. 그렇지 않고 배우는 방법은 이미 선배들이 다 겪었던 시행착오를 자신도 그대로 겪는 방법이 있습니다. 자신은 시행착오를 겪지 않고 한번에 제대로 적을 수 있다고 생각하는 것은 자신의 능력에 대해서 대단히 너그럽게 생각하는 심리학적인 오류에 빠지는 것입니다.

비단 스펙을 적는 일뿐만 아니라 스키를 배우던, 발레를 배우던 모든 인생사가 다 비슷하지만 누구에게도 시행착오를 겪지 않는 행운은 찾아오지 않습니다. 책을 보고 공부를 하는 것도 많은 도움이 되지만 주변에서 경험자를 찾아서 도움을 받으세요. 주변에 자신을 도와줄 전문가가 있다면 그것이 행운입니다.

2009년 1월 19일 월요일

프로젝트는 연습이 아니다.

필자는 수많은 소프트웨어를 개발해왔고, 주위에서 여러 프로젝트를 봐왔습니다.
그러면서 성공한 프로젝트와 실패한 프로젝트도 많이 봐 오면서 그 차이에 대해서도 많이 생각해 왔습니다.

물론, 성공한 프로젝트는 모두들 알고 있는 요소들이 있습니다. 
상세하고 꼼꼼한 일정관리, 꾸준한 리스크관리, 인력관리, 품질관리 등등 이미 알려진 것들입니다. 비단 S/W 프로젝트가 아니더라도, 빌딩을 만들 때도 당연히 필요한 프로젝트 관리의 요소들입니다.

그런데, 유독 소프트웨어 개발 프로젝트에서 종종 벌어지는 현상이 있습니다. 이것이 프로젝트에 큰 리스크가 되고 프로젝트를 실패하게 만드는 원인이 되기도 합니다.

이것은 바로 "프로젝트를 연습처럼 생각한다"는 겁니다. 연구, 공부처럼 생각합니다.

"요즘 Python이 인기인데, A모듈에서는 Python을 써야겠다."
"이번 프로젝트는 UML로 설계를 하겠다."
"Flex로 UI를 만들면 쉽다고 하는데, Flex를 쓰자"
"A라는 DB가 빠르고 가볍다고 하는데, 그걸 써보자"
"요즘 B기술이 대세인데, 어차피 공부해야 할 거 프로젝트 하면서 배우자"

실제로 개발자들은 실제 프로젝트에서 많이 배우는 것이 사실이지만, 거의 경험이 없는 기술을 단지 "배우기 위한 목적"이나 "좋아 보여서" 사용한다면 이는 프로젝트에 큰 리스크가 될 수 있습니다.

필자는 개발자들에게 늘 강조하는 것이 "프로젝트는 연습이 아니다.", "프로젝트는 검증된 기술을 가지고 하는 것이다."입니다. 물론 검증된 기술과 아닌 것의 경계는 모호하지만 이는 경험으로 판단해야죠. 충분히 성공할 수 있는 기술의 조합으로 프로젝트를 해야죠. 그렇다고 하더라도, 프로젝트 중간에는 수많은 변수들이 있어서 성공이 보장된 것이 아닙니다. 아직 검증이 안되었지만, 프로젝트에 꼭 필요한 기술이라면, 미리 또는 요구분석 시에 Prototype을 만들어보면서 검증을 하는 것이 좋습니다. 모든 기술을 다 검증할 필요는 없지만, 검증이 필요한 기술을 프로젝트에 직접 사용할 경우 실패할 수도 있습니다.

또 개발자들이 충분히 연습이 되어 있지 않아서 능숙하게 사용하지 못한다면, 일정을 지연시키는 큰 원인이 됩니다. 이런 경우는 이미 익숙한 옛날 기술을 사용하는 것이 나은 경우가 많습니다. 

Research Project라면 얘기가 다르죠. Research Project의 목적은 연구이기 때문에 검증 안된 기술을 얼마든지 사용해도 되죠. 이 경우 요구사항의 상세도도 일반 프로젝트와 다르고 일정의 중압감도 다르기 때문에 기술에 집중할 수 있습니다. 평상 시에 크고 작은 Research Project를 자주 수행해야 실제 프로젝트에 적용할 수 있는 기술을 풍부하게 보유할 수 있습니다.

프로젝트를 연습이라고 생각한다면, 프로젝트 실패로 가는 지름길로 가고 있는 것입니다. 자신이 지금 어떤 프로젝트를 하고 있는지 잘 구분해야 합니다.