본문내용
1. 소프트웨어 진화
1.1. 소프트웨어의 정의
소프트웨어는 "물리적 실체인 하드웨어의 반대어로 만들어진 용어로, 컴퓨터 프로그램과 같은 뜻으로 해석되는 경우도 있으나 프로그램 자신 외에 그 프로그램 자신의 설명서, 그 프로그램에 의해 업무를 수행할 때의 사무 상의 규정이나 절차, 이들을 문서화한 설명서나 색인서도 모두 포함한 전체를 가리킨다"이다. 또한 "컴퓨터 시스템을 가동시키는 데 필수가 되는 시스템 소프트웨어(system software)와 이용자 측의 업무에 특유한 응용 프로그램(applications program)을 구별해 왔으나 현재는 양자를 포함하여 소프트웨어라고 하며, 시스템 개발(system development)과 소프트웨어 개발(software development)은 동의어로 취급되고 있다."라고 할 수 있다.
1.2. 소프트웨어 진화 프로세스
1.2.1. 개발과 진화
소프트웨어 개발은 일반적으로 명세(specification), 구현(implementation), 검증(validation), 운영(operation)의 단계로 이루어지며, 새로운 요구사항이 제안되면 다시 위 과정이 반복되면서 소프트웨어가 진화하게 된다. 이러한 소프트웨어의 개발과 진화는 나선형 모델로 표현될 수 있다. 나선형 모델은 한 기업이 개발과 유지보수를 모두 수행하는 것을 가정하며, 상업용 소프트웨어의 경우에 해당한다.
또한 소프트웨어의 진화는 초기 개발(initial development), 진화(evolution), 서비스(servicing), 단계적 폐지(phaseout)의 단계로 진행되는 모델로 설명될 수 있다. 진화 단계는 소프트웨어가 성공적으로 사용되고 있는 단계로, 새로운 요구사항이 등장하며 시스템은 지속적으로 개선된다. 서비스 단계에서는 새로운 기능이 추가되지 않고, 버그를 수정하는 등의 간단한 수정만 행해진다. 단계적 폐지 단계에 있는 소프트웨어는 계속하여 사용될 수는 있지만 변경되지는 않는다. 이는 소프트웨어가 계속 수정되면 일반적으로 품질은 저하되기 때문에, 시간이 지나면 소프트웨어를 수정하는 것이 비용 면에서 효율적이지 않다는 점을 반영한 모델이다.
1.2.2. 일반적인 진화 프로세스
일반적인 진화 프로세스는 소프트웨어가 지속적으로 변화하고 진화하는 과정을 설명한다. 이 프로세스는 변경 요청(Change Requests), 영향력 분석(Impact Analysis), 출시계획 수립(Release Planning), 변경의 구현(Change Implementation), 시스템 출시(System Release) 등 5단계로 구성된다.
먼저 변경 요청 단계에서는 소프트웨어에 대한 변경 사항을 제안한다. 이어서 영향력 분석 단계에서는 변경 사항이 어떤 소프트웨어 컴포넌트에 영향을 미치는지 분석하고, 변경에 소요되는 비용과 영향을 예측한다. 출시계획 수립 단계에서는 어떤 변경 요청을 구현할지 결정한다. 변경의 구현 단계에서는 변경 사항을 실제로 구현하고 검증한다. 마지막으로 시스템 출시 단계에서는 새로운 시스템을 배포한다.
이러한 프로세스는 새로운 변경 요구사항이 제시되면 반복된다. 소프트웨어는 지속적으로 변화하므로 이 프로세스는 소프트웨어의 진화를 이끄는 중요한 메커니즘이 된다. 변경 요청의 종류, 조직의 개발 프로세스, 참여 인력의 경험 수준 등이 이 프로세스에 영향을 미친다.
이처럼 일반적인 진화 프로세스는 소프트웨어가 변화하고 진화하는 과정을 단계적으로 설명한다. 이를 통해 소프트웨어 시스템이 지속적으로 발전하고 개선될 수 있도록 한다.
1.2.3. 특수 상황의 진화 프로세스
특수 상황의 진화 프로세스는 긴급한 변경 요청이나 애자일 방법으로 개발된 프로젝트의 진화 시 적용되는 프로세스이다.""
긴급한 진화 프로세스는 정상적으로 작동되려면 반드시 고쳐야 하는 심각한 결함이 있을 때, 운영체제 업그레이드와 같은 시스템 환경이 변함에 따라 소프트웨어가 예상치 않은 결과를 나타낼 때, 경쟁사의 제품이 출시되는 것과 같은 빠른 대응을 필요로 하는 비즈니스적 요구가 있을 때 사용된다.""이때는 요구사항이나 설계 문서의 분석에 앞서 급하게 코드를 수정하며, 차후의 유지보수 작업이 어려워질 수 있다.""
애자일 방법으로 개발된 프로젝트의 경우, 진화 프로세스는 개발 프로세스의 연속이라 볼 수 있다.""소프트웨어를 변경할 때 자동화된 회귀 테스팅이 유용하며, 변동 사항은 추가적인 유저 스토리로 표현된다.""다만 개발 팀과 유지보수 팀이 다른 경우 문제가 발생할 수 있는데, 개발 팀이 애자일 방식을 이용했지만 유지보수 팀은 계획 기반의 방식을 선호하거나, 반대의 경우에도 문제가 생길 수 있다.""
1.3. 프로그램 진화 역학
1.3.1. 리먼의 법칙
리먼의 법칙은 진화하는 '대형 소프트웨어'에 적용될 수 있는 몇 가지 법칙으로, 리먼(Lehman)과 벨라디(Belady)에 의해 제안되었다"". 이러한 법칙은 소프트웨어의 변화와 진화 과정을 설명하며, 소프트웨어 유지보수를 계획할 때 고려해야 할 중요한 특징들을 보여준다"".
첫째, 지속적인 변화(continuing change) 법칙은 소프트웨어가 계속해서 변화하지 않으면 유용성이 저하된다는 것을 말한다"". 즉, 소프트웨어는 지속적으로 변화해야 하며, 그렇지 않으면 소프트웨어의 가치가 떨어지게 된다"".
둘째, 증가하는 복잡도(increasing complexity) 법칙은 소프트웨어가 변경될수록 시스템의 구조가 점점 더 복잡해지고 나빠진다는 것을 의미한다"". 따라서 소프트웨어 구조 개선을 위한 추가적인 노력이 필요하게 된다"".
셋째, 거대 프로그램 진화(large program evolution) 법칙은 프로그램의 크기, 릴리스 간격, 보고되는 에러의 개수 등이 변경 후에도 거의 일정하다는 것을 ...