많은 프로젝트들이 개발에 실패한다. 하지만 어디에도 실패한 프로젝트는 찾아보기 힘들다. 한국적 상황에서 실패란 그 후폭풍이 만만치 않기 때문에 거의 성공으로 결론 내린다. 하지만 성공의 정의가 적절한 예산과 일정, 품질을 만족하는 것이라면 과연 얼마나 우리는 성공했다고 말할 수 있을까?
- 왜 실패 할까?
실패하는 프로젝트는 두가지다. 1) 시간이나 자원이 부족해져서 실패하는 경우와 2) 불가능에 도전한 경우이다. 여기서 두번째는 논외로 하자. 성공할 수 있었지만 실패했었던 경우를 보자. 처절한 죽음의 행진을 한 뒤에야 무엇이 잘못되었는지 알게되면 차후를 위해 그나마 다행이지 않은가. 물론 입장차에 따라 갑이나 경영진은 개발자의 무능으로 몰아가기도 한다. 왜 모든 프로젝트는 결국 시간과 자원이 부족해지는 것일까?
- 너무 늦게 개발한다.
개발 초기엔 낙관론이 지배한다. 요구사항을 분석한다, 자료를 모은다 하며 일을 시작하지만 실제 개발에 들어가지 않았으니 요구사항을 받아도 정확히 분석하기 어렵다. 그렇게 열심히 허송세월(?)을 보내고 난뒤 본격적으로 개발에 들어간다. 실 개발에 들어가야할 시간을 상당히 허비한 후 무수한 삽질을 통해 정확히 고객이 원하는 것이 무엇이고 어떤식으로 개발해야 할지 알게 된다.
- 너무 빨리, 깊게 개발한다.
개발에 들어가면서 요구사항을 굉장히 상세히 개발한다. 화면이 200개에 달하는 관리 프로그램이라고 하자. 그중 10개의 화면을 완전히 개발한다. 그야말로 퍼펙트하게...... 그리고 사용자에게 보여준다. 사용자는 갸우뚱 한다 "전체적으로 연동이 안돼서 잘 모르지만 대략 맞는것 같네요." 자 이제 화면 하나씩, 하나씩 꼼곰히 개발하여 전체 구조를 단단히(?) 정의 한다.
다시 사용자에게 보여준다. 이제야 사용자는 깨닫기 시작한다. 이게 아니라는 것을. 자 이제 핵심 구조를 대대적으로 뜯어 고쳐져야 한다.
애도한다. 아마 프로젝트 일정은 거의 막바지에 도달해 있을 것이다. 아 다시 개발한다면 성공할 텐데...... 하지만 세상에 동일한 프로젝트는 없으며 다시 개발할 일은 아마 없을 것이다.
- 성공하려면?
모든 성공에 바탕에는 최선을 다하는 자세가 필요하다. 어떤 방법론도, 어떤 기법도 최선을 다하려는 마음이 없다면 대부분의 영특한 개발자는 남을, 그리고 스스로를 기만하게 된다. 최선을 다하려는 마음을 가지고 있다는 전제하에 개발 환경을 구축한 뒤에는 다음의 방법들이 필요하다.
- 첫날부터 개발한다.
점점 개발 일정은 줄어든다. 요구사항은 늘어날 것이며 또한 개발 도중 변해간다. 요구사항이 변하는 것이 이상한 것이 아니라 당연한 것이다. 변화하는 요구사항에 대응하기 위해 많은 코딩을 해야 하므로 첫날 부터 개발한다. 예를 들어 어떤 회원 관리 프로그램을 개발한다고 하자. 아직 비지니스 로직은 아무것도 모른다. 아는 것은 단 하나 회원관리 프로그램이라는 것이다. 그렇다면 나는 코딩을 시작한다. 아마 다음과 같은 클래스를 만들것이다. class MemberManager ...... 그리고 몇가지의 당연한 맴버 클래스들과 함수들...... 이정도면 첫날의 코딩으로는 충분할 것이다. 그리고 지속적으로 다듬어 나간다.
- 느슨하게 아는데까지만 개발한다.
위에서 이야기한 회원관리 프로그램에서 회원의 개인 정보를 상세히 관리할 필요가 있다는 것이 파악되었지만 아직 무엇인지 모른다.
그렇다면 개인정보 관리자 클래스를 만들어서 맡긴다. 계속 잘 모르는 기능들은 그것을 위임하는 객체를 만들고, 상위 클래스만이 인터페이스로서 접근될 수 있도록 한다. 아마 문제가 생기면 상위 클래스의 접근 함수를 몇개 교체하는 것으로 끝날 수 있을 것이다.
- 두번 개발한다.
느슨하게 개발하여 전체적인 모습을 보여준다. 중요한 것은 실제 작동하는 프로그램을 사용자에게 보여주는 것이 전체 개발기간의 1/5 - 1/3을 넘지 않아야 한다는 것이다. 1) 고객에게 대략적이지만 전체적으로 작동하는 프로그램을 보여주고, 2) 사용자와의 피드백을 통해 개발자는 전체 프로그램의 명확한 윤곽을 파악하고 3)고객이 무엇을 원하는지 알게 되면서 더 나아가서 4)고객이 원하지만 생각하지 못했던 개선까지도 추가로 반영할 수 있게된다. 5)느슨함을 유지하며 점진적이며 점증적으로 두번째 개발을 진행 한다.
아마 이전 대부분의 코드를 재활용 할 수 있으면서 마치 스크립트를 짜듯이 프로그램을 구성할 수 있을 것이다.
축하한다. 아마 전보다 더 많은 코드를 구성하면서도 결함은 적고, 사용자는 좀 더 만족할 것이다. 더불어 당신의 가치도 높아질 것이다.