Скучная теория или полезный инструмент: зачем разработчику алгоритмы и структуры данных
Рассказывают джуны, синьоры и хайринг-менеджеры
«Алгоритмы служат базовыми элементами любой машинной программы», — говорил автор языка программирования Pascal Никлаус Вирт. Но среди разработчиков до сих пор бытует мнение, что разбираться в алгоритмах и структурах данных нужно только для того, чтобы удачно пройти техническое собеседование. В результате специалисты могут даже успешно решать задачи, но при этом не понимать, как работает их код, и не иметь возможности улучшить его качество.
В этом материале разбираем, как знание алгоритмов и структур данных влияет на реальную работу и что конкретно нужно знать джуниору, мидлу и синьору, чтобы получить оффер.
Каких знаний по алгоритмам ожидают компании и как их продемонстрировать
Знание алгоритмов и умение работать со структурами данных ожидают от разработчиков большинство компаний. Если это необходимо для проекта, то ожидания по знаниям примерно одинаковы как для джуниора, так и для синьор-позиции.
Это база, которую изучают в университете. Мы не ожидаем знаний экзотических структур данных, но обязательно должно быть понимание того, как работают базовые вещи на примере стандартных коллекций. Чтобы это проверить, мы даем небольшую практику с оценкой быстродействия различных подходов к решению простой алгоритмической задачи
Андрей Белоус, Senior Dev Lead в Luxoft
В компании Roosh свои ожидания по количеству правильных ответов от кандидатов изобразили следующим образом:
- джуниор: >50 %;
- мидл: >70 %;
- синьор: >90 %
На этапе технического собеседования эти знания обязательно проверяют. Инженеры используют их для понимания сложности ML-алгоритмов, процессинга данных и т. д.
В Luxoft отмечают, что на фронтенд-позицию в простых проектах знания алгоритмов менее важны и реже будут блокером. Для бэкэнд-позиций бывает по-разному: многое зависит и от бизнес-домена. Например, для проектов в сфере энергетики всегда проверяют эти знания в первую очередь, так как важно быстродействие при обработке больших объемов данных.
Неутешительная новость для тех, кто не интересуется алгоритмами и структурами данных: компании часто отказывают таким кандидатам.
В Roosh считают подобные знания мастхэвом: разработчик должен продемонстрировать профиль с Leetcode, профиль на Github с решенными задачами с Leetcode.
Если же вы только начинаете свой путь в разработке, то прохождение курсов и указание этого в резюме сможет сыграть вам в плюс:
«Плюсом это будет только для интерна. Если же кандидат с опытом 10 лет напишет, что год назад проходил курс по базовым структурам данных, то это скорее минус, потому что тогда непонятно, как он работал 9 лет до этого», — говорят в Luxoft.
О чем спрашивают на собеседованиях
Роман Аболмасов, Fullstack Developer и TechLead в SoftServe, говорит, что на собеседованиях обычно могут спросить об алгоритмах и структурах данных, начиная от сортировки пузырьком и деревьев — до просьбы оценить эффективность алгоритмов по временным и пространственным параметрам:
Также у вас могут спросить, где нужно реализовать определенный алгоритм или структуру данных или как можно оптимизировать существующий алгоритм для улучшения его производительности
Роман Аболмасов, Fullstack Developer и TechLead в SoftServe
Назар Конюшенко, Middle Unity Developer, говорит, что об алгоритмах на собеседованиях его почти не спрашивали:
Максимум, что могу вспомнить, — просили перечислить алгоритмы сортировки, которые я знаю (просто названия). По моему опыту в геймдеве, задачи, где требовались бы знания каких-то специфических алгоритмов, мне не попадались, а типичные — давно уже реализованы в стандартных библиотеках. О структурах данных спрашивают почти всегда: какие знаете, как работают «под капотом», в чем разница и т. д.
Назар Конюшенко, Middle Unity Developer
Анна Костырко, Junior Node.js Developer, говорит, что на собеседовании ей пригодились знания о сложности поиска по массиву и дереву.
Как алгоритмы и структуры данных помогают в работе
Роман Аболмасов вспоминает, что на одном из проектов, связанном с подсчетом плоскостей деталей для обработки, полалгоритмом обертки Грэхемаьзовался алгоритмом обертки Грэхема и методом Монте-Карло. Первый помог с вычислениями выпуклой оболочки множества точек в пространстве, а второй пригодился для моделирования сложных систем, которые трудно изучать аналитически. Его суть заключается в том, чтобы генерировать случайные входные данные для системы и вычислять выходные данные. Затем результаты вычислений агрегируются, и на основе статистики определяются вероятность, риски или другие параметры системы.
Самым сложным для понимания и работы синьор-разработчик считает рекурсивные алгоритмы. При их использовании важно определить, насколько глубоко может дойти рекурсия и как эффективно управлять памятью, чтобы избежать негативных последствий.
Назар Конюшенко, мидл-специалист, реализовывал алгоритм только раз — для собственного пет-проекта:
«Структуры данных используются отовсюду: и обычные списки, и хеш-таблицы, и словари, и стек».
Он говорит, что любой более или менее типичный алгоритм уже много раз описан в сети и реализован. Поэтому здесь сложность только в том, как его адаптировать под конкретную задачу. Со стандартными структурами данных надо запомнить названия (их достаточно много) и принцип работы:
«Бывает, помнишь, какой принцип работы структуры тебе нужен, но не можешь вспомнить, как она называется. Тогда просто гуглишь».
Джуниор-разработчица Анна Костырко добавляет, что уверенно подступается к Leetcode и по возможности решает там задачи. На стажировке были таски из Map и Set, но это не главное:
Знания об алгоритмах, структуре данных и умение решать такие задачи учат смотреть на кодинг немного с другой стороны. Это влияет на разработку на работе, даже без прямого использования. Приобретается привычка искать, как можно оптимизировать код, смотреть на несколько шагов вперед и глубже изучить язык программирования
Анна Костырко, джуниор-разработчица