////
Search
Duplicate
🖼️

20. 소프트웨어 품질

구현 관점에서 소프트웨어 품질과 관련된 주요 개념들을 설명한다. 품질과 품질 보증 자체를 중점으로 다루며 실무 중심의 기법보단 전반적인 관점에서 품질과 관련된 내용을 다룬다.

소프트웨어 품질의 특성

소포트웨어는 외적인 품질과 내적인 품질로 나뉜다.
외적인 특성은 소프트웨어 제품의 사용자가 느끼는 특성들을 의미하며 다음과 같다.
정확성: 시스템의 사양과 설계, 구현에 오류가 없는 정도
사용성: 사용자가 시스템을 배우고 사용하는 데 있어서의 용이함
효율성: 메모리와 실행 시간 같은 시스템 리소스의 사용의 효율성
신뢰성: 특정 상황에서 언제든지 필요한 기능을 수행할 수 있는 시스템의 능력과 고장 사이의 시간
무결성: 시스템이 프로그램이나 데이터에 대해 허용되지 않거나 잘못된 접근을 막는 정도
여기엔 적절한 데이터 접근을 보장하는 것뿐만 아니라 권한이 없는 사용자의 접근 제한도 포함된다.
적응성: 시스템을 변경하지 않고 설계된 환경뿐만 아니라 다른 응용 프로그램이나 환경에서 사용될 수 있는 정도
정밀성: 양적 결과 면에서 구성된 시스템에 오류가 없는 정도
견고성: 시스템이 잘못된 입력이나 악조건같은 엣지 케이스 등에서도 기능을 계속해서 수행할 수 있는 정도
내적인 특성은 프로그램 내적인 품질을 의미하며 구현에 가까운 프로그래머라는 특성상 이에 더 중점을 둔다.
유지보수성: 소프트웨어 시스템의 기능을 변경, 추가, 향상, 수정 등 변경할 때의 편의성
유연성: 시스템이 설계된 환경이 아닌 다른 목적이나 다른 환경으로 변경할 수 있는 정도
이식성: 시스템이 설계된 환경이 아닌 다른 환경에서 작동할 수 있도록 시스템을 변경할 때의 편의성
재사용성: 시스템의 일부분을 다른 시스템에서 사용할 수 있는 정도나 편의성
가독성: 시스템의 소스코드를 구체적인 명령문 수준에서 읽고 이해할 때의 편의성
테스트 용이성: 시스템을 단위 테스트나 시스템 테스트할 수 있는 정도, 시스템이 요구사항을 충족하는지 검증할 수 있는지에 대한 정도
이해 용이성: 시스템 구성과 코드 수준에서 시스템을 이해할 때의 편의성
어떤 수준에서 내적인 특성이 외적인 특성에 영향을 미치기도 하므로 내적인 특성와 외적인 특성 사이의 차이가 완전히 분명하지는 않다.
가독성, 유지보수성이 낮은 경우 결함 수정에 영향을 미치므로 정확성신뢰성으로 이어진다.
일반적으로 어떤 특성을 중시하는 경우, 다른 특성을 약화시키게되는 상충 관계가 존재하듯이, 외적인 품질 특성에도 이러한 관계가 존재한다.
서로 상충하는 목적과 결과 사이에서 가장 바람직한 방법을 찾는 것은 현재 상황을 명확하게 인식하고 목적을 명확하게 하는 것이다.

2. 소프트웨어의 품질을 향상시키기 위한 기법

