[daily] 책 리뷰 - 프로그래머를 위한 파이썬

저의 업무 환경은 Python입니다. Airflow와 AWS 서비스(lambda, batch, glue..) 전부 파이썬만을 사용하고 있습니다.

Python을 잘 알고 싶어 5월 중순부터 이 책을 공부하기 시작해 이제 마지막 장을 남겨놓고 있습니다. 퇴근 후 꾸준히 공부한다고 했는데 생각보다 진도가 많이 늦었습니다. 공부에도 나름 요령이 생겨 다음 공부부터는 좀 더 효율적인 시간 안배가 가능하지 않을까 싶습니다.

아쉬운 점도 있지만 저와 비슷한 레벨(파이썬으로 간단한 코딩이 가능한 신입)의 개발자에게 좋은 내용들이 많다고 생각합니다. 영어 제목은 Pratices of the Python Pro라 처음 표지를 봤을 때는 좀 겁을 먹었었는데, 고급자 뿐만 아니라 입문자 수준인 저도 충분히 보고 느낄 점이 많았습니다. O’reilly 전문가 파이썬 / 고성능 파이썬 정도를 소화하실 정도의 실력자이시라면 Python 자체에 대한 설명보다는 프로그래밍에 Python이 어떻게 녹아들어야할지에 대한 내용을 중점으로 보시면 좋을 것 같습니다.

노션 페이지에 책 내용과 코드를 기록해두었으니 어떤 내용인지 Preview를 원하시면 참고해주세요.

노션 링크


프로그래머를 위한 파이썬

프로그래머를 위한 파이썬

영어 원서를 번역한 책이고 파이썬 기초를 알고 있어야 합니다. 어떻게 프로그램을 작성할 것인가에 대한 일반적인 방법론의 기초에 좀 더 가까운데, 설명을 위한 언어가 파이썬으로 되어 있습니다. 거기에 파이썬에서 제공하는 특징이나 장점을 어떻게 녹여낼지 설명합니다.

Chapter 1. 모든 것이 중요한 이유

1장에서는 이 책의 작가가 생각하는 파이썬과 그 장점, 그리고 소프트웨어 설계에 대한 철학을 설명하고 있습니다. 본격적으로 파이썬을 다루기 전에 가벼운 마음으로 읽어도 되는 정도의 내용입니다.

Chapter 2. 설계의 기초

이 챕터에서는 이 책의 마지막까지 고수하는 불변의 원칙 관심사 분리가 처음 등장합니다. 이 개념은 이 책에서 반복 등장하고 그만큼 중요합니다. 클래스, 모듈, 메서드와 같이 코드를 정의할 수 있는 단위들을 가지고 어떻게 코드를 분리해야할지 코드와 함께 설명합니다.

Chapter 3. 추상화와 캡슐화

2장을 보면 코드를 분리에 대한 당위성은 이해가 갑니다. 그러나 어떻게 분리해야 잘 분리하는 것인지는 아직 모릅니다. 3장에서는 추상화와 캡슐화를 통해 이를 설명합니다. 상속, 다형성 등 객체지향을 공부했다면 익숙한 개념들도 등장합니다.

길진 않지만 프로그래밍 스타일(절차적, 함수형, 선언형)에 대해서도 다룹니다. 이 책의 챕터 중에서 가장 다양한 내용을 다루는 챕터인것 같습니다. 파이썬을 다루는 책답게 덕타이핑 개념도 등장합니다.

Chapter 4. 높은 성능을 위한 설계

이 챕터에서는 복잡도에 대해 이야기합니다. 흔히 알고있는 빅오 표기법부터 메모리 개념의 공간 복잡도, 그리고 이를 측정하는 방법과 도구에 대해 설명합니다. 복잡도는 코드 성능에 직결되기 때문에 이를 강조하고 있습니다.

Chapter 5. 소프트웨어 테스트하기

파이썬의 기본 모듈인 unittest 프레임워크(이쯤 되면 라이브러리로 아예 정착한 수준이 아닌가 싶습니다.) 사용법에 대해 설명합니다. pytest와 TDD에 대해서도 언급하지만 짧은 편이라 이 부분은 따로 공부를 해야할것 같습니다. 테스트 코드를 어떻게 작성해야 할지 알 수 있습니다.

Chapter 6. 실전! 관심사 분리

