소프트웨어를 개발하는데 있어 가장 잦은 그리고 가장 난처한 질문이 “언제 끝나요?”라는 질문이다.
한 마디로 대답하자면 “알 수 없다”.
요구사항은 언제나 변화무쌍하고 정확하게 동작할 것 같았던 프로그램은 실제로 돌려보면 오류 투성이다. 막바지에는 보이지 않던 각종 버그가 눈에 띈다. 이 버그를 수정하는데 얼마나 더 걸릴지는 또 알 수 없는 일이다.
정확하게 예측하고 시간을 엄수하며 한 번에 깔끔하게 종료되는 프로젝트란 있을 수 없다.
서울 – 부산
우리가 서울에서 부산까지 고속도로로 차를 몰고 가본다고 가정해보자. 5시간 안에 도착할 수 있을확률은 얼마나 될까. 서울과 부산간 거리는 400km 남짓하니 평균속도 80km/h 정도면 충분히 도달할 수 있다. 맑은 날 고속도로에 아무 문제가 없다면 5시간 안에 도착할 확률은 99% 이상이 될 것이다.
하지만 비가 오거나 안개가 심하게 낄 확률은?
차가 막혀서 시간을 허비할 확률은?
갑자기 차가 고장 나거나 교통사고가 날 확률은?
이 같은 각종 외부 요인이 발생하면 5시간 안에 도착할 확률은 훨씬 더 낮아질 것이고 우리는 이를 불확실성이라 부른다.
불확실성
개발 업무는 이 같은 불확실성이 매우 높다. 외부 요인이 고속도로의 그 것과는 비교조차 되지 않을 정도로 높다. 불확실성은 “판단이나 의사결정에 필요한 적절한 정보의 부족“이라고도 할 수 있는데 프로젝트 일정을 보다 정확하게 예측하려면 이 같은 불확실성을 면밀히 파악하고 확실한 정보로 개선할 수 있어야 한다.
Rapid Development
그래서 수많은 프로젝트 일정 관리 기법이 책, 논문 형태로 소개되었고 그 중 내가 본 가장 감명깊은 책은 스티브 맥코넬의 Rapid Development다. 번역서 제목은 “프로젝트 쾌속 개발 전략”으로 기억한다.
책 기저에 흐르는 핵심 문장은 아래와 같다.
“위험 요소를 빠르게 제거하라”
일정 산정이 어려울 경우 과감하게 그 기능을 포기하면서 위험 요소를 최소화 하라는 얘기다.
멀리 볼 것 없이 윈도우만 봐도 그렇다.
원래 윈도우 비스타에는 WinFS(Windows Future Storage)라는 관계형 데이타베이스 기반의 파일 시스템이 도입될 예정이었으나 출시를 1년이나 남긴 시점에서 이 기능은 과감히 제외됐다. 핵심기능이라며 마켓팅을 진행했음에도 무리하게 개발을 진행해 문제가 생기는 것 보다 위험 요소를 빠르게 제거하는 쪽을 택한 것이다.
다시 불확실성
그렇다면 불확실성을 판단하려면 어떤 일이 필요할까.
- 프로토타입
- 테스트
- 코드 리뷰
- 실제 환경 테스트
앞서 서울 – 부산을 5시간 안에 도착할 수 있을지 판단하는 가장 확실한 방법은 미리 직접 가보는 것이다. 소프트웨어 개발 또한 마찬가지다. 프로토타입을 통해 미리 진행해보는 것이 가장 좋은 접근 방법이며 다행히 소프트웨어 개발은 고속도로를 달리는 것보다 훨씬 더 빠르고 유연하게 대처할 수 있다. 이 같은 장점을 살려 가능한 많은 프로토타입을 진행해보고 조금이라도 의심스러운 부분은 제거해 나간다.
사실 테스트는 매우 어렵다. 특히 4번 처럼 실제 환경과 가까운 테스트는 더욱 어렵다. 아무리 좋은 테스트라도 실제 환경에선 또 다른 결과를 낼 수 있다. 테스트를 갖추는데 개발하는 것보다 훨씬 더 오랜 시간이 걸릴지도 모른다.
하지만 테스트는 무엇보다 중요하다. TDD(Test-driven Development)에서는 아예 테스트부터 만들기를 권장한다. 프로토타입과 마찬가지로 가급적 많은 테스트를 만들어보고 외부 요인의 위험 요소를 파악하는데 집중한다.
코드 리뷰는 코드 품질을 높이는데 필수적이다. 코드 리뷰 할 시간이 있으면 일정내 마감하라는 압박이 있겠지만 코드에 좋은 냄새가 나지 않으면 좋은 품질의 소프트웨어가 나올 수 없다. 좋은 코드는 유지보수를 쉽게 하고 앞으로 생산성을 더욱 높인다. 아무리 바쁘더라도 배포(Deployment) 이전에는 반드시 코드 리뷰를 진행해 미래의 불확실성을 제거해야 한다.
또 다시 불확실성
이렇게 해도 불확실성은 여전히 존재하고 일정은 어긋나기 일쑤다.
완벽한 예측이란 이상일 뿐이며 어떠한 예측도 잠재 위험 요소를 모두 찾아낼 수 없다. 여기에는 변화무쌍한 요구사항도 한 몫 거든다. 요구사항이 바뀌면 위험요소는 또 다시 늘어난다.
자, 그렇다면 이런 악순환을 해결할 명쾌한 방법은 없는 것일까.
아무것도 안 하는 것이다. 아무것도 안 하면 아무 문제도 생기지 않는다.
하지만, 독일의 문호 William Shedd 는 이런 명언을 남겼다.
A ship is safe in harbor, but that’s not what ships are for.
배는 항구에 있을때 가장 안전하다. 그러나 그것이 배의 존재 이유는 아니다.