jrcfore***
2021-02-21

파이썬 고수가 되고 싶은 개발자를 위한 실전 프로그래밍 지침서. 파이썬의 기능과 능력을 제대로 활용해 프로그램을 체계적으로 구축하는 방법을 소개한다. 문서화, 버전 관리, 시간대 설정 방법, 패키징, 테스트, 배포 등 개발에 필요한 필수 지식뿐 아니라 유명 파이썬 개발자들의 경험담까지 담았다.
스크립트 언어로는 파이썬이 바야흐로 최강자의 자리에 이르게 되었다. 요즘학부 출신 신입 사원들에게 C/C++을 코딩할 줄 아냐? 혹은배웠냐고 물어보면 과반수가 해당 내용이 커리큘럼상에서 빠져있다고 한다. 정말 놀랍고 신기한 일이다. 필자의 학부시절에는 C/C++은 기본이었거니와 나아가 어셈블을 배우는것 역시 학교 정규 커리큘럼에 항상 기본으로 포함되어 있었기 때문이다.
시대가 그만큼 변한 것인지, 아니면 파이썬이라는 언어 체계가 그만큼잘 잡혀있는 것인지. 아니면 그 두 가지 사항 모두를 만족하는 것인지.그것은 파이썬을 학습한 새대의 판단에 맡겨두기로 하고, 금일은 한빛미디어에서 이번에 출간된 '진지한 파이썬'이라는 책에 관해 리뷰를 하고자 한다.
필자의 눈엔 아직도 파이썬은 상당히 신기한 스크립트 언어이다. 아직도네이티브 (이젠 네이티브가 C/C++로 통용되는듯싶다.) 스타일 코딩을 고집하는 내게 메모리 할당도, 타입 정의도 더 이상 '{ }'도 사용하지 않는 파이썬 스크립트는 그동안 필자가 배워온 틀에서 상당히 괴리가 있는 언어이다.
하지만 근래 들어? (기간이 꽤 된 것으로 알고 있다.) 코딩 테스트, 프로그래밍 경진 대회 등에서 파이썬 언어를 채택하고있다는 것을 보면, 확실히 파이썬 언어가 대세이고 요즘 트렌드인 것 같긴 하다.
【어떤 독자를 위한 책인가】
이 책은 파이썬을 이용한서비스 한 사이클 전체를 총괄한 책이라고 평할 수 있을 것 같다. 파이썬 언어 선택에서부터 API 문서화 관리, TC 관리 그리고 배포와 나아가 심화된 파이썬테크닉에 이르기까지. 말 그대로 파이썬 언어를 이용한 서비스 개발에 필요한 전체적인 사이클을 다루기때문이다. 그렇기에 각각의 챕터에 해당하는 내용의 심도 있는 학습을 위해서는 추가적인 해당 탑픽 관련서적을 참고할 필요가 있어 보인다. (이 책은 고작 300pg이다. 어떤 착은 TC만으로 600pg 분량의내용을 뽑아내는 것을 보면, 얼마나 압축하고 핵심만 추렸는지 대략 가늠해 볼 수 있다.)
그렇다고 해서 내용에 아쉬움을 크게 느끼진 못했다. 그만큼 정말 파이썬을이용한 개발에 있어 우리가 놓치기 쉬운 팁들, 개발자들이 자주 하는 실수 그리고 우리가 궁금해할 요소들에관해 인터뷰 형태로 보충 설명해 주고 있기 때문이다.
따라서 필자가 생각하기에 이 책은 어느 정도 서비스 개발에 관한 경험이 있고 파이썬 문법에 관해서는 기본적 소양을갖춘 그런 초-중급 사이의 개발자들이 읽기에 좋은 책이라 생각된다. 물론고급 개발자도 해당 책을 통해 많은 것을 얻어 갈 수 있을 것이라 생각된다. (꼭 파이썬에한정된 팁만 있는 것이 아니므로 다른 언어가 주력 언어더라도 해당 도서를 한 번쯤 읽어보면 좋을 것이라 생각된다.)
【책의 구성】 '진지한 파이썬'의책의 구성은 어떠한가.
이 책은 따로 구성을파트별로 요약하기 어려울 것 같다. 그만큼 각 챕터가 독립적인 내용을 다루고 있으며, 하나하나 챕터가 모두 중요하기 때문이다. 따라서 필자가 가장 중요하게생각했던 챕터 몇 개만을 추려보았다
chapter 03 : 문서화와 모범 API 사례
흔히 개발자들이 하는중대한 실수 중 하나가 이것이다. 개발만 잘하면 돼.. 맞는말이다. '개발자'라는 직함만 봐도 개발을 잘하는 것은 개발자의책무이자 중요한 의무이기 때문이다. 하지만 개발만 잘해선 안된다. 개발한작품을 잘 문서화해서 누구든 쉽게 사용할 수 있게 해야 한다는 것이다.
나아가 문서화만 잘해선 안된다. 개발 로직 역시 간결하고 일관되며기능 단위로 잘 조율되고 통합되어야 한다. 하나의 기능을 수행하는API가 난잡하게 내부에서 다양한 또 다른 API 들에 의존성이 물려있다면 해당 API는 언제든 변경될 수 있다는 불완전성을 갖는 것과 같다.
따라서 API 하나하나를 설계할 때에도 신중함이 필요하며, 어느 부분을 사용자에게 전달할 것인지 어떻게 전달할 것인지, 어떤용도로 전달할 것인지 잘 설계하고 문서화하는 것 역시 '개발자'로써당연히 갖춰야 할 덕목이다.
chapter 06 : 단위 테스트
여러분이 신이 아니라면, 여러분의 코드는 항상 누군가에 의해서 감독되고 평가되어야 한다. 필자역시 그러하다. 필자가 20대일 때 필자의 머릿속엔 이런생각이 가득했다. 내 코드는 무결하고 절대 버그를 일으키지 않는다. 그렇다. 필자가 20대에 짠 코드들을 보면 나름 정성 가득하고 무결해 보이며절대 버그가 없을 것처럼 보였다. 하지만 그뿐이었다. 다른누군가가 필자 모르게 코드 2줄만을 바꾼다면 모든 시스템이 녹다운되는 현상을 관찰할 수 있는 훌륭한도미노 코드이다. (왜냐하면 하나가 쓰러지란 연쇄적으로 다 무너지는 구조이므로?)
더욱이 요즘처럼 공개 소프트웨어가 대세인 시대에 내가 짠 코드가 누군가에 의해 수정되는 사례는 적지 않게 볼수 있다. 물론 머지 과정에서 검증이 들어가겠지만 코드가 10만줄 100만 줄 된다면 언제 일일이 다 검증하고 있겠는가? (뭐시간이 엄청 많다면 가능할 수 있겠지만..)
그렇기에 작은 부분일지라도 단위 테스트로 구성하고 빌드나 배포 시에 항상 테스트를 자동으로 수행하게 하는 것은몹시 중요하다.
코드의 안정성은 곧 개발자의 신용과도 같은 것이다. 성능은 좋으나업데이트할 때마다 수많은 버그가 발생하는 API를 서비스에 사용하겠는가? 아니면 성능은 좀 떨어지나 업데이트할 때마다 안정성이 높아지는 API를서비스에 사용하겠는가? 답은 독자 여러분이 생각해 보시길 권한다.
chapter 10 : 성능과 최적화
이 부분 역시 많은개발자들, 특히 근래 스크립트 개발자들에게 많은 부분 부족한 부분이다.최적화, 예전 필자가 23년 전에 코딩하던 시절에는컴퓨터 램이 32MB 면 어마어마하게 좋은 컴퓨터였다. 좋다못해 전설적인 컴퓨터였다. (물론 개인 기준이지만) 이 시절엔코드 한 줄을 짜더라도 메모리를 어떻게 하면 효율적으로 최적화할지, 어떻게 해야 사용량을 줄일 수 있을지철저히 계산하고 다이어트 시키고 효율을 높여야 했다. 적어도 요즘 컴퓨터들에 비해 1000배 이상 램과 CPU Clock에서 성능이 떨어졌다고 해도과언이 아닐 것이다.
하지만 지금은 시대가 너무나 좋아져서 메모리는 넘쳐나고 CPU Clock 역시어마어마하게 늘어난 상태이다. 그렇기에 대부분 최적화 없이 돌아가는 데에 집중하는 경향이 크다.
돌아가는 것도 중요하지만, O(N)에 처리될 코드가 O(N^2)에 처리되고 참조 지역성을 만족할 수 있는 코드임에도 cachehit rating을 내다 버린 수많은 코드들이 여기저기서 쉽게 찾아볼 수 있다.
최대한 양보해서 메모리 최적화까지는 바라지 않는다.(메모리 누수랑은다른 문제이다. 누수는 반드시 잡아야 한다.) 하지만 적어도 cache hit rating 그리고 참조 지역성, 시간 복잡도만큼은최적화하는 습관을 들이도록 하자.
물론 책에서는 함수에서 제공하는 메서드를 사용하는 방법, 그리고 프로파일러를사용하는 방법, 병목지점을 찾아서 훌륭하게 디텍션 및 처리하는 방법들을 정리하고 있으나, 한 가지 더 필자가 강조하고 싶은 부분이 있다. 파이썬에서 제공하는메서드를 사용하는 것은 훌륭한 방법이다. 이미 바퀴가 있는데 또 바퀴를 만들 필요는 없기 때문이다. 하지만 그 바퀴가 얼마나 효율적인지 어떤 용도로 만들어졌는지는 이해하고 사용하는 습관을 들이도록 하자.
【진지한 파이썬을 읽고…….】
항상 느끼는 게 출판되는책들에서 요즘 IT의 흐름과 대세가 보인다는 것이다. 안드로이드가처음 나왔을 당시에는 적어도 4년 정도는 안드로이드 관련 도서가 엄청나게 나왔던 걸로 기억하고 있다. iOS 역시 그러하다. 그렇게2008년부터 지금까지 PC -> web-> Android / iOS -> web/ AI / 핀테크(블록체인)의 형태로 개발의대세가 흘러온 것 같다. 물론 대세가 그러하다는 것이지 해당 도서들이 출간이 안된 연도는 단 한 번도없었다.
필자가 생각하기에 이러한 오픈소스 기반의 REST API의 시대도어느 정도 고착화되고 대중화된다면 그 이후에는 증강 현실 / 가상 현실 쪽으로 포커싱이 옮겨가지 않을까싶다. 흐름을 보아도 그러하다. 개인 단말 -> 세계 인프라의 통합 -> AI -> IT와 생활의융햡 -> ? 다음은 무엇일지 대략 짐작 가능하지 않은가? 아마도증강 현실 / 가상 현실이지 않을까?
아마도 그 시대가 도래할 때쯤에 우리가 알고 있던 지식들은 한때 시대를 풍미했던 레거시 기술이 되고 더 추상화되고간략화된 기술들이 도래하지 않을까 싶다.