Обложка статьи «Зачем программисту изучать алгоритмы»

Зачем программисту изучать алгоритмы

София Техажева

София Техажева, руководитель программ «Python-разработчик» и «Алгоритмы для разработчиков» в Яндекс.Практикуме

Понятие «алгоритм» довольно расплывчато — обычно оно обозначает последовательность действий для достижения конкретной цели. Например, есть алгоритм заваривания чая или алгоритм сборки шкафа из ИКЕА. Но в контексте программирования мы имеем в виду другие алгоритмы.

За всю историю компьютерных наук сложилось понимание, какие алгоритмы и структуры данных (способы их хранения) нужны для решения практических задач — так называемый джентльменский набор, который должен знать каждый разработчик. Например, сортировка: товары в магазине сортируют по стоимости или сроку годности, а рестораны — по удалённости или рейтингу. Хэш-таблицы помогают проверить корректность пароля и не хранить его на сайте в открытом виде, графы — находить кратчайший путь и хранить связи между пользователями в соцсетях.

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

Знание алгоритмов помогает найти эффективное решение задачи

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

Аналогично и в программировании. Задача разработчика — использовать наиболее эффективное решение. Для этого нужно учитывать скорость работы программы, объём потребляемой памяти, экономическую эффективность (насколько стоимость решения оправдана конечным результатом), простоту реализации, масштабируемость.

Пример №1. Нужно отсортировать n чисел в порядке возрастания. Задача кажется невероятно простой. Проходим n раз по массиву чисел. На первом шаге выбираем наименьшее число из всех и меняем его местами с самым первым элементом. Второй шаг: выбираем самое маленькое число в массиве, начиная со второй позиции, и меняем его местами со вторым элементом. Повторяем для остальных элементов. Так работает алгоритм сортировки выбором. Но при таком подходе получится O(n2) операций. Когда n станет неприлично большим, работать машина будет долго. Чтобы понимать, какой из алгоритмов будет оптимальным для ваших исходных данных, надо знать, как эти алгоритмы устроены. Скорее всего, вам примерно никогда не придётся реализовывать их вручную, но знание, как они работают, точно пригодится.

Пример №2. Вы научились писать код, но ничего не слышали об алгоритмах. Сделали на заказ видеосервис, дали на разработку год гарантии. Проект стал успешным, но уже при первых десяти тысячах пользователей всё начало ломаться: сервера быстро выходят из строя, а видео, по ощущениям пользователей, грузится миллион лет. Заказчик приходит к вам и просит решить проблему. Вы догадываетесь, что нужно использовать более эффективный алгоритм сжатия. Здесь и пригодится знание алгоритмов: понимая, как работает каждый из них, вы сможете подобрать наилучший вариант для решения задачи или даже написать собственный.

Наличие множества готовых библиотек не означает, что не нужно понимать, как они устроены. Фундаментальные знания помогают узнать, что внутри, как оно работает и почему решение А лучше Б в конкретной ситуации. Если вы разберётесь, как устроены классические алгоритмы, то сможете создавать собственные решения, комбинировать методы друг с другом, чтобы решать более сложные задачи.

Вы будете готовы к собеседованиям

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

Вас могут попросить реализовать алгоритм полностью или представить часть решения. Например, найти пропущенное число или дубликаты в целочисленном массиве от 1 до 100. При этом от вас будут ждать не одно решение, а сравнение нескольких возможных вариантов, основываясь на их вычислительной сложности. То есть не просто воспользоваться сортировкой подсчётом, но и объяснить, почему этот метод лучше сортировки пузырьком или сортировки вставками.

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

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

Это хороший способ тренировать мозг

Алгоритмы не обязательно использовать только в работе. Это один из вариантов «тренажёра для программистов». Сначала вы решаете задачи на Codeforces, а спустя некоторое время собираете команду для участия в соревнованиях по спортивному программированию.

Другой бонус: вы научитесь быстро и интуитивно решать обычные задачи. Главный инженер Apple и выпускник МТИ Али Альмоссави в своей книге «Bad Choices: How Algorithms Can Help You Think Smarter and Live Happier» рассказал, как использует знания компьютерных наук в обычной жизни.

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

Алгоритмы, как математика, приводят в порядок ум, учат выражать свои мысли и решать даже самые непростые задачи. Если захотите научиться решать задачи по программированию, отправляйтесь на Codeforces, TopCoder или LeetCode, где собраны упражнения для любого уровня подготовки. Попробовать решить типичные для алгоритмических собеседований задачи можно и в бесплатной части курса «Алгоритмы для разработчиков» в Яндекс.Практикуме.

Что почитать про алгоритмы?

Алгоритмы

Авторы: С. Дасгупта, Х. Пападимитриу, У. Вазирани

Книга больше подойдёт новичкам, так как помогает разобраться с основными методами построения и анализа алгоритмов. Она собрана из лекций преподавателей университетов Сан-Диего и Беркли. Эта книга ― хорошее начало для тех, кто ещё ничего не читал про алгоритмы.

Алгоритмы: построение и анализ

Авторы: Т. Кормен, Ч. Э. Лейзерсон, Р. Л. Ривест, К. Штайн

Это справочник и пособие по алгоритмам, которое пригодится и начинающим разработчикам, и сеньорам, и тимлидам. Описания даются на простом языке, главы независимы друг от друга, можно изучать в любом порядке и объёме.

Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих

Автор: А. Бхаргава

Думаете, алгоритмы это сложно? Книга убедит вас в обратном. В ней подробно разбирается каждый алгоритм: будет понятно даже ребёнку. Воспроизвести их на любом языке программирования не составит труда.

Программирование. Теоремы и задачи

Автор: А. Шень

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

Искусство программирования

Автор: Д. Кнут

«Если вы сможете прочесть весь этот труд, то вам определённо следует отправить мне резюме», — так об этой книге отзывался Билл Гейтс. Если вы считаете себя гением программирования, то начните с неё. «Искусство программирования» входит в 12 лучших книг физико-математических монографий XX столетия по версии журнала American Scientist.