2008년 12월 12일 금요일

다 만들었어요. 이제 테스트만 하면 되요.

소프트웨어를 개발하는 회사에서는 자주 듣는 말입니다.
그런데, 이 테스트가 언제 끝날지 모르는 경우가 많습니다.

소프트웨어 개발 컨설팅을 하면서 정말 놀란 것 중의 하나가 대부분의 회사가 릴리즈 시 "알파", "베타", "RC", "GA", "FCS"와 같은 단계를 거치지 않는 다는 것이었습니다. 
대부분이 알파수준의 소프트웨어를 만들어서 만족스러울 때까지 테스트와 수정을 동시에 병행한다는 것이었습니다. 이는 큰 회사나 작은 회사나 별 차이가 없었습니다. 개발을 단계적으로 진행하지 않는 회사는 업무와 일정에 대한 정교한 구분 없이 일을 진행하다가 적당한 시점에서 한번의 테스트를 통해 제품을 완성하려고 합니다.
이를 빅뱅(Big bang) 테스트라 하는데 이 방법이 운 좋게 개발 기간을 단축시켜 줄지도 모른다는 기대감으로 일을 중구난방으로 진행하는 것입니다. 하지만 이는 전혀 근거가 없는 생각이며, 테스트를 한번에 끝낸다고 프로젝트가 더 빨리 끝나지는 않습니다. 이 방법은 테스트 기간 내내 혼란에 휩싸이게 만들고, 테스트가 언제 끝날지 도저히 예측할 수 없으며, 일정 기간 내에 품질이 얼마나 향상될 수 있을지 추측조차 하기 어렵습니다. 심지어 통합조차 잘 되지 않기 때문에 내포되어 있는 버그가 얼마나 되는지도 파악하기 어렵습니다. 결국 프로젝트 일정이 가시권에서 점점 멀어지게 됩니다. 운이 좋으면 밤을 새면서 일정대로 프로젝트를 마칠 것이고, 그렇지 않으면 프로젝트가 실패하게 됩니다. 


소프트웨어 프로젝트는 개발 단계 별로 관리하는 것이 좋습니다. 단계 별로 진행을 하면 각 단계가 명확해지기 때문에 프로젝트 진행 상황이 눈에 들어오고, 혼란으로 인한 재작업이 줄어 들며, 프로젝트 일정을 단축시키고, 비용을 절약해 줍니다.
특히, 높은 품질의 제품을 출시하기 위해서는 제품 및 프로젝트의 성격에 알맞게 단계 별 릴리즈를 하는 것이 좋습니다. 릴리즈는 알파, 베타, RC(Release Candidate)단계로 나뉘고 각각의 릴리즈 일정은 미리 계획하여 정해 둬야 합니다.



각 단계에는 다음과 같은 의미가 있습니다.

  • 프리알파(Pre-alpha): 알파 이전에 만들어내는 빌드들입니다. 개발 버전(Engineering version)이라고 하기도 합니다. 일일빌드(Daily Build)의 결과물도 프리알파에 해당합니다. 아직 기능이 모두 다 구현이 되어 있지 않습니다.
  • 알파(Alpha): 기능이 모두 구현되었으나, 버그는 꽤 많은 상태, 설치도 안되어서 기능을 확인해 볼 수도 없는 등의 버그는 없어서 모든 기능을 테스트 해 볼 수는 있습니다. 일부 작동이 안 되는 기능이 있습니다. 일반적으로 알파버전부터 테스트팀의 공식적인 테스트가 시작됩니다. 이를 알파테스트라고 부릅니다.
  • 베타(Beta): 중요한 버그는 거의 수정이 되어서 작은 버그들만 남아 있습니다. 베타 버전은 종종 사용자 평가(Evaluation) 및 외부 테스트(Field Test)를 위해서 외부에 배포되기도 합니다. 이런 목적으로 배포되는 버전을 베타 릴리즈라고 부르며 베타 버전을 사용해 보는 사용자를 베타 테스터라고 부릅니다. 베타버전 이전에 프리베타(Pre-beta)를 만드는 경우도 있습니다
  • RC(Release Candidate): 출시를 위해서 만들어진 버전입니다. FCS(First Customer Shipment), 감마(Gamma) 또는 델타(Delta)라고 부르기도 합니다.
  • GA(General availability)RTM(Release to Manufacturing)이라고 부르기도 합니다. RC 중에서 테스트를 통과하여 출시 할 수 있는 버전입니다. 일반적인 경우 마지막 RC와 동일합니다. 
이런 식으로 테스트팀에 전달하는 버전이 어느 수준인지 알려주어야 합니다. 그렇지 않으면 알파수준의 버전을 가지고 곧 고객에게 전달할 수 있을 것 같은 착각에 빠지기도 합니다.

