jrcfore***
2020-04-30

지난 20년간 전 세계 프로그래머에게 리팩터링의 교본이었던 이 책의 1판은, 기존 코드의 디자인을 개선하고 소프트웨어 유지 관리 능력을 향상시켰으며 기존 코드를 이해하기 쉽게 만드는 데 도움을 주었습니다.
리펙토링, 학부 시절이나 대학원 시절 그리고 회사에 입사하고 어떤 프로젝트를 하건 듣게 되는소리가 바로 '리펙토링!!'이다. 그만큼 CS분야에 몸담고 있는 사람이라면 한번쯤 들어봤을 굉장히친숙하면서 거리가 있는 용어 또한 '리펙토링'이다. 왜 그럴까? 왜 우리는 그토록 리펙토링에 대한 중요성에 대해서 나름알고 있음에도 이것을 언제 어떻게 적용해야하는지, 그리고 어떤식으로 적용한 내용을 최적화 해야 좋은지이러한 내용에 대해서는 거의 전무한 상태이다. 왜냐하면 아무도 우리에게 리펙토링에 대한 이론적 배경과대략적인 모양은 그려줬지만 실재로 언제 어떤 느낌으로 이를 대해야할지는 가르쳐주지 않았기 때문이다. (물론가르쳐 준다고해서 바로 적용할 수 있는 그런 분야의 학문도 아니긴 하지만.) 하지만 이번에 운이 좋게리뷰한 이 책은 앞서 언급한 언제 어떤 느낌으로 이를 대해야할지에 대한 대략적인 느낌을 알려주고 있다. 그렇다면이번에 리뷰한 책은 과연 어떤 책인지 이제부터 살펴보도록 하자.
'리팩터링 2판'은 CS를 하는 모든 사람이라면 읽어야한다. 아니 그냥 무조건 필독서다. 하지만 여기서 의미하는 필독이라는 의미는무조건 읽어야만한다는 의미는 아니다. 반드시 많은 코드를 분석하고 직접 실습하면서 책에서 배운 내용을몸으로 익힐 때까지 반복해서 공부하라는 의미이다. 이 책은 굉장히 친절하지만 코드 경험이 많이 업는막 입문한 사람들이 읽기에는 약간 내용이 심오하다. 무엇보다 갓 입문하는 사람들이 리펙토링이라는 분야에손을 대기에는 너무 이르므로, 좀 더 실무적 경험 (프로젝트경험)이 어느정도 쌓인 다음에 이 책과 함께 CS의 세계를다시금 여행하길 권한다.
이 책을 각 독자층별로 간략히 정리하자면, 초심자에게는아직 신경이 이어지지 않는 머리 속에 기억된 지식으로써 남을 것이며, 중급자에겐 코드를 보며 순간 순간뇌리 속에 번뜩할 아이디어와 인사이트를 줄 그런 책이 될것이다. 그리고 숙련자에게는 이미 몸으로 채득되어자연스레 코드에 녹아내는 그런 아름답고 철학적인 코딩이 가능하게 해줄 것이다.
이 책은 자바 코드를 비롯한스크립트 코드를 예를 들어가며 각각 리펙토링 과정을 설명하고 있다. 단순 글로만 정리한 것이 아니라, 어느 상황에서 어떤 기법으로 어떤식으로 접근해야하는지를 잘 설명하고 있다. 물론시중에도 리펙토링과 코드 추상화에 관련된 좋은 책들이 많이 있지만 필자가 이제껏 읽어보았던 책들 중에 과히 으뜸으로 손꼽힐 그런 내용들로 구성되어있었다.(솔직히 책을 읽으며 그동안 필자가 짠 코드들을 생각하면, 정말 반성을많이해야겠구나..란 성차을 꽤나 했다.) 책의 쳅터 구성은전반부는 전체적인 리펙터링이 무엇이며 언제 어떻게 해야하며 이와 관련된 지식들을 통합적으로 설명하고 있다. 또한후반부는 각각의 케이스에 따른 리펙토링을 챕터별로 잘 구분하여 설명하고 있기 때문에 전반부를 차례로 읽고 후반부는 필요에 따라 각 쳅터를 선정하여읽어도 크게 무리가 없겠다는 생각이 들었다. 그만큼 후반부의 각 쳅터는 각 쳅터의 구성이 독립적으로잘 구성되어 있었고 또한 전 장에 크게 연관되어 있지 않기 때문에 앞장에 관한 지식이 많이 없더라도 어느정도 편하게 읽을 수 있게 구성되어 있다.(물론 간혹 뒷장의 기술이 앞장에서 언급되는데, 그런 경우에는 어느장의내용인지 충분히 언급하고 있기 때문에 잘 기억해 두었다가 나중에 해당 쳅터의 내용을 공부할때 참고하면 되는 구조이다.)
리펙토링은 어찌보면 굉장히주관적인 기술이다. 왜냐하면 누군가에게는 괜찮아 보이는 구조인 것이 누군가에게는 굉장히 어설프고 불편해보이는 구조로 보일 수 있기 때문이다. 그렇기 때문에 이게 답이야! 라고확실히 단언하고 접근하기에는 한계가 있는 학문이다.(간단히 말해 획일화 된 답은 없다.) 하지만 이번에 리뷰한책은 리펙토링의 지식 중에서도 골자가 되는 내용만을 다루고 있기 때문에 이 부분에 대해서는 아마도 대부분의 프로그래머들이 수궁할 수 있는 수준이라고생각된다. 특히 실무에 있다보면 다양한 사람들이 구성한 수많은 코드들을 접하게 되는데 몇개의 코드들은정말 눈씻고 처다봐도 형편 없는 그런 코드가 있는가하면 정말 몇몇 코드는 그 흐름이 분명하고 자연스러워 프로젝트 구성을 한눈에 파악하기 좋은 코드가있다. 이런 후자의 코드들의 공통점은 리펙토링을 수시로 했다는 점과 책에서 언급하고 있는 기본 리펙토링적지식이 튼튼한 사람이라는 점 그리고 무엇보다 누군가에 본인의 코드가 한눈에 잘 파악되고 잘 이해할 수 있는 구조이길 바라는 만든이의 간절한 마음이녹아있다는 점이 공통점이었다. 그렇기에 이 책을 통해 수많은 독자분들이 자신의 코드가 나만의 코드가아닌 우리 모두의 코드가 될 수 있는 그런 창작물을 만들 수 있는 프로그래머가 되길 바래본다.