본문 바로가기

프로그램언어/code complate

소프트웨어의 품질에 대한 조망

1. 소프트웨어 품질의 특성
2. 소프트웨어의 품질을 향상시키기 위한 기법들
3. 품질 향상 기법의 상대적 효율성
4. 품질 보증 활동 시기
5. 소프트웨어 품질의 일반적인 조치
6. 요점 정리

소프트웨어의 품질을 향상시키기 위한 내용을 다루고 있지만, 품질과 품질 관리 자체를 중심으로 다루고 있다.

1. 소프트웨어 품질의 향상
ㅇ 품질의 특성은 두가지로 외형/내형으로 구분이 되며,
- 외형적으로는 정확성 / 유용성 /  효율성 / 신뢰성 / 무결성 / 적응성 / 정밀성 / 견고성
- 내적적으로는 유지 보수성 / 유연성 / 이식성 / 재사용성 / 가독성 / 테스트 용이성 / 이행성
ㅇ 이 몇몇 특성들은 그 의미가 겹치기도 하지만, 이 특성들 역시 가치를 두고 있는 부분에 있어서는 다르다는 점이다.
ㅇ 각각의 수준에 따라 외적인 / 내적인 특성에 영향을 서로 미치기 때문에 특성들 간의 차이가 완전히 분명하지는 않다.
ㅇ 예를들어 내적으로 이해하기 어렵거나 유지 보수가 가능하지 않는 소프트웨어는 결함을 수정할 수 있는 능력을 해치기 때문에, 이는 결국 정확성과 신뢰성이라는 외적인 특성에 미친다.
ㅇ 융성성이 없는 소프트웨어는 사용자의 요구에 맞게 변경될 수 없으며, 이는 결국 유용성이라는 외적인 특성에 영향을 미친다.
ㅇ 요점은, 일부 품질의 특성들이 사용자를 위한 편의성을 강조하고 일부는 프로그래머를 위한 편의성을 강조하고 있다는 것이다. 무엇과 무엇이, 그리고 언제, 어떻게 이러한 특성들과 상호 작용하는지 노력해야 한다.

표 도입 부분.

