[소프트웨어공학] Error와 Defect와 Failure의 차이점/소프트웨어 품질 보증
소프트웨어 품질 보증
소프트웨어 품질 보증이란 고객의 요구사항(requirement)와 개발된 산출물이 일치하는지 확인하기 위한 체계이다. 이는 개발단계 전체에 걸쳐 진행된다.
소프트웨어의 품질 수준을 높이려면 적잖은 비용이 들어간다. 이 비용을 나누자면 아래와 같다.
소프트웨어 품질 비용
예방 비용
- 오류를 방지하기 위한 비용
- 프로젝트 관리, 교육, 품질 보증, 형상관리, 기술 지원 등이 포함
- 제품이 실제로 만들어지기 이전에 모두 소요되는 비용
평가 비용
- 요구사항을 모두 포함하는가를 검토하기 위한 비용
- 검토, 테스트, 감사 등이 포함
- 평가 비용은 제품이 완성 된 후, 사용자에게 배포되기 이전에 소요되는 비용
내부 실패 비용
- 고객에게 납품되기 전 요구사항을 충족하지 못하여 발생되는 추가 비용
- 결함 관리, 재작업, 재테스팅 등이 포함
외부 실패 비용
- 사용자에게 넘어간 후, 발생 된 결함으로 인해 발생하는 비용.
- 결함조치, 기술지원, 인지도 하락 등이 포함
이를 인식하고 예방비용과 평가비용에 많은 비용(시간을 포함)한다면 오히려 전체적인 비용은 낮아질 가능성이 있다.
내부 실패비용과 외부 실패비용이 줄어들어 총 품질비용이 줄어들 수 있기 때문이다.
오류 VS 결함 VS 장애
소프트웨어를 개발하는 과정에서는 다양한 오류가 발생할 수 있다. 이 포스팅에서는 오류, 결함, 장애의 의미와 차이를 명확히하고 그것을 미연에 방지하는 방식에 대하여 기술한다.
오류[Error]
정확하지 않는 결과를 산출하는 모든 활동을 말한다. 활동이 복잡해질 수록(프로그램이 커질수록) 에러는 피하기 힘들어지는 특성을 가진다. 즉 에러는 불가피하다. 다시 말해 개발자가 아무리 조심한다고 해도 모든 에러를 피할 수는 없다.
예방 방법
스텐다드와 가이드라인을 따른다.
예)
MISRA-C : C 프로그래밍에 대한 개발 표준, 자동차 산업의 표준
UML(Unified Modeling Language) : 표준화된 범용 모델링 언어
결함[Defect(fault/bug)]
Error가 소프트웨어에 표현된 것을 말한다. fault 혹은 bug라고도 일컫는다. 분석 중에 발견될 수 있으며, 개발 단계에서 스스로 해결하면 결함이라고 한다.
소프트웨어 defects는 static하다고 말한다. 그것이 코드가 가지는 특성이기 때문이다.
예방 방법
V&V(Verification & Validation)을 진행한다. V&V는 testing, inspection, static analysis, simulation을 포함한다.
예)
IEEE 1012 : 확인과 검증에 관한 표준이다.
장애[Failure]
제품이나 소프트웨어, 서비스 등이 기대한 결과를 가지지 못하는 경우이다. (요구사항을 반영하지 못하는 등)
소프트웨어 failure는 dynamic하다고 말한다.
예방 방법
Fault tolerance를 적용한다. Fault Tolerance란 어느 구성 요소가 고장이 나더라도 시스템이 중단하지 않고 계속 작동할 수 있는 능력을 말한다. Fault Tolerance는 아래 3가지 상태를 거친다.
1- Fault Detection(장애 감지)
2- Fault Diagnosis(장애 진단)
3- Fault Recovery(장애 복구)
+ 정적 분석
정적 분석이란?
소스 코드를 실행하지 않고 코드를 분석하는 방식이다. 이러한 방식으로 코드 스멜을 제거한다.
즉 정적 분석/정적 테스팅은 아래의 기능을 한다.
정적 테스팅
결함 검출
- 신뢰성 결함
- 보안 결함
- 성능 결함
- 메모리 사용 결함
코딩 표준/가이드라인 위반 검출
- 코딩 표준 위반(MISRA, JSF C++ 등)
- 코딩 가이드라인 위반(GNU, Google...등)
*동적 분석 : 테스트 케이스를 작성하여 런타임 환경에서 코드를 분석하는 방식.
*정적 분석 : 소스 코드를 실행하지 않고 코드를 분석하는 방식. 이러한 방식으로 코드 스멜을 제거한다.
+ 동적 분석
동적 테스팅 예시(https://doompa.tistory.com/297)