Прежде чем программа начнет выполнять то, что ты от нее хочешь, тебе нужно объяснить ей, как это сделать. Тебе нужно написать инструкцию, которая шаг за шагом объяснит компьютеру, что именно от него требуется и как этого достичь. Именно такие инструкции и называются алгоритмами.
Алгоритмы ‒ это базис, основа основ, фундамент любой разработки. Алгоритмы появились и использовались задолго до первых компьютеров и программ. Первые упоминания об алгоритмах встречаются аж в IX веке, настолько это фундаментальное понятие.
Умение оперировать алгоритмами ‒ незаменимый навык для любого программиста. Это то, что выводит качество кода на новый уровень. Это то, что помогает выучить любой язык программирования буквально за несколько недель. Ведь алгоритму неважно, на каком языке ты его описываешь.
Причем, когда я говорю «неважно» ‒ это действительно неважно. Алгоритм может быть написан обычным натуральным языком, как список инструкций, а может быть изображен в виде блок-схемы или псевдокода. Различные языки программирования лишь помогают нам оформить алгоритм в вид, удобный для понимания компьютером.
Один из ключевых навыков, которые я проверяю у кандидатов перед собеседованием ‒умение выявлять и составлять алгоритмы. Ведь именно этот навык и отличает хорошего программиста от «программиста». Хорошие новости ‒ этот навык легко нарабатывается, и сейчас я расскажу, как.
Есть несколько простых правил, которых стоит придерживаться при написании любого алгоритма.
1) Входные данные. Должен быть хотя бы один входной параметр. Если мы не дадим алгоритму данные для работы, то какой же результат мы ожидаем в итоге?
2) Выходные данные. Как ни странно, но должен быть хотя бы один выходной параметр. Иначе, если мы не получаем ничего на выходе, то зачем нам вообще нужен был алгоритм?
3) Простота. Алгоритм не должен быть перегружен или усложнен. Чем проще будут инструкции, тем проще будет их выполнить.
4) Масштабируемость. Алгоритм должен легко расширяться без внесения изменений в основную логику.
5) Конечность. Алгоритм должен завершиться после конечного числа шагов. В алгоритме не должно быть мест, которые позволили бы случиться бесконечному зацикливанию. Иначе в случае ошибки мы никогда не узнаем, что же пошло не так.
Зная эти простые правила, давайте попробуем немного отвлечься от программирования и написать алгоритм для приготовления черного чая. Звучит очень просто, но на практике далеко не все с этим справятся.
Начало
· Взять пакетик чая и стакан с кипятком.
· Опустить пакетик чая в стакан с кипятком.
· Подождать три минуты.
· Вытащить пакетик чая из стакана.
Конец
Итак, мы имеем: входные данные ‒ пакетик чая и стакан с кипятком, мы имеем выходные данные ‒ стакан с заваренным чаем. Алгоритм довольно простой, я уверен, даже ребенок справится с его выполнением, что уж говорить о компьютере. Этот алгоритм легко масштабируем ‒ нам нужно либо увеличить количество входных данных (использовать несколько пакетиков и несколько стаканов) либо увеличить размеры этих входных данных. Причем сам алгоритм редактировать при этом не придется. У этого алгоритма есть четкий конец. Нет такой ситуации, при которой мы будем бесконечно выполнять какие-то действия.
Теперь у нас есть основные знания о простых алгоритмах, а значит, мы можем вернуться обратно к программированию и продолжить наше путешествие в алгоритмизацию.
Каждый разработанный алгоритм должен быть, в первую очередь, эффективным. Эффективность алгоритма измеряется временем выполнения и используемой памятью. Алгоритм считается эффективным, если для его исполнения требуется минимальное время и используется как можно меньше памяти, причем, как и в жизни, за двумя этими зайцами одновременно не угнаться. Если нужно уменьшить время выполнения, придется жертвовать памятью, и наоборот. Как и во всем, здесь важен баланс, оптимальный компромисс между временем и памятью.
Окей, что такое алгоритмы и как они выглядят мы уже вроде бы поняли, а как же научиться их видеть и создавать? Каких-то секретов или лайфхаков тут нет. А жаль, иначе я бы наклепал вам статей в формате «5 лайфхаков алгоритмизации» или «Делай эти алгоритмы каждый день и уже через месяц ты будешь работать в Google». К сожалению, тут все довольно банально, и для понимания темы нам придется углубиться в ее изучение.
Начинать, как всегда, стоит с самых основ. Если у кого-то была информатика в школе или университете, наверное, вы сталкивались с тем, что в начале обучения вас обязательно знакомили с алгоритмами сортировки. Самый распространенный ‒сортировка пузырьковым методом. Пузырьковым он называется из-за схожести процесса с тем, как пузырьки поднимаются со дна на поверхность. Так и тут, более "крупные" числа "всплывают" в конец массива.
Не поленитесь, разберите этот алгоритм на пальцах. Поймите, как он работает. Поверьте, далеко не каждый сможет повторить его сходу из головы.
Советую разобрать такие алгоритмы, как алгоритм Евклида для нахождения НОД (наибольший общий делитель), числа Фибоначчи и бинарный поиск. Для лучшего усвоения и понимания визуализируйте алгоритмы. А если к визуализации добавить примерные данные, то понимание не составит никакого труда.
Естественно, все вышеперечисленные алгоритмы без постоянного применения на практике просто забудутся. Но цель у нас ‒ не выучить конкретно эти алгоритмы, а понять общую суть и концепцию. Для того, чтобы держать свой мозг в тонусе и оттачивать мастерство алгоритмизации, я советую зарегистрироваться на сервисе www.codewars.com или projecteuler.net.
Подводя итог, хотелось бы еще раз повторить, что зубрить и учить конкретные алгоритмы не имеет никакого смысла. Все эти подборки типа «100 алгоритмов, которые обязательно должен знать любой программист» просто кликбэйтят вас. Программист должен уметь мыслить алгоритмами. Должен уметь разбивать процесс на алгоритмы. А этого можно достичь только практикуясь и совершенствуясь!