Привет! На связи Александра Стеценко, операционный директор и соавтор блога Wezom Академии. В моей сфере деятельности мне часто приходится общаться с начинающими айтишниками, которые находятся в самом начале своего пути в IT. И я заметила определенную закономерность: большинство из них уверены, что программирование — это гораздо сложнее, чем есть на самом деле…
Нет, я не хочу сказать, что программирование — это элементарно. Но и не так сложно, как кажется поначалу.
Яркий пример — алгоритмы в программировании. Многие помнят этот термин еще со школьного алгебраического курса. И я, пожалуй, не ошибусь, если скажу, что кроме самого названия в памяти почти ничего не осталось.
По сути, отсюда и определенный страх в изучении программирования в целом и алгоритмов в частности. Все кажется слишком сложным, непонятным и давно забытым.
А если я скажу, что все действительно достаточно просто? Что алгоритмы в программировании — это совсем не страшно и при правильном подходе вы овладеете ими и сможете использовать без особого труда?
Предлагаю на несколько минут отвлечься от того, что вы помните еще со школьного курса, и поговорить об алгоритмах именно в программировании. Следующая информация будет полезна тем, кто только начинает свой путь в IT и хочет узнать важную теорию перед практикой. Поэтому без лишних слов — начнем!
Понятие алгоритма изначально не связано с программированием в принципе. Термин в более современном толковании начал использоваться еще в 30-50-е годы ХХ века в работах Тюринга, Поста, Черча, Винера и Маркова. А вообще его ввел еще персидский ученый Аль-Хорезми около 825 нашей эры.
Среди начинающих в IT существует расхожее мнение, что программирование требует глубоких математических знаний. На самом деле, это не совсем так.
Зачастую решающий фактор — не математический склад ума, а алгоритмическое мышление. И как раз над ним следует активно работать, чтобы развиваться в программировании.
Поэтому на этом и сосредоточимся.
Алгоритм — набор последовательных инструкций, описывающих порядок поведения программы для достижения поставленной задачи.
Для лучшего понимания проведем аналогию с реальной жизнью. Ваша работа — это тоже определенный алгоритм:
1. Сели за рабочее место
2. Включили компьютер
3. Открыли браузер или рабочую программу
4. Начали работать
Отбросьте один из шагов своего рабочего алгоритма и вся система разрушится.
Так же и в программировании.
Алгоритм — это последовательность команд и действий, благодаря которым программа достигает определенных целей. А процесс программирования — это, по сути, запись последовательных алгоритмов.
Программирование — это набор иногда достаточно сложных алгоритмов и систем, которые могут очень запутать программиста-новичка. И здесь следует помнить, что любой, даже самый сложный запутанный алгоритм, строится на базовых алгоритмических структурах. А они достаточно просты:
Структура данных — это контейнер, информация в котором скомпонована определенным образом. Причем в зависимости от «компоновки» будет варьироваться и ее эффективность в разных операциях.
Алгоритмы и структуры данных — тесно связанные между собой понятия. На основе первых формируются вторые. Рассмотрим базовые структуры данных, используемые в программировании.
Это самая простая структура данных, в которой элементы расположены последовательно, а каждому из элементов присвоено числовое значение (индекс). Индекс соответствует позиции элемента внутри массива:
Существуют и более сложные массивы — многомерные. То есть массивы внутри других массивов.
В программировании работать с массивами достаточно удобно, используя простые команды:
Insert
— вставить элемент по указанному индексу;Get
— вернуть элемент по указанному индексу;Delete
— удалить элемент по указанному индексу;Size
— получить общее количество элементов в массиве.В массивах несложно находить нужные элементы, объединять и сортировать их, изменять порядок расположения.
Это абстрактный тип данных, в котором список элементов организован по принципу LIFO
Представьте, что вы складываете книги в стопку. Верхней всегда будет та, которую вы положили последней. А нижней — первая. По такому принципу работают и стеки:
Стеки позволяют использовать следующие команды:
Push
— вставляет элемент сверху;Pop
— возвращает верхний элемент после удаления;isEmpty
— возвращает true
, если стек пуст;Top
— возвращает верхний элемент без удаления из стека.В одном массиве может быть несколько стеков, с которыми можно взаимодействовать отдельно.
Тип сохранения элементов данных с последовательным их расположением. В отличие от стека, в очередях используется принцип FIFO
Основные операции с очередями:
Enqueue
— добавляет элемент в конец очереди;Dequeue
— удаляет элемент с конца очереди;isEmpty
— возвращает значение true
, если очередь пуста;Top
— возвращает первый элемент очереди.Очереди часто сравнивают именно со стеками, и эти структуры данных имеют много общего.
Это массивы, в которых каждый элемент служит отдельным объектом и построен на других элементах — данных и ссылках на следующий узел:
Основные операции со связанными списками:
InsertAtEnd
— вставляет указанный элемент в конец списка;InsertAtHead
— вставляет элемент в начало списка;Delete
— удаляет указанный элемент;DeleteAtHead
— удаляет первый элемент списка;Search
— возвращает указанный элемент;isEmpty
— возвращает True
, если связанный список пуст.Это наборы узлов, соединенных друг с другом в виде сетки, где один элемент может одновременно быть связан с большим количеством других:
Графы бывают ориентированными (с четко направленными ребрами) и неориентированными (с возможностью выполнять переход в обоих направлениях).
Дерево — это иерархическая структура данных с множеством разветвлений.
Самая простая аналогия — дерево навыков в видеоиграх:
Есть несколько типов деревьев данных: N-дерево, сбалансированное дерево, бинарное дерево, AVL-дерево и другие. Рекомендуем ознакомиться с ними более подробно, потому что сейчас древовидные структуры используются очень активно.
Хотим отдельно остановиться на префиксных деревьях. Это подвид древовидной структуры данных, которым вы пользуетесь ежедневно. Например, когда вы используете поиск в браузере, ищете слова в словаре или набираете текст на клавиатуре с Т9.
Например: вот так префиксное дерево хранит слова top, thus и their:
Это способ хранения данных, при котором каждому элементу в таблице присваивается неповторимый индекс. А каждый объект хранится в виде «ключ – значение». Используя нужные ключи, вы можете легко находить нужные значения:
Еще один важный термин, связанный с алгоритмами, — это функции.
Функция — это фрагмент программного кода, к которому можно обратиться из другого места программы. В большинстве случаев под функцией понимается определенный идентификатор, но некоторые языки программирования допускают и функции без имени.
Функции позволяют выборочно работать с разными элементами структуры данных, обращаясь к ним непосредственно. При этом примеры функций для разных языков программирования отличаются. Для наглядности можем привести несколько примеров:
JavaScript:
function max (a, b) { return a >= b ? a : b; }
С++:
void name(string text) { cout << text; }
Java:
public void name(String text) { System.out.println(text); }
Несмотря на визуальную разницу, технически работа функций в разных языках программирования практически идентична. Ее можно описать следующим образом:
Кстати, у языков программирования достаточно обширный список интегрированных функций, которыми вы можете пользоваться «как есть». Но опытные программисты могут создавать собственные функции, которые больше отвечают их задачам.
Программирование, работа с алгоритмами и базами данных происходит не в вакууме. Задача программиста — быть командным игроком, распределять задачи по проекту и оптимизировать рабочий процесс. Один из основных рабочих инструментов современного девелопера — система контроля версий Git.
Советуем ознакомиться с информацией по работе с Git на официальном сайте. Мы же перечислим основные этапы работы с Git в классическом рабочем процессе с примерами команд в терминале (например, в редакторе VS Code):
git branch
git checkout -b
<ваш код>
git add
git commit -m “useful info about the code I wrote”
git branch
git push origin
Чтобы активировать процесс, нажмите Pull request. Если вы не допустили ошибок, получите следующее сообщение:
Итак, итоги:
Можно привести много примеров, как алгоритмы упрощают процесс программирования и ускоряют выполнение кода. Назовем всего некоторые из возможностей, которые они открывают перед девелопером. А точнее — умение их использовать:
И здесь у опытных программистов может появиться возражение: все эти и другие задачи можно решить с помощью соответствующих фреймворков и библиотек. Можно, никто и не возражает. Вот только в таком случае подобные манипуляции способствуют существенному разрастанию кода. Как следствие — фризы страниц, длинная первая загрузка и невысокий FPS при скроллинге.
Понимание алгоритмов и структур данных очень важно для программиста. Пройдет время, появятся новые языки и сами принципы программирования. Но алгоритмы и структуры данных останутся. Потому что это базис.
И несмотря на то, что мы в Wezom Академии всегда выступаем за практику, в этом случае советуем будущим программистам подробнее ознакомиться именно с теорией, закрепить и расширить полученные сегодня знания.
Да, может. Более того, многие разработчики не ставят эти направления в приоритет. Но отсутствие базовых знаний и теории алгоритмов — это, во-первых, существенное замедление работы над проектами. А во-вторых, необходимость использовать инструменты, без которых можно обойтись, сэкономив время и силы.
А теперь хочу обратиться к тем, кто только начинает свой путь в программировании, и к уже имеющим определенный опыт работы. Как вы относитесь к использованию алгоритмов в работе? Изучаете ли это направление и используете знания на практике? Или оставили ли его «до лучших времен» и концентрируетесь на более практичных вещах? Нам интересно ваше мнение, поэтому приглашаем к обсуждению в комментариях.
В благословенные офисные времена, когда не было большой войны и коронавируса, люди гораздо больше общались…
Вот две истории из собственного опыта, с тех пор, когда только начинал делать свою карьеру…
«Ты же программист». За свою жизнь я много раз слышал эту фразу. От всех. Кто…
Отличные новости! Если вы пропустили, GitHub Copilot — это уже не отдельный продукт, а набор…
Несколько месяцев назад мы с командой Promodo (агентство инвестировало в продукт более $100 000) запустили…
Пару дней назад прочитал сообщение о том, что хорошие курсы могут стать альтернативой классическому образованию.…