Обложка: Стоит почитать: обзор книги Чарлза Уэзерелла «Этюды для программистов»

Стоит почитать: обзор книги Чарлза Уэзерелла «Этюды для программистов»

Роман Зайруллин

Роман Зайруллин

Backend-разработчик в ASODesk, автор книги «Legacy Software. Как заставить чужой код работать?»

Сразу исправлюсь и скажу честно: читать эту книгу бесполезно. Её стоит именно прорешать, все 23 представленные в ней задачи.

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

Уэзерелл, подбирая задачи, использовал другой принцип.

Пусть сами задачи не очень сложные и изначально рассчитаны на студентов технических специальностей, их почти невозможно сесть и начать решать в «лоб», кроме, возможно, самой первой — придётся подумать, выделить параметры, определить подзадачи и придумать, как описанные в условии процессы и явления можно выразить понятно для компьютера.

Иными словами, эти задачи-упражнения подобранны специально для того, чтобы полировать навыки решения прикладных, «настоящих» задач, с которыми сталкиваются программисты в своей работе. То есть навыки, которые отделяют программиста-олимпиадника из анекдотов от практикующего специалиста. Отсюда и название — «Этюды».

«Этюды для программистов» начинаются с довольно простых классических задач: «Игра Жизнь» и раскрашивание карты, и они показывают основное направление остальных задач — задачи на моделирование с нечётким результатом, и задачи, где нужно перенести условие задачи в какую-то промежуточную модель, с помощью которой задача разрешается на компьютере относительно просто.

Например, для одной из задач требуется описать экономическую симуляцию. И хоть параметры симуляции заданы в условии, первым делом придётся провести несколько «раундов торгов» вручную на бумажке, поковыряться с таблицами. Затем перед вами встанет ряд сугубо программистских вопросов — а как определить действия участников симуляции? Каким образом организовать следования правилам симуляции? Прямых указаний в условии на это нет. Но если вы смогли представить действия игроков (участников симуляции), как функции взаимодействия, и выделили их параметры и аргументы, то вы заметите, что их общность позволяет… А вот тут я остановлюсь, чтобы не заспойлерить самую интересную часть в поиске решения.

И такое происходит буквально с каждой задачей. Постепенно кажущаяся неполнота условий, и местами полная оторванность от «компьютерности», приведут вас к важной мысли: компьютеры хороши для решения слабо сформулированных задач, например, для проверки гипотез без чёткого представления об ожидаемом результате.

Но самое важное, эти задачи помогают сформировать навыки разбора задач: построение модели, выделение параметров и так далее.

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

Для того, чтобы такой перенос состоялся, специалист должен научиться переносить свои навыки и опыт, который он получил от решения учебных задач, на задачи реальные. И это именно то, что делает «Этюды для программистов» одним из сильнейших задачников.