Нужны ли знания алгоритмов программисту?
Вопрос — как изучать алгоритмы решения задач, — и вообще нужно ли их изучать программисту, — вовсе не риторический. Но прежде чем ответить на этот вопрос необходимо определиться с тем, а нужны ли вообще знания алгоритмов решения задач программисту?
С одной стороны программирование это творческий процесс, требующий на основе знаний о методах решения поставленной задачи проявить смекалку в их выборе или разработке нового метода, а с другой стороны программирование это инженерное дело, то есть ремесло, в котором очень важен практический опыт и умение грамотно составить код программы, чтобы затраты и результат были хотя бы сопоставимы. Поэтому ответ вопрос — нужны ли изучать алгоритмы решения задач программисту разработчику для формирования специфики мышления и разработки хороших программ знания алгоритмов решения задач программисту заключается в следующем.
Программирование это достаточно сложный процесс кодирования и отладки программы, которому всегда предшествует этап алгоритмизации решения поставленной задачи. Алгоритмы и программирование это два тесно связанных между собой элемента создания любой программы. Поэтому знания алгоритмов решения задач не навредят, а только помогут.
Именно понимание принципов работы алгоритмов и используемых структур данных формирует специфическое мышление программиста и позволяет создавать высокопроизводительные и качественные программы.
Если Вы хотите быть ремесленником, то нужны только знания простейших алгоритмов решения задач, но надо научиться хорошо использовать те средства программирования, которые уже созданы. Можно ограничиться знанием базовых алгоритмических структур.
Если Вы хотите быть творцом в программировании, то знания алгоритмов решения задач нужны обязательно, чтобы создавать свои собственные программные продукты, отличающиеся оригинальностью. Для таких программистов вопрос «Как изучать алгоритмы» жизненно важный вопрос.
Мои рекомендации – надо начинать с ремесла, постепенно приближаясь к творческому процессу. То есть на начальном этапе освоить программирование, а в дальнейшем осваивать те алгоритмы, которые нужны для решения поставленной задачи. Тогда и алгоритмы и программирование войдут в жизнь как само собой разумеющееся. Далее мы этот тезис попытаемся обосновать и предложить особый подход к освоению алгоритмом с помощью встроенных средств среды программирования.
Но что важно уже на начальном этапе программирования, так это знание базовых алгоритмических структур и их программную реализацию. Это связано с тем, что в современных языках программирования используется всего три оператора — присваивания, условный оператор и оператор цикла, реализующие три базовых алгоритмических структуры — последовательная, ветвления и повторения. Изучать эти алгоритмы решения задач надо глубоко, так чтобы знать их работу хорошо, потому что на их основе можно создать любую программу любой сложности.