bark라는 간단한 어플리케이션을 만들어봅니다. 다만 6장에서 만드는 bark는 관심사 분리가 적게 반영되어 있습니다. 10장까지 챕터를 진행하면서 bark를 가지고 관심사 분리를 직접 진행할 것이기 때문입니다. Do it!

Chapter 7. 확장성과 유연성

확장 가능한 코드에 대해 설명합니다. 확장 가능한 코드는 무엇일까요? 반대로 확장이 어려운 코드는 어떤 코드일까요? 이 챕터에서는 이런 코드를 어떻게 판별해야 할지, 또 어떻게 해결하면 좋을지에 대해 설명합니다.

Chapter 8. 상속과 규칙과 예외

상속은 객체지향의 역사를 함께 한 개념이라고 해도 과언이 아닙니다. 상속과 계층구조는 어떻게 가져가면 좋을지, Java에서 사용되는 추상 클래스 / 인터페이스를 파이썬에서는 어떻게 만들지, 마지막으로 Bark 어플리케이션에서 추상 클래스 / 상속의 개념을 직접 적용시킵니다.

Chapter 9. 경량화하기

이 쯤 왔으면 무겁고 긴 코드를 분리해야 한다는 사실에는 이견이 없을 것입니다. 그렇다면 그 기준은 무엇일까요. 단지 코드 라인수가 많으면 분리의 대상일까요? 이 챕터에서는 분리를 해야하는 기준은 어떻게 정해야할지, 함수와 클래스를 어떻게 분리하면 좋을지에 대해 설명합니다.

Chapter 10. 느슨한 결합 만들기

분리를 하기 위해서는 강하게 결합되어 있지 않아야 합니다. 강하게 결합되어 있는 코드는 한 줄의 수정만으로도 연쇄적인 부작용을 낳을 수 있습니다.

이 챕터에서는 강하게 결합되어 있는 코드의 징후, 결합도를 줄이는 전략을 상호간의 메세지 개념을 가지고 설명합니다.

Chapter 11. 향상과 진보

마지막 장에서는 Chapter 1~10을 간단히 정리하고, 앞으로 소프트웨어 개발자로 살아가는데 어떤 것을 더 공부하면 좋을지 설명합니다. 한 권의 책을 한 번 다 읽었다는 뿌듯한 마음으로 가볍게 읽으면 되겠습니다 :)


총평

총평이라고 하기엔 너무 거창하고, 책 전체의 느낀 점을 장/단점으로 나열합니다.

1. 쉽다

필요한 공부(인터넷 강의, 책, 컨퍼런스 등)라면 너무 쉬운것만 찾는 것은 좋지 않습니다. 그러나 이해도 가지 않는 내용을 한없이 들여다 보는 것은 지루하고 의욕을 떨어트립니다. 그렇기 때문에 저에게는 이 책이 쉽다는게 큰 장점으로 다가왔습니다.

예시로 간단한 어플리케이션을 만들고 그 모듈을 리팩토링하면서 관심사 분리, 캡슐화 등을 진행합니다. 직접 작성한 어플리케이션을 중심으로 진행하기 때문에 다른 주제로 주의가 흐트러지지 않습니다. 내용 뿐만 아니라 구성 또한 이해하기 쉽게 되어 있습니다.

책의 전체 예시가 github에 있어 참고도 가능하고, 영어가 편하신 분들은 구글에 영어 제목 Pratices of the Python Pro을 검색하면 무료 PDF도 구할 수 있기 때문에 여러모로 접근하기 편한 책인것은 확실합니다.

2. Python을 활용할 수 있는 방법을 설명한다.

Java는 우리나라에서 20년을 1인자로 군림한 프로그래밍 언어입니다. Spring 또한 그렇습니다. 물론 국내 Python 개발자분들이 잘 작성한 포스팅 / 개발 방법론도 많지만, Java가 쌓아온 아성을 넘보기에는 물리적인 한계가 분명 존재합니다.

그렇기 때문에 Python으로 쉽게 쓰여진 책이 더욱 귀하게 느껴집니다. Do it 파이썬과 같은 책으로 파이썬 기초를 익힌 후에 Flask 같은 웹개발 공부로 넘어가는 것이 일반적인 흐름인데, 그 사이에 이 책을 거치면 좋을것 같습니다. 특정 프레임워크에 국한되지 않는, 파이썬이라는 언어를 사용하는데에 좋은 밑거름이 될 것이라 생각합니다.

