리팩터링을 하면 일의 균형이 바뀐다. 처음부터 완벽한 설계를 갖추기보다는 개발을 진행하며서 지속적으로 설계한다. 시스템을 구축하는 과정에서 더 나은 설계가 무엇인지 배우게 된다. 그 결과, 개발의 시작부터 끝날 때까지 프로그램은 줄곧 우수한 설계를 유지한다.
2009년에 Refactoring 1판을 읽었으니 13년 만에 2판을 읽었다. 1판의 원서가 1999년 나왔고 번역서는 2002년에 읽었으니 내가 1판을 읽은 시점도 책이 꽤 지난 시점에 책을 읽었지만 유행을 타는 책은 아닌 덕에 당시에도 꽤 인상깊게 읽었다. 그리고 거의 20년이 지나서 2018년에 2판이 나왔다. 흥미롭게도 Java를 하던 시점에 Java로 된 1판을 읽었는데 지금은 JavaScript을 주력으로 하고 있는데 2판은 JavaScript로 나와서 반가웠다.
언어의 특징을 완전히 벗어날 수는 없지만 예제 자체는 JavaScript 언어의 특징에 갖히지 않고 범용적인 리팩토링 관점을 이해할 수 있도록 노력한 것을 느낄 수 있었다.
켄트는 내게 리팩터링을 알려준 사람이자, 리팩터링 과정을 노트에 기록하도록 영감을 주었고, 완결된 형태의 작품으로 빚어내는 데 도움을 줬다. 코드 악취(code smell)라는 개념도 만들어 냈다.
요즘은 업무에서도 개발을 많이 하고 있지만 다양한 경력을 쌓아오면서 최근에는 인프라쪽이나 매니징에 더 많은 시간을 썼고 그외에는 간단한 프로그램을 만드는 정도에 그쳤기 때문에 요즘 개발을 하면서 코드나 설계에 대한 고민을 안한지가 오래되었다는 생각을 많이 하게 되었고 원래도 큰 프로젝트를 오랫동안 개발한 경험이 많지는 않기 때문에 만들고 있는 소프트웨어가 커져감에 따라 한계도 조금씩 느끼고 있던 시점이었다.
프로그램이 새로운 기능을 추가하기에 편한 구조가 아니라면, 먼저 기능을 추가하기 쉬운 형태로 리팩터링하고 나서 원하는 기능을 추가한다.
프로그래밍 공부도 다시 해야겠다는 생각도 있었지만, 그동안 주워들으면서 배운 지식도 있어서 막상 시작은 못 하고 있었다. 지금 업무로 하는 프로젝트가 Node.js 기반이었는데 동료들은 JavaScript에 익숙지 않은 사람도 있었고 요즘은 내가 가진 JavaScript 코드 형태도 너무 낡았다고 생각하고 있었기에 사내에서 스터디하면서 이 책을 선택했다.
원래 의도는 코드를 작성한 배경도 다르기 때문에 이 책으로 공부하면서 의견을 나누면서 서로에 대한 생각도 더 이해하고 여기서 공부한 걸 프로젝트에도 적용하겠다는 생각이었다. 진도에 따라서 코드에도 리팩토링을 적용하고 싶었지만 막상 하니까 일하면서 스터디 진도 따라가는 중에 이걸 실제 코드에 매주 넣기는 쉽지는 않다 보니 진도에 따라가기에 급급하기는 했다.
리팩터링하기 전에 제대로 된 테스트부터 마련한다. 테스트는 반드시 자가진단하도록 만든다.
컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다.
테스트 없이는 코드를 작성한 지가 꽤 오래되긴 했지만 이런저런 사정으로 지금은 테스트 코드가 부실한 상태로 프로젝트가 커가는 중이긴 하다. 이 부분에 대한 막연한 두려움이 있으면서도 테스트 코드를 많이 채워가지 못하고 있었는데 책을 보면서 테스트에 대한 생각도 많이 하게 되었다. 예전에 테스트에 대한 고민을 하던 거에 비해서는 지금은 테스트에 대한 확신이 있기 때문에 이런 고민 자체는 없는 편이지만 마틴 파울러가 리팩터링을 설명하면서도 테스트를 과도할 정도로 강조하는 걸 보면서 반성도 하게 되었다.
누군가 "리팩터링하다가 코드가 깨져서 며칠이나 고생했다"라고 한다면, 십중팔구 리팩터링한 것이 아니다.
...
나는 코드 베이스를 정리하거나 구조를 바꾸는 모든 작업을 '재구성(restructuring)'이라는 포괄적인 용어로 표현하고, 리팩터링은 재구성 중 특수한 한 형태로 본다.
그래도 1판을 읽은 뒤에 경력도 있기 때문에 1판을 읽었을 때처럼 임팩트는 없었다. 당시의 느낌을 다 기억하지는 못했지만, 당시에는 "아~ 이렇게 하는 거구나", "이렇게 할 수도 있구나"라는 걸 배웠다면 그동안 그래도 쌓은 지식이 있으니 이 책에서 새로운 부분을 많이 배웠다는 느낌은 없었다. 대신 코딩이나 리팩토링에 대한 생각이 환기되는 기분이었다. 알고 있다고 생각하면서도 안 하고 있었던 것도 있고 간단한 부분인데 잊고 있었던 부분들도 있어서 이런 부분을 생각하면서 다시 리팩터링에 대한 생각을 많이 하게 되었고 그룹 스터디로 하다 보니 다양한 입장에 대한 생각도 들을 수 있어서 재미있었다.
켄트 벡의 말을 떠올리게 해준다. "난 뛰어난 프로그래머가 아니에요. 단지 뛰어난 습관을 지닌 괜찮은 프로그래머일 뿐이에요." 리팩터링은 견고한 코드를 작성하는 데 무척 효과적이다.
리팩토링은 프로그래밍 서적 중에 추천할 만한 책 중 하나라고 생각하는데 이번 기회가 없었다면 이미 1판을 읽었다고 읽어보지 않았을 책이라 읽으면서 더욱더 좋았다.
Comments