소프트웨어 품질의 목표
외적인 특성과 내적인 특성 중 명확한 품질의 기준이 되는 목표를 설정하는 것이다.
명확한 목표를 설정하지 않으면 개발자가 예상과 다른 특성을 최대화하기 위해 작업할 수도 있다.
명확한 품질 보증 활동
품질 보증에 있어서 보편적인 문제 중 하나는 품질이 부가적인 목표로 인식되는 것이다.
실제로 어떤 조직에서는 품질보다 빠르게 처리하는 것을 미덕으로 여긴다.
품질이 중요함을 이해하고 특정 목표를 세우고 달성하기 위해 노력해야 한다.
테스트 전략
테스트 수행은 제품의 신뢰성에 대한 상세한 피드백이 가능하다.
소프트웨어 공학 가이드라인
가이드라인은 개발 당시 소프트웨어의 기술적인 특성을 관리한다. 문제 정의, 요구사항 개발, 아키텍처, 구현, 시스템 테스트를 포함한 모든 소프트웨어 개발 활동에 적용된다.
비형식적인 기술적 리뷰
많은 소프트웨어 개발자는 형식적인 리뷰 전에 자신이 작업한 내용을 리뷰한다.
비형식적인 리뷰에는 설계나 코드를 책상에서 검사하거나 동료와 함께 코드를 살펴보는 방법이 포함된다.
절차를 따르는 기술적 검토
소프트웨어 공학적으로 프로젝트를 접근했을때, 프로세스 관리 작업 중 하나는 투자 비용과 문제 해결 비용이 가장 적은 시기인 최저 비용 단계에 문제를 찾는 것이다.
이를 위해 개발자들은 품질 관문, 주기적인 테스트 리뷰를 통해 제품의 품질을 유지한다.

개발 프로세스

변경 관리 과정
통제되지 않은 변경은 설계와 코드 작성에 혼란을 줄 수 있다.
변경을 효과적으로 관리하는 것이 높은 품질을 유지하는 지름길이다.
결과 측정
품질 보증 계획의 결과를 측정하지 않는다면 계획대로 되고 있는지 확인하지 못하고 피드백도 불가하다.
측정은 계획이 성공인지, 실패인지를 알려주고 프로세스가 어떻게 향상될 수 있는지 알 수 있게 조정된 방법으로 프로세스를 변경할 수 있게 해준다.
프로토타이핑
시스템의 핵심 기능에 대한 실질적인 모델을 개발하는 것이다.

목표 설정

품질 목표를 명확하게 설정하는 것은 고품질 소프트웨어를 작성하기 위한 가장 간단하고 명확한 과정이다.

3. 품질 향상 기법의 상대적 효과성

품질 향상 기법의 효과에 대한 여러 측면을 설명한다.

발견된 결함의 비율

기법들에 따라 결함을 발견하는 효율도 다르고 찾아내는 결함의 종류도 다르다.
결함 감지 기법을 판단하는 한 가지 방법은 프로젝트에 그 당시 존재하는 전체 결함의 수를 기준으로 이 기법을 사용해 발견한 결함의 비율을 계산하는 것이다.
제거 단계
최하 비율
최빈수 비율
최고 비율
비형식적 설계 검토
25%
35%
40%
형식적 설계 정밀 검토
45%
55%
65%
비형식적 코드 검토
20%
25%
35%
형식적 코드 정밀 검토
45%
60%
70%
모델링 또는 프로토타이핑
35%
65%
80%
코드에 대한 개인 검사
20%
40%
60%
단위 테스트
15%
30%
50%
컴포넌트 테스트
20%
30%
35%
통합 테스트
25%
35%
40%
회귀 테스트
15%
25%
30%
시스템 테스트
25%
40%
55%
소량 베타 테스트
25%
35%
40%
대량 베타 테스트
60%
75%
85%
이 표를 보면 개발자들이 더 높은 비율로 결함을 감지하고 싶다면 여러 기법들을 조합하여 사용해야 함을 알 수 있다.
결론적으로 결함 감지 기법은 단독으로 사용했을 때보다 함께 사용할 때 더 좋은 결과를 가져온다.
존스는 단위 테스트와 기능 테스트, 시스템 테스트를 조합해 사용하면 종종 60% 이하의 결함 감지 효율을 가져오는데 부적당하다고 지적했다.
익스트림 프로그래밍에서 사용되는 일련의 결함 제거 기법은 결함 제거 효율이 평균 90%에서 최고 97%에 이른다.
비형식적인 설계 검토(페어 프로그래밍), 비형식적인 코드 검토(페어 프로그래밍), 코드에 대한 개인 탁상 검사, 단위 테스트, 통합 테스트, 회귀 테스트

결함 발견 비용

