А точно ли программистам не нужны алгоритмы?

16c95d10ce2b6f7b8cc27b904242e07b.jpegHidden text

Нужны

Алгоритмы, которые мы заслужили

Алгоритмы, которые мы заслужили

Предыстроия

Мне 21 год и я работаю программистом всего 4 года, за это время я побывал на 2–3 мелких проектах и 3–4 проектах крупных компаний, таких как: Luxoft (упокой его душу), Альфа, ОТП, ГПБ и др. Так же я часто прохожу собеседования и в другие компании, чтобы «держать себя в форме», собирать статистику и т. п. Прохожу собеседования, в том числе и в крупные финтехи и пока что не хочу туда идти. А почему, это тема для отдельной статьи.

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

Знакомство с математикой

Ещё со школы мы учим математику, физику, биологию и другие б̶е̶с̶п̶о̶л̶е̶з̶н̶ы̶е, как нам кажется, бесполезные предметы и даже после школы не все понимают, для чего всё это было нужно. Как часто вы слышали фразу «мне математика в жизни не нужна, калькулятор всегда под рукой»? С одной стороны, всё верно, калькулятор всегда под рукой, любую формулу или теорему тоже можно найти за 2 минуты. Но как эти аргументы могут оспорить мнение, что все эти предметы просто меняют мышление. Как человек знает, что колесо проще катить, чем тащить булыжник, так и я знаю что бинарный поиск быстрее\лучше, чем линейный. Хотя ни разу ни разу не тащил булыжник, не катил колесо и не писал алгоритм бинарного поиска в рабочем коде. Все эти алгоритмы реализованы в каждой второй библиотеке, и писать самостоятельно это практически никогда не нужно. Но как я пойму, что его тут вообще можно применить? Как я пойму, что он тут улучшит работу?

aaa30c27ca9aa6d2edfe5ecedf496c25.png

Я могу не помнить, как этот алгоритм написан, где он реализуется и т.д, но я знаю, что могу вспомнить что это такое только посидев в интернете пару минут, я знаю, что такой алгоритм существует, что он применим в той или иной задаче. Но как бы я узнал эту информацию, если бы не зашел на LeetCode\CodeWars\Codeforces (нужное подчеркнуть) и не провел бы там хотя бы 20 минут своего времени, даже просто смотря на топики задач?

Алгоритм не нужно учить, его нужно реализовать самостоятельно. Написать (можно даже с гайдами), с дебагом попробовать что-нибудь посмотреть внутри, поменять что-нибудь и понять что именно сломалось. Любая информация запоминается в разы лучше, если ёе записать\нарисовать\реализовать. Так и с алгоритмами, не нужно заходить на математические форумы и прошерстывая сотни страниц запоминать какой-либо алгоритм. Достаточно всего лишь зайти на любой сайт с алгоритмическими задачками открыть уровень Easy и решить 2–3 задачи на тот или иной алгоритм. Тут не идёт речь про алгоритмы уровня корневой оптимизации, которая помимо того, что просто специфична, но и абсолютна не реализуема в 99% задач в программировании. Бинарный поиск, сортировки, жадные алгоритмы и т.п. — наши лучшие друзья. После их реализации в голове появятся трейдоффы многих из них. Жадный алгоритм не всегда точно находит ответ, для бинарного поиска нужен отсортированный список и т.д.

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

Собеседования скатываются

Я очень часто прохожу собеседования и очень часто слышу вопрос про HashMap, про индексы в БД. Знаю как на них отвечают другие люди, и в большей части люди могут только пересказать выученное предложение с какого-нибудь сайта. Возможно такое влияние на статистику имеют выпускники IT курсов, но и прожжённые опытом программисты не всегда понимают каким образом бинарный поиск лучше линейного, или из-за какой структуры данных индекс вообще ускоряет работу. Они знают их сложность алгоритмов, знают, что алгоритм бинарного поиска применим на сортированном массиве (хотя это тоже не всегда), но не знают почему. И тогда становится непонятно, как такой работник сможет на глаз определить узкое место какого-нибудь процесса или хотя бы предложить использовать другой, более продуктивный вариант функции.

Тут опять может прозвучать аргумент «я же не реализую эти индексы, зачем мне знать какая там структура внутри? Мне сказали, что быстрее работает и это самое главное. А, как и почему это уже дело второстепенное». Всё верно, в современных реалиях программистам зачастую можно не знать как работает та или иная функция, но «экспертное» мнение обязательно должно быть в каждой команде. А что если такого человека нет у вас в команде? Тогда начинаются проблемы. Индексы вдруг начинают работать дольше потому, что никто не знает, что они замедляют операции вставки, поиск по списку начинает занимать секунды, если не десятки секунд и вся программа работает в разы медленнее только потому, что данных стало больше, а алгоритмы остались те же, т.к. никто не знает об существовании других или не знает куда их применить. Теперь ваш тестировщик вас постоянно пилит: «А почему теперь страница 2 минуты открывается?». Бесконечные созвоны, лживые оптимизации по типу «убрать лишний if из метода» и т. п. И все это продлится до того момента, как вас не уволят или не наймут человека с той самой «экспертизой». Так почему бы тогда не ждать человека, который вас может заменить, а самим стать человеком, который может заменить кого‑нибудь. Это так же может стать триггером для повышения зарплаты, так что никогда не поздно.

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

Заключение

В следующий раз, как я буду реализовывать очередную п̶е̶р̶е̶к̶л̶а̶д̶к̶у̶ ̶j̶s̶o̶n̶'̶о̶в бизнес-задачу, смогу подумать «а не могу ли я случайно улучшить этот процесс?»

© Habrahabr.ru