소프트웨어 인스펙션(Software Inspection)의 이해



소프트웨어 인스펙션(Software Inspection)이란?

개발 산출물에 대해 실행 이전에 자세한 검토를 수행하는 것으로 코드리뷰(Code Review)와 같은 개념입니다. 소프트웨어 개발의 어느 단계에서나 수행 가능하고 4~5명이 한 팀(소프트웨어 및 개발을 이해하는 수준)이 되어 수행할 수 있습니다.  오류를 찾아내는 것이 목적이고 오류수정의 대한 논의는 지양합니다.

초기단계에서 오류를 발견하게 되면 종료단계에서 오류를 발견해서  수정하는 것보다 비용이 훨신 감소합니다. 30~70%의 논리적 설계 오류(Logic-design Error) 및  코드 오류를 조기에 발견 할 수 있어 전통적인 소프트웨어 테스트와 병행하여 수행시 매우 효과적이며 코드의 품질 향상을 도모할 수 있습니다.

소프트웨어 인스펙션팀의 구성

인스펙션팀(Inspection Team)은 아래와 같이 구성될 수 있습니다.

  • 진행자(Moderator)
  • 개발자(Programmer) 또는 작성자(Author) 코드의 주인
  • 설계자(Designer)
  • 테스트전문가(Tester)

위의 역할자들이 포함된 4~5명이  다 같이 모여서 함께 코드를 리뷰 하는것입니다.

현업에서는 조직의 환경에 따라 팀을 다르게 구성하는 것도 가능하지만 진행자와 개발자가 반 드시 필요 합니다.

소프트웨어 인스펙션 팀의 역할(Role)

진행자(Moderator)

팀의 리더의 역할을 하는 진행자는 인스펙션을 계획하여 일정 및 산출물을 팀원에게 배포하고 검토자를 선정하여 인스펙션 절차가  잘 이루어지도록 진행합니다.

마지막으로 인스펙션 종료 후 오류에 대한 수정요청을 하게 됩니다.

개발자(Programmer) 또는 작성자(Author)

검토 대상이 되는 산출물(문서, 코드) 작성을 제출하는 역할로서 모든 익스펙션 절차가 종료되면 검토 결과를 조치하게 됩니다.

제출자(Reader)

작성자를 대신하여 객관적이고 정확하게 검토대상의 자료 제출하고 인스펙션에서 작성자보다 객관적 입장에서 의견을 제시하는 역할입니다.

검토자(Inspector)

인스펙션 전에 검토 대상을 충분히 검토하고 실제로 오류를 찾아내는데 노력하는 역할 입니다. 이때 결함을 해결하는 의견 제시보다는 오류 그 자체만 수집하도록 합니다.

기록자(Recorder)

인스펙션에서 나온 모든 의견 기록하고 종료 후에 기록을 정리 및 문서화하는 역할 입니다.

소프트웨어 인스펙션 절차

Software Inspection1

1. 계획(Planning)

진행자는 인스펙션 대상 산출물 선정하고 팀을 구성합니다. 팀을 구성하면 사전에 인스펙션 대상 산출물 팀원에게 배포하고 인스펙션   날짜, 시간 및 장소를 공지하게 됩니다. 팀원들은 배포된 산출물을 사전에 숙지하기 위한 계획을 세워야 합니다.

2. 개관(Overview)

팀원이 인스펙션 자료들을 잘 이해하고 분석할 수 있게 하는 것이 목적입니다. 팀원이 산출물을 보다 쉽게 이해하도록 하여 인스펙션의 효과를 높일 수 있으며 팀원들의 산출물에 대한 이해도가 높을 경우는 생략이 가능합니다.

3. 준비(Preparation)

검사 회의에 참여하기 전 준비 단계로 개별적으로 작업 산출물과 관련 자료들을 철저하게 숙지하고 이해해야 합니다.  검토해야 할 주요 항목은 체크 리스트를 활용하고 팀원은 각자 준비하는데 얼마 만큼의 시간을 사용하였는지, 결점이라고 생각되는 것들을 기록해야 합니다.

4. 검토회의(Meeting)

인스펙터들이 작업 산출물을 함께 검토하는 회의로 실제 인스펙션이 이루어지는 단계입니다. 개발자가 산출물내용을 풀어 설명하는 동안, 다른 모든사람들은 오류를 찾습니다. 왜 오류가 발생했는지, 또 어떻게 수정할 지 논의해서는 안되고 오로지 산출물을 정밀히 조사하는 작업에만 집중해야 합니다.  이 오류 검출 과정에 개발자에 대한 비판으로 가지 않도록 주의하도록 합니다.

시간 기록과 함께 찾아진 모든 오류를  분류하고 기록합니다. 이 과정이  너무 길 경우 효율성 저하되기 때문에 1~2시간 사이로 조절하도록 합니다.

5. 재작업(Rework)

개발자가 검사 회의 후 모든 발견된 오류 수정하는 단계로 오류의 개수에 따라 진행자가 재검사 진행 여부를 판단 할 수 있습니다.

6. 추적(Follow-up)

개발자가 수정한 결과를 진행자가 체크하여 결과가 좋은경우에는 인스펙션을 공식적으로 완료하고 산출물을 형상관리 체제로 귀속시킵니다.



