Зачем Программисту Знать Алгоритмы?

Часто появляются статьи типа «нужны ли программистам алгоритмы», и все они имеют примерно один и тот же шаблон.

Автор статьи обычно пишет: «Я пишу сайты/скрипты в 1С уже N лет, и никогда не использовал алгоритмы или структуры данных.

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

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

Сама постановка такого вопроса в корне неверна.

Количество специальностей в отрасли постоянно растёт, и человек, пишущий сайты на .

net, будет заниматься совсем другими делами, чем человек, пишущий драйвера для датчиков на ARM-архитектуре под экзотическую ОС.

Давайте сначала определимся, что такое алгоритм.

Неофициально Кормен определяет алгоритм как четко определенную процедуру, которая принимает на вход одно или несколько значений и в результате возвращает одно или несколько значений.

Формально алгоритм определяется в различных моделях вычислений: операциях, которые можно выполнять на машине Тьюринга или с использованием лямбда-исчисления.

Таким образом, практически любой код, который что-то делает, является алгоритмом.

Оказывается, вопрос «нужны ли программисту алгоритмы» можно перевести как «нужно ли программисту уметь писать кодЭ» Правильный вопрос должен звучать примерно так: «Нужно ли программисту в отрасли X знать передовые алгоритмы и детали теории вычислений».

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

вроде не нужен.

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

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

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

Библиотеки? Рамки? Они устаревают, их интерфейсы меняются, все они написаны чаще всего на одном языке, который студенты могут никогда не использовать в отрасли.

Должны ли мы научить всех писать веб-сайты? Или научить всех писать ОС? Образование должно охватывать максимально широкую аудиторию и обеспечивать максимально широкий спектр навыков.

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

Написание кода — это просто необходимый инструмент, который используется для решения проблем.

Кто знает, какие навыки вам понадобятся в будущем? Таким образом, теория обучения является наиболее оптимальной с образовательной точки зрения.

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

Парадокс в том, что люди, задающие вопросы о необходимости алгоритмов, обычно обладают некоторыми знаниями в этой области.

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

Итак, вы абстрактный программист в вакууме, вы более десяти лет работаете над сборкой сайтов и решением простых однотипных задач для клиентов/компании.

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

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

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

Теория алгоритмов и анализа учит не только экзотическим алгоритмам и структурам данных в виде АВЛ и красно-черных деревьев.

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

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

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

Какую бы задачу вы ни решали — будь то простой веб-сайт с выборкой данных из базы данных или bash-скрипт на сервере, вы будете использовать те или иные структуры данных.

Как минимум примитивный массив, а скорее всего что-то более сложное.

Языки дают нам множество различных структур, многие из которых взаимозаменяемы.

Часто у нас есть несколько вариантов одного и того же абстрактного типа с разными реализациями.

Например, в C++ есть векторные и списочные структуры данных.

Чем они отличаются и каковы преимущества и недостатки использования того или другого? Как карта реализована в C++ и чем она отличается от multimap? Как список реализован в Python — через массив или связанный список и как с ним лучше всего работать? Почему не рекомендуется использовать ArrayList в C#, а вместо этого использовать List? Как реализован SortedDictionary и как он повлияет на выполнение программы, если использовать его вместо Dictionary? Как работает продолжение, когда его следует использовать и есть ли побочные эффекты при его использовании? Когда вы в последний раз использовали каррированные функции, которые есть почти во всех языках? Если вы думаете, что карта в C++ реализована как хеш-таблица, вы ошибаетесь.

Он реализован на красно-черных деревьях, а хеш-таблица реализована unordered_map. Отдельно стоит упомянуть динамическое программирование.

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

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

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

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

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

Во-вторых, различные инструменты и библиотеки часто нужно «настраивать» — сообщая им, какие алгоритмы, структуры данных и технологии использовать внутри.

Без базовых знаний придется либо идти читать ману, либо выбирать наугад. В-третьих, существует множество проблем, которые невозможно решить простым вызовом API библиотеки или фреймворка.

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

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

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

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

Со мной работал один программист с более чем десятилетним опытом.

Однажды нам понадобилась функция, которую используемая нами библиотека на тот момент не поддерживала: примитивный перенос текста в одном из визуальных компонентов.

Этот «программист» увидел, что стандартными средствами это сделать невозможно, и сразу заявил, что реализация такой функции невозможна.

Задачу решил стажер третьего курса с аналитическим мозгом, который за два часа написал простой алгоритм и внедрил его в нужный компонент. Мне достался по наследству еще один проект в виде сайта на .

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

После некоторого рефакторинга страница загрузилась почти мгновенно.

Может ли программист обойтись без знаний алгоритмов и теории анализа? Может быть, таких «программистов» много.

Программистами их можно было бы назвать с натяжкой.

Ко мне на собеседования приходит очень много программистов, имеющих десяти-пятнадцатилетний опыт работы и не особо понимающих, что и зачем они делают. У них есть своя ниша, они переходят из компании в компанию, не задерживаясь в ней больше года.

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

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

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

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

Чтобы использовать язык, на котором вы пишете, эффективно и в максимально возможной степени.

Принимать обоснованные и осмысленные решения о выборе библиотеки и технологий для решения проблемы.

Если ваша работа состоит в том, чтобы написать SQL-запрос и ввести команду в консоль, то хочу вас разочаровать: вы не программист, вы пользователь, вам действительно не нужны алгоритмы и тому подобное, и вы зря потратили свои силы.

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

Теги: #программирование #Алгоритмы #мысли вслух #программирование #Алгоритмы

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.