Software Change
- Software change is inevitable: 소프트웨어는 계속해서 변화를 겪어야 한다. 소프트웨어 사용 중에 새로운 요구사항이 생기고, 비즈니스 환경이 변하며, 에러를 수정해야 하고, 새로운 컴퓨터나 장비가 시스템에 추가될 수 있다. 또한 시스템의 성능이나 신뢰성을 개선할 필요가 있을 수 있다.
- Key problem for organizations: 모든 조직에서 중요한 문제는 기존 소프트웨어 시스템에 변경을 구현하고 관리하는 것이다. 대기업의 경우, 소프트웨어 예산의 대부분은 새로운 소프트웨어 개발보다는 기존 소프트웨어의 변경과 발전에 사용된다.
A Spiral Model of Development and Evolution
- Spiral model은 소프트웨어 개발 및 진화에서 반복적인 과정을 강조하는 모델로, 개발이 점진적으로 이루어지고 새로운 요구사항과 변경사항이 지속적으로 반영된다. 이 모델은 개발과 진화가 반복적이고 점진적인 과정을 거쳐 이루어짐을 보여준다.
Evolution and Servicing
- Evolution (진화):
- 소프트웨어 시스템의 생애 주기에서 운영 중인 시스템이 새로운 요구사항에 맞춰 진화하는 단계이다. 이 과정에서 시스템은 계속해서 기능을 확장하고, 기존의 요구를 처리하며 발전한다.
- Servicing (유지보수):
- 이 단계에서 소프트웨어는 여전히 유용하지만, 주로 버그 수정과 환경 변화에 따른 적응을 위한 변경만 이루어진다. 새로운 기능은 추가되지 않으며, 기존 기능의 유지와 운영에 필요한 변경만 이루어진다.
- Phase-out (단종):
- 소프트웨어가 여전히 사용될 수 있지만, 더 이상 변경이 이루어지지 않는 상태이다. 시스템은 유지되지만 더 이상의 발전이나 기능 추가는 없으며, 주로 지원 종료를 의미한다.
Evolution Processes
- Software Evolution는 소프트웨어가 유지보수되고 발전하는 방식이다. 이 과정은 여러 요소에 따라 달라진다:
- 유지보수하는 소프트웨어의 유형: 시스템의 성격에 따라 진화하는 과정이 달라진다.
- 사용된 개발 프로세스: 개발 프로세스가 어떻게 설정되었는지에 따라 소프트웨어 진화가 영향을 받는다.
- 사람들의 기술과 경험: 개발과 진화 과정에 참여하는 사람들의 경험에 따라 진화 방식도 달라질 수 있다.
- Proposals for change: 시스템 진화의 주요 동력은 변경 제안이다. 제안된 변경 사항은 영향을 받는 구성 요소와 연결되어야 하며, 변경의 비용과 영향을 추정할 수 있어야 한다. 또한, 변경 사항을 추적하고 진화하는 과정은 시스템의 생애 주기 동안 지속적으로 이루어진다.
The Software Evolution processes
Urgent Change Requests
- Urgent changes는 종종 소프트웨어 공학 프로세스를 전부 거치지 않고 즉시 적용해야 할 수 있다. 예를 들어:
- 심각한 시스템 결함이 발견되어 정상적인 운영을 계속할 수 없을 때,
- 시스템 환경(예: OS 업그레이드)의 변경이 예상치 못한 영향을 미쳤을 때,
- 비즈니스 변경(예: 경쟁 제품 출시)으로 인해 빠른 대응이 필요한 경우 등이다.
Agile Methods and Evolution
- Agile methods는 점진적인 개발 방식을 채택하므로 개발과 진화 사이의 전환이 원활하게 이루어진다. 진화는 시스템의 자주적인 릴리스를 기반으로 개발 과정을 계속 이어가는 방식이다.
- Automated regression testing은 시스템 변경 시 매우 유용하다. 새로운 기능 추가나 변경이 기존 시스템에 미치는 영향을 확인할 수 있다.
- 변경 사항은 user stories로 표현될 수 있으며, Agile development teams가 유지되고 있다는 가정 하에 Handover 문제를 피할 수 있다.
Handover Problems
- Agile approach를 사용한 개발 팀이 있지만 evolution team이 Agile 방식에 익숙하지 않고 계획 기반의 접근 방식을 선호하는 경우, evolution team은 세부적인 문서를 요구할 수 있다. 하지만 Agile에서는 그런 문서가 제대로 생성되지 않기 때문에 문제가 발생할 수 있다.
- 반대로 계획 기반 접근을 사용한 개발 팀에서 evolution team이 Agile 방법을 선호하는 경우, automated tests를 새로 개발해야 할 수 있으며, 기존 코드가 refactor되지 않거나 단순화되지 않은 상태일 수 있어 Agile 개발 기대에 맞지 않을 수 있다.
Legacy Systems
Legacy systems는 더 이상 새로운 시스템 개발에 사용되지 않는 언어와 기술에 의존하는 오래된 시스템이다. 이러한 시스템은 구형 하드웨어 (예: 메인프레임 컴퓨터)에 의존할 수 있으며, 구형 프로세스와 절차들이 함께 사용될 수 있다.
또한 Legacy systems는 종종 넓은 사회 기술적 시스템의 일환으로, 하드웨어, 소프트웨어, 라이브러리 및 기타 지원 소프트웨어와 비즈니스 프로세스를 포함한다.
레거시 시스템의 요소들
- System hardware (시스템 하드웨어):
- Legacy 시스템은 더 이상 사용되지 않는 하드웨어에 맞춰 작성된 경우가 많다. 예를 들어, 오래된 메인프레임 컴퓨터나 특수 하드웨어에 의존하는 시스템들이 이에 해당한다.
- Support software (지원 소프트웨어):
- Legacy 시스템은 다양한 지원 소프트웨어에 의존할 수 있으며, 이 소프트웨어는 구식이거나 더 이상 지원되지 않는 경우가 많다. 이러한 소프트웨어의 유지 보수와 업데이트가 어려운 경우가 많다.
- Application software (응용 소프트웨어):
- 비즈니스 서비스를 제공하는 응용 시스템은 여러 개의 응용 프로그램으로 구성된다. 이러한 소프트웨어는 특정 비즈니스 요구를 충족시키기 위해 설계되었으나, 시간이 지나면서 최신 기술에 맞지 않거나 유지보수가 어려워진 경우가 많다.
- Application data (응용 데이터):
- Legacy 시스템에서 처리되는 데이터는 종종 불일치, 중복 또는 다른 데이터베이스에 분산되어 있을 수 있다. 이러한 데이터는 관리가 복잡하고 오류가 발생할 수 있다.
- Business processes (비즈니스 프로세스):
- 비즈니스 프로세스는 비즈니스 목표를 달성하기 위해 사용되는 과정들이다. Legacy 시스템은 이러한 비즈니스 프로세스가 설계되고, 그 기능에 의해 제약을 받는 경우가 많다.
- Business policies and rules (비즈니스 정책과 규칙):
- 비즈니스 정책과 규칙은 비즈니스 운영 방식을 정의하고, 비즈니스에 대한 제약을 설정하는 규칙들이다. Legacy 시스템은 이러한 정책과 규칙에 내장되어 있어, 시스템의 변경이 비즈니스 운영에 영향을 미칠 수 있다.
Legacy System Replacement and Change
Legacy 시스템 교체는 위험하고 비용이 많이 드는 작업이다. 그 이유는 다음과 같다:
- 시스템이 여전히 사용되고 있기 때문에 교체가 쉽지 않다.
- 시스템 사양이 완전하지 않음.
- 시스템과 비즈니스 프로세스가 강하게 통합되어 있음.
- 비즈니스 규칙이 문서화되지 않고 Legacy 시스템에 내장되어 있음.
- 새로운 소프트웨어 개발이 지연되거나 예산을 초과할 수 있음.
또한, Legacy 시스템 변경(수정)은 비용이 많이 든다. 그 이유는 다음과 같다:
- 일관되지 않은 프로그래밍 스타일.
- 구식 프로그래밍 언어 사용, 이에 해당하는 언어 능력을 가진 사람의 수가 매우 적음.
- 불충분한 시스템 문서화.
- 시스템 구조의 퇴화.
- 프로그램 최적화가 이루어져 있어 코드가 이해하기 어려운 경우가 많음.
- 데이터 오류, 중복, 불일치 문제 등.
Legacy System Management
Legacy 시스템 관리를 위한 전략을 선택하는 것은 매우 중요하다. 조직은 다음 중 하나의 전략을 선택해야 한다:
- 시스템을 완전히 폐기하고, 비즈니스 프로세스를 수정하여 시스템을 더 이상 필요하지 않도록 만든다.
- 시스템을 계속 유지한다.
- 시스템을 재구성하여 유지보수를 개선한다.
- 시스템을 새로운 시스템으로 교체한다.
Legacy System Assessment
Legacy 시스템의 상태를 평가하기 위해서는 비즈니스 가치 평가와 시스템 품질 평가가 필요하다. 평가 항목은 4가지 범주로 나눌 수 있다:
- Low quality, low business value (저품질, 낮은 비즈니스 가치):
- 이 시스템들은 폐기해야 한다.
- Low quality, high business value (저품질, 높은 비즈니스 가치):
- 이 시스템은 비즈니스에 중요한 기여를 하지만 유지보수 비용이 높다. 이런 시스템은 재구성하거나 적절한 시스템으로 교체해야 한다.
- High quality, low business value (고품질, 낮은 비즈니스 가치):
- 이 시스템은 COTS(상용 소프트웨어)로 교체하거나 폐기하거나 유지해야 한다.
- High quality, high business value (고품질, 높은 비즈니스 가치):
- 이 시스템은 정상적인 시스템 유지보수를 통해 계속 운영할 수 있다.
Software Maintenance
- Software Maintenance:
소프트웨어 유지보수는 소프트웨어가 사용된 후 프로그램을 수정하는 과정을 의미한다. 주로 custom software의 변경을 위해 사용된다.- Generic software products는 새로운 버전을 만들기 위해 진화한다고 할 수 있다.
- 변경 사항은 기존 구성 요소를 수정하거나 시스템에 새로운 구성 요소를 추가하여 구현된다.
- 보통 시스템 아키텍처에 대한 주요 변경은 포함되지 않는다.
Types of Maintenance
- Fault Repairs (결함 수정):
- 시스템을 변경하여 버그나 취약점을 수정하고 요구사항을 충족하지 못한 부분을 고친다.
- Environmental Adaptation (환경 적응):
- 소프트웨어가 다른 운영 환경에서 작동할 수 있도록 유지보수한다.
- 예를 들어, 시스템이 초기 구현 환경과 다른 컴퓨터나 운영 체제에서 작동할 수 있도록 시스템을 변경하는 과정이다.
- Functionality Addition and Modification (기능 추가 및 수정):
- 시스템을 수정하여 새로운 요구 사항을 만족시킨다.
Maintenance Costs
- Maintenance Costs는 보통 개발 비용보다 크다.
- 예를 들어, 애플리케이션에 따라 2배에서 100배 이상 차이가 날 수 있다.
- 기술적 및 비기술적 요인 모두 영향을 미친다.
- 소프트웨어가 유지보수될수록 유지보수 비용은 증가한다.
- 유지보수는 소프트웨어 구조를 손상시킬 수 있기 때문에, 추가 유지보수가 점점 더 어려워진다.
- 오래된 소프트웨어는 높은 지원 비용을 초래할 수 있다 (예: 구식 언어, 컴파일러 등).
Maintenance Prediction
- Maintenance Prediction (유지보수 예측):
시스템에서 어떤 부분이 문제를 일으킬 수 있는지, 그리고 유지보수 비용이 얼마나 들지 예측하는 과정이다.- change acceptance은 변경된 구성 요소의 유지보수성에 달려 있다.
- 변경을 구현하면 시스템이 degrade되고, 유지보수성이 떨어진다.
- 유지보수 비용은 변경 수와 변경 비용에 따라 달라진다.
Change Prediction
- Change Prediction (변경 예측):
시스템과 환경 간의 관계를 예측하는 데 필요하다.- Tightly coupled systems에서는 환경이 변경될 때마다 시스템도 변경해야 한다.
- 이 관계에 영향을 미치는 요소들은 다음과 같다:
- 시스템 인터페이스의 수와 복잡성
- 본질적으로 변동성이 큰 시스템 요구 사항의 수
- 시스템이 사용되는 비즈니스 프로세스
Metrics for Change Prediction
- Metrics for Change Prediction (변경 예측을 위한 지표):
- 이들 중 하나라도 증가하면 유지보수성이 감소했을 수 있다.
- Process metrics:
- 수정 유지보수 요청 수
- 영향 분석에 필요한 평균 시간
- 변경 요청을 구현하는 데 걸린 평균 시간
- 미결 변경 요청 수
- Complexity metrics:
- 제어 구조의 복잡성
- 데이터 구조의 복잡성
- 객체, 메소드(절차), 모듈 크기
Software Reengineering
- Reengineering (소프트웨어 리엔지니어링):
리엔지니어링은 기능을 변경하지 않고 레거시 시스템의 일부 또는 전체를 재구성하거나 다시 작성하는 것이다.- 일부 서브시스템이 자주 유지보수가 필요한 경우에 적용된다.
- 리엔지니어링은 시스템을 더 쉽게 유지보수할 수 있도록 하는 데 필요한 추가 노력을 포함한다.
- 시스템은 재구성되고, 문서화가 다시 이루어진다.
- Advantages of Reengineering (리엔지니어링의 장점):
- Reduced risk (위험 감소): 새로운 소프트웨어 개발에는 많은 위험이 존재한다. 개발 문제, 인력 문제, 사양 문제 등이 발생할 수 있다.
- Reduced cost (비용 감소): 리엔지니어링의 비용은 새로운 소프트웨어를 개발하는 비용보다 상당히 적다.
Reengineering Process Activities
- Source code translation (소스 코드 번역):
- 코드를 새로운 언어로 변환한다.
- Reverse engineering (역공학):
- 프로그램을 분석하여 시스템을 이해한다.
- Program structure improvement (프로그램 구조 개선):
- 이해하기 쉽게 자동으로 프로그램 구조를 재구성한다.
- Program modularization (프로그램 모듈화):
- 프로그램 구조를 재조직화한다.
- Data reengineering (데이터 리엔지니어링):
- 시스템 데이터를 정리하고 재구성한다
Refactoring
- Refactoring는 프로그램의 구조를 개선하거나 복잡성을 줄여서 변경을 통한 저하를 늦추는 과정이다. 이는 예방적 유지보수로, 미래에 발생할 수 있는 변경 문제를 줄이기 위한 노력이다.
- 리팩토링은 프로그램을 수정하여 구조를 개선하고, 복잡성을 줄이며, 프로그램을 더 이해하기 쉽게 만드는 작업이다. 이 과정에서는 기능 추가가 아니라 프로그램 개선에 집중한다.
Refactoring과 Reengineering
- Reengineering(재설계)은 시스템이 일정 기간 동안 유지보수된 후, 유지보수 비용이 증가할 때 수행된다. 이 과정에서는 자동화된 도구를 사용하여 구형 시스템(legacy system)을 처리하고, 더 유지보수가 용이한 새로운 시스템을 만든다.
- Refactoring은 개발과 진화 과정 내내 지속적으로 이루어지는 개선 과정이다. 이는 시스템을 유지보수하는 데 드는 비용과 어려움을 증가시키는 구조와 코드의 저하를 피하기 위한 작업이다.
‘Bad Smells’ in Program Code
- Duplicate code (중복 코드): 동일하거나 매우 유사한 코드가 프로그램 내 여러 곳에 포함되어 있을 수 있다. 이는 하나의 메서드나 함수로 묶어 필요한 곳에서 호출할 수 있도록 수정하여 제거할 수 있다.
- Long methods (긴 메서드): 메서드가 너무 길다면, 여러 개의 짧은 메서드로 다시 설계하는 것이 좋다.
- Switch (case) statements (Switch문): switch 문은 종종 값의 타입에 따라 중복이 발생하는 경우가 있다. 프로그램 곳곳에 분산되어 있을 수 있는데, 객체지향 언어에서는 다형성(polymorphism)을 활용하여 같은 작업을 할 수 있다.
- Data clumping (데이터 뭉치기): 동일한 데이터 항목(클래스의 필드, 메서드의 파라미터)이 여러 곳에서 반복되는 경우, 이들을 하나의 객체로 묶어서 대체할 수 있다.
- Speculative generality (추측적 일반화): 개발자가 미래에 필요할 수도 있다고 예상하여 프로그램에 일반성을 추가하는 경우가 있다. 그러나 대부분은 불필요한 코드로 제거할 수 있다.
반응형
'CS 지식 > 소프트웨어 공학' 카테고리의 다른 글
Implementation Issues(소프트웨어 구현 주요 이슈들)과 오픈 소스 (0) | 2024.12.02 |
---|---|
Software Testing(소프트웨어 테스팅)과 개발 테스팅 (0) | 2024.12.01 |
Architectural Pattern(아키텍처 패턴)과 스타일 종류 (0) | 2024.12.01 |
Architectural Design (아키텍처 설계) 결정과 4+1 View (0) | 2024.12.01 |
Model-Driven Engineering (모델 기반 엔지니어링, MDE, MDA) 의 개념과 활용 (0) | 2024.12.01 |
댓글