[오라일리] 실무로 통하는 클린 코드 – 코드 품질과 디자인을 개선하는 208가지 실전 레시피

“한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.”

클린 코드. 말은 쉽다. 읽기 좋고, 간단하고 직관적이며, 그럼에도 좋은 동작을 보여주는 코드. 사실상 실무에서 이런 코드를 접하는 건 하늘의 별따기다. 솔직히 아직까지 클린 코드라고 볼만한 코드를 본 적은 없다. 심지어 본인도 그런 코드를 짜본 적이 없다. 다시 말하자면, 말은 그럴 듯한데, 이게 클린 코드다라고 할 만한 전형을 본 적이 없다. 그래서 뭐가 클린 코드인지 머릿속에 잘 그려지지 않는다.

이 책을 보기 전에 클린 코드 바이블 격인 책을 본 적은 있다. 그런데 내 머릿속에 남아 있는 게 별로 없다. 본인이 제대로 안 읽었던지, 너무 이론 중심적이었던지, 아무튼 없다.

뭔가 써먹을 만한 걸 모아둔 책이라고 한다. 208가지나 실었다. 뭐라도 하나 건지면 다행이란 생각이 들었다. 그래서 일단 펼쳐 읽기 시작했다. 구성은 매우 간단하다. 문제와 해결, 그리고 설명. 208번 반복하고 있다. 이를 이해시키기 위해 좀 장황하게 설명을 하고 시작했다. 갑자기 전단사? 수학 용어가 나온다. 아, 물론 프로그래밍의 기본은 논리와 수학이다. 이를 무시하는 건 아니지만, 갑작스레 수학 용어를 자주 반복해서 사용하다보니 복잡한 느낌을 받는다. 여전히 수학은 잘 모르겠다.

전단사와 더불어 매우 자주 언급되는 표현은 “빈약한”이다. 원서에서 어떤 단어를 빈약한으로 번역한 걸까? 그냥 번역기에 돌려보면 “빈약한”은 “poor”로 번역하는데, 정말 이 단어였을까? 다른 단어이진 않을까? 궁금해진다. 차후에 원서를 보게 되면, 한 번 신경써서 봐야겠다 싶다.

1장과 2장은 좀 어려웠다. 원래 책에 서두와 첫 번째 장이 제일 어렵다고는 하지만, 희한하게 잘 읽히는데 어려웠다. 아마 이해해야 할 핵심 내용인지라 그런 인상을 받았을지도 모르겠다. 인내심을 갖고 읽어내린 다음 3장부터 이제 실질적으로 필요한 레시피가 나오기 시작한다.

전반적으로는 이렇게 평가할 수 있겠다. 어떤 레시피는 아하, 하고 감탄할만 하고, 어떤 레시피는 묘했고, 어떤 레시피는 아닌 것 같은데 싶었고, 어떤 레시피는 무슨 얘길하는지 잘 이해가 되지 않았다. 다시 말해 208가지 전부가 나에게 다 이해가 되고, 필요했으며, 적합한 건 아니었다는 얘기다. 그러나 상당수가 내 생각과 비슷했고, 도움이 될 만한 내용들이었다.

감탄할 만한 레시피는 3.2 객체의 본질 파악하기를 그 예로 들 수 있겠다. 완벽히 이해가 된 상태는 아니지만, 필수 동작이 객체를 식별한다는 설명 그 자체는 내게 울림을 줬다. 이를 잘 소화해내서 체화하는 건 내 몫인지라 고민이 많이 필요한 내용이었다.

묘했던 레시피는 4.1 작은 객체 생성하기다. 보통은 이름을 저장할 변수를 정의하면 String name으로 끝난다. 그런데 그렇게 하지 말고 Name을 정의하고 Name name으로 사용하라고 한다. 의도는 이해가 되지만 이게 과연 현실적인가라는 의문은 남는다. 이렇게 사용한 객체를 DB와 연관짓게 되면 변환 절차를 거치도록 추가 작업을 해야 하는데, 이게 과연 현실적인가 묘했다.

아닌 것 같은 레피시는 6.11 괴상한 조건문 재작성하기다. if (42 == abc) 라고 하지 말고 if (abc == 42) 라고 하라는 얘기다. 왜 이상할까? 꽤 오랫동안 후자 방식으로 했을 때 실수로 abc = 42와 같이 사용하거나 했을 때 문제를 알아차리지 못하고 실행될 수 있고, 이로 인해 오류가 발생할 수 있으니 문제가 되지 않도록 전자처럼 코드를 작성하라고 조언을 받아왔다. 꽤 여러 책과 글에서 접했던 내용이었다. 그런데 이렇게 하지 말라고 얘길하는 게 아닌 것 같다는 생각이 들었다. 둘 다 나름의 논리를 갖고 있으니 결국 받아들이는 건 본인이니 본인이 잘 판단해야 할 문제긴 하겠지만 말이다.

무슨 얘긴지 이해가 안 되는 레시피는 16.1 객체 ID 피하기다. 실질적으로 처리하는 모든 데이터는 DB와 밀접한 관계가 있다. 값을 처리해서 DB에 저장하거나, DB에 저장된 값을 읽어와 주어진 처리를 한 다음 다시 저장한다. 그렇기 때문에 거의 모든 객체에는 ID가 존재한다고 볼 수밖에 없다. 그래서 이 부분은 잘 이해가 되지 않았다. 잘못된 내용은 아닐 테고, 저자가 얘기하는 바를 제대로 이해하고 받아들이지 못한 것 같아 좀더 연구할 필요가 있는 내용일 테다.

각 경우에 맞게 하나씩 레시피를 그 사례로 들었지만, 그런 유형들이 여러 개 있다. 그래서 이 책은 한 번 읽고 책장에 꽂아두는 책이 아니다. 다양한 경험을 할 수록 이 책에서 적용 가능한 레시피를 찾아 써보는 게 좋다. 그리고 가끔 레시피 하나를 뽑아 그 내용을 곱씹어보는 게 좋을 만한 책인 듯도 싶다.

다만 아쉬운 점은 다양한 레시피를 소개하고 있고, 필요에 의해서 어떤 레시피들은 적절하게 설명을 달아놨지만, 어떤 레시피는 그 설명이 상대적으로 빈약해서 관련 자료를 더 찾아봐야 하는 경우도 있었다. 즉, 만병통치약처럼 볼 수는 없는 내용이 있다. 이 점은 주의해야 한다.

현재 진행 중인 프로젝트에서 이 레피시들 중 적용할만한 게 있다. 다만, 그대로 적용하기엔 무리인 것들도 있다보니 점진적으로 적용할 수 있는 방법을 찾아야 한다. 그래도 개선 방향에 써먹을만한 내용(특히 16장 섣부른 최적화, 17장 결합도, 20장 테스트, 21장 기술 부채, 22장 예외 등)이 많으니 차분히 활용해 볼 생각이다.

저자는 이 책 1.4 왜 클린 코드인가요? 에서 읽고, 이해하고, 유지 보수하기 쉬운 코드를 의미한다고 적어놨다. 머리로는 알겠는데, 마음 속 깊숙이 우러나오는 느낌은 아니다. 저자의 말을 이해할 수 있는 그날까지 더 공부해야겠다. 이런 나침반같은 책들을 읽으면서.


코멘트

댓글 남기기

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.