[리뷰] 좋은 코드, 나쁜 코드
in Review on Review, Book, Good, Code, Bad, Code, 품질, 추상화, 계층, 계약, 오류, 가독성, 예측가능, 오용, 모듈화, 테스트
제이펍
출판사의"좋은 코드, 나쁜 코드(톰 롱 저/차건회 역)"
를 읽고 작성한 리뷰입니다.
좋은 코드와 나쁜 코드의 비교 예시를 통해 코드의 품질을 높여주는 방법을 안내하는 안내서로 클린코드와 같은 명작의 계보를 잇는 책이라 할만하다.
좋은 프로그램 코드를 작성하기 위한 지침서로 클린코드, 실용주의 프로그래머, 코드 컴플릿트 같은 명저의 맥락을 이어가는 책이라 할 만하다.
주로 좋은 코드와 나쁜 코드
의 예시를 통해 장단점을 비교해 나간다. 기존 도서 대비 차이점이 있다면 프로그래밍이 발전해나가며 새롭게 등장
한 assertion, generic과 같은 기법이나 객체지향에서 새롭게 등장한 패턴이 가미되었다는 점이다.
예제코드로 등장하는 언어는 의사코드이지만 학술적으로 사용하는 의사코드이기보다는 Java문법에 가까운 언어이다. 적어도 개발하는 프로젝트가 Java, C# 과 같은 정적언어
를 기반으로 하고 있다면 특정언어에 구애 받지 않고 대부분 책에 등장하는 기법들을 적용해 볼 수 있다는 점이 큰 장점이다.
다만, 정적언어를 다루다보니 Python과 같은 동적언어를 다룰 때는 활용에 있어 약간의 주의가 필요하며 객체 지향언어가 아닌 함수 지향언어를 다룰때에도 그 아이디어가 추구하고자 하는 목적을 달성하는데 참고는 할 수 있어도 그대로 가져다 사용하긴 어려운 부분들도 있다.
하지만 동적언어든 함수형 언어든간에 이 책의 핵심 주제인 좋은 코드를 만들기 위한 6가지 전략이 추구하는 바를 잘 이해한다면 큰 도움이 될 것이다.
책의 중심주제인 6가지 전략
이라 함은 가독성, 예측 가능한 코드, 오용에 대한 사전 방지 기업, 모듈화, 재사용과 일반화, 제대로 테스트 하기 정도로 소개할 수 있다.
이런 6가지 주제를 중심으로 이론, 실전, 테스트 크게 세 부분으로 나뉘는 것이 특징이다. 이론은 추상화와 같이 보다 상위 수준에서 고려해야 할 부분들의 개념과 개요를 잡는데 유용하다.
이보다 프로그래머들 입장에서는 코드로 읽는 것이 더 가독성을 높여줄 것이기에 2부에 해당하는 실전 파트가 보다 재미있고 실제 적용해 볼 수 있다는 점에서 유익할 것이다.
나쁜 코드를 예로 들어 무엇이 문제인지 설명하고 이를 좋은 코드로 전환하기 위한 아이디어가 소개된 후 좋은 코드의 예시를 드는 형식으로 대부분의 내용이 구성되어 있다. 예를 들면 의존성 주입
을 소개할 수 있겠다.
의존성 주입이란 말 그대로 의존성 즉, 종속성으로 인한 잦은 유지보수 및 오류를 발생할 가능성을 높여주는 코드를 주입하는 형태로 전달받음으로써 문제를 근본적으로 피할 수 있게 하는 기법이다.
예를 들어 위의 코드는 NorthAmericaRoadMap이라는 객체를 내부에서 생성한다. 이렇게 되면 추후 NorthAmericaRoadMap 클래스에 수정 사항이 발생할 경우 일일이 모든 소스코드를 뒤져 이 객체를 호출하는 부분을 찾아 알맞게 바꿔줘야 하는 문제가 생긴다.
이런 경우 아래 코드와 같이 필요한 객체를 생성자의 인자로 주입해버리면 문제를 간단하게 해결할 수 있다.
위 코드에서 한가지 더 눈여겨 볼 만한 점은 RoadMap 클래스를 인터페이스로 추상화
했다는 점이다. 추상화에 관련된 부분은 별도의 절에서 구체적으로 다루고 있다. 추상화 또한 의존성 주입과 같이 좋은 코드를 작성하기 위한 좋은 기법 중 하나이다.
이런 굵직한 바로 활용해 볼만한 기법외에도 오용에 대한 사전 방지 기법
에 대해 자세히 다룬 것도 인상적인 부분이었다. 오류를 미연에 확실하게 방지할 수 있다면 미래에 기술적인 빚을 줄이는데 그보다 좋은 방법은 없을 것이다. 손자 병법에 언급되었듯 싸우지 않고 이기는 셈이니 말이다.
서술형 명명 규칙으로 충분히 이해하기 쉬운 코드에 주석을 다는 것을 지양하는 사소한 부분부터 date 타입의 변수를 stirng 타입의 변수로 사용하여 세상에 존재하지 않는 시간 예를 들어 2022년 17월 99일과 같은 엉뚱한 데이터가 들어오는 것을 사전에 방지할 수 있다.
조금 더 나아가면 generic을 써서 형을 완벽하게 명시할 수 있는가 하면 객체 지향의 기법을 활용해 final이나 private과 같은 키워드를 이용하여 객체를 immutable하게 활용한다면 있을 수 없는 경우의 수를 완전히 봉쇄할 수 있다. 이런 기법은 뒤에 테스트 파트에서도 잘 활용하도록 안내되어 있다.
전반적으로 가독성 좋게 구성되어 읽기 쉽다는 점이 책의 큰 특징임과 동시에 실전에 바로 적용해 볼 수 있는 풍부한 예제와 다양한 업무 도메인을 주제로 하고 있다는 점이 책의 특징이다.
다만 프로그래밍의 기본 개념과 구체적인 기법들을 어느 정도 활용해 본 경험이 있어야 이 책을 완벽히 소화하는데 문제가 없을 것이다. 객체 지향 기법의 발전 흐름을 어느 정도는 알고 있어야 이 책이 지향하는 목표에 다다를 수 있을 듯 하다.
다형성, 추상화, 인터페이스와 같은 기본적인 객체 개념을 일일이 상세하게 설명해주는 책은 아니기에 기본적인 선수 지식이 필요하다. 즉, 책의 서문에서 밝힌 바와 같이 3년 정도의 개발 경험은 있어줘야 책을 읽기에 부담이 없겠다는 생각이 든다.
물론 경력이 10년이 넘는다 해서 이 책을 읽지 말아야 한다는 것은 아니다. 이런 부류의 책은 언제나 이상을 지양하고 있고 우리는 때로는 인력이 부족해서 혹은 시간이 부족해서라는 이유로 늘 이상과 실제에서 다투고 있기에 마음을 다잡거나 새로운 기법에 대한 좋은 해결책을 찾는데 늘 도움이 되는 책이니 곁에 두고 수시로 참조할만하다 생각한다.
보다 나은 코드를 위한 새로운 지침서가 등장하여 기쁜 마음으로 리뷰를 마친다.