장점 뿐만 아니라 단점과 유의사항 또한 언급합니다. 파이썬의 높은 자유도가 단점이 되는 경우를 몇 번 마주한 적이 있는데, 이에 대해 어떻게 대처하면 좋을지 생각할 수 있는 재료들을 제공해줍니다.

3. 책이 쓰여진 의도가 명확하다.

저는 이 책이 프로그램을 어떻게 만들고 고쳐나가면 좋을까에 대한 인사이트를 주는 책이라고 생각합니다. 주로 다루는 내용이 디버깅, 리팩토링, 유지보수인것만 보더라도 알 수 있습니다. 한 번 보고 이해했다 생각한채로 그만 보는 책이 아니라, 프로그래머로 살면서 계속 옆에 두고 참고할만한 책입니다.

단, 그렇기 때문에 어플리케이션에 Python을 적용한 실제 사례를 보고 빠르게 적용하고자 하는 분들이나, 파이썬이라는 언어 자체를 깊게 탐구하고자 하는 분들에게 맞는 책은 아닌것 같습니다. Pratices of the Python Pro라는 영어 제목 중 Pro라는 단어가 실전에 다이렉트로 적용이 가능하다는 인상을 심어줄수도 있다는 생각이 들었습니다. 물론 실전에 적용할 사례가 충분하지만 새로운 라이브러리 기능을 적용하는 것처럼 짧은 시간에 가시적인 효과를 내는 내용은 아님을 알리고 싶습니다.

4. 번역

유일하게 아쉬운 점인데, 영어 어투를 그대로 옮긴듯한 문장들이 종종 있습니다. 영어를 잘 해석한 직역보다는 한국어를 잘 이해한 의역이 추가된다면 매끄럽게 읽는데 더 좋을 것 같습니다.

예를 들면 이런 문장입니다.

필자는 모든 경우에 단단한 결합이 본질적으로 나쁘다는 것이 아니라 그물망 비유를 좋아한다.

이 문장의 원문은 I like this analogy because it doesn’t say that tight coupling is inherently bad in all cases입니다. 100% 단어의 의미를 직역한 번역은 아니지만, 제가 번역을 한다면 이렇게 번역할 것 같습니다.

  • 필자는 모든 경우에 단단한 결합이 본질적으로 나쁘다는 것이 아니라 그물망 비유를 좋아한다.

  • 필자는 그물망 비유를 좋아한다. 그물망 비유를 보면 강한 결합이 본질적으로 나쁜 것은 아니라는걸 알 수 있기 때문이다.

전자와 후자 중 후자가 더 깔끔하게 이해되는 한국말이라고 생각합니다. 이 문장 뒤에서는 단단한 결합이 갖는 장점을 서술하고 있기 때문에, 뒷 문장과 붙여보면 그 차이가 더 명확히 드러납니다.

  • 필자는 모든 경우에 단단한 결합이 본질적으로 나쁘다는 것이 아니라 그물망 비유를 좋아한다. 오히려 단단한 결합과 느슨한 결합의 차이에 초점을 두게 하며, 코드의 최종 결과를 이해하는 데 도움이 된다.

  • 필자는 그물망 비유를 좋아한다. 그물망 비유를 보면 강한 결합이 본질적으로 나쁜 것은 아니라는걸 알 수 있기 때문이다. 오히려 단단한 결합과 느슨한 결합의 차이에 초점을 두게 하며, 코드의 최종 결과를 이해하는 데 도움이 된다.

그 외에도 수동태를 그대로 번역한듯한 느낌의 번역체도 보입니다.

이 코드는 허용될 수 있다.

이 문장의 원문은 this code might be tolerable입니다.

  • 이 코드는 허용될 수 있다.
  • 이 코드를 허용할 수 있다.

한국말은 수동태를 사용하면 어색하게 들리기 때문에, 영어 문장이 수동태로 되어있다 하더라도 문장의 주체를 바꾸어 번역했으면 어떨까 하는 생각이 듭니다. 책의 내용은 만족스러우나 위에서 언급한 문장 외에도 매끄럽지 못한 문장들이 더러 보이는 점이 아쉽습니다.