어떤 결함 감지 기법은 다른 감지 기법에 비해 효과가 더 좋듯이, 비용이 더 들기도 한다.
가장 경제적인 기법을 사용하면 다른 조건이 모두 같은 경우에 결함 감지당 최소 비용이 든다.
대부분의 연구에서 정밀 검토가 테스트보다 비용이 저렴하다는 사실을 발견했다.
소프트웨어 공학 연구소가 실시한 한 연구에서 코드를 읽는 것이 테스트하는 것보다 시간 당 약 80%의 결함을 더 발견한다는 것을 알아냈다.
정밀 검토를 수행하고 테스트를 수행하자..

결함 수정 비용

오류를 초기에 찾아내는 감지 기법이 결과적으로 더 낮은 수정 비용이 든다.
결함 감지 같은 기법들은 결함의 증상과 원인을 한 번에 발견하지만 테스트같은 기법들은 증상은 찾아내지만 결함의 원인을 진단하고 수정하기 위한 별도의 작업을 거쳐야 한다.
효과적인 소프트웨어 품질 향상 프로그램에는 개발의 전 과정에 적용되는 기법들을 조합해 사요해야 한다. 다음은 평균 이상의 품질을 얻기 위해서 추천할 만한 조합이다.
모든 요구사항, 아키텍처, 시스템의 주요 부분의 설계에 대한 형식적인 정밀 검토
모델링이나 프로토타이핑
코드 리뷰와 정밀 검토
수행 테스트

4. 품질 보증 활동 시기

소프트웨어에 오류가 더 일찍 추가될수록 소프트웨어의 다른 부분과 더 많이 얽히고 오류를 제거하는 데 더 큰 비용이 든다.
요구사항에서의 결함을 설계에서 하나 이상의 결함을 만들고 코드에서는 수많은 오류를 만들 수 있다.
요구사항의 오류는 추가적인 아키텍처나 잘못된 아키텍처 선택으로 이어질 수 있다.
결함은 소프트웨어의 모든 단계에 숨어드는데, 초기 단계에서뿐만 아니라 프로젝트의 나머지 전반적으로 품질 보증 작업을 수행해야 한다.
작업을 시작할 때, 품질 보증 작업이 계획에 포함되어 있어야 하고 작업을 진행 중일 때는 기술적 특성의 한 부분이어야 하며 작업이 끝날 대는 제품의 품질을 검증하여 마무리해야 한다.

5. 소프트웨어 품질의 일반적인 원칙

소프트웨어 품질의 일반적인 원칙은 품질의 향상으로 개발 비용을 줄일 수 있다는 것이다.
생산성과 품질을 향상시키기 위한 가장 좋은 방법은 수정 작업이 요구사항의 변경이나 설계상의 변경인지에 상관없이 코드를 다시 작성하는 데 걸리는 시간을 줄이느 것이다.
대부분의 프로젝트에서 가장 큰 활동은 정상적으로 작동하지 않는 코드를 디버깅하고 수정하는 것이다.
디버깅과 리팩토링, 다른 수정 작업이 전형적인 소프트웨어 개발 주기에서 약 50% 정도의 시간을 차지한다.
이는 곧 오류를 예방하여 디버깅을 줄이면 생산성이 향상된다는 의미다. 따라서 개발 일정을 줄이는 가장 확실한 방법은 처음부터 천천히 안전하게 가는 것이다.

요점 정리

결함을 비싸게 고치는 대신 저렴하게 예방하기 위해서 품질을 확보하는 데에도 비용을 충분히 들이는 것이 중요하다.
품질 보증과 관련된 모든 목표를 동시에 달성할 수는 없다. 달성하고자 하는 목표를 분명히 결정하고 결정된 목표를 팀원들과 공유하여 일관된 상태를 유지하라.
어떠한 단일 결함 감지 기법도 그 자체만으로는 완벽하지 않다. 성공적인 품질 보증 프로그램은 서로 다른 오류를 발견하기 위해 다양한 기법을 활용하라.
구현 중에 효과적인 기법을 적용할 수 있고, 구현 전에도 강력한 기법들을 적용할 수 있다. 결함을 초기에 발견할수록 수정 비용을 줄일 수 있다.
소프트웨어의 품질 보증은 프로세스 지향적이다. 소프트웨어 개발은 제조업과 같이 최종 제품에 영향을 미치는 일련의 단계가 없다. 따라서 결과물의 품질은 소프트웨어를 개발하는 데 사용되는 모든 프로세스에서 관리해야 한다.