Анализ рекомендаций, опубликованных в интернете, по вопросу нужны ли знания алгоритмов решения задач и вообще нужно ли их изучать их программисту, показывает, что мнения экспертов разделились примерно поровну. Наиболее распространенными аргументами в пользу изучения алгоритмов являются:
- знания существующих алгоритмов решения задач необходимо, чтобы пройти собеседование, но не во всех фирмах это практикуется, поэтому можно ориентироваться на будущую работу в выбранной фирме;
- знания алгоритмов решения задач необходимы, если программист будет участвовать в разработке алгоритмов решения поставленных задач, когда необходимо выбрать наиболее подходящую структуру данных для определенной задачи и предсказать как будет вести себя программа в обычных и исключительных ситуациях;
- самое главное, что знания алгоритмов формирует специфическое мышление начинающего программиста, который с самого начала учится создавать компактные эффективные решения с выбором и созданием наиболее оптимального алгоритма, соответствующего существу поставленной задачи.
Но изучение алгоритмов это очень сложная задача. Поэтому там, где это возможно, надо обойти этот процесс. Знания алгоритмов решения задач не требуется в следующих случаях:
- когда можно написать программу, используя множество существующих программных средств, таких как сортировка массивов самыми различными способами(метод sort() есть во всех библиотеках);
- когда, имеется возможность встроенными средствами языка программирования (отладчик, оптимизатор и т.п.) определить какой из существующих методов работает лучше и где в программе появляются проблемы с быстродействием, использованием памяти и т.п.
В обоих этих случаях надо хорошо знать платформу(среду программирования) и умело использовать ее возможности.
Резюмируя приведенные доводы, можно сказать – каждый по-своему прав. Любая точка зрения имеет право на существование.
Основные подходы к изучению алгоритмов программистами
Анализ рекомендаций по методике изучения алгоритмов решения задач не математиками, а программистами показал, что их настолько много, что не всегда можно применить все. Общим является то, что изучение алгоритмов это сложное мероприятие и требует очень ответственного подхода. Поскольку алгоритмы имеют под собой математическую основу, то для их освоения следует обладать прочными знаниями математики и очень желательно(но не обязательно) иметь алгоритмическое мышление.
Примечание. Для более эффективного усвоения изучаемого материала познакомьтесь с методикой и стилем познания.
Сущность основных рекомендаций сводится в следующему:
- изучать алгоритмы решения задач лучше всего по книжкам, но с реальными задачами, а не просто читать про алгоритмы и не использовать их, они быстро забудутся, а ещё интереснее пытаться модифицировать существующий алгоритм и разработать подобный алгоритм самостоятельно;
- в процессе изучения теории алгоритмов важно абстрагироваться от инструментария, «забыть» о языках программирования; недаром лучшие книги по алгоритмам содержат в себе примеры «программ», реализованных на псевдоязыках, так называемом псевдокоде, что позволяет не задумываться о реализации и тонкостях языка программирования и сконцентрироваться на логике;
- для начала нужно освоить теоретический фундамент: основные структуры данных, их свойства и методы работы с ними, анализ и сложность алгоритмов, их основные типы и классы, не надо заучивать наизусть все виды сортировок или мудрёных деревьев — это вряд ли возможно и абсолютно бесполезно;
- после изучения теоретического материала обязательно нужно научиться применять эти знания, используя для этого специализированные ресурсы типа HackerRank, в которых рассматриваются алгоритмы разного уровня сложности, начиная с самого базового, и затрагивающие много разных тем, или свои собственные задачи, но главное для решения любых задач недостаточно знать какой-то базовый алгоритм, нужно уметь приспособить его к конкретной ситуации, модифицировать, совместить с другими подходами;
- не стоит ориентироваться исключительно на теорию: после изучения каждого алгоритма старайтесь реализовывать его, находить ему применение для какой-либо первой пришедшей в голову задачи и главное, конечно,понимание теории алгоритмов и структур данных поможет вам быстрее находить решения многих повседневных задач, правильно оценивать формальную корректность программ и принципиальную достижимость желаемого результата, не писать код, который тормозит на ровном месте, более глубоко понимать, как работают базы данных и тому подобное;
- на начальном этапе программирования вообще не рекомендуется углубляться в алгоритмы решения задач и изучать их, потому что это сложная область computer science, и изучать ее без должной подготовки непросто;
- — если Вы хотите что-то понимать в алгоритмах, то Вам поможет учебная литература, например, книга «Грокаем алгоритмы», если знания нужны для подготовки к собеседованию, то полезно повторить основные понятия и алгоритмы и поупражняться в их использовании. Для тренировки решения алгоритмических задач на любом из языков программирования есть специализированные сервисы: HackerRank, Codewars и LeetCode. Используя их возможности надо научиться решать задачи среднего уровня и выше;
- если Вы хотите лучше решать поставленные задачи, то надо четко определить, алгоритмы из какой области знаний нужно изучить, в первую очередь, обращайте внимание на книги с алгоритмами на вашем языке программирования Python, Java и C, C++, С# и т.п.
Вот таковы рекомендации программисту по изучению алгоритмов решения задач, которые можно встретить в интернете. Лично я со всеми согласен, но по каждому можно дискуссировать. Изучение алгоритмов это очень трудоемкий процесс. Поэтому надо не алгоритмы изучать ради алгоритмов, а решать задачи, выбирая или создавая наилучшие алгоритмы. На пути познания алгоритмов часто встречаются трудности и барьеры, особенно в понимании алгоритма решения задачи. Преодолевать их необходимо итерационным подходом, постепенно преодолевая ступор. Алгоритмы и программирование взаимосвязаны и их отделить друг от друга не всегда возможно.
Один мой уважаемый учитель говорил мне — если не понимаешь, то учи наизусть, понимание со временем приходит. Знания сами по себе не приходят никогда, а добываются кропотливым трудом, а понимание приходит иногда само собой. Книга и карандаш — вот два главных инструмента при изучении алгоритмов решения задач на ЭВМ. Самый тупой карандаш острее самой острой памяти. Если применить к этому правилу алгоритмы и программирование, то алгоритмы это понимание, а программирование — это знания и умения.
Алгоритм аутентификации по клавиатурному почерку
Для примера ответа на вопрос, как изучать алгоритмы решения задач самостоятельно, рассмотрим задачу аутентификации по клавиатурному почерку. Для изучения алгоритма решения поставленной задачи сначала определяемся с источниками информации. Их обычно много. Все просмотреть и тем более изучить не возможно. Поэтому доверимся поисковым системам, в которых представление в запросе выполняется по релевантности. Анализируя представленные источники информации выбираем статью «Файсханов И.Ф. — Аутентификация пользователей при помощи устойчивого клавиатурного почерка со свободной выборкой текста // Кибернетика и программирование. – 2018. – № 3. – С. 72 — 86.».
Далее изучение алгоритма сводится к усвоению последовательности математических операций по решению поставленной задачи.
Традиционно ограничение доступа к информации осуществляется по логину и паролю, поэтому аутентификация по клавиатурному почерку строится на основе возможности наблюдать за параметрами ввода логина и пароля, характерными для пользователя.
Основными параметрами, характеризуемыми процесс ввода пары логин-пароль, являются время нажатия клавиши и интервал времени между нажатием очередной клавиши и отпусканием предыдущей клавиши и их статистические характеристики.
Описание алгоритма аутентификации по клавиатурному почерку далее представлена в виде трех изображений с текстовыми пояснениями. Изучение алгоритма заключается в разборе представленных математических выражений, их сущности, Процесс освоения надо доводить до понимания. При необходимости следует обращаться к дополнительным источника за разъяснениями терминологии и понятий.

