소프트웨어 오류를 제거하는 가장 효율적인 방법과 가장 저렴한 방법은 무엇일까? 프로젝트를 진행함에 있어 이 두 가지 질문은 항상 가슴 속에 품고 다녀야 하지만, 공론화가 되지 않는 희한한 속성이이 있다. 이미 널리 알려진 바와 같이 오류 제거에 드는 비용은 시스템 분석과 설계와 구현에 드는 비용 각각에 비해 거의 두 배가 넘든다고 한다. 그렇다면 왜 이렇게 비싼 댓가를 치루면서도 계속 소프트웨어 오류에 무관심할까?
가장 큰 이유는 소프트웨어 오류에 대한 연구가 상당히 뒤쳐저 있기 때문이다. 최신 프로그램 언어, 최신 라이브러리, 프레임워크에 대한 책이나 기사는 넘쳐나지만, 소프트웨어 오류에 대한 책을 한번 찾아보기 바란다. 책장 한 칸이면 다 채우고도 남을 정도다. 결국 '~카더라'라는 주관적인 견해가 판을 치다보니 믿을만한 정보가 부족해지고, 믿을만한 정보가 부족하다 보니 모두 자기 머리만 믿는다. 그리고... 후반부에 가서 완전히 함정에 빠진 사실을 알아차린다. T_T
로버트 L. 글래스 큰 형님은 테스트와 관련한 여러 연구를 종합해서 다음과 같은 결론을 내린다.
- 반드시 검토를 수행하여 테스트를 보완한다
- 기능적 테스트를 강조하되 구조적 테스트도 수행한다
- 설계 검토와 코드 검토를 모두 수행해야 한다
여기서 기능적 테스트는 프로그램 요구사항 명세서를 기반으로 범위를 결정한 테스트이고, 구조적 테스트는 프로그램 내부 동작 방식에 맞춰 범위를 결정한 테스트이다. 코드 검토는 소프트웨어를 실행하지 않고 정적으로 소스 코드 자체를 살펴서 오류를 찾는 방법이다.
코드 검토 과정에서 사용하는 단계적 추상화(stepwise abstraction)는 소프트웨어에서 핵심적인 하위 프로그램을 찾아 기능을 파악한 후 이들 개별 기능으로부터 소프트웨어 전체 그림을 파악하는 방법이다. 워크스루와 인스펙션은 검토 회의 전에 코드를 읽고 마음속으로 소프트웨어 논리를 따라서 테스트 케이스를 실행하는 방법이다.
흥미롭게도 코드 검토 과정에서 사용하는 방법이나 소프트웨어 설계 과정에서 사용하는 방법이 너무나도 유사하다. 한쪽에서는 마음 속으로 설계도를 그리고, 다른 한쪽에서는 마음속으로 설계도면을 돌려본다. 결국 설계와 코드 검토는 마음으로 행하는 작업이며, 유기적으로 수행해야 효과를 높인다는 결론에 이른다. 물론 예나 지금이나 테스트는 반드시 수행해야할 작업이긴 하지만, 마음의 눈으로 수행하는 코드 검토를 절대 간과하지 말지어다.
"소프트웨어 컨플릭트 2.0: 시대를 뛰어넘는 즐거운 논쟁" 역자 박재호 올림