신입 개발자의 레거시 코드 분석 시도
1. 레거시 코드?
태도는 큰 차이를 가져올 수 있는 작은 요소다
-윈스턴 처칠(Winston Churchill)
백지상태에서 시작하는 그린 필드 프로젝트를 선호하는 사람이 있냐는 질문에 개발자들의 거의 모두가 손을 든다. 반면 레거시 코드에서 작업해야 하는 프로젝트를 선호하는 사람이 있냐는 질문에는 아무도 손을 들지 않았다.
레거시 없이 백지 상태에서 시작하는 프로젝트는 항상 즐겁다. 자유롭게 기술을 선택하고, 최신의 프레임워크를 사용할 수 있으며 기존 기능을 깨뜨릴 걱정 없이 편하게 코딩할 수 있다. 기존 코드를 이해할 필요 없이 코드를 작성할 수 있다는 점은 대단히 큰 이점이다.
떠나버린 개발자가 남겨놓은 코드 위에서 일하는 상황이라면 개발자가 위축될 수밖에 없다.(옆에 남아있는 개발자에게 잘하자) 아무런 테스트도 없고 문서도 없다면 공황에 빠진다.(테스트 주도 개발과 문서화를 생활화하자)
우리는 레거시 코드를 만나지 않을 가능성이 극히 낮다. 단지 프로젝트에 따라 우리가 빠져들어가는 구렁텅이의 깊이가 다를 뿐이다.
2. 태도의 변화
무언가가 마음에 들지 않는다면 바꾸어라.
그것을 바꿀 수 없다면, 그에 대한 당신의 생각을 바꾸어라.-마리 엥겔브레이트(Mary Engelbreit)
우리가 아무리 한탄하고 불평하고 저주해봐야 삶이 쉬워지거나 나아지지 않는다. 무언가 나아지길 원한다면 그에 맞는 액션을 취해야한다.
레거시 코드를 보면서 끙끙 앓거나 힘들다는 말보다는 그것을 이해하고 개선해보려고 노력해야 한다. 계속해서 깔끔하게 정리하고자하는 내 본능을 참지 않아야 한다. 보는 것 자체가 막막하기만 한 코드를 이해하려 든다는 것이 처음에는 무모할 수 있다. 작은 부분씩 집중해서 한 번에 하나씩 이해해 나간다면 조금씩 개선 가능하다.
테스트 코드를 작성해보고, 메소드와 클래스를 정리하며 변수명을 적합하게 바꾸는 등 점차적으로 코드를 이해하기 쉽고 다루기 편하게 만들어 갈 수 있다.
레거시 코드는 거대한 직소 퍼즐을 푸는 것과 비슷하다. 모든 퍼즐 조각들을 펼쳐놓고 맞추려하면 진도가 나가지 않는다. 조각들을 그룹으로 나누고 모서리나 경계선부터 시작하면 도움이 된다. 몇 가지 작은 그룹들이 만들어지면 큰 형태가 그려지고, 그렇게되면 약간은 정리된 작은 그룹들의 조각 모음으로 만들 수 있다. 즉 점진적으로 기존 코드에 대한 테스트 코드를 작성하면서 이해도를 높이고 리팩토링을 해나간다.
몇몇 조각들을 맞추는데 성공하면 전체 그림의 일부분을 볼 수 있다. 이 단계에서는 실질적으로 손에 잡히는 것을 얻을 수 있기 때문에 조금 더 자신감이 생긴다. 코드도 이해되기 시작하고 업무 진척도 빨라지며, 전체 직소 퍼즐의 완성 단계가 보이기 시작한다. 개선하는 코드 조각이 하나씩 늘어날 때마다 코드 전체를 개선하고 싶은 욕구가 일어난다. 이러한 성취감은 큰 보상이 된다. 처음에는 그냥 보는 것만으로도 벅차던 코드가 이제는 특별한 노력 없이도 소설책을 읽듯이 스토리까지 이해된다.
레거시 코드는 우리가 다른 방식으로 생각하도록 강제한다는 특징이 있다. 우리는 레거시 코드를 두 가지 관점으로 보게 될 것이다.
- 지금 하고 있는 일을 고통스런 전생의 업보로 본다.
- 재미있고 도전적인 문제로 본다.
우리는 후자를 택해야 한다. 남이 작성한 코드를 어렵다고 말하기는 쉽다. 심지어 대충보고 비웃을 수도 있다. 하지만 나라면 더 잘 만들 수 있는가? 나라면 더 깔끔한 코드를 단번에 만들었을까?라고 스스로에게 물어보아야 한다.
백지상태의 그린필드 프로젝트이든 레거시가 가득한 브라운 프로젝트이든 상관하지 않게 될 것이다.
일을 즐길 수 있느냐 없느냐는 우리의 태도에 달려 있다.
3. 결론
많은 기업들이 자신의 소프트웨어에 인질로 잡혀 있다. 소프트웨어가 얼마나 빨리 변경 혹은 개선될 수 있느냐에 따라 비즈니스의 민첩성이 드러난다. 소프트웨어의 품질이 좋지 않을수록 변경하기 더 어려워진다. 비즈니스의 민첩성은 곧 소프트웨어의 품질인 것이다. 기업이 사용하는 소프트웨어의 개선이나 변경이 느릴수록 시장 환경의 변화에 기업이 대응하는 속도도 떨어진다.
회사와 개발자들은 정기적으로 도끼날을 가는 시간이 낭비가 아니라는 사실을 이해해야 한다.
바로 그것이 시간을 절약하고 끊임없이 빨리 움직일 수 있는 최선의 방법이다.