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

Но достаточно ли такого аргумента в защиту изучения этой дисциплины?

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

00:00 О чем это видео
00:31 Зачем это изучать?
01:40 Методы разработки алгоритмов
02:08 #1. Метод грубой силы / полный перебор / исчерпывающий поиск (Brute-Force)
03:23 Что делать, когда не получается решить задачу?
03:38 #2. Разделяй и властвуй / метод декомпозиции (Divide and Conquer)
04:26 Уменьшай и властвуй (Decrease and Conquer)
04:53 Примеры задач
05:40 #3. Динамическое программирование (Dynamic Programming)
06:02 Сверху вниз / Мемоизация (Top-down / Memoization)
06:53 Снизу вверх / Табуляция (Bottom-up / Tabulation)
07:07 Примеры задач
07:34 #4. Жадный алгоритм (Greedy Algorithm)
09:01 Примеры задач
09:33 #5. Поиск с возвратом (Backtracking)
10:09 Метод ветвей и границ (Branch and Bound)
11:43 Примеры задач
11:56 #6. Локальный поиск (Local Search)
12:47 Суть
13:10 Примеры задач
13:34 #7. Преобразуй и властвуй / метод преобразования (Transform and Conquer)
14:01 Примеры задач
14:42 Анализ алгоритмов и другое
15:13 Так всё-таки зачем?
17:50 Итоги

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

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

Дальновидность

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

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

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

Подробней по вопросу пользы применения мы прошлись еще в новом видео.

Алгоритмы — всё же не самое главное

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

Есть куча как фундаментальных, так и узкоспециализированных вещей, которые могут оказаться более важными. Например, если наша цель стать Android-разработчиком — возможно для нас важнее будет разобраться в тонкостях Android API и различиях конкретных железок. Если наша цель стать специалистом в области анализа данных — возможно самым важным тогда окажется изучить некоторые разделы математики.

Дополнительную поправку дает сложность проектов, с которыми мы будем сталкиваться.

Об опасностях при изучении алгоритмов

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

Тратим поменьше сил и времени на негативные эмоции, касаемо качества материалов и пускаем это время на что-то более продуктивное. Выгодней будет считать все эти неточности фичами, а не багами: поиск этих неточностей будет дополнительной головоломкой, которая продвигает наше аналитическое мышление, помогает разобраться в предмете еще глубже и подкидывает идеи для блога (а иногда и для целого выступления на митапе/конференции).

Подборка материалов

Курсы

Дополнительные материалы

Computational Complexity

Divide and Conquer (and Combine)

Greedy Algorithm

Dynamic Programming

Backtracking

Branch and Bound

Transform and Conquer

Другое

Практика

Справочники

Этот пост будет обновляться в будущем
Добавляй в закладки, чтобы не потерять!