2009년 1월 31일 토요일

소프트웨어를 개발하는 끝내주게 좋은 방법

블로깅을 시작한지는 그리 오래 되지 않았지만 블로그 운영을 시작하면서 자연스럽게 인터넷에서 소프트웨어를개발에 대한 다양한 글들을 보게 되었습니다

대부분의 글들은 자신의 ,간접적인 경험에 의해서 작성되지만 모든 글들을 쓰면  백그라운드에 대해서는자세히 설명할 수가 없으므로글을 읽는 독자들은 오해를 하는 일들이 잦을 것으로 생각합니다  경험들과 지식들이 나에게 똑같이 적용이 되거나 도움이  것이라고 단순히 생각하는 오류가 벌어질 수도 있을  같습니다

그래서 제가 쓰는 글들은 자연스럽게 소프트웨어를 개발하는 기본 원리나 원칙에 포커스를 하고 있습니다수많은 소프트웨어 개발사와 개발자들을 만나면서 단순한 기법이나 툴의 사용보다 기본 원리를 익히는 것이 중요하다는 것을 알게  것도  이유입니다. 그리고 그런 글들을 계속 읽다보면 자연스럽게 친숙해지면서 몸에 익는다면 소프트웨어를 개발하는데 도움이 좀 되지 않을까 생각합니다.

결국 끝내주게 좋은 방법은 없고 원리를 알고 나서 응용을 하는 것이 제대로 소프트웨어를 개발하는 방법이라고 생각합니다.

소프트웨어를 개발하는 기본 원리는 소프트웨어의 종류나 규모에 따라서 다르지 않습니다다르다면 원리라고  없겠죠팩키지 소프트웨어나 펌웨어나 SI 게임이나 기본 원칙은 다르지 않습니다단지현실에 응용이  때는 각각의 특성에 따라서 다양한 방법의 변화가 있을  있죠.

최대 30MM이나 50MM짜리 프로젝트만을 수행해  개발자는  테두리에서의 경험에 대해서만 얘기를  있는데 방법이 수백MM 규모의 프로젝트와는 맞지 않을  있을 것입니다. 수백MM짜리 규모의 프로젝트는 차원이 다르죠. 어설픈 방법으로도 소규모 프로젝트는 그럭저럭 수행이 될 수 있어도 규모가 그정도 커지만 요행을 바라기는 어렵습니다.



또, 주로 SI프로젝트나 외주 용역 프로젝트만 수행을   경험이라면 소프트웨어를 개발하는 기본 원리보다는 예를 들어 고객을 다루는 계속 변하는 요구사항에 대응하는 적당한 품질로 타협하는  등에 대해서 많이 고민해 봤을 수도 있습니다.

 또한 SI 경험보다는 팩키지라던가 대규모 프로젝트의 경험이  많기 때문에 모든 분야를  경험해보고하는 얘기는 아닌 것이죠

결국 글을 일고 판단하는 것은 읽는 사람의 몫일 수도 있는데저의 괜한 기우일 수도 있겠네요.

판단은 스스로하고 너무 끝내주게 좋은 것을 찾으려고 하지는 맙시다

2009년 1월 29일 목요일

Head First Software Development 리뷰



"더 쉽고 재미있게 소프트웨어를 개발하는 방법"

이 책의 한글 부제입니다.
확실히 재미는 있겠더군요. 책도 재미있게 구성되어 있고요.
책의 전반적이 내용이 소프트웨어를 개발하는 과정을 재미있고, 쉽게 접근할 수 있도록 잘 작성되어 있습니다.

하지만 상당히 부족한 점이 발견됩니다. 그건 바로 "스펙"이죠.

이 책에서 소개하는 사용자 스토리와 태스크는 "스펙"을 대신할 수 있는 수준은 아닙니다. 사실 내용도 좀 다르죠.

이 세상에는 수많은 종류의 소프트웨어가 있는데, 그 중에서 일부는 이 책에서 소개하는 방법이 적당할 수도 있다는 생각이 듭니다. 예를 들어서 간단한 쇼핑몰 사이트를 구축하거나 그리 복잡하지 않는 비즈니스 시스템을 만들 때 좋을 것도 같습니다. 그 외에도 더 있겠죠.

하지만 사용자 스토리와 태스크를 기반으로 소프트웨어를 개발하게 되면 개발 후에 뭐가 남나 생각해보면 남는 것이 별로 없습니다. "스펙"은 단순히 소프트웨어를 개발할 때만 쓰이는 것이 아니고 유지보수 기간에도 계속 필요하며 차기 업그레이드에서도 필요합니다. 또 그 내용은 사용자 스토리와는 비교가 안될 만큼 다양한 내용이 포함됩니다. 결국 그러한 스펙의 필수 내용들은 무시된 채 개발이 될 수도 있고 개발자가 경험이 많고 재수가 좋으면 큰 문제가 없을 수도 있겠죠. 또 너무 단순한 사용자 스토리는 결국 러프한 요구사항을 가지고 개발하는 것과 큰 차이가 없습니다. 결국 개발자의 취향이나 능력에 따라서 기능이 달라지는 일이 발생하게 됩니다.

대부분의 소프트웨어 프로젝트에서 "스펙"은 매우 중요하며 꼭 필요합니다. "스펙"은 프로젝트의 커뮤니케이션의 중심이며 일정과 비용 산정의 기준이 됩니다. 이 책을 읽는 독자가 자신의 소프트웨어 프로젝트에 이 방법을 직접 적용하고 싶다면 "스펙"에 대해서는 큰 기대를 하면 안됩니다. 그리고 자신의 프로젝트에 적당한 방법인가도 생각을 해봐야 겠습니다. 또한, 이터레이션도 모든 소프트웨어 개발에 적당한 방법이 아닙니다. 이터레이션이 적합한 소프트웨어가 있죠.  

물론 이 책은 쉽고 재미있게 잘 쓰여진 책입니다. 단, 이 방법이 모든 소프트웨어 개발에 적용되는 것이 적당하지 않다는 것을 알아야 할 것 같습니다. 하나의 좋은 방법을 소개한 것으로 보면 적당할 것 같습니다. 결국 원리를 깨우치고 자신의 개발팀에 알맞은 방법을 찾아나가는 것이 올바른 방법입니다. 

어디에도 끝내주게 좋은 방법은 없으니까요.

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명만 되어도 별도의 테스트를 두는 것이 효율적입니다. 예외적으로 특수한 프로젝트라면 모를까 일반적으로 별도의 테스트를 두는 것이 더 빠르고 적은 비용으로 높은 품질의 소프트웨어를 만드는 한 방법입니다.

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