Привіт! На зв’язку Олександра Стеценко, операційний директор та співавтор блогу 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; }
C++:
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 Академії завжди виступаємо за практику, та у цьому випадку радимо майбутнім програмістам детальніше ознайомитися саме з теорією, закріпити та розширити отримані сьогодні знання.
Так, може. Більше того, багато розробників не ставлять ці напрямки в пріоритет. Проте відсутність бодай базових знань та теорії алгоритмів — це, по-перше, суттєве уповільнення роботи над проєктами. А по-друге, необхідність використовувати інструменти, без яких можна було б обійтися, зекономивши час та сили.
А тепер хочу звернутися до тих, хто тільки починає свій шлях в програмуванні, та до тих, что уже має певний досвід роботи. Як ви ставитеся до використання алгоритмів в роботі? Вивчаєте цей напрямок і використовуєте знання на практиці? Чи залишили його «до кращих часів» і концентруєтеся на більш практичних речах? Нам цікава ваша думка, тому запрошуємо до обговорення в коментарях.
Блогер та розробник Джозеф Круз розповів, чому не варто писати ідеальний код та чому це…
Днями я завзято нила про щось ChatGPT (експериментую між сеансами з живим терапевтом). І от…
«Крутіть колесо, щоб отримати знижку до 50%!» «Натисніть тут, щоб відкрити таємничу пропозицію!» «Зареєструйтесь зараз,…
Дуже хочеться робити якісь десктопні апки. Сумую за часами коли всі програми були offline-first, і…
Надсилаючи криптовалюту, багато новачків ставлять запитання: як працюють комісії та чому вони відрізняються в різних…
Нова афера набирає обертів — ось детальний розбір того, як фальшиві потенційні роботодавці намагаються вкрасти…