소프트웨어공학 - 소프트웨어 품질
소프트웨어의 품질의 정의
- DoD, 1985, “소프트웨어가 사용자의 의도대로 수행될 수 있는 정도”
- ISO, 1986, “명시되었거나 묵시적인 요구를 충족시키는 정도”
품질의 특징
- 품질이 절대적이지 않습니다
- 품질은 다차원적이다
- 품질은 제약조건(사람, 돈, 시간, 도구)에 따른다
- 품질은 수용 가능한 타협에 관한 것이다
- 품질 기준이 독립적이지 않음
외부 품질
시스템 사용자에게 보이는 품질
내부 품질
시스템 개발자가 고려하는 품질. 내부 품질은 외부 품질을 달성하는데 도움을 준다. 외부의 신뢰성을 달성하기 위해서는 내부에서 검증이 필요하다.
제품의 품질
기능, 사용성, 효율성, 신뢰성 등이 있다.
프로세스 품질
생산성, 방법 및 도구의 효율성, 표준을 사용, 관리 등이 있다.
품질 요소
사용자
- 사용이 쉬움
- 기능성(기능이 가지는 역할과 효과의 정도)
- 배우기 쉬움
- 효율성
- 신뢰성
스폰서
- 낮은 비용
- 생산성
- 유연성
- 효율성
- 신뢰성
유지보수하는 사람
- 문서
- 적은 에러
- 읽기 쉬운 코드
- 좋은 설계
- 신뢰성
소프트웨어 품질이 다른 품질과 다른점
- 소프트웨어는 물리적으로는 존재하지 않는다.
- 처음에는 고객의 요구에 대한 지식이 부족하다.
- 시간이 지남에 따라 고객의 요구도 변경된다..
- h/w와 s/w 모두 빠른 속도로 변한다.
- 특히 고객들의 높은 기대(적응력(adaptablility) 참조)
품질을 나타내는 요소
- 정확성, 신뢰성 및 견고성 Correctness, Reliability and Robustness
- 성능 Performance
- 사용자 친화성 User Friendliness
- 검증가능성 Verifiability
- 유지보수성 Maintainability
- 재사용성 Reusability
- 이식성 Portability
- 이해가능성 Understandability
- 상호운용성 Interoperability
- 생산성 Productivity
- 적시성 Timeliness
- 가시성 Visibility
정확성, 신뢰성 및 견고성
섞어서 사용하기도 한다. 응용 프로그램이 예상한대로 기능을 수행하는 정도를 의미한다.
정확성 Correctness
프로그램이 명시된 기능에 따라 동작할 경우 Correct하다고 한다. 설명서가 있는 경우, 프로그램이 해당 설명서의 기능을 충족하는지 명확하게 판단할 수 있다.
신뢰성 Reliability
- 의존가능성이라 불리기도한다. 의존할 수 있으면 신뢰할 수 있다.
- 제품 고장의 빈도와 고장의 위험여부를 측정하여 신뢰성을 측정한다.
- Failure: 작동 조건에서 실행될 때 허용되지 않는 효과나 행동이다.
- 통계적으로도 정의할 수 있다: MTTR, MTTF, MTBF
- MTTR: Mean Time To Repair: 고장 시점에서 수리가 완료되어 재가동되는 시점까지
- MTTF: Mean Time To Failure: 수리가 불가능한 고장까지의 평균 시간
- MTBF: Mean Time Between Failure: 정상 작동시간은 고장 후 수리되어 정상작동하다가 다시 고장이날때가지 작동한 시간이다.
- 정확성과의 관계
- 정확성은 신뢰성의 부분집합이다.
- 정확성이 있는 소프트웨어는 신뢰성이 있지만,그 반대는 아니다. 신뢰성이 있는 소프트웨어가 정확성이 없을 수 있는데, 간헐적으로 에러를 발생시킬 때이다.
- 정확성은 절대적인 개념으로 맞거나 틀린 것을 의미한다. 그러나 신뢰성은 상대적인 것으로, 맥락과 사용자에 따라 신뢰성여부가 달라질 수 있다.
- 즉 정확성은 소프트웨어의 행동이 규격과 일치하는 정도를 의미하고, 신뢰성은 명시된 조건에서 요청된 기능을 수행할 수 있는 능력을 의미한다.
견고성 Robustness
요구사항에서 예상하지 못했던 상황에서도 합리적으로 행동할 경우 견고하다고 한다.
작동 조건의 범위, 유효한 입력에서 허용되지 않는 결과의 가능성, 유효하지 않은 입력이 주어졌을 때의 효과의 허용가능성 등을 고려한다.
신뢰성과의 관계
- 견고성은 잘못된 입력이나 예상치 못한 환경에서도 계속해서 기능하는 정도를 의미한다.
- 신뢰성은 명시된 조건 하에서 요구되는 기능을 수행하는 능력이다.
- 따라서 시스템은 견고하지 않으면서 신뢰성이 있을 수 있고, 견고하면서 신뢰성이 없을 수 있다.
품질 요소 간의 관계
- 정확성은 신뢰성의 부분집합이다.
- 안전은 견고함의 부분집합이다.
-
(정확성, 신뢰성) 과 (견고함, 안전)은 서로 약간 겹친다.
- Robust but not safe: 치명적인 오류가 발생할 수 있다.
- safe but not correct: 짜증나는 오류가 발생할 수 있다.
- Correct but not safe or not robust: 기능이 부족하다.
- Reliable but not correct: 에러가 간헐적으로 발생한다.
성능 Performance
주어진 시간 간격내에 어떤 행동을 실행할지에 대한 시스템의 반응성을 나타낸다. 성능을 시간 및 공간 효율성과 동일시하기도 한다.
시스템의 사용성에 영향을 준다.
모니터링, 분석, 시뮬레이션으로 성능을 측정할 수 있다.
성능의 개념을 software process에 적용시킨 것이 생산성이다.
- 언제 성능을 추정해야할까?
- 소프트웨어 성능 추정은 제품이나 프로세스의 품질을 결정하고 그 품질을 향상시키며 품질을 예측하는데 도움을 준다.
- 개발 과정 초기에 성능을 추정하여 프로젝트 기간와 일정을 정하고, 비용 절감 및 시간 절약에 도움을 줄 수 있다.
사용자 친화성 User Friendliness
사용하기 쉽고, 쉽게 시스템을 구성하고 하드웨어 환경에 맞게 조정할 수 있는 것이다.
검증가능성 Verifiability
소프트웨어의 특성(속성)을 아무 문제 없이 검증할 수 있는 경우 검증 가능하다고 한다.
formal analysis나 테스팅을 통하여 측정할 수 있다.
유지보수성 Maintainability
유지보수는 소프트웨어를 수정하고, 알맞게 조정하며, 기능을 향상시킨다.
수리가능성 Repairability
소프트웨어 시스템이 제한된 작업량으로 수정될 수 있는 경우, 수리가능하다고 한다.
HL PL, CASE(복잡한 응용 프로그램을 작성하는데 도움을 주는 소프트웨어 기술) 등의 도구를 사용하여 향상시킬 수 있다.
모듈화를 통해 달성할 수 있다.
발달가능성 Evolvability
새로운 요구사항을 충족시킬 변화를 허용한다면 발달가능하다.
수정은 새로운 기능을 만들 수도 있고, 기존 기능을 바꿀 수도 있다. 재설계 등이 있다.
재사용성 Reusability
기존에 있는 요소를 활용해 새로운 제품을 만드는 것을 말한다. 예를 들어 라이브러리, 모티브, 유닉스 쉘이 있다.
사람, 요구사항, 설계, 코드, 도메인 분석 등을 재사용할 수 있다.
객체지향을 이용해 달성할 수 있다.
재사용성을 프로세스에 적용시키면 소프트웨어 방법론, life cycle model 등이 있다.
이식성 Portability
다른 환경(하드웨어 플랫폼, 소프트웨어 플랫폼)에서 작동하면 이식성이 있다고 한다.
이해가능성 Understandability
내부 품질이다. 다른 품질을 달성하는데 도움을 준다.
유지보수를 쉽게하게 해준다.
외부의 관점에서, 예상가능한 동작을 보이면 이해가능하다고 한다.
객체지향 패러다임은 이해하기 쉽다고 주장한다.
상호운용성 Interoperability
시스템이 다른 시스템과 공존하고 협력할 수 있는 능력이다.
생산성 Productivity
소프트웨어 제작 과정의 퀄리티이며, 제작 과정의 효율성을 측정한다. 간단하게는 Line of code로 측정한다.
적시성 Timeliness
프로세스와 관련된 요소이다. 제시간에 제품을 배달할 수 있는 능력이다. 섬세한 일정 관리와 정확한 예상, 명확한 이정표 등이 요구된다.
이를 달성하기 위해 incremental delivery가 사용된다.
가시성 Visibility
프로세스와 관련된 요소이며, 모든 단계와 현재 상태가 문서화된 경우 가시성이 있다.
행동이 미치는 영향을 고려할 수 있게 되고, 의사결정에 도움을 준다.
특정 어플리케이션에서 품질 요구사항
정보 시스템
데이터를 저장하고 검색하는 시스템. 은행 시스템, 도서관 시스템 등이 있다. 데이터 무결성, 데이터 가용성, 데이터 이동, 성능, 보안, 사용자 인터페이스가 요구된다.
실시간 시스템
미리 정해진 시간 안에 반드시 반응해야하는 시스템. 공장 모니터링 시스템, 미사일 방어 시스템, 마우스 소프트웨어 등이 있다. control-oriented 이고, 스케줄링이 필요하다.
hard real time과 soft real time이 있다.
실시간 시스템에는 응답시간이 요구된다(정확성도 충족).
분산 시스템
데이터, 조작, 하드웨어를 분산하는 시스템 예를 들어 client/server의 middleware가 있다.
분산 시스템에는 시스템 가용성, 유사성, task 할당,파티셔닝, 고장허용한계 등이 있다.
임베디드 시스템
임베디드 시스템에서 소프트웨어는 많은 요소 중 하나이며, 이 시스템은 end 사용자에 대한 인터페이스가 없다.
참고 문헌
- Roger S. Pressman, Bruce R. Maxim, “Software Engineering”(9th edition), MCGrawHill,2019
- 김치수 저, “소프트웨어 공학”, 한빛아카데미, 2021
- https://accu.org/journals/overload/17/93/wilson_1585/
- https://studybuff.com/what-is-robustness-of-a-software/
- https://www.pluralsight.com/blog/software-development/software-engineering-metrics
- https://www.softwaretestinghelp.com/software-test-estimation-how-to-estimate-testing-time-accurately/
댓글남기기