소프트웨어 품질관리(NHN은 이렇게한다)

SW 개발의 특징(경험적 프로세스)

어떤 서비스나 재화를 생산하는 과정은 ‘정의된 프로세스’를 따르는 경우와 ‘경험적 프로세스’를 따르는 경우로 나뉜다. 정의된 프로세스는 공장의 생산 라인과 같이 반복할 수 있는 과정을 의미한다. 반면 경험적 프로세스는 어머니가 음식을 만드는 과정과 유사하다. 음식이 완성될 때까지 양념을 넣고 간을 보고 다시 양념을 넣는 과정을 반복한다. 이렇게 피드백을 자주 받는 방식으로 제품을 생산하는 방식을 경험적 프로세스라고 한다.

피드백은 현재까지 구현된 SW가 사용자의 요구 사항과 일치하는 지를 확인하는 과정이다. 전통적인 개발 방법론에서는 이런 사실을 SW 개발 프로젝트 후반부에서야 확인할 수 있다. 이런 문제를 프로젝트 후반부가 아닌 초기부터 자주 드러내어 문제를 일찍 해결하려는 방법이 품질 혁신 활동이다.

QP(Quality Practice) 품질 혁신 활동

코딩 컨벤션, 코드 리뷰, 코드 커버리지, 정적 분석, 사이클로매틱 복잡도 5가지 품질의 각 수행 활동에 대한 품질 지표를 측정할 수 있는 방법과 품질 기준을 정의했다. 현재는 서스테이닝 품질을 개선하기 위해 '중복 코드 분석 활동'을 추가하고 '사이클로매틱 복잡도'와 '코드 리뷰'는 자율적으로 적용하도록 정책을 변경했다.

코딩 컨벤션

코딩 컨벤션은 언어별 네이밍 규칙, 코드 스타일, 주석, 보안 영역을 포괄한다. 여기엔 클래스나 메서드, 변수의 이름을 짓는 방법, 공백이나 줄 바꿈, 들여쓰기의 정도, 파일, 클래스, 메서드, 상수 등의 주석 작성 방법, 주요 공격 유형별 방어 코드 작성 방법 등이 포함된다. (ex 자바 Checkstyle)

코드 리뷰

코드 리뷰 수행 시점은 조직에 따라 형상 관리 시스템에 커밋하기 전이나 커밋한 후에 결정하며 신규/개편 개발 과제는 최소한 반복 개발 주기별로, 서스테이닝은 2주 ~ 2개월 간격으로 1 시간씩 진행할 것을 권장한다.

cf) Sustaining : 운영 중인 서비스 또는 서비스 관리 시스템의 운영 품질 개선을 위한 소규모 개발 업무를 의미한다.

사이클로매틱 복잡도

위의 그래프에 나타난 제어 흐름은 먼저 A의 조건에 따라 작업 B,C,D가 수행된다. 작업 B 뒤에는 항상 E가 수행되며, 이 두 작업은 이중으로 중첩된 반복 구조의 일부이다.

사이클로매틱 복잡도는 그래프에 있는 리전(그래프 평면 상의 밀폐된 영역)의 수로 정의한다. 따라서 위의 그래프에서는 R1부터 R5까지 다섯 개의 리전이 있으며, 사이클로매틱 복잡도는 5이다.

효과적인 명세 작성

SW의 품질 관리는 사용자의 요구 사항을 수집하고 기록하는 단계에서부터 시작된다고 할 수 있다. 전통적인 SW개발 과정을 살펴보면 기획자가 '요구 사항 명세서', '기획 명세서' 등 다양한 이름의 문서를 작성해서 개발자에게 전달하면 개발자는 이를 기반으로 설계 명세서, 개발 명세서, 기능 명세서 등을 작성한다. 개발이 완료되면 QA나 테스터는 테스트 계획서, 테스트 설계서 등 각종 문서를 작성하기 시작한다. 물론 언제든 요구 사항이나 설계 내용은 변경될 수 있기 때문에 의사소통의 어려움을 겪게 된다. 따라서 품질을 높이기 위해서는 혼잡해진 언어들 간에 소통의 코드가 필요하다.

예제를 이용한 명세 작성 기법 (가능한 모든 조합을 열겨하고, 예외 케이스까지 고려)

