Code Metaphor

Programming, Writing, Reading, Thoughts…

레거시 코드와 생산성

어제는 피부에 와닿는 생산성에 대한 고민을 할 수 있는 날이였다. 상황은 이랬다. 사내 그룹웨어에 프로젝트 관리를 추가해야 하는데, 프로젝트 관리라는 것이 대단한 것은 아니고

위와 같은 요구 사항이었다. 저것만 보면 릴레이션 모델 서너개에 스캐폴딩(scaffolding)을 적절히 쓰면 하루 혹은 이틀 정도면 다 끝낼 수 있을 것이라 예상할 수 있다. 아마 RoR 같은 현대적인 웹 프레임워크들 가운데 내게 익숙한 것을 골라 썼다면 말이다.

그러나 그룹웨어는 부정적 의미에서의 전형적인 PHP 코드들이었고, 내게 주어진 일은 기본적으로 그것을 유지보수하고, 그것에 기능을 추가하는 일이었다. 난 입사하고 나서 그것들을 리팩토링할 궁리를 한달 넘게 하다 포기해버렸다. 리팩토링하기 위해서는 테스트를 해야 하는데, 레거시 코드는 테스트 가능성(testability)이 0에 가까웠기 때문이다. 적어도 내공이 미천한 내게 있어서는 0에 가까운 것이 아니라, 0이였다. 원칙상으로는 기능 추가는 다음 순서로 해야 한다.

  1. (테스트가 없다면, 리팩토링하기 위해) 테스트를 작성한다.
  2. (기능 추가를 하려는데 중복이 잦고 정리가 되어 있지 않아 그것이 힘든 경우) 리팩토링을 한다.
  3. 기능 추가 및 유지 보수를 한다.

그렇지만 저것은 기존 코드가 어느 정도 테스트 가능성을 가지고 있을 때의 이야기다. 단위 테스트가 없어도 좋다. 어느 정도의 테스트 가능성만 확보하면 될 것이다. 그러니까, 내 변명은 이렇다. 세상에 테스트 불가능한 코드가 있냐는 것은 논란의 여지가 있긴 해도, 일단 나의 내공으로는 안되는 코드가 있긴 하다. 아는 사람은 알겠지만, PHP는 언어 자체가 하나의 조악한 웹 프레임워크이고, 그걸 그대로 사용하면 테스트하기 무척 힘들어진다. $_GET, $_POST 변수를 사용하는 코드의 매개변수들을 어떻게 가로채서 테스트해야할 것인가? 또 결과는 어떻게 받아서 테스트해야 하는가? 어떻게든 그걸 테스트한다고 해도, ‘리팩토링을 하기 위한 테스트’라는 목적은 불분명해질 정도의 커버리지 낮은 테스트가 나올 것이다. (테스트 단위가 잘게 쪼개지지 못하고, 페이지가 되어버릴 것이다.)

이럴 때 나로서는 새 마음 새 기분으로 갈아엎고 처음부터 다시 작성하는 것만 떠오른다. 그렇지만 그러기에는 시간이 촉박했다. 게다가 내가 어떻게 잘 RoR을 사용해서 그룹웨어를 재작성했다고 해도, 사내에서 그걸 좋아할 사람은 없을 것이다. (흑흑.)

어쨌든, 나는 테스트도 없이 무법 천지의 레거시 코드들과 몸을 섞으며 기능 추가를 해버렸다. 항상 테스트 속의 화초(?) 같은 코드들만 작성하다가 무법 지대에서의 마구잡이식 총쏘기 코딩을 하니까 생산성도 무척 떨어졌다. 이때 알 수 있는 사실 하나. 버전 관리 시스템, TDD, 웹 표준 등을 이야기할 때 “좋은 건 알겠는데, 생산성이 떨어져서 안돼”라고 하는 이야기는 결국 정말 변명 밖에 안된다는 것. 왜냐면 나 같은 경우 저것들을 쓰지 않으면 오히려 더 생산성이 떨어지기 때문이다. 한마디로 하기 나름이라는 것이다.

내가 데드라인을 약간 초과해서 어쨌든 일정을 맞춰서 기능 추가를 하긴 했지만, 점점 이 코드를 유지보수하는 일은 힘들어질 것이라고 생각한다. 아마 앞으로도 이 코드를 리팩토링하게 될 일은 없을 것이다. 코드 외적인 이유로 인해 그룹웨어가 뒤집힐 때가 되서야 뭔가 달라질 것이다. 사실 처음에 테스트를 작성하고, 거기에 이왕이면 현대적인 웹 프레임워크까지 도입해서 깔끔하고 빠르게 그룹웨어를 개선해왔다면 어땠을까? 생각보다 사람들은 근시안적인 것 같다.

이번 글은 결론이 없다. 죄송. 그냥 한 시간이면 끝낼 수 있었을 기능 구현을 반나절 이상 붙잡고 있는 내 자신에게 화가 나고, 그러면서 드는 여러가지 생각들을 분출하고 싶어서 오랜만에 써봤다.

This entry was posted on December 18, 2007 at 11:40 AM. You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

5 Responses to “레거시 코드와 생산성”

  1. 거친마루 Says:

    마치 사격장에서 사격 연습을 하다가 전쟁터에 나간것 같은 기분;;; 시간이 없다는 이유로 처음부터 소스에 넣고 볶아진 스파게티…

    그 스파게티에서 토마토를 제거하고 크림소스로 바꿔야 하는… 더러운 기분 잘 알죠 흐흐

  2. 강규영 Says:

    http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200410110002

    혹시 아직 안 읽어보셨다면, 이 책을 추천해요.

  3. Hong, MinHee (DAHLIA) Says:

    http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200410110002

    혹시 아직 안 읽어보셨다면, 이 책을 추천해요.

    오, 좋은 책 추천 감사합니다. 꼭 읽어봐야겠습니다.

  4. 행복개발자 Says:

    힘내세요…

    기존에 있는 소스를 다시 만들지 않는 이상은 어쩔 수 있는 방법이 없답니다.

    나의 생각이 들어가있지 않은 소스는 참.. 알 수가 없죠. ^^;

  5. 소리미르 Says:

    삽질 축하

Powered by WordPress. Styled by Hong, MinHee. XML Feed, Comments XML Feed.