2. 소프트웨어의 품질을 향상시키기 위한 기법들
ㅇ 소프트웨어 품질 보증은 시스템의 특성이 바람직한지를 보장하기 위해서 설계된 계획적이고 체계적인 활동 프로그램이다.
ㅇ 소프트웨어 품질 보증에서는 소프트웨어 개발 프로세스에도 초점을 맞추어야 한다.
 - 소프트웨어 품질의 목표 : 소프트웨어의 품질을 향상시키는 가장 강력한 기법은 앞에서 설명한 외적/내적 특성들 중에서 명확한 품질을 목표로 설정하는 것이다.
 - 명확한 품질 보증 활동 : 일반적인 문제는 품질을 부차적인 목표로 설정 지저분한 프로그래밍을 예외적인 것으로 당연히 받아들인다.
 - 테스트 전략 : 테스트 수행은 제품의 신뢰성에 대한 상세한 평가를 제공할 수 있다. ( 요구사항 / 아키텍처 / 테스트 전략 ) ( 다음편으로 넘김 :: 22장 개발자 테스트 )
 - 소프트웨어 공학 지침 : 개발 당시 소프트웨어의 기술적인 특성을 관리해야 한다. ( 문제정의/ 요구사항분석 / 아키텍처 / 구현 / 시스템 테스트를 포함한 모든 소프트웨어의 활동
 - 비형식적인 기술적 검토 : 많은 소프트웨어 개발자들은 형식적인 검토 단계 전에 자신이 작업한 내용을 검토 ( 설계 / 코드를 책상에서 검사하거나 동료와 함께 코드를 상의하는 방법이 포함 )
 - 형식적인 기술적 검토 소프트웨어 : "최저 비용 단계" 이러한 목표를 달성하기 위해서 개발자들은 주기적인 테스트 또는 검토를 하여 제품의 품질을 다음 단계로 넘어가기에 충분한 결정할 수 있다.
 - 외부 감사 : 품질의 결정하기 위해서 특성한 형태의 기술적인 검토가 필요한데, 감사팀의 외부 조직으로 구성하고 결과는 경영진에 보고하는 형식을 가진다.

(1) 개발 프로세스
 - 변경 관리 과정 : 소프트웨어의 품질을 유지하는데 있어서 한가지 큰 걸림돌은 통제되지 않은 변경이다.
 - 결과의 측정 : 측정을 이용하면 프로세스가 향상될 수 있도록 조정된 방법으로 변경할 수 있다. ( 예를 들어 정확성 / 유용성 / 효율성 등을 측정 )
 - 프로토타이핑( prototyping) : 프로토타이핑은 시스템의 핵심 기능들에 대한 실질적인 모델을 개발하는 것이다. 개발자는 유용성을 결정하기 위해 사용자 인터페이스의 일부를 프로토타이핑하거나 수행시간을 결정하기 위해 핵심적인 부분을 계산하거나 필요한 메모리의 크기를 결정하기 위해 데이터 집합에 프로토타이핑할 수 있다. ( 단위테스트 )

(2) 목표의 설정
Gerald Weinberg와 Edward Schulmandms, 프로그래머들이 품질의 목표를 설정하는 것이 수행 능력에 미치는 영향을 조사하는 하는 놀라운 실행을 수행했다.(1974). 5개팀으로 나뉘어 동일한 다섯 개의 품질 목표를 주어졌으며, 서로 다른 목표에 최적화하도록 지시하였다.
표.

3. 품질 향상 기법의 상대적 효율성
다양한 품질 보증 습관들은 모두 동일한 효과를 갖지 않는다. 많은 기법들이 연구되었고, 결함을 발견하고 제거하는 효과가 알려져 있다.
(1) 발견된 결함의 비율
결함 감지 기법을 평가하는 한 가지 방법은 프로젝트의 특정한 위치에 있는 전체 결함의 수에서 이 기법을 사용하여 발견된 결함의 퍼센트를 결정하는 것이다.
다음 표는 널리 사용되는 결함 감지 기법들에 의해서 발견된 결함의 퍼센트를 보여준다.
표.

[ Gerald Weinberg ] 만약 프로그래머가 프로그램을 작성하는 식으로 건축가가 건물을 짓는다면, 건물에 날아온 첫 번째 딱따구리 때문에 건물이 붕괴될 것이다.
ㅇ 프로그래머들이 다음 기법들 중 어느 하나를 사용하여 오류를 찾도록 하였다.
 - 명세에 대한 실행 테스트
 - 소스 코드가 있는 명세에 대한 실행 테스트
 - 명세와 소스 코드를 사용하여 검토와 조사

ㅇ 결론적으로, 결함 감지 기법들은 단독으로 사용되었을 때보다 함께 사용될 때 더 좋은 결과를 가져온다.
ㅇ 익스트림 프로그래밍(Extreme Programming)과 같은 결함 제거 기법으로 작업을 시작한 사람들이 그렇지 않은 사람들 보다 결함 제거 수준이 뛰어난지에 대한 이유를 이해하기 다음과 같이 표를 이용하였다.
표.
http://word.tta.or.kr/terms/termsView.jsp?gubun=1&terms_num=21429

(2) 결함 발견 비용
경제적인 기법은 단위 결함당 비용이 최소이며, 다른 조건들은 모두 동일하다.

(3) 결함 수정 비용
결함 발견 비용은 비용 방정식의 한 부분일 뿐이다. 어떻게 오류가 발견이 되든 수정에 필요한 비용은 든다는 것으로 보일 수 있다. 허나, 결함이 시스템에 시간이 길면 길수록, 제거하는데 더 많은 비용이 들기 때문에 오류를 초기에 찾아내는 감지 기법이 더 낮은 수정 비용의 결과를 가져올것이다.

정리 ::
결론적으로, 효율적인 소프트웨어 품질 향상 프로그램은 개발의 전 과정에 적용되는 기법들의 조합을 포함해야 한다. 다음은 평균 이상의 품질을 얻기 위해서 추천할만한 조합이다.
ㅇ 모든 요구사항, 모든 아키텍처, 그리고 시스템의 주요 부분에 대한 설계의 형식적인 조사
ㅇ 모델링이나 프로토타이핑
ㅇ 코드 읽기나 조사
ㅇ 수행 테스트

4. 품질 보증 활동 시기
ㅇ 소프트웨어가 만들어지고 부분에 내재되어 있는 오류를 제거하지 못하면 이후에 비용은 증가된다.
ㅇ 추가적인 아키텍처는 추가적인 코드와 테스트 케이스, 문서를 수반하며, 요구 사항에서의 오류가  나중에 쓸모없는 아키텍처, 코드 , 테스트 케이스를 야기한다.

5. 소프트웨어 품질의 일반적인 원칙.
ㅇ 소프트웨어 품질의 일반적인 원칙은 품질의 향상으로 개발 비용을 줄일 수 있다.
ㅇ 보증에 대한 정의 ( 품질 향상을 위해 )
 - 수정 작업이 요구 사항에서의 변경이나 설계 상에서의 변경 또는 디버깅으로 인한 것.
 - 코드를 재작성하는데 걸리는 시간을 줄이기.
 - 소프트웨어 제품의 평균 생산성은 한 사람이 하루에 약 10-50줄 코드를 작성하는 것이다.
   1) 테스터 시간,
   2) 프로젝트 관리자의 시간
   3) 관리 지원팀의 시간도 모두 포함.
   4) 요구사항 분석이나 아키텍처 작업과 같은 코드를 작성하지 않는 활동 계산도 포함.
 - 프로젝트의 가장 큰 활동은 정상적으로 작동하지 앟는 코드를 디버깅하고 수정
 - 디버깅과 리펙토링, 그리고 다른 수정 작업이 전형적이 소프트웨어 개발주기에서 약 50% 차지 ( 오류를 예방하면 디버깅을 줄이면 생산성이 향상 )