ex) 계산기 프로그램

계산기의 사칙 연산에 대한 명세는 테이블로 표현할 수 있다. 테이블로 명세를 작성할 때 특별한 형식이나 규칙이 있는 것은 아니다. 그러나 테이블을 작성할 때도 역시 언어의 중의성과 모호성의 함정을 주의해야 한다.

정상적인 사용

left

operator

right

equal

result?

6

+

3

=

9

6

-

3

=

3

6

*

3

=

18

6

/

3

=

2

비정상적이지만 합당한 사용

left

operator

right

equal

result?

0.0000000000003

*

0.00000000004

=

1.2e-59

5555555555555555

*

111111111111

=

6.1728395061727e+62

0.000000000004

+

0.000000000003

=

0.000000000007

5

/

3

=

1.66 ... 667

비정상적이고 예외적인 사용

left

operator

right

equal

result?

5

+

=

5

-

5

=

-5

5

/

0

=

error

단계적 빌드

지속적인 통합이란 통합 과정을 자동화하고 주기적인 빌드, 테스트, 분석을 통해 피드백을 받는 과정이다. 개발자가 형상 관리 시스템에 변경한 코드를 커밋하면 CI 서버는 빌드를 수행하여 결과를 제공하며 설정한 주기에 따라 주기적으로 빌드를 수행하기도 한다.

[기존 개발 프로세스]

단계적 빌드

  1. 개발자 빌드 : 로컬 PC에서 변경한 코드를 형상 관리 시스템에 커밋하기 전에 수행 / 빌드환경: 로컬 PC / 테스트 범위 : 다른 모듈에 의존하지 않는 단위 테스트

  2. 커밋 빌드 : 형상 관리 시스템에 저장된 코드가 변경되었을 때 해당 코드가 다른 코드와 충돌하지 않는지 확인하기 위해 수행 / 빌드환경 : CI 서버 / 테스트 범위 : 여러 명의 단위 테스트를 모아 수행하는 테스트(미들웨어에 의존하지 않는 테스트)

  3. 통합 빌드 : 정해진 시간 주기마다 수행. 주기는 일반적으로 24시간이며, 밤에 수행하는 것을 권장. 최종 통합 빌드 완료 후에는 코드 완료를 선언 / 빌드환경 : CI 서버 / 테스트 범위 : DB, 플랫폼, 네트워크 등의 미들웨어에 의존하는 테스트

  4. 릴리스 빌드 : 사용자에게 소프트웨어를 배고하기 위해 수행. 빌드 라벨을 붙이면 의사소통에 유용 / 빌드환경 : 빌드 배포 시스템 / 테스트 범위 : 기능 테스트, 성능 테스트, 부하 테스트

단계적 빌드에 필요한 것 : 형상 관리 시스템, 빌드 자동화 스크립트, CI 서버

[CI 서버 구성]

CI 서버란 ‘빌드 자동화 서버’다. 좀 더 구체적으로 말하자면 ‘정해진 스케줄에 따라 빌드를 수행하는 서버’라고 할 수 있다. CI 서버는 주기적으로 또는 형상 관리 시스템에 변화가 발생했을 때 자동으로 빌드를 수행하고 결과를 보고한다.

cf) Continuous Inspection(코드 품질용 ex 소나) 코드만 점검하고 빌드나 배포 작업은 안함. 지속적으로 코드품질을 유지하려는 목적

코드 커버리지

새로 작성하거나 수정된 코드를 어느 정도 테스트했는지 개발자 테스트 수행 정도를 파악하기 위한 품질 지표로 코드 커버리지를 측정했다. 커버리지를 측정하지 않고 테스트를 수행할 때는 일반적으로 코드의 일부분만을 실행하는데 커버리지를 측정하면 테스트를 그만해야 하는지, 추가할 테스트는 없는 지 확인할 수 있으며 개발자가 의무적으로 테스트를 수행하게 된다는 점에서 효과적이다. (가장 중요한 수행 활동)

정적 분석

정적 분석이란 SW를 실행하지 않고 도구를 이용해서 소스 코드나 바이너리를 분석해서 잠재적인 결함을 찾아내는 것을 말한다.

중복 코드 분석

Last updated