이번 이야기는 첫 번째 이야기인 만큼, 소프트웨어 개발의 가장 기본적인 단계에 대해 쉽게 설명해보려고 합니다. 소프트웨어는 복잡한 현실 세계의 문제를 소프트웨어를 통해 자동화하거나 간소화하기 위한 작업을 뜻합니다. 이 작업에는 여러 단계가 있지만, 가장 중요한 아래 5가지 단계를 거치게 됩니다.

요구사항 분석 (Requirement Analysis)

도메인 사용자의 요구사항을 수집하고 분석하여 소프트웨어 개발에 필요한 기획을 위한 사전 작업입니다. 이러한 요구사항 수집은 전문가 인터뷰나 설문 등을 통해 이루어지거나, 사용자들의 행동 패턴을 분석하여 얻어낼 수 있습니다. 다만 고객들은 대부분 소프트웨어에 대한 전문가가 아니므로, 요구사항을 직접적으로 수집하기보다는 고객의 요구사항에서 적절히 필요한 부분을 추출하여 요구사항 명세서나 유즈케이스 다이어그램등의 산출물을 작성합니다. 요구사항 분석은 소프트웨어 개발에서 가장 간과하기 쉬운 부분입니다. 하지만 정확한 요구사항 도출에 실패할 경우, 소프트웨어 개발의 전체적인 비용이 증가하거나 최종적으로 프로젝트 전체가 실패할 수 있습니다.

기획 (Planning)

요구사항을 바탕으로 소프트웨어 개발의 목표와 범위를 정하고, 예산 및 일정을 수립하는 단계입니다. 투입 인원 및 개발에 필요한 다양한 요소들을 계획합니다. 또한 개발 범위를 정하고, 어떤 순서로 개발을 수행할지 결정합니다. 기획 단계에서는 실제 개발에 포함될 다양한 정보나 대략적인 UI 구성 및 메뉴 구성 등이 포함됩니다. 이러한 기획 단계의 완성도에 따라 개발 시점에서 불필요한 의사소통을 줄이고 전체적인 개발 기간을 단축할 수 있습니다. 기획 단계에서 실수하기 쉬운 부분은 개발 범위 산정에 실패하여 일정이 맞지 않거나, 불필요하게 많은 리소스를 산정하여 프로젝트 전체 방향성을 잘못 설정하는 경우입니다.

설계/디자인 (Design)

설계는 소프트웨어의 큰 부분에서는 소프트웨어 아키텍처를 결정하고, 어떤 라이브러리를 사용할지, 또 어떤 데이터를 어떤 구조로 전송할지 수립하는 단계입니다. 소프트웨어 아키텍처의 선택에 따라 향후 유지보수 비용이나 구현 시간이 크게 달라질 수 있는 매우 중요한 시간입니다. 설계 시점에서 발생하기 쉬운 실수는 현재 소프트웨어에 필요한 수준보다 지나치게 복잡하거나 단순하게 설계하여 유지보수 비용이 증가하는 경우입니다. UI/UX 측면에서는 사용자에게 제공할 인터페이스와 경험을 설계하며, UI/UX 엔지니어가 구현할 수 있는 시각적인 부분에 대해 디자인합니다. 최근에는 사용자 경험이 소프트웨어 품질에 많은 영향을 주기 때문에 디자인에 투자하는 시간이 늘어나는 추세입니다.

구현 (Development)

구현 단계에서는 소프트웨어 엔지니어가 설계를 기반으로 코딩을 수행하고, UI/UX 디자인을 실제로 구현합니다. 소프트웨어 개발에서는 도메인의 상황이나 고객의 요구사항을 완벽히 파악하기 어렵기 때문에, 기획자와 디자이너 등의 이해관계자 들과 지속적으로 피드백을 주고 받아야 합니다. 이 단계는 소프트웨어 개발 주기 중 가장 많은 시간이 소요되는 단계이며, 대규모 개발에서는 각 모듈별로 개발한 뒤 이를 통합하는 과정을 거칩니다. 개발 시간 동안 엔지니어는 테스트와 구현을 반복하면서 소프트웨어를 완성해 나갑니다. 소프트웨어 엔지니어는 이 시점에 개발 속도를 높일지 향후 유지 보수를 위해 모듈화 및 안정화를 수행할지 적절한 엔지니어링 수준을 결정해야 합니다. 프로젝트에 상황에 따라서 엔지니어는 빠른 개발 속도를 위해 기술 부채를 감내하기도 하며 안정성이 중요한 프로젝트에서는 시간을 좀더 소비하여 소프트웨어 안정화를 위한 엔지니어링 시간을 투자하는 경우도 있습니다.

테스트 (Testing)

테스트 단계에서는 테스트 계획과 테스트 케이스를 기준으로 소프트웨어의 잘못된 구현이나 예기치 못한 오류를 찾아냅니다. 단위 테스트, 시스템 테스트, 통합 테스트 등의 단계별 테스트를 반복적으로 수행합니다. 추가로 보안 검증이나 부하 테스트 등 소프트웨어 특성에 따라 별도의 테스트를 수행하기도 합니다.테스트 과정에서 발견된 오류는 엔지니어링팀이 수정하며, 이러한 작업이 반복적으로 이루어집니다. 테스트 단계는 지루하고 힘들 수 있지만, 소프트웨어의 안정성을 보장하기 위해 반드시 필요한 과정입니다.

출시 (Release)

출시 단계에서는 모든 테스트와 수정이 완료된 소프트웨어를 사용자의 환경에 배포합니다. 출시 이전에 알파 및 베타 테스트를 통해 고객의 피드백을 수집하기도 하며, 출시 이후에도 지속적인 유지보수를 수행해야 합니다. 출시 직후에는 테스트에서 발견되지 않은 새로운 이슈가 발생할 가능성이 있으므로 개발팀은 긴장을 늦추지 않아야 합니다. 또한 사용자 피드백을 기반으로 차기 버전을 준비하는 것도 중요한 작업입니다.

소프트웨어 개발 방법론은 위 단계를 어떻게 배치하고 적용하느냐에 따라 달라집니다. 폭포수 개발 방법(Waterfall)은 각 단계를 순차적으로 진행하며, 대규모 SI(System Integration) 프로젝트에 많이 적용됩니다. 애자일(Agile) 방법론은 각 단계를 반복적으로 수행하며, 빠른 출시와 개선이 필요한 스타트업이나 소프트웨어 전문 기업에서 많이 사용됩니다. 이러한 방법론은 구체적인 세부 사항에서는 차이가 있지만, 전통적으로 위 5가지 단계를 수행해야 한다는 점은 동일합니다. 시간이 된다면 애자일 방법론이나 폭포수 방법론에 대해서도 좀더 이야기 해보면 좋을 것 같습니다.