me.neoascetic

Первый десяток прочитанных книг

Решил, вслед за afiskon’ом и darkus’ом, начать вести подобную рубрику и в своём бложике. Возможно, это побудит меня больше читать, потому как в последнее время из-за этого вашего интернета читаю всё меньше и меньше. Можно провести эксперимент. Начал я писать этот пост в конце июля. Первая книга из выборки была прочитана в конце мая. Сейчас я заканчиваю третью. Посмотрим, сколько времени понадобиться, чтобы закончить десяток и написать об этом пост.

Н. Вирт. Алгоритмы и структуры данных (2010)

Ну что тут можно сказать? Классика программирования. То, что я должен был прочесть, когда учился - но не прочёл. Базовые структуры данных, базовые алгоритмы, всё пропитано духом старой школы, несмотря на то, что в название присутствует фраза “Новая версия для Оберона”. Вспомнил и понастольгировал по синтаксису Паскаля. В анализе описываемых алгоритмов не хватает “забивания” на малые величины, нет никакого упоминания асимптотического анализа, “О” большого и “о” малого. Сделано это намеренно, чтобы не забивать голову первокурсникам, для которых книга и предназначена, или же связано с тем, что в то время асимптотический анализ применительно к изучению сложности алгоритмов ещё не применялся - я не понял. В книжке Кормена это начинают объяснять в первую очередь, поэтому, скорее всего, имеет место быть первый вариант.

В переводе позабавило использования термина “древесная структура” (от “древесина”, а не от “дерево”) для обозначения tree structures.

N. Ford. The Productive Programmer (2008)

Книжка, ставящая своей целью сделать программиста более продуктивным за счёт рассказа о различных утилитах, хитростях, подходах в разработке, облегчающим жизнь и упрощающим работу. Из ней мало что нового для себя я узнал. Многие даваемые советы отталкиваются от существовавших на момент написания софтин, приведены скриншоты с элементами меню, которые нужно выбрать, чтобы, собственно, жизнь стала легче, причём с альтернативами для разных платформ. Это не есть хорошо, потому что чтение становится сиюминутным и актуальным только на момент написания книги - о большинстве программ я либо не слышал, либо они уже являются устаревшими и имеют более удобные альтернативы. Из этой, практической части, я вынес для себя только возможность поиска элемента меню по мере написания его названия в OSX по нажатию Cmd+Shift+?. Как-то маловато.

Из теоретической части книги, где даются общие советы по разработке, упоминаются TDD, YAGNI, DSL… Но для себя я отметил лишь Закон Деметры (о котором уже, впрочем, знал), позабавила аллегория о бритье яков, а также призыв не становиться заложником авторитетов - в том смысле, что не стоит слепо следовать стандартам и “практикам”, если их нарушение в некоторых пунктах сделает жизнь удобней. Но последнее должно быть понятно здравомыслящему человеку и без всяких книжек.

В общем, если бы эта книжка попала ко мне лет пять назад, то принесла бы гораздо больше пользы, чем сейчас.

A. Aksyonoff. Introduction to Search with Sphinx (2011)

Название говорит само за себя. Содержимым книга недалеко ушла от документации, разве что описывает некоторые вещи более подробно. Некоторые главы целиком скопированы из официального блога (или же наоборот - скопированы из книги в блог). Понравилось описание примера как ускорить обновление индекса путём использования нескольких дельт индексов. С другой стороны, многих вещей - которые пришлось использовать прямо вчера! - в книге нет. Оно и неудивительно - на дворе 2014 год, в то время как книга датирована 2011. Как сам автор и призывает, за актуальной информацией лучше обратиться к документации. Но для того, чтобы поддержать автора столь хорошего поискового движка, книжку можно и приобрести.

А. Шилейко. Кибернетика без математики (1977)

Старая книжка, которую нашёл в очередном списке прочтённых книг у darkus’а. Помимо введения в основы кибернетики, классификации подсистем, из которых всякая кибернетическая машина состоит и выводов о том, что всё в нашем мире суть эти самые кибернетические машины, было весьма интересно прочесть о состоянии IT на заре её существования и предположений о том, как, исходя из представлений того времени, она будет развиваться. Например, следствием того что цена железки несравнимо дешевле цены софта делается вывод, что в будущем “решатели проблем” будут выполнены в железе, а не в софте.

Кроме этого, рассматривался вопрос искусственного интеллекта и в частности то, что является критерием его “разумности”. Дескать, если ИИ не может выиграть чемпиона по шахматам и если на основе этого мы делаем вывод, что данный ИИ - неразумен, значит и всякий, кто проиграет этому чемпиону является неразумным, а это абсолютное большинство человечества. Т. о. ИИ не обязательно нужно “блестать” в какой-то сфере, или даже во всех сферах, чтобы быть разумным. А ещё меня абсолютно очаровала идея создания автомата со способностью к примитивному обучению безо всяких микросхем и софта, а с помощью простейшей биметаллической пластины!

В общем, крайне советую к прочтению эту коротенькую, действительно с весьма малым количеством математики, книжку. Оно того стоит. Хотя бы для того, чтобы понять, что почему кибернетика - это наука о том, куда нужно стучать молотком.

К. Хорстман. Scala для нетерпеливых (2013)

С трудом осилил эту книжку - несмотря на то, что стремился приступить к тому, чтобы пощупать Scala, как можно быстрее. И дело не столько в стиле изложения материала, с ним вроде всё нормально, сколько в самой Scala, в (чрезмерном?) богатстве синтаксиса, в куче нюансов, которые, судя по всему, “не нужно пытаться понять, нужно просто запомнить”. Причём автор книги сам порой отмечает убогость некоторых конструкций: “синтаксис [опережающего определения] настолько неуклюж, что только мамочка сможет любить его”. Вот, например, так производится доступ ко второму элементу кортежа: c._2. Когда я увидел это, я сразу понял - что-то здесь не так. И оказался прав: какая-то монструозная система типов, хитрые неявные их преобразования друг в друга… Прав был tonsky, когда писал, что “центральная идея Скалы — боль, боль во всем”.

В общем, я возлагал на этот язык большие надежды, но он их не оправдал - на Scala писать мне будет просто неприятно. На очереди Clojure.

Б. Керниган, Д. Ритчи. Язык программирования Си (2001)

Классика от авторов языка, что тут ещё скажешь, которую прочесть раньше мне, увы, не удавалось. Описание ядра языка Си, довольно-таки простого и минималистичного, доступных простых и составных типов данных, нюансы привидения значений и адресной арифметики. В конце книжки - спецификация ANSI C89 и описание стандартной библиотеки. Библиотека, кстати, хоть и достаточно мала, но, на мой взгляд, чуточку избыточна (зачем на каждую функцию есть аналог с stdin/stdout?), а функции имеют имена, не отражающие их функциональность. Например, чем отличаются getc от getchar? А тем, что первой необходим формальный параметр в виде указателя на файл, а вторая берет символ из stdin! Весьма очевидно, ага. С другой стороны, за счёт малого размера библиотеки запомнить труда не составит.

Меня приятно удивило, что уже в ANSI C89 присутствует возможность использования переменного количества аргументов функции. Думаю, в новых версиях вкусняшек ещё больше!

В общем, книжка стоящая, без шелухи. Лично мне не хватило описания процесса сборки на низком уровне, а также описания хороших практик и утилит при работе над крупными проектами. Но оно и понятно - цель книги совсем не в этом, а практики и утилиты постоянно меняются.

E. Lehman, T. Leighton. Mathematics for Computer Science (2004)

Я уже упоминал об этой книжке. Точнее, это не совсем книжка, а материал к лекциям Принстонского университета, в тексте немало намёков на то, что непосредственно происходило на лекциях, а также юмор, полный отсылок ко внутренней кухне университета. Не смотря на это, основные математические концепции, используемые в computer science, рассказываются (и понимаются!) с лёгкостью, а примеры, на которых новые знания закрепляются, содержат немалое количество шуток. В общем, я чрезвычайно рекомендую книжку к прочтению, тем более что содержит она всего около трёхсот страниц и доступна для бесплатного скачивания. Но прочесть у меня заняло около двух месяцев со второго захода. Жуть, конечно, но к качеству содержимого это ни коим образом не относится.

Как выяснилось, видеолекции доступны онлайн, так что, вероятней всего, стоит совмещать чтение с их просмотром.

A. Avram, F. Marinescu. Domain-Driven Design Quickly (2006)

Domain Driven Design (проблемно-оринтированное проектирование) - набор правил, позволяющих принимать правильные проектные решения и ускорить процесс проектирования в незнакомой предметной области. Я захотел познакомиться с этим подходом поближе, потому что некоторые идеи мне показались весьма годными. Но читать автора подхода желания не было никакого, и вместо этого я нашёл небольшую брошюрку, созданную специально для цели популяризации DDD и доступной для бесплатного скачивания. Брошюрка действительно небольшая, около сотни страниц, и на ней с самого высокого уровня, с высоты птичьего полёта, рассматриваются основные идеи и паттерны DDD, хорошие практики при построении информационных систем в крупных доменах. Читается легко, все кажется логичным и понятным, но подробностей ждать не стоит. Впрочем, вряд ли их можно обнаружить и в книге автора подхода - её поругивают за большой объем воды и повторение одного и того же. Рекомендую к прочтению, не такая уж она и большая, в конце концов.

M. Fogus. The Joy of Clojure (2011)

Уже после прочтения книги я понял, что предпочёл бы ей Clojure for the brave and true. Не то что бы она плохая, нет - но стиль повествования по сравнению с альтернативой, которую я, впрочем, просмотрел только мельком, скучноват. Авторы рассказывают о многих вещах весьма поверхностно - поэтому для лучшего усвоения читать её рекомендую с официальной документацией под рукой.

Сильный упор сделан на то, в чём Кложура блистает - параллельные вычисления, но это и неудивительно. Возможно, я в первую очередь смотрел на неё как на язык общего пользования, для решения повседневных задач, а возможно потому, что со всей сложностью параллелизации вычислений ещё не сталкивался, поэтому глава не произвела на меня большого эффекта.

В последней главе, которая посвящена доказательству утверждения, что Clojure “меняет то, как вы думаете”, эта самая мантра повторяется в конце каждой секции. Раздражает. Главным образом потому, что вау-эффекта от всех этих макросов-шмакросов у меня не возникло - меня не покидала уверенность, что то же самое, в принципе, можно было бы и простыми функциями реализовать в каком-нибудь другом динамическом языке. Может быть, не так элегантно, впрочем.

В любом случае, Кложуру, в отличии от Скалы, у меня появилось желание пощупать. И я даже начал щупать - на 4clojure. Пожалуй, стоило предпочесть книжке связку 4clojure + официальная документация.

Д. Босуэлл, Т. Фаучер. Читаемый код, или Программирование как искусство (2012)

Эту книгу, за авторством разработчиков из Гугла, мне посоветовали, как выжимку основных идей, касаемых непосредственно кодирования, из “Совершенного кода” Макконнелла, к которой я приступал дважды, но так и не осилил. Выжимкой она и оказалась - состоит практически из всего того, что я успел прочесть в “Совершенном коде”. Книжка коротенькая, читается легко, с весёлыми картинками. Перевод немного суховат в том плане, что некоторые концепции переводятся дословно вместо общепринятых аббревиатур - “DRY” как “не повторяй себя”, “разработка, ориентированная на тестирование” вместо “TDD” и т. п. Судя по всему, книжка ориентирована на свежеиспечённых программистов, ещё и не слышавших об упомянутых терминах - лично я узнал из неё мало нового и, как и вторую книжку из этого списка, предпочёл бы увидеть её в начале карьеры.


Конец апреля. Практически одиннадцать месяцев на список из десяти не очень больших книжек. Как-то не очень густо - вероятней всего, связано с тем, что из-за смены работы и переезда я стал меньше времени проводить в общественном транспорте. Тем не менее, опыт считаю успешным хотя бы потому, что пост-таки вышел в свет и времени на этот небольшой список не понадобилось ещё больше. Есть идея перейти от таких списков к отдельным постам-обзорам, чтобы материал больше походил на конспект - для себя, т. к. конспектирование по памяти положительным образом сказывается на запоминании, и для читателей блога - в качестве саммари.