Структура книги

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

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

Так, например, у меня была странная ситуация. Ко мне в группу по обучению попал человек – Юра. Он талантливый ученик и показывает большие успехи в своём вузе. О графах не только наслышан, но и успел обработать много задач в учебном заведении.

У меня он занимался разработкой игр на Unity. Позже его определил в команду, которая писала игру “Вычислитель”. Суть игры в том, что игроку загадывается число и на экран выводится набор выражений. Часть из них в результате даёт загаданное число. И игроку нужно на скорость решать выражения в уме и выбирать те, ответ на которые был ему загадан.

Я думаю вы уже понимаете, что одна из главных задач для программиста в этом проекте – это написание генератора выражений? То есть нам нужно получить некий модуль, которому остальные члены команды могли бы передать на вход:

  1. Необходимый ответ;
  2. Список разрешенных операторов;

Под списком операторов подразумевается набор из +, -, *, /. Модуль генерирует такое выражение, в котором использовались бы все возможные операторы из списка (в рандомном порядке), а результат которого совпадал бы с первым аргументом.

Например:

Вход:

  1. 25;
  2. +, +, -;

Выход:

  1. 35 – 20 + 5 + 5;

Я отдал эту задачу Юре. И, к сожалению, он не смог с ней справиться с первого захода. После чего мы сели с ним и устроили мозговой штурм. И мы, конечно, пришли к решению в поле теории графов.

Это решение у меня было в голове потому, что в начале обучения прочитал книгу по теории компиляции и интерпретации. Там я прочел познавательную главу о редукции и интерпретации выражений. Суть в том, что выражение разбивается на специальное дерево, по которому потом вычисляется.

Например, для выражения:

10 + 60 – 30 = 40;

Мы можем построить такое дерево:

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

Алгоритм работает просто:

  1. Ставит корнем дерева число, которое должно получится в итоге;
  2. Проводит ребро от этого числа до любого оператора из списка;
  3. Генерирует два случайных числа, применение оператора к которым даст нужный результат и проведёт два ребра от оператора до этих чисел;
  4. Если есть ещё операторы, то соответственно, ведёт ребра от этих чисел до операторов;

Потом это дерево переводится в читаемый человеком формат. Тут также встает интересующий нас вопрос на счёт приоритета операторов. Он также решаем, но уже не так интересен на данный момент.

Юра, хоть и мог спокойно запрограммировать это решение, и обучен всем необходимым знаниям, чтобы прийти к этому решению, сделать этого не мог.

Тем не менее существует необъятное количество тем, которые могут значительно облегчить жизнь и поднять на новый уровень профессиональных успехов, которые остаются за бортом из-за того, что вы не умеете применять их на практике.

Эта книга структурирована так из-за того, что каждая тема разбирается по несколько раз на различных примерах, открывая вам новые грани возможностей. Книга состоит из 10 проектов, каждый из которых состоит из шагов, которые проделываются для достижения цели. Подобрав очень интересные задания для вас, называя их “Задачами”, нам предстоит разобрать 100 примеров.

Книга не только про алгоритмы

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

Дело в том, что проблема Юры состояла не только в том, что он не спроецировал знания, приобретенные в вузе, на задачу. А в том, что он написал работающее решение, но с которым никто, кроме него, не мог работать.

Я знал, что это может произойти и сразу, как только мы пришли к тому, как будем решать эту задачу, я прислал ему набор интерфейсов (Те, что в C#), чтобы он мог их реализовать на основе того, что мы придумали.

А сам, опираясь на эти интерфейсы, раздал задачи другим разработчикам и написал свой код. Чтобы, как только Юра закончил, мы могли пройтись автоматизированными тестами по результатам работ, да и воткнуть в игру и поиграться всей командой.

Но, к сожалению, Юре это не удалось. Он не понимал идей, которые таятся за моей просьбой и, конечно, выкинул интерфейсы и сделал всё на статических методах, с которыми сложно было работать. В результате интеграция его генератора заняла гораздо больше времени, чем хотелось бы. Мне пришлось применить паттерн “Адаптер” и всё встало на свои места. Но кодовая база стала гораздо запутанней.

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

Разделы и задачи

Главный материал книги заключается в практических разделах. Раздел объединяет, сквозной темой, ряд глав. Каждый раздел – это новая задача, которую нам предстоит решить. Глава разбивает эту задачу на подзадачи и решает их. Иногда, в процессе решения, мы приходим к узкому месту, которое не можем решить в поле той главы, в которой находимся, именно тогда всё выливается в новую главу, которая вводит новые понятия и с помощью них решает проблему.

Название глав могут повторяться в разных разделах. Это нормально. Воспринимайте название главы как сокращение от полного названия, состоящего из номера тома, раздела и самого названия. Например: “Том 1. Вендинговый автомат. Функциональная композиция”.

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

Если вы нашли ошибку, пожалуйста выделите её и нажмите Ctrl+Enter.


Leave a Reply

Your email address will not be published. Required fields are marked *