Далее описывается процесс вычисления статистических характеристик клавиатурного почерка.

Следующий фрагмент алгоритма поясняет формирования вектора измерений параметров.

В сформированный вектор входных параметров включаются не только величины, отражающие особенности клавиатурного почерка пользователя, но и сама ключевая фраза, а именно ASCII коды нажатых клавиш; что позволяет еще более повысить надежность работы системы в режиме идентификации пользователя.
Процесс аутентификации подразумевает два режима работы — обучение и идентификацию.
На этапе обучения пользователь вводит некоторое число раз предлагаемые ему тестовые фразы(логин и пароль). При этом рассчитываются и запоминаются эталонные характеристики данного пользователя.
На этапе идентификации рассчитанные оценки сравниваются с эталонными, на основании чего делается вывод о совпадении или несовпадении параметров клавиатурного почерка.
Пример программной реализации данного алгоритма и решения возникающих проблем представлен в статье «Программное обеспечение аутентификации по клавиатурному почерку«.
Использование среды программирования для изучения алгоритмов
Итак, как говорилось ранее, в программировании целесообразно начинать с инженерного подхода то есть с ремесла. Выбрать, изучить основы одного из языков программирования, хорошо освоить среду программирования и ее возможности по отладке программ и их оптимизации. Далее следует постепенно усложнять решаемые задачи, приближаясь к творческому процессу, основанному на алгоритмическом подходе.
При этом с одной стороны надо изучать алгоритмы только интересующей области знаний(работы, профессии), с другой — надо научиться разбирать и анализировать существующие алгоритмы, не смотря на то, что они реализованы во многих программах. Более того именно существующие программы могут помочь в освоении запрограммированных алгоритмов. Далее рассмотрим как изучать алгоритмы самостоятельно с использование среды программирования.
Для этого необходимо взять любую программу и повыполнять ее в пошаговом режиме, наблюдая за изменениями переменных, так чтобы понять, как работает запрограммированный алгоритм. Одновременно можно запоминать и приемы программирования. И тогда станет ясно, что алгоритмы и программирование это единый процесс для профессионала.
Для примера рассмотрим методику изучения алгоритма пузырьковой сортировки элементов массива на языке Pascal.
Находим программу пузырьковой сортировки массива. Создаем проект консольного типа. Вставляем в него текст программы. Если имеются ошибки, в процессе отладки программы устраняем их.

Когда программа выполняется, расставляем точки останова в местах с которых будем контролировать значения переменных и элементов сортируемого массива. Запускаем программу. Выполнение остановится на первой контрольной точке. Далее выполнение осуществляется по шагам, путем нажатия клавиши F8.
Нулевая итерация внутреннего цикла (i=1, j=1) заключается в выборе первого элемента массива и сравнении его со вторым элементов. Так как результат “ложный”, то ничего не делается.
Первая итерация внутреннего цикла – сравнивается второй элемент с третьим. Сравнение “истина”. Запоминается больший элемент в переменной k=246. Затем меньший элемент 39 записывается на предыдущее место большего. В следующем операторе значение большего элемента записывается на предыдущее место второго элемента. Произошла перестановка второго и третьего элементов. Больший элемент(камень) опустился на одну позицию вниз, меньший элемент(пузырек) поднялся на позицию вверх. Первые три итерации внутреннего цикла показаны на рисунках ниже.

