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

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

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

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

Другое

Практика

Справочники

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