컴퓨터 프로그래밍의 대중화는 더 쉽고 간결한 언어에 대한 기대와 활성화로 연결되었다. 그중 파이썬은 상대적으로 낮은 진입장벽과 쉽고 간결한 문법 덕분에 다양한 분야에서 사용된다. 간단한 스크립트부터 대규모 프로젝트까지 파이썬은 주 프로그래밍 언어로 성장했고 외부 라이브러리를 사용해 언어의 효율성과 실행 속도를 극대화하려는 많은 연구가 진행되고 있다. 파이썬의 가장 큰 장점은 훌륭한 외부 라이브러리들이 꾸준히 개발되고 있는 활발한 언어라는 점이다. 프로그래머는 사용성이 입증된 외부 패키지를 활용해 복잡한 알고리즘 개발에 할애하는 시간을 줄이고 효율적인 코드를 작성할 수 있다.
이 책은 외부 패키지를 사용해 파이썬 코드를 최적화하고 효율성을 높이는 몇 가지 핵심 방법을 소개한다. 기본적인 파이썬 문법 및 사용법을 숙지하고 외부 패키지 사용에 대한 개념을 이해하는 파이썬 프로그래머를 대상으로 한다. 간단한 파이썬 기반 프로그램을 단계적으로 작성하면서 문제점을 집어내고 Cython과 NumPy를 사용해 코드를 최적화한다. 또 프로그래밍 분야의 최대 난제이자 동시에 즐거움인 병렬처리의 개념을 소개하고 multiprocessing 모듈과 IPython Parallel 패키지 등을 사용해 파이썬 프로그램을 병렬화한다. 이 책에서 소개하는 최적화 기법은 거의 모든 파이썬 프로그램에 적용할 수 있는 보편적이며 유용한 기술이므로 반드시 숙지하기를 권유한다.
이 책을 번역하는 데 생각 이상으로 오랜 시간이 걸렸다. 학교에서 공부하기도 했고 업무에서도 종종 논의한 개념이기 때문에 꽤 알고 있다고 생각했지만 오산이었다. 여러 번 읽고 다른 자료들도 참고해야 어느 정도 이해할 수 있었다. 데이터베이스 분야는 번역 용어가 아직 정립되지 않았다는 것도 몸소 느꼈다. 일반적으로 원서와 영어 논문을 참고하다 보니 영어가 더 익숙한 용어들을 굳이 번역해야 하나 싶기도 했다. 예를 들어 'READ UNCOMMITTED' 격리 수준을 '커밋 전에 읽기'라고 부르는 경우는 흔하지 않다. 하지만 어색하더라도 의미가 더 잘 와 닿는다면 좋은 시도라고 생각한다.
이 책은 데이터베이스를 지탱하는 알고리즘을 설명하고 최신 논문과 시스템에서만 접할 수 있는 관련 개념들을 정리한 책이다. 데이터베이스를 공부하는 학생과 현업 개발자 그리고 특히 여러 최신 데이터베이스의 원리와 기술을 숙지해야 하는 데이터베이스 연구자들을 위한 책이다. 관계형 데이터베이스 시스템을 사용해봤고, 분산 시스템을 사용해 새로운 시스템을 구축하려는 개발자라면 많은 도움이 될 것이다. 이미 검증된 라이브러리가 많아서 직접 알고리즘을 작성하거나 데이터베이스 엔진을 개발하는 일은 흔하지 않다. 하지만 이론과 알고리즘을 이해하는 정도는 컴퓨터 과학자와 일반 개발자를 나누는 기준이 되며, 최선의 해결책을 찾는 데 결정적인 역할을 한다. 이 책은 데이터베이스 개발자라면 반드시 알아야 하는 분산 시스템의 기본 이론 및 알고리즘을 설명하는 책이다.
데이터베이스별로 어떤 기능이 있는지, 얼마나 빠른지 또 어떤 유형의 애플리케이션에서 사용되는지 등의 실용적인 측면은 다루지 않는다. SQL과 같은 쿼리 언어와 쿼리 플랜도 설명하지 않는다. MySQL과 오라클 중에 어떤 것을 선택해야 할지 고민 중이거나, 1억 건이 넘는 로우를 어떤 데이터베이스에 저장해야 할지 고민 중이라면 이 책은 도움이 되지 않을 것이다. 대신 데이터베이스 이론과 알고리즘을 스토리지 관점에서 설명하고, 분산 시스템의 기본 개념과 알고리즘을 설명한다. 다른 이론서와의 차이점은 기존 알고리즘을 개선한 여러 변형 알고리즘도 설명한다는 점이다. 최신 분산 시스템에서 사용되는 알고리즘이 궁금하다면 많은 도움이 될 것이다.
1부(1~7장)는 데이터베이스에 데이터를 저장하는 방식에 대해 설명한다. 데이터베이스에서 가장 중요한 B-트리 알고리즘을 설명하고 캐시 정책, 복구, 동시성 제어 등의 중요한 주제도 다룬다. 6장과 7장이 1부의 핵심이다. Lazy B-트리와 Bw-트리, LSM 트리, Wisckey 등의 변형된 B-트리를 설명한다.
2부(8~14장)는 분산 데이터베이스 시스템의 일관성을 유지하기 위해 사용되는 알고리즘에 대해 설명한다. 장애 감지, 리더 선출, 안티 엔트로피, 분산 트랜잭션, 합의 알고리즘 등을 다룬다. 분산 시스템은 여러 노드로 구성되기 때문에 이들 사이에는 서로의 문제를 감지하고, 작업을 나눠서 실행하고, 상태에 대한 합의를 하는 알고리즘이 필요하다.
각 주제를 더 알고 싶다면 각 장 끝에 정리된 문헌과 논문을 꼭 참고하길 바란다. 인터넷에서 관련 자료와 예제를 찾아보는 것도 많은 도움이 될 것이다.
소프트웨어를 설계하는 일은 어지간히 복잡한 일이 아니다. 규모가 작든 크든 어떤 언어를 사용할 것인지 또 주어진 예산 안에서 어떤 솔루션을 사용할 것인지 등에 대한 충분한 조사가 필요하다. 하지만 프로그램의 목적과 기능이 같아도 허용된 인프라 및 개발 기간 그리고 사용자 등 여러 상황에 따라 언어와 구조가 모두 완전히 바뀔 수 있다. 따라서 소프트웨어 설계는 해답이 없는 문제이며 최적화와 쉬운 유지보수를 이룰 수 있는 답을 찾아가는 힘든 모험이다. 하지만 해답이 없다고 해서 제각기 생각한 방식대로 설계해버리면 설계자 본인도 이해할 수 없는 무시무시한 결과물이 나올 것이다. 이런 경우 자신보다 더 오랜 시간 비슷한 문제에 대해 고민했던 다른 학자나 개발자들의 노하우와 해결책을 참고하는 것이 해답이다. 여태까지 아무도 생각하지 못한 엄청난 구조가 아닌 이상 보편적인 답은 반드시 있다. 디자인 패턴은 소프트웨어 설계 과정에서 자주 발생하는 문제와 의문들을 분류해 각 목적에 최적화된 코드 구조를 정립한 개념이자 해결책이다.
GoF(Gang of Four)가 제시한 디자인 패턴이라는 개념을 처음 접하면 그 목적과 의도를 파악하기가 힘들 수도 있다. 정작 가장 중요한 기반 알고리즘과 기술은 뒷전으로 한 불필요한 소리 같기도 하다. 또 수많은 소프트웨어 구조를 몇 가지 형태로 분류하는 것도 다소 무책임해 보인다. 하지만 디자인 패턴의 목적은 단순하다. 수많은 구조를 몇 가지 형태로 패턴화해 프로그램 간 재사용할 수 있는 코드를 작성하고 유지보수를 쉽게 하는 것이다. 누군가 맘대로 작성한 코드보다 특정 디자인 패턴을 기반으로 작성한 코드가 당연히 더 이해하기 쉽다. 해당 패턴만 숙지한다면 프로그램 구조를 빠르게 이해할 수 있다. 나아가 설계 문서에 들어갈 내용도 줄어들고 패턴에 대한 수많은 사용 예제 및 정보가 있으므로 유지보수 및 확장이 쉽다. 이처럼 장점만 있는 디자인 패턴을 마다할 이유가 전혀 없다. 물론 아주 간단한 프로그램까지 굳이 디자인 패턴을 적용하는 일은 낭비다. 지나친 추상화로 인해 프로그램의 규모에 비해 구조가 너무 복잡해지는 상황은 피해야 한다.
이 책은 GoF가 제시한 모든 디자인 패턴을 파이썬으로 작성하는 방법을 다룬다. 디자인 패턴을 이해하는 데 꼭 필요한 객체지향 개념 및 관련 프로그래밍 이론까지 겸비했다. 디자인 패턴은 언어에 종속적인 부분이 있기 때문에 해당 언어에 대한 충분한 이해는 필수다. 이제는 파이썬은 쓰이지 않는 분야를 찾아보기 힘들 정도로 꼭 필요한 언어가 됐기 때문에 개발자라면 파이썬 기반 디자인 패턴은 한번쯤은 숙지해야 한다. 더 나은 소프트웨어 설계와 생산성 높은 코드를 작성하는 데 이 책이 많은 도움이 되길 바란다.
풀스택 개발이란 쉽게 말해 프론트엔드와 백엔드를 넘나드는 개발을 일컫는다. 풀스택 개발자는 시스템 설계와 구축은 물론 실제 사용자까지 서비스와 관련된 모든 부분과 사람을 상대하는 직업이다. 특히 다양한 프레임워크가 끊임없이 쏟아져 나오고 개발 트렌드가 빠르게 변화하는 웹 프로그래밍 분야에서 풀스택 개발자는 막중한 책임과 임무를 지닌 직책이다. 안정되고 검증된 기존 기술을 고집하는 개발자가 있는 반면 트렌드에 따라 새로운 기술을 끊임없이 시도하는 개발자가 있다. 좋고 나쁨을 따질 수 없는 개발자의 성향이자 소속된 집단의 개발 철학과 방향성에 따라 다르다고 생각한다. 굳이 나누자면 이 책은 후자에 속하는 개발자에게 적합하다.
이 책은 Go 언어와 리액트 기반의 풀스택 웹 프로그래밍 가이드다. Go 언어는 2009년에 구글이 공개한 언어이고, 리액트는 2013년에 페이스북이 공개한 자바스크립트 기반의 프론트엔드 라이브러리다. 비교적 최신 기술로 구분되는 이 두 기술을 사용해 백엔드와 프론트엔드 영역을 명확히 구분해서 웹 서비스를 개발하는 방법을 소개한다. Go 언어와 리액트를 사용하지만 모든 프로그래밍 언어에서 공통적인 프로그래밍 개념을 설명하고 웹 서비스를 처음부터 함께 구현한다. 예제 코드를 직접 작성해보면 풀스택 개발의 의미와 단계를 직접 파악할 수 있을 것이다. 이미 숙련된 풀스택 개발자라면 기본 개념을 되새기고 새로운 기술을 접하는 기회가 될 것이고, 풀스택 개발을 공부 중인 독자라면 웹 서비스를 직접 완성해보는 값진 경험이 될 것이다. 다만 다른 프로그래밍 이론서와 Go 언어 입문서를 먼저 정독한 후 이 책을 볼 것을 권장한다. 각 주제와 예제 코드를 자세히 설명하기보다는 개념을 이해한다고 가정하고 키워드와 방향을 제시하기 때문이다. 따라서 이 책에서 끝나지 않고 각 주제를 더 깊이 있게 공부하기를 권한다. 특히 동시성 프로그래밍과 동형 프로그래밍은 어렵지만 흥미로운 주제다. 『Go 동시성 프로그래밍』(에이콘, 2019)과 『동형 자바스크립트 웹 개발』(에이콘, 2018) 같이 해당 주제를 집중적으로 다루는 다른 도서를 꼭 참고하기를 바란다. 끊임없는 공부와 연구가 풀스택 개발의 진정한 의미라고 확신한다.