Заметка

Алгоритмы не нужны?

Тему “ненужности” алгоритмов я слышу постоянно всю свою карьеру. Мнения по вопросу полярны: от “алгоритмы не нужны нигде и никогда” до “алгоритмы - самое главное знание программиста”.

Моё мнение: алгоритмы однозначно нужны, вопрос только в глубине знания.

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

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

В некоторых областях (тот же ИИ) алгоритмы нужны однозначно. Там всё намного проще, потому что вопрос необходимости знаний в области алгоритмов даже не поднимается. А что же делать тем, кто работает в других областях? Нужны ли алгоритмы людям, которые каждый день красят кнопки и перекладывают JSON-ы?

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

Однажды я решил это исправить и пошёл на большой практический курс по алгоритмам от Яндекс.Практикума. Здесь я не буду описывать свой опыт прохождения курса и как-то его оценивать (если интересно - напишите в комментах, расскажу отдельно). Скажу только, что это обучение прекрасно легло на мой опыт разработки.

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

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

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

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

Мораль проста: учите алгоритмы, но до определённой степени глубины. Сохраняйте здравомыслие. И не пишите цикл в цикле в цикле 🙂