소프트웨어 인스펙션 체크 리스트

소프트웨어 인스펙션 수행중 산출물이나 코드의 오류를 검사할때 쓰이는 소프트웨어 테스트 체크 리스트는 일반적인 에러(Common Errors)를 체계적이고 효과적으로 검사하기 위해 사용합니다. 이미 많은 표준 문서들이 공개되어 있으며 표준 테스트 체크 리스트로부터 각 조직과 프로젝트의 특성에 맞는 테스트 체크 리스트를 생성해야 합니다.
단, 너무 자세한 테스트 체크 리스트는 효과가 떨어질 수 있습니다.

표준화된 소프트웨어 테스트 체크 리스트에 포함되는 항목에는 다음과 같은 내용이 있습니다.

데이터 참조 에러(Data Reference Errors) : 올바르지 못하게 선언되거나 잘못된 값으로 초기화 된 Data를 참조할 경우 발생하는 에러.

  •  초기화되지 않은 변수가 있는가?
  •  데이터 오버플로우(Data Overflow) 에러.
  •  “Off by one” 오버플로우 에러.
  •  변수가 참조하는 메모리가 할당되어 있지 않은 경우(Dangling Reference).
  •  변수에 맞는 타입의 값이 저장되어 있지 않은가?
  •  변수가 2개 이상의 함수에서 참조될 때 동일하지 않은 값이 참조되는가?

데이터 선언 에러(Data Declaration Errors) : 부적절하게 선언된 변수나 상수를 사용할 때 발생하는 에러.

  • 명시적으로 선언되었는가?
  • 올바른 타입으로 선언되었는가?
  • 선언 시점에 값이 Assign 되었는가?
  • 선언된 변수명이 명확하게 구분되는가?
  • 선언된 변수가 단 1번이라도 참조되고 있는가?

계산 에러(Computation Errors) : 잘못된 연산으로 인해 발생하는 에러.

  • 연산하는 두변수의 데이터타입이 같은가?(예: Integer, Float)
  • 데이터 타입은 같지만 길이가 다른 변수를 연산하는경우.
  • 데이터 타입이나 길이의 차이를 자동적으로 변환 또는 처리하는 컴파일러에 대해 고려되어야 함.
  • 왼쪽 피연산자의 데이터 타입이 오른쪽 연산 결과변수의 데이터타입보다작은지확인해야함.
  • 연산 중 오버플로우(Overflow)가 발생할 가능성이 있는가?
  • 정수의 나눗셈과 같은 경우, 연산결과가 의도하지 않은 값으로 표시 될 수 있는가?

Software Inspection2

비교 에러(Comparison Errors) : 다른 형태의 값을 비교하여 생기는 에러.

  • 서로 다른 타입을 비교 하고 있지 않은가?
  • 비교 연산자는 올바르게 사용되었는가?(비교연산자: ==, <=, <, >=, >)
  • 불리언 연산식(Boolean Expression)이 올바르게 사용 되었는가?
    i가 2와 10 사이인지 비교하는 경우
    -> 잘못된 연산: 2 < i< 10
    -> 올바른 연산: (2 < i) && (i< 10)
    i가x 또는y 보다 큰지 비교하는 경우
    -> 잘못된 연산: i> x || y
    -> 올바른 연산: (i> x) || (i> y)
  • 불리언 연산식(Boolean Expression)이 반복해서 여러 번 사용되는 경우 순서가 명확하게 드러나는가?
    올바른 연산식의 예(순서가 명확함)
    -> if((a==2)&&(b==2) || (c==3))

제어 에러(Control Flow Errors) : 데이터 흐름이 잘못된 순서인 에러

  • 모든 반복(Loop)이 항상 종료되는지 확인
  • 모든 프로그램, 모듈, 함수가 종료되는지 확인
  • 한번도 실행하지않는 반복(Loop)이 있는지 확인

Software Inspection3

  • Switch~Case문 같이 값에 따라 분기되는 코드
    인덱스(Index) 값이 범위를 벗어날 때에 대한 처리코드가 “Off By One” 에러가 반복(Loop)에 의해 발생할 수 있는가?

Software Inspection4

인터페이스 에러(Interface Errors) : 단위 개체간 규약이 일치하지 않는 에러

  • 함수 호출 시 인자(Parameter)의 수와 순서가 올바른가?
  • 인자의 타입과 크기는 올바르게 호출되고 있는가?
  • 인자의 값이 잘못 사용되고 있지 않은가?
  • 전역변수(Global Variable)의 경우, 여러 함수에서 동일한 값과 이름으로 참조되고 있는가?
  • 상수(Constant) 값이 인자로 전달되고 있지 않은가?

입출력 에러(Input/output Errors) : 파일 생성 관련 에러

  • 파일의 속성(Attributes)이 올바르게 생성되어 있는가?
  • 파일의 크기가 현 메모리 사이즈에 비해 적절한가?
  • 모든 파일이 사용되기 전에 열리고 있는가?
  • 사용 후에 닫히고 있는가?
  • EOF(End-Of-File) 조건이 체크되어 처리되고 있는가?
  • 입출력에러(I/O Errors)들이 체크되어 처리되고 있는가?

댓글 남기기