설계 원칙 강화에 효과적인 동료 검토
필자의 프레임워크 개발 프로젝트에서 초기에는 품질 보증 활동을 했으나, 프로젝트가 중반 이후로 접어들자 품질 보증은 점차 큰 부담이 되었다. 품질 보증 담당자가 다수의 개발자가 만드는 프레임워크 전체를 이해하고 코드가 적절한지 판단하기 힘들어졌다. 품질 검토를 누락한 부분은 이후에 고스란히 유지보수가 어려운 부분으로 남았다. 개발자가 유지보수 담당자와 같거나 같은 조직에 속하는 경우에는 덜하지만, 개발만 하고 빠지는 외주 개발에서 품질 보증이 소홀한 경우를 흔히 볼 수 있다. 예산과 납기라는 제약이 있기 때문에 어떤 프로젝트든 타협을 한다. 그렇기 때문에 품질 보증 수준과 미흡한 부분에 대한 향후 대책이 중요하다.
우리 팀은 프레임워크 배포 이후에 프레임워크를 적용하면서 새로운 요구사항에 수렴하면서 프레임워크를 진화시키는 프로젝트를 수주했다. 프로젝트 초기 우리가 가장 먼저 한 활동은 리팩토링이었다. 이미 프레임워크를 배포한 상태이므로 API 수정은 어려웠지만, 내부 개선에는 지장이 없었다. 코드가 간결해지고, 전체적으로 일관성이 높아졌다. 아쉽게도 앞선 프로젝트와 동일한 팀원으로만 구성할 수 없어서 다른 사람이 작성한 코드를 리팩토링 해야 할 때, 난이도가 높거나 별도 지식이 필요한 솔루션 연계를 다룬 경우라면 손을 대기 힘들거나 많은 시간을 요했다.
만일 타임머신을 타고 과거로 돌아간다면 프로젝트 관리자 혹은 팀장으로서 어떻게 조치할 수 있을까? 짝 프로그래밍(Pair Programming)을 시도해보고 싶다. 이전에도 시도는 했다. 그러나 10주 만에 고객에게 무언가 입증해내야 하는 부담이 있어 포기했다. 팀 문화를 바꾸는 일은 단기에 이룰 수 없다. 그렇다고 해도 짝 프로그래밍을 시도하면서 점차 팀에 어울리는 방법으로 바꿔갈 수 있을 것이다. 가령, 빈번한 동료 검토 수준으로 완화할 수도 있다. 분명한 점은 코드 수준에서라면 품질보증 담당자를 별도로 두는 방식보다는 단위 테스트 그리고 동료 검토가 효과적이란 사실이다. 협업을 강조하는 애자일, XP 진영에서는 짝 프로그래밍 이외에도 시도해 볼만한 많은 프랙티스를 제시한다.
인수인계를 활용한 체계 강화
인수인계시점은 설계 원칙 구현 정도를 점검하고, 강화할 수 있는 기회이기도 하다. 이 글은 주로 프레임워크 개발자와 유지보수 담당자 사이의 인수인계를 배경으로 하지만, 선임자와 후임자 사이에서도 크게 다르지 않다.
필자는 인수인계시점에 다음과 같은 3계층으로 우리가 만든 산출물을 분류해 인식하기로 했다. 어떤 내용은 프레임워크 사용자 수준에서 개략적인 논의를 하는데 도움이 된다. 가령, 제품 설명서 내용이나 가이드 서두의 개요 등이 여기에 해당한다. 프레임워크를 유지보수 하는 개발자나 프레임워크를 특정 상황에 맞게 수정하는 개발자라면 다른 정보를 필요로 한다. 어떤 API를 수정해야 하는지 정도는 필수 정보이고, 정상적으로 작동하도록 수정하기 위해서는 단순히 확장 지점에 대한 이해만으로 부족한 경우가 있다. 프레임워크가 구동하는 주요 메커니즘은 알아야 한다. 특정 부분 메커니즘에 대해서는 아주 세밀하게 알아야 할 수도 있다. 이를 위한 설계 방안과 구현 및 테스트 코드를 모든 기능마다 구비하고 정리해둘 수 있을까?
경제성을 고려하지 않는다면 가능하다고 하겠지만, 대개의 경우 실용적인 방법이 아니다. 우리는 먼저 코드를 논리적으로 적절히 나누어서 인수인계 일정을 수립했다. 그리고 코드 작성자가 주안점으로 삼을 사항을 기록하여 인수인계 받을 담당자에게 전달했다. 주안점을 중심으로 인수인계를 받으면서 코드를 이해하고, 향후 요구사항이 있을 경우 확장할 부분 그리고 확장 방안을 습득하게 했다. 설계 메커니즘 설명이나 확장 방안은 먼저 변수나 메소드 이름 수준에서 리팩토링을 수행해 가능한 코드 수준에서 이해할 수 있게 한다. 변수나 메소드 이름을 변경해도 난해한 부분 중에 하나 이상의 복잡한 문제를 함께 해결하려 하는 코드가 있다면 하나의 역할만 하도록 변경한다. 이쯤에서 머리도 식힐 겸 쉬운 비유를 하나 들어보겠다. 영화감상을 통해 영어공부를 하는 방식은 효과적일까? 대개는 그렇지 않은데, 그 이유는 다음 그림에서 보는 바와 같다.
그림 5. 영어공부와 영화감상을 같이 하기
시작은 영어 공부로 했어도 영화에 빠져 영어 듣기는 뒷전이 될 수 있다. 자칫 여배우의 외모에 혹해 아예 영어 공부는 안중에도 없어질 수 있다. 비유가 프레임워크와 너무 동떨어져있다고 생각하는가? 그렇다면 위 그림에 대입할 수 있는 코드 예제를 떠올려보자. 만일 XML 파일과 함께 HTTP요청을 수신하는 서버 클래스 로직을 생각해보자. 요청을 수신한 클래스에서 요청 내용을 확인해 적절한 클래스로 보내는 작업을 하는데 XML 파일을 읽어 데이터를 적절한 형태로 변경하는 로직까지 담당한다면 어떨까? 엄청나게 긴 코드로 인해 해당 클래스의 역할에 대해 인지하기도 힘들고, 그에 따라 수정 역시 어려워진다. 리팩토링을 통해 하나의 클래스에 하나의 역할만 부여했다고 해도 복잡한 선택에 따라 if-else 코드를 피할 수 없는 경우가 발생한다. 이 경우는 조건에 따라 달라지는 내용에 대해 API 설명(javadoc 주석)으로 설명하게 하고, 여러 객체에 걸쳐서 설명할 부분이라면 그때 비로소 설계 가이드 혹은 확장 가이드에 설명하도록 했다. 기계적인 표준화에 따라 작성하는 경우 종종 불필요하거나 중요하지 않은 내용마저도 많은 분량의 가이드로 남는다. 종종 이는 유지보수 부담을 준다. 게다가 내용이 지나치게 많으면 중요한 내용을 찾는데 방해가 되기도 한다. 이와 같이 체계 수립은 별도의 소수의 인력 위주로 진행하기 보다는 체계를 유지해야 할 사람이 직접 참여하는 것이 효과적이다.