ㅇ NASA / IBM 소프트웨어 공학 연구에서 품질 보증의 향상이 오류율을 줄여주지만 전체적인 개발 지용에 있어서 추가적인 비용이 들지 않는다.
내용) 1985년에 진행된 한 연구에서,166명의 전문 프로그래머들이 동일한 명세로 프로그램을 작성하였다. 작성된 프로그램의 평균 코드 길이는 200줄이었으며 작성 시간은 5시간에 약간 못 미쳤다. 흥미로운 결과는 프로그램을 완성하기 위해서 평균 시간이 걸린 프로그래머들이 오류가 가장 많은 프로그램을 작성한 것이다. 평균보다 많거나 적게 걸린 프로그래머들은 눈에 띄게 오류가 적은 프로그램을 작성하였다.(DeMarco와 Lister1985)
그림 참조)

ㅇ 전형적인 코드-테스트-디버깅 과정과 비교
 - 개선된 소프트웨어 품질 프로그램은 비용을 줄인다.
 - 디버깅과 리팩토링에 들어가는 자원을 초기 품질 보증 활동으로 재분배.
 - 업스트림(upstream, 선행 활동)은 다운스트림(downstream, 후행 활동)보다 프로젝트의 품질에 더 많은 영향.
 - 실질적인 효과는 더 작은 결함 / 더 짧은 개발 기간 / 더 낮은 비용

6. 요점 정리
ㅇ 품질은 결과적으로 무료지만 결함을 비싸게 고치는 대신 싸게 예방하기 위해서 자원의 재분배가 요구된다.
ㅇ 모든 품질 보증의 목표들을 동시에 달성할 수는 없다. 달성하고자 하는 목표를 분명히 결정하고 결정된 목표를 팀원들과 공유하라.
ㅇ 어떠한 단일 결함 감지 기법도 그 자체만으로는 완벽하게 효율적이지 않다. 테스트 자체는 오류 제거에 있어서 가장 훌륭한 방법이 아니다. 성공적인 품질 보증 프로그램은 서로 다른 종류의 오류를 발견하기 위해서 다양한 기법들을 사용한다.
ㅇ 구현 중에 효과적인 기법들을 적용할 수 있고 구현 전에도 마찬가지로 여러 가지 강력한 기법들을 적용할 수 있다. 결함을 초기에 발견할수록, 소스 코드의 나머지 부분에 영향을 덜 미칠 것이며, 피해도 적을 것이다.
ㅇ 소프트웨어에서의 품질 보증은 프로세스 지향적이다. 소프트웨어 개발은 제조업과 같은 최종 제품에 영향을 미치는 반복적인 단계가 없다. 따라서 결과물의 품질은 소프트웨어를 개발하기 위해서 사용되는 프로세스에 의해 관리되어야 한다.