모든 소프트웨어를 개발할 때마다 이 같은 단계를 전부 다 거쳐야 하는 것은 아닙니다. 제품의 규모와 난이도, 성격에 따라서 단계를 서로 다르게 정해야 합니다. 대규모 제품이거나 복잡한 팩키지 제품은 이 단계들을 거치는 것이 일반적입니다. 이런 제품을 한번에 높은 품질로 만들어 내기는 어렵기 때문입니다.

하지만 소규모 제품이거나, 고객의 수가 아주 적거나, 업그레이드 프로젝트라서 복잡도가 낮을 경우라면 처음부터 원하는 품질 수준에 근접하게 제품을 만들어 낼 수 있습니다. 이런 경우라면 테스트 단계를 간략하게 해서 진행할 수 있습니다.

댓글 9개:

  1. 드디어 "소프트웨어 개발의 모든 것" 책을 구입했습니다. 어제부터 틈틈이 읽고 있는데
    역시 내용이 알차군요. 실전경험에서 나오는 포스같은것이 느껴집니다. 앞으로도 좋은 글
    많이 부탁드립니다.

    답글삭제
  2. 헝그리맨님 안녕하세요.
    궁금하신 내용이 있으면 언제든지 얘기해주세요.
    감사합니다.

    답글삭제
  3. 좋은 글 잘 봤습니다. 여러가지 생각들이 머리속에서 떠오르는 글이네요. ^^
    일정을 준수하며 프로젝트를 진행한다는건 항상 어려운 숙제처럼 늦겨지네요.
    프로토타입이 완성되고, 테스트가 진행되면 생각치 못한 사항들....
    매번 경험하는거지만, 처음은 간단한 것부터가 시작이지만 욕심이라는건 끝이 없나 봅니다.

    답글삭제
  4. 태양공원님 안녕하세요.
    적어주신 방법은 "발전적인 프로토타이핑"이란 모델과 비슷하네요. 처음에 기술을 검증한 프로토타입을 만들고 점점 기능을 더해가는 겁니다. 프로토타입을 만드는 방법은 일반적인 프로젝트와 다르게 간단하게 진행합니다. 하지만 이 방법은 잘못하면 주먹구구식 개발로 빠질 수 있다는 단점이 있습니다.

    답글삭제
  5. ○ 소프트웨어 테스트 정의 ° 노출되지 않은 숨어있는 결함을 찾기위해 SW를 작동시키는 일련의 행위와 절차로 오류발견을 목적으로 프로그램을 실행하여 품질을 평가하는 과정 목표 ° 잠재된 오류의 발견 ° 기술적인 기능 및 성능의 향상 ° 사용자 만족도, 신뢰도 향상 특징 ° 결함이 있다는 가정하에 테스트 계획을 수립 및 테스트 케이스 작성하여 실행 ° 개발자가 자신의 프로그램을 직접 테스트 하지 않음(테스트의 결과로 디버깅수행) ° 성공적인 테스트는..

    답글삭제
  6. 잘 계획된 일정도... 실제 현장에서는 끊임없는 사용자의 변경요구로 인해 프로젝트의 마지막 단계까지 변경이 발생하는 경우가 허다하죠. 테스트 일정은 계속 지연되고 결국은 빅뱅테스트가 진행되어버곤 하죠. --;;

    답글삭제
  7. 필넷님 안녕하세요.
    맞습니다. 그런 경우가 허다하지요. 그래도 원리와 원칙을 안다면 그런 상황에서도 좀더 잘 대응할 수 있겠죠. 제가 접한 수많은 회사는 별다른 생각없이 으례 그렇게 빅뱅테스트를 하고 있더군요. 이런 경우라면 문제겠죠.

    답글삭제
  8. 빅뱅테스트에 익숙해진 우리나라 소프트웨어 개발 현실이 안타깝습니다.
    제대로된 소프트웨어 관련 관리자나 아키텍트가 절대적으로 부족한 듯합니다. 그리고 이를 뒷받침해줄 안목높은 경영진이 있어야 하는데, 여러모로 그런분들 만나기가 참 힘드네요~

    제대로된 테스트를 통하여 높은 수준의 어플리케이션이 제대로 평가받을 날을 기대합니다~
    좋은글 잘 읽고 갑니다 :)

    답글삭제
  9. 장성진님 안녕하세요.
    더 좋은 방법이 있는데, 해오던 방법이 더 익숙해서, 잘 몰라서, 우리는 다르다고 생각해서 비효율적인 방법을 그냥 고수하는 경우가 많습니다.

    답글삭제