Читал в переводе издательства «Питер», к которому — что бывает редко с технической литературой на русском — нет вообще никаких претензий, кроме, конечно, выбора исходного материала.
Единственное хорошее, что я нашел в этой книге — это отсылки к другим, явно более качественным источникам. Исходя из предположения, что автор их тоже читал, сложно не задаваться вопросом — зачем и для кого была написана эта книга, процентов на 80% идущая внахлест с «Grokking Algorithms»? Сам автор в предисловии упоминает, что «аудитория этой книги — программисты среднего и высокого уровня», после чего он будет на протяжении 200 страниц рассказывать о том, как работает рекурсия и поиск вглубину, что такое дерево, как написать игру в крестики-нолики и всё такое прочее с 101-лекций. При этом, все эти темы, давно забытые обозначенной аудиторией, как правило, сопровождаются кодом, который проще написать с нуля, чем понять. Так фундаментально, например, у Копеца начинается модуль реализации алгоритма Дейкстры:
from future import annotations
from typing import TypeVar, List, Optional, Tuple, Dict
from dataclasses import dataclass
from mst import WeightedPath, print_weighted_path
from weighted_graph import WeightedGraph
from weighted_edge import WeightedEdge
from priority_queue import PriorityQueue
…и продолжается далее всей красотой декораторов и классов питона. На вопрос «почему?» автор не отвечает, но очевидно, что — потому что может.
При всём этом книга прикидывается дружеским справочником, который можно открыть с любого места и познакомиться с каким-нибудь новым алгоритмом. И в это же время код написан так, будто предполагается, что читатель готов не только с первой страницы держать в голове весь написанный автором код, но и где-то даже предвидеть, для каких задач этот код планируется использовать в последующих главах. Сам автор, конечно, знает, что через 50 страниц этот модуль будет импортироваться для другой задачи, а читателю остается только верить и ждать, что алгоритм (который можно реализавать в две простых функции) нужно расписывать простыней классов и зависимостей. Автор настолько увлечен идеей написания универсального кода, который можно переиспользовать для решения разных задач схожего подхода, что будто бы немного забывает рассказать про заявленную тему книги — задачи и алгоритмы.
В дополнение, в этой книге не было ни одной темы, по которой первая же выдача гугла не давала более грамотное и понятное объяснение. А в случае с некоторыми алгоритмами, иногда даже одна блок-схема из википедии давала лучшее объяснение, чем 20-страничная глава книги. Даже имея полное представление о раскрываемой автором теме иногда приходилось по паре минут буксовать над одним абзацем, только чтобы въехать в его авторские аналогии. До последней страницы книги не покидало ощущение того, что от самых первых набросков и до печати этот текст не касался ни одного человека имеющего хоть какое-нибудь отношение к образованию; и также, что автор явно любит писать свой код сильно больше, чем учить. Такой вот молодец.
2/10. Книга будет бесполезна/вредна для начинающих и предельно скучна для всех остальных.