Рубріки: Основи

Вирішує не математичний склад розуму: що потрібно знати, щоб почати програмувати

Олександра Стеценко

Привіт! На зв’язку Олександра Стеценко, операційний директор та співавтор блогу Wezom Академії. За сферою діяльності мені часто доводиться спілкуватися з айтівцями-початківцями, які знаходяться на самому початку свого шляху в IT. І я помітила певну закономірність: більшість з них впевнені, що програмування — це набагато складніше, ніж є насправді… 

Ні, я не хочу сказати, що програмування — це елементарно. Але й не так складно, як спочатку здається.

Яскравий приклад — алгоритми в програмуванні. Багато хто памʼятає цей термін ще з шкільного курсу алгебри. І я, мабуть, не помилюся, якщо скажу, що крім самої назви в памʼяті не залишилося майже нічого.

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

А якщо я скажу, що все насправді досить просто, навіть элементарно? Що алгоритми у програмуванні — це зовсім не страшно і при правильному підході ви опануєте та зможете використовувати їх без особливих зусиль?

Пропоную на кілька хвилин абстрагуватися від того, що ви памʼятаєте ще з шкільного курсу, і поговорити про алгоритми саме у програмуванні. Наступна інформація буде корисна для тих, хто тільки розпочинає свій шлях в IT і хоче дізнатися більше важливої теорії перед практикою. Тому без зайвих слів — почнемо!

Основи: що потрібно знати, щоб почати програмувати

Поняття алгоритму першопочатково не було повʼязане з програмуванням в принципі. Термін у більш сучасному тлумаченні почав використовуватися ще у 30-50-ті роки ХХ століття в роботах Тюрінга, Поста, Черча, Вінера та Маркова. А взагалі його запровадив ще персидський вчений Аль-Хорезмі близько 825 року нашої ери.

Серед початківців в IT існує поширена думка, що програмування потребує глибоких математичних знань. Насправді це не зовсім так.

Часто вирішальним фактором є не математичний склад розуму, а алгоритмічне мислення. І якраз над ним потрібно активно працювати, щоб розвиватися в програмуванні.

Тому на цьому і зосередимося.

Поняття алгоритму

Алгоритм — це набір послідовних інструкцій, що описують порядок поведінки програми для досягнення поставленої задачі.

Для кращого розуміння проведемо аналогію з реальним життям. Ваша робота — це теж певний алгоритм:

1. Сіли за робоче місце
2. Увімкнули компʼютер
3. Відкрили браузер чи робочу програму
4. Почали працювати

Відкиньте один з кроків свого «робочого алгоритму» і вся система зруйнується.

Так само і в програмуванні.

Алгоритм — це послідовність команд та дій, завдяки яким програма досягає певних цілей. А процес програмування — це по сутіі є запис послідовних алгоритмів.

Базові структури алгоритмів

Програмування — це набір іноді доволі складних алгоритмів і систем, які можуть досить сильно заплутати програміста-новачка. І тут варто памʼятати, що будь-який, навіть найбільш складний на заплутаний алгоритм будується на базових алгоритмічних структурах. А вони досить прості:

  • Слідування — організація алгоритму, в якому всі дії виконуються тільки послідовно без повторень чи пропусків:

  • Розгалуження — форма організації команд, при якій в залежності від певних умов виконується задана команда чи послідовність команд:

  • Повторення (цикл) — методика організації команд, коли послідовність дій виконується неодноразово в залежності від певної умови:

Базові структури даних

Структура даних — це контейнер, інформація в якому скомпонована певним чином. Причому в залежності від «компоновки» буде варіюватися і її ефективність в різних операціях.

Алгоритми і структури даних — тісно повʼязані між собою поняття. Власне, на основі перших формуються другі. Розглянемо базові структури даних, які використовуються у програмуванні.

Масиви

Це найпростіша структура даних, в якій елементи розташовані послідовно, а кожному з елементів присвоєне числове значення (індекс). Індекс відповідає позиції елемента всередині масива:

Існують і більш складні масиви — багатомірні. Тобто такі, що мають масиви всередині інших масивів.

В програмуванні працювати з масивами досить зручно, використовуючи прості команди:

  • Insert — вставити елемент по вказаному індексу;
  • Get — повернути елемент по вказаному індексу;
  • Delete — видалити елемент по вказаному індексу;
  • Size — отримати загальну кількість елементів у масиві.

В масивах нескладно знаходити потрібні елементи, обʼєднувати та сортувати їх, змінювати порядок розташування тощо.

Стеки

Це абстрактний тип даних, у якому список елементів організований за принципом LIFOВід англ. last in — first out, «останнім прийшов — першим зайшов».

Уявіть, що ви складаєте книги в стопку. Верхньою завжди буде та, яку ви поклали останньою. А нижньою — перша. За таким принципом працюють і стеки:

Стеки дозволяють використовувати наступні команди:

  • Push — вставляє елемент зверху;
  • Pop — повертає верхній елемент після видалення;
  • isEmpty — повертає true, якщо стек пустий;
  • Top — повертає верхній елемент без видалення зі стеку.

В одному масиві може бути декілька стеків, з якими можна взаємодіяти окремо.

Черги

Тип збереження елементів даних з послідовним їх розташуванням. На відміну від стека, у чергах використовується принцип FIFO Від англ. First in First Out — «першим прийшов — першим зайшов».

Основні операції з чергами:

  • 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);
}

Незважаючи на візуальну різницю, технічно робота функцій в різних мовах програмування практично ідентична. Її можна описати наступним чином:

  1. функція розміщується в певній частині програми, де потрібно викликати дію алгоритму;
  2. при обробці нашого коду обробник натикається на функцію і повертається до тієї частини програми, де прописаний наш алгоритм;
  3. обробник виконує функцію, при цьому враховуючи вказані нами аргументи;
  4. після виконання функції бере чи не бере результати її виконання та повертається до того рядку коду, який і викликав функцію;
  5. по завершенню обробник переходить до наступних рядків коду.

До речі, мови програмування мають досить великий список інтегрованих функцій, якими ви можете користуватися «як є». Та досвідчені програмісти можуть створювати власні функції, які більше відповідають їхнім задачам.

Основи роботи з системою контролю версій

Програмування, робота з алгоритмами та базами даних відбувається не «у вакуумі». Задача програміста — бути командним гравцем, розподіляти задачі по проєкту і оптимізувати робочий процес. Один з основних робочих інструментів сучасного девелопера — система контролю версій 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
  • Запит на  «злиття»: перейдіть на онлайн-репозиторій GitHub і зробіть запит на злиття гілки:

Натисніть Pull request, щоб активувати процес. Якщо ви не допустили помилок, то отримаєте наступне повідомлення:

Резюмуємо: чи достатньо цих знань програмісту-початківцю

Отже, підсумки:

  • Алгоритми — це інструкції, які описують послідовність дій програми.
  • Структури даних — структурні елементи, за допомогою яких створюють алгоритми для розвʼязання певних задач.
  • Структури алгоритмів — це характер звʼязків між алгоритмами, що буває трьох видів:
  1. Лінійний алгоритм — з послідовними операціями.
  2. Розгалужений алгоритм — з послідовністю виконання операцій, що залежить від певних умов.
  3. Циклічний алгоритм — з багаторазовим виконанням одних і тих же дій, наприклад, для виконання однотипних обчислень з однаковими залежностями, але з різними перемінними.

Можна навести багато прикладів, як алгоритми спрощують процес програмування та прискорюють виконання коду в принципі. Наведемо лише деякі з можливостей, які вони відкривають перед девелопером. А точніше — уміння їх використовувати:

  • оптимізація оновлення DOMОб'єктна модель документа;
  • кешування в памʼяті елементів, що будуть повторно використовуватися;
  • демонстрація лише того контенту, який юзер бачить «просто зараз»;
  • нормалізація даних, використання селекторів для кешування обʼємних даних, що потребують додаткових розрахунків;
  • передзавантаження (preload) контенту, розробка стратегії кешування запитів тощо.

І тут у досвідчених програмістів може зʼявитися заперечення: всі ці та інші задачі можна вирішити за допомогою відповідних фреймворків та бібліотек. Можна, ніхто й не заперечує. От тільки в такому випадку подібні маніпуляції сприяють суттєвому розростанню коду. Як наслідок — фрізи сторінок, довге перше завантаження та невисокий FPS при скролінгу. 

Розуміння алгоритмів та структур даних дуже важливе для програміста. Мине час, зʼявляться нові мови та самі принципи програмування. Але алгоритми та структури даних залишаться. Тому що це — базис.

І не дивлячись на те, що ми в Wezom Академії завжди виступаємо за практику, та у цьому випадку радимо майбутнім програмістам детальніше ознайомитися саме з теорією, закріпити та розширити отримані сьогодні знання.

Чи може програміст працювати над проєктами без знання алгоритмів та структур даних?

Так, може. Більше того, багато розробників не ставлять ці напрямки в пріоритет. Проте відсутність бодай базових знань та теорії алгоритмів — це, по-перше, суттєве уповільнення роботи над проєктами. А по-друге, необхідність використовувати інструменти, без яких можна було б обійтися, зекономивши час та сили.


А тепер хочу звернутися до тих, хто тільки починає свій шлях в програмуванні, та до тих, что уже має певний досвід роботи. Як ви ставитеся до використання алгоритмів в роботі? Вивчаєте цей напрямок і використовуєте знання на практиці? Чи залишили його «до кращих часів» і концентруєтеся на більш практичних речах? Нам цікава ваша думка, тому запрошуємо до обговорення в коментарях.

Якщо ви знайшли помилку, будь ласка, виділіть фрагмент тексту та натисніть Ctrl+Enter.

Останні статті

IT в Україні йде до свого фінального кінця. І потраплятимуть туди виключно за покликом душі

Коротко про українську IT-сферу у 2024 році Це коли на одну вакансію Middle розробника по…

26.03.2024

Блокчейн-розробка сьогодні: зарплати і перспективи на ринку праці

Формування криптовалютної галузі в Україні почалося ще у 2014 – саме тоді з'явилися перші стартапи,…

18.03.2024

Скільки рішень ухвалює розробник? Погляд новачка, який запускає продукт

Автор цього блогу — Python-девелопер Сергій Солдатов, який вирішив створити досить унікальний продукт. І це…

12.03.2024

Чи треба готуватись до співбесіди?

Думки шукачів діляться на: «так, однозначно» і «ні, не вартує, я все і так про…

04.03.2024

Відкладаєте до останнього? Що таке «синдром студента» і як з ним боротися

Синдром студента — це форма прокрастинації, яка полягає в тому, що людина, якій дали завдання,…

23.02.2024

Вчимося працювати з Git: основи конфігурації, гілки, додавання файлів та директорій

Git — це найпопулярніша CVS прямо зараз, яка дозволяє відстежувати історію розробки і спільно працювати.…

20.02.2024