[채성수의 소프트웨어 인사이드] 피해야 할 해커 개발 모델 - 넥스트데일리
다른 사람의 컴퓨터 시스템에 몰래 들어가서 악의적인 일을 저지르는 사람들을 해커라고 한다. 영화에서 많이 볼 수 있듯이 해커는 짧은 시간에 상대 컴퓨터 시스템에 침투하여 원하는 일을 해야 하기 때문에 컴퓨터 키보드를 능수능란하게 다루며 순간적으로 프로그램을 코딩하고 상황 변화에 순발력 있게 대처하면서 침투한다. 자기의 지식을 일순간에 모두 동원하여 상대 컴퓨터 시스템의 방어막을 무력화시키고 뚫어야만 성공하기 때문이다.
이런 방식으로 소프트웨어를 개발할 때 해커 개발 모델이라고 한다. 이 방식은 처음으로 소프트웨어를 개발하는 사람들 대부분이 사용한다고 보면 된다. 자신이 개발할 프로그램의 알고리즘(Algorithm, 로직)이 정리되었건 안되었건 바로 컴퓨터에 앉아서 프로그램을 코딩 하는 것이다. 이 방법으로 코딩을 하면 자신의 생각대로 프로그램이 동작하는 경우 보다는 프로그램이 제대로 동작하지 않는 경우가 태반이다. 프로그램 소스의 수정에 수정을 거듭하면서 어느 정도 자신이 원하는 프로그램이 되었을 때, 이제는 프로그램 소스가 도대체 어떻게 되어 있는지 본인도 헷갈리기 시작한다.
해커 개발 모델은 개인이 취미 생활로 프로그램을 개발하거나, 프로그램 개발 언어를 공부하는 사람에게나 적당하다. 프로그램이 잘 안 돌아도 크게 문제가 될 일이 없기 때문이다. 하지만 간단한 소프트웨어를 만들더라도 체계적인 소프트웨어 개발 과정에 따라 개발하는 것을 습관화 해야 한다고 조언한다.
해커 개발 모델을 사용하여 수정을 거듭하게 되면 프로그램 소스는 마치 스파게티처럼 복잡하게 얽혀 있는 상태가 된다. 이를 스파게티 소스라고 한다. 프로그램 소스가 이런 저런 수정이 더해지면서 누더기가 되는 것이다. 스파게티 소스에서의 프로그램 알고리즘은 복잡해진다. 기능의 중복이 발생하고 쓸데없는 코드가 늘어 나면서 모듈화가 깨진다. 차후에 수정이 필요할 때 수정 포인트를 제대로 찾아 내기가 어려워지면서 수정의 속도가 늦어지기 시작한다. 수정 후의 기능이 원하는 대로 안되는 경우도 발생한다.
스파게티 소스 코드는 소프트웨어에서 공통적으로 발생하는 이슈이고 문제점이다. 프로그램 소스는 다른 사람이 보았을 때 쉽게 이해할 수 있도록 작성되는 것이 중요한 포인트이다. 프로그램은 만들어지면 향후의 수정에 대비하고 문제가 생겼을 경우에 대응하기 위해서도 가독성이 좋아야 한다. 프로그램은 독립성, 모듈성, 알고리즘 단순함과 깔끔함을 갖추어야 나뿐만 아니라 다른 사람들도 읽기 쉽고, 이해하기 쉬운 것이다.
기업에서 사용하는 소프트웨어에서도 이런 스파게티 코드를 경우를 종종 보게 된다. 프로그램의 소스 코드가 스파게티처럼 얽혀 있는 경우에 거기에 기능의 추가나 수정을 해야 한다면 이것을 수정하는 개발자는 죽을 맛이다. 그 소스 코드를 이해하는데도 많은 시간을 빼앗기게 된다. 수정하는 것보다 차라리 다시 개발하는 것이 낫겠다고 의사결정을 하는 경우도 생긴다.
스파게티 소스가 되는 원인은 다양하지만 대표적으로 두 가지를 들 수 있다. 첫째는 처음 개발이 시작되었을 때부터 프로그램의 소스 코드를 구조화하였으면 이런 일이 발생하지 않는다. 그 구조화의 첫 걸음이 소프트웨어 설계도이다. 설계도가 제대로 안되어 있기 때문에 스파게티 소스가 되는 주요 원인이 된다. 또 하나의 원인은 프로그램을 수정할 때 원래의 알고리즘을 수정하지 않고 추가적인 로직을 더하는 방법을 택한다. 원래의 알고리즘을 잘 못 수정하면 큰 사고로 이어질 수 있기 때문에 덧붙여서 기능을 추가하게 된다. 이렇게 추가적인 로직을 덧붙이는 방식은 수정 결과에 대한 안전성은 보장하지만 프로그램의 구조를 복잡하게만 만들 뿐이다.
기업은 감내할 수준 이상으로 스파게티 프로그램이 많아 지면서 프로그램의 수정에 들어가는 시간이 오래 걸리고, 수정 후에도 안정적인 소프트웨어의 동작이 되지 않을 경우에 리팩토링 프로젝트를 실행한다. 리팩토링은 소스 코드를 다시 구조화시켜서 불필요한 로직을 없애고, 프로그램의 알고리즘을 단순화시켜서 프로그램의 유지보수성을 강화시키고, 프로그램의 성능을 향상시킨다. 릭팩토링은 결국 프로그램을 다시 개발하는 것과 마찬가지 일이 된다.