Мне пришла в голову идея, что было бы полезно делиться достаточно подробными впечатлениями о прочитанных книгах. Хотя я и пользуюсь GoodReads и Shelfari, но обзоры там делаю на английском и достаточно краткие. В качестве периода между обзорами выбран месяц, что дает мне возможность прочитать 2-4 книги, про которые стоило бы рассказать :-)
The Joy of Clojure: Thinking the Clojure Way
Я купил The Joy of Clojure: Thinking the Clojure Way (авторы Michael Fogus и Chris Houser) почти сразу после того, как она появилась на сайте Manning, и регулярно получал обновления для него. Но примерно месяц назад пришла полная версия книги (но без окончательной вычитки редактором и красивой верстки), и я сел за ее чтение в полном объеме. У этой книги имеется отдельный сайт на котором можно найти дополнительную информацию о книге, включая информацию о существующих скидках на предварительную версию (MEAP).
Хочется сразу отметить, что это не учебник по языку Clojure, и хотя в книге имеется отдельная глава с кратким (около 30 страниц) описанием основ языка, но все равно, для начала стоит прочитать одну из существующих книг: Practical Clojure или
Programming Clojure, или еще не выпущенную, но уже доступную через MEAP,
Clojure in Action.
Книга пытается рассказать о том, как "более правильно" программировать на Clojure с точки зрения стиля языка и функционального программирования, как лучше организовывать программы на Clojure. Сюда относятся использование "ленивых" структур данных, когда нужно и можно использовать макросы, как организовывать рекурсивное выполнение, как организованы различные структуры данных, когда их нужно и можно использовать, и т.п.
Также достаточно много места уделено вопросам производительности программ на Clojure — какие структуры данных лучше использовать в различных ситуациях, как можно улучшить производительность с помощью type hinting, использования "переходных" структур данных, "блочных" последовательностей и мемоизации.
Не обойден стороной и вопрос конкуррентного программирования на Clojure, и использование изменяемых данных в программах. Обсуждению этих вопросов посвящена 11-я глава книги, в которой обсуждается устройство изменяемых структур (refs/atoms/agents), когда их можно и нужно использовать, а также рассказывается про параллельное программирование на Clojure (futures, promises, локи и т.п.).
Кроме того, книга касается вопросов использования мультиметодов, протоколов и типов данных, введенных в Clojure 1.2, а также вопросов интеграции с JVM и Java. Но эти темы рассматриваются не настолько подробно, как остальные.
Вердикт: эту книжку рекомендуется прочитать всем, кто уже познакомился с языком, но хочет изучить некоторые темы более подробно и/или хочет научиться "более правильно" программировать на этом языке. Я лично нашел достаточно много интересного материала, который начал применять в своих проектах.
Lucene in Action, 2-е издание
Я давно собирался посмотреть на Lucene для своих проектов, слышал про книгу Lucene in Action, но было много жалоб на то, что эта книга уже устарела и неприменима для свежих версий Lucene. Недавно вышедшее второе издание Lucene in Action исправляет эту проблему.
Начинается книга (глава 1) с небольшого обзора Lucene и из чего она состоит, описываются основные этапы в жизненном цикле поиска — сбор документов, выделение информации, индексация, и сам поиск. Кроме того, в 1-й главе приведены небольшие, но законченные примеры того, как можно выполнять индексацию документов и затем использовать полученный индекс для поиска.
Первая часть книги (главы 2-6) посвящены подробному описанию того, как Lucene устроена, и как можно использовать ее возможности в приложениях. Глава 2 полностью посвящена вопросам индексации с описанием того, какие есть опции индексации, как они влияют на работу Lucene, включая производительность, как можно производить индексацию численных и временных (temporal) данных, как можно оптимизовывать и отлаживать процесс индексации.
Глава 3 описывает использование основных поисковых возможностей Lucene. Глава начинается с простого приложения, которое используется в качестве основы для остальных примеров. Сначала рассматривается использование IndexSearch, который используется для выполнения поиска, а затем уже рассматриваются основные виды запросов, реализованных в Lucene, и QueryParser.
Главы с 4-й по 6-ю посвящены "расширенным" темам, их можно пропустить при первом прочтении, если вам нужны только стандартные возможности Lucene. В 4-й главе описываются различные анализаторы текста, реализованные в Lucene и Nutch, а также показывается как можно реализовать новые анализаторы и/или расширять существующие. 5-я глава посвящена дополнительным возможностям поиска — запросам по нескольким полям и/или индексам, использовании векторов терминов (term vectors), сортировке результатов и т.п. А в 6-й главе рассказывается о том, как можно расширить возможности поиска путем реализации собственных методов сортировки, фильтров и "сборщиков" (collectors) документов.
Вторая часть книги (главы 7-11) рассказывает о том, как можно выделять текст с помощью библиотеки Tika (глава 7), какие существуют расширения для Lucene (главы 8-9), как можно использовать Lucene с языками, отличными от Java (глава 10), а 11-я глава рассматривает вопросы администрирования Lucene, и настройки производительности.
Третья часть книги полностью посвящена рассмотрению того, как Lucene применяется в реальных проектах (Kruge, SIREn, LinkedIn) и рассказывается про то, какие возможности Lucene они используют, как организован процесс индексации и поиска, какие расширения были добавлены для работы, и т.д.
Вердикт: Большое количество примеров и подробное описание как делают эту книгу очень привлекательной для людей, которые начинают использовать Lucene. После ее прочтения, можно возвращаться к ней для получения ответов на вопросы, которые не описываются в официальной документации.
Introduction to Algorithms
Эту книгу я уже читал много лет назад, в русском переводе (на русском она называется Алгоритмы. Построение и анализ), но некоторое время назад мне захотелось обновить теоретические основы, и поэтому я решил перечитать эту книгу. В руки мне попало 2-е издание, а спустя буквально месяц вышло уже третье издание Introduction to Algorithms, и я немного жалею, что не дождался его, поскольку там есть некоторые полезные темы.
Я не могу много написать об этой книге, иначе это будет ее пересказ :-) Лучше всего о ней говорит оглавление этой книги.
Это классический учебник по алгоритмам и подходам к их анализу. Книга начинается с основ анализа алгоритмов, и затем переходит к рассмотрению различных алгоритмов и структур данных (списки, деревья, хеш-таблицы, кучи и т.д.). Для каждой из рассматриваемых тем приводится анализ сложности алгоритма, рассматриваются возможные варианты реализации структур данных и т.п. Достаточно много места посвящено алгоритмам над графами. Кроме базовых структур данных и алгоритмов, в книге рассматриваются некоторые "сложные" темы — биноминальные кучи, b-trees и т.п. Почти сотню страниц книги занимают приложения, в которых описывается весь математический аппарат, необходимый для чтения этой книги —
теория множеств, основы теории вероятностей, и т.п.
Стоит также отметить, что на английском языке доступны видео-записи лекций по данному курсу которые читались в MIT (они также доступны через iTunesU).
Вердикт: всем программистам читать обязательно, можно использовать как справочник, но первые главы нужно прочитать обязательно.