소프트웨어 유지보수
- 시스템을 인도한 후에 변경하는 일반적인 프로세스
- 변경의 범위
- 코딩 오류
- 설계오류
- 요구사항 오류
소프트웨어 유지보수 유형
- 버그와 취약점을 고치기 위한 결함 수리
- 수리의 종류에 따라 비용 상이(코딩 오류/설계 오류/요구사항 오류)
- 수리의 종류에 따라 비용 상이(코딩 오류/설계 오류/요구사항 오류)
- 소프트웨어를 새로운 플랫폼과 환경에 맞추기 위한 환경적 적응
- 새로운 기능을 추가하고 새로운 요구사항을 지원하기 위한 기능성 추가
유지보수 비용 분포
유지보수 비용
- 개발비용보다 많이 필요
- 기술적/비기술적 요인 둘 다 영향받음
- 소프트웨어가 유지보수됨에 따라 증가
→ 소프트웨어 구조가 망가짐에 따라 유지보수가 힘듦 - 오래된 소프트웨어의 경우 높은 비용 필요
유지보수 비용이 높은 이유
- 유지보수 과정에서 새로운 기능 추가가 초기 개발과정에서 동일한 기능을 구현하는 것보다 비용이 더 듦
- 새로운 팀이 유지보수되는 프로그램을 이해해야 함
- 프로그램 유지보수 업무는 인기가 없음
- 프로그램이 오래될수록 구조는 엉망진창이 되고 변경하기 어려워짐
- 유지보수와 개발의 분리는 개발팀이 유지보수가 쉬운 소프트웨어를 작성하는데 이점이 없다는 것을 의미
유지보수 예측
- 소프트웨어 시스템에 요구될 수 있는 변경을 평가하는 것
- 변경 비용이 가장 많이 들 것 같은 시스템 부분을 식별
시스템 변경 예측
- 변경 가능성이 가장 높은 소프트웨어 컴포넌트를 변경에 더 잘 적응할 수 있도록 설계할 수 있음
- 예 : 얼마나 많은 변경 요청이 예상될 수 있는가?
유지보수성 예측
- 유지보수 비용을 절감할 수 있는 컴포넌트 개선에 노력을 투자할 수 있음
- 예 : 시스템의 어느 부분이 유지보수하는데 가장 비용이 많이 들 것인가?
유지보수 비용 예측
- 소프트웨어 유지보수를 위한 예산을 설정할 수 있음
- 예 : 이 시스템의 전체 수명에 관한 유지보수 비용은 얼마나 될 것인가?
변경 예측
- 시스템에 대한 변경 요청 횟수를 예측하기 위해서는 시스템과 외부 환경사이의 관계를 이해해야 함
- 시스템과 환경 사이의 관계를 판단하기 위해 살펴봐야 하는 것
- 시스템 인터페이스의 개수와 복잡도
- 본래 변하기 쉬운 시스템 요구사항의 개수
- 조직의 정책과 절차를 반영하는 욕사항은 도메인 특성 기반 요구사항보다 변하기 쉬움
- 조직의 정책과 절차를 반영하는 욕사항은 도메인 특성 기반 요구사항보다 변하기 쉬움
- 시스템이 사용되는 비즈니스 프로세스
- 비즈니스 프로세스가 많아질수록 변경 요구 증가
복잡도 지표
- 복잡도 측정은 유지보수 비용이 많이 들 것 같은 프로그램 컴포넌트를 식별하는데 유용
- 시스템이나 컴포넌트가 복잡할수록 유지보수 비용이 많이 듦
- 시스템이 서비스되기 시작한 이후에 유지보수성을 예측하는데 프로세스 데이터를 이용할 수 있음
프로세스 지표
- 다음 항목으로 유지보수성 파악 가능
- 수정 유지보수를 위한 요청 횟수
- 영향 분석에 필요한 평균 시간
- 변경 요구를 구현하는데 걸리는 평균 시간
- 아직 처리되지 않은 변경 요구의 개수
→ 위의 모든 사항이 증가하면 유지보수성이 하락하는 것을 가리키는 것을 의미
소프트웨어 재공학
- 다음의 작업들을 포함
- 시스템을 다시 문서화
- 시스템 아키텍처를 리팩토링
- 프로그램을 최신의 프로그래밍 언어로 변환
- 시스템 데이터의 구조와 값을 수정하고 업데이트
- 소프트웨어의 기능은 변경하지 않으며, 시스템 아키텍처에 대한 중대한 변경을 피하도록 노력
- 장점
- 리스크 감소
- 비즈니스에 중요한 소프트웨어를 다시 개발하는 것에는 매우 높은 리스크가 존재
- 비즈니스에 중요한 소프트웨어를 다시 개발하는 것에는 매우 높은 리스크가 존재
- 비용 절감
- 새로운 소프트웨어를 개발하는 비용에 비해 재공학 비용은 상당히 적을 수 있음
- 리스크 감소
재공학 프로세스
소스 코드 변환
- 변환 도구로 프로그램에 오래된 프로그래밍 언어에서 동일한 언어의 최신 버전이나 다른 언어로 변환
- 변환 도구로 프로그램에 오래된 프로그래밍 언어에서 동일한 언어의 최신 버전이나 다른 언어로 변환
역공학
- 프로그램을 분석하고 정보 추출 - 기능과 구성을 문서화하는데 도움
- 프로그램을 분석하고 정보 추출 - 기능과 구성을 문서화하는데 도움
프로그램 구조 개선
- 제어구조가 분석되어 읽고 이해하기 쉽게 수정
- 제어구조가 분석되어 읽고 이해하기 쉽게 수정
프로그램 모듈화
- 프로그램의 관련된 부분들이 함께 그룹으로 묶이고, 적절한 경우에는 중복성이 제거
- 프로그램의 관련된 부분들이 함께 그룹으로 묶이고, 적절한 경우에는 중복성이 제거
데이터 재공학
- 프로그램이 처리하는 데이터가 프로그램의 변화를 반영하기 위해 변경
- 스키마 재정의, 기존 데이터배이스 구조 변환, 데이터 정리
- 프로그램이 처리하는 데이터가 프로그램의 변화를 반영하기 위해 변경
재공학 접근법
재공학 비용
- 수행되는 작업의 범위에 명백하게 좌우됨
- 소프트웨어 재공학의 문제
- 시스템을 향상하는 데에 실제적인 제한이 있음
- 새로 개발된 시스템만큼 유지보수성이 좋지는 않음
리팩토링
- 변경에 따른 프로그램의 품질 저하를 느리게 하기 위해 프로그램을 개선하는 프로세스
- 미래의 변경 문제를 감소시켜 주는 예방 유지보수
- 구조 개선, 복잡도 감소, 프로그램 이해하기 쉽도록 수정
- 기능 추가 X, 프로그램 개선에 집중
리팩토링과 재공학 비교
- 재공학
- 시스템이 일정 시간 동안 유지보수되고 유지보수 비용이 증가하고 있을 때 발생
- 유지보수성이 더 좋은 시스템을 만들기 위해 레거시 시스템을 처리하고 재공학하는데 자동화된 도구 사용
- 리팩토링
- 개발 및 진화 과정 전반에 걸쳐 개선하는 연속 프로세스
- 시스템 유지 보수 비용과 어려움을 증가시키는 구조 및 코드의 품질 저하를 방지하기 위한 것
프로그램 코드 개선할 수 있는 상황
중복 코드
- 하나의 메서드나 함수로 구현하여 호출함으로 제거
- 하나의 메서드나 함수로 구현하여 호출함으로 제거
길이가 긴 메서드
- 길이 가 너무 긴 메서드는 다수의 짧은 메서드들로 재설계
- 길이 가 너무 긴 메서드는 다수의 짧은 메서드들로 재설계
스위치 케이스 문
- 객체 지향 언어에서 종종 같은 것을 달성하기 위해 다형성을 사용할 수 있음
- 객체 지향 언어에서 종종 같은 것을 달성하기 위해 다형성을 사용할 수 있음
데이터 군집
- 모든 데이터를 캡슐화하는 객체로 대체
- 모든 데이터를 캡슐화하는 객체로 대체
추측에 근거한 일반성
- 개발자들이 앞으로 필요할 경우를 대비하여 프로그램에 일반성을 포함시킬 때 발생
- 종종 간단하게 제거 가능