Вторая итерация внутреннего цикла – сравнивается третий элемент с четвертым. Сравнение “истина”. Запоминается больший элемент в переменной k=246. Затем меньший элемент 245 записывается на предыдущее место большего. В следующем операторе значение большего элемента записывается на предыдущее место третьего элемента. Произошла перестановка третего и четвертого элементов. Больший элемент(камень) опустился на одну позицию вниз, меньший элемент(пузырек) поднялся на позицию вверх.

Третья итерация внутреннего цикла – сравнивается четвертый элемент с пятым. Сравнение “истина”. Запоминается больший элемент в переменной k=246. Затем меньший элемент 26 записывается на предыдущее место большего. В следующем операторе значение большего элемента записывается на предыдущее место четвертого элемента. Произошла перестановка четвертого и пятого элементов. Больший элемент(камень) опустился на одну позицию вниз, меньший элемент(пузырек) поднялся на одну позицию вверх.

И так повторяется столько раз, каков размер массива. Для рассматриваемого примера 10 раз. При этом самый большой элемент окажется в самом низу.
Затем вся эта процедура повторяется еще десять раз. В результате в консоль выводится отсортированный массив.
Таким образом, наблюдая за изменениями переменных при выполнении каждого отдельного оператора, познается алгоритм сортировки. Усвоив простейший алгоритм можно попытаться составить программу, в которой сортировка выполняется не с начала, с конца массива. В этом случае при первом десятикратном повторе самый маленький элемент будет подниматься в верх.
Далее аналогично можно рассмотреть работу более совершенных алгоритмов сортировки. Метод быстрой сортировки Хоара и другие. Что касается сложных программ, то здесь нужен опыт и умение применит данный подход к фрагментам программы, а не к программе в целом.
Как изучать алгоритмы решения задач на онлайн курсах
Как бы там не было, но самостоятельное изучение алгоритмов это трудоемкий и достаточно длительный процесс. По настоящему алгоритмы надо изучать целенаправленно, например, на онлайн курсах под руководством профессионалов.
Если самостоятельно трудно поддается изучение алгоритмов программирования, то можно воспользоваться специальными курсами. Например, на курсах «Алгоритмы и структуры данных» компании OTUS.RU Вы сможете расширить свой кругозор и получить опыт реализации классических алгоритмов, который поможет Вам при создании собственных алгоритмов для решения задач различного назначения. В программу курсов входят самые известные прикладные алгоритмы, знание которых, как правило, требуется для программиста.
Именно понимание принципов работы алгоритмов и структур данных позволяет повысить производительность программ и улучшить качество кода.
Хорошо известная команда beONmax подготовила набор из 30 курсов, которые выйдут (или уже вышли) на beONmax в 2021 году.
Сточки зрения изучения алгоритмов и структур данных следует обратить внимание на курс от beONmax «Алгоритмы и структуры данных от А до Я«. Это достаточно полное руководство по алгоритмам и структурам данных. Курс практический с домашними заданиями и разбором решений. Присоединяйтесь.
С полным перечнем курсов компании beONmax можно познакомиться, перейдя по ссылке.
Заключение
Алгоритмы и программирование сильно взаимосвязаны и взаимообусловлены. Знания алгоритмов решения задач начинающему программисту не очень нужны, но не помешают ему в освоении языков программирования и приобретении опыта решения задач на ЭВМ.
Знания алгоритмов решения задач профессиональному программисту необходимы, как воздух, чтобы не изобретать велосипед, а создавать собственные инновационные программные продукты и в полную силу использовать возможности изученных языков программирования.
Вопрос — как изучать алгоритмы решения задач программисту лучше, — самостоятельно или на онлайн курсах под руководством профессионалов в специализированных учебных центрах?
Ответ — освоение алгоритмов решения задач возможно различными способами – чтение книг, тренинги в специализированных сервисах и разбор существующих программ в отладочных режимах среды программирования.
Изучение запрограммированных алгоритмом позволяет также приобретать опыт применения используемых профессионалами приемов программирования.
Вот таковы краткие рекомендации. Успехов всем в этом трудном деле.
Можно ли зная результат выполнения программы раскрыть уровень абстракции по формальным признакам. Например, условно: есть машина которая делает шарики, условно. Можно ли исследуя вкус, запах, цвет шарика понять, хотя бы примерно, что именно происходит в машине? Пожалуйста, ответь.
Вопрос, конечно, интересный. По результатам выполнения программы по формальным признакам раскрыть уровень абстракции вряд ли возможно.