Вступ в програмування
На яке питання мені, як розробнику з багаторічним стажем, дуже важко відповісти? Це коли до мене звертаються з питанням: "Володимире, на які курси піти, щоб вивчити програмування з нуля?"
Чому для мене це питання таке складне? По-перше, я вивчав програмування в девʼяностих роках, коли не існувало айті-курсів, не було Ютьюбу, та й інтернету в мене не було. По-друге, поняття "вивчити з нуля" дуже широке. Людина взагалі нічого не знає? Тому що сучасне програмування тісно повʼязане з тим, як працює компʼютер, з яких компонентів він складається, як працює Інтернет, де заховалися ті компʼютери у хмарах, чим займаються айті-фахівці коли розробляють програмне забезпечення. Чому це важливо знати? Тому що коли ми кажемо "програмування", то маємо на увазі "програмування (кого? що?) — програмування компʼютера".
— Володимире! Але програми існують не лише для компʼютерів! Є програми на мобільному телефоні, є програми в хмарі, та навіть в роботі-пилососі теж є програма! Чому ви кажете програмування компʼютера?
А чи дійсно ці згадані пристрої такі різні? Розглянемо два пристрої, різниця між якими аж 75 років.
Перший — це компʼютер EDSAC, побудований в Кембриджському університеті у 1949 році. Він побудовано на електронних лампах, споживав 11 кіловат та виконував 160 математичних інструкцій на секунду. Другий — це iPhone 16 Pro Max розроблений компанією Apple у Каліфорнії у 2024 році. Він побудовано за допомогою напівпровідників, споживає менше одного вату та виконує 35 трильйонів математичних інструкцій на секунду. Може здатися, що нічого спільного у цих двох пристроїв немає. Але EDSAC та iPhone обʼєднує те, що ці два компʼютери побудовані на архітектурі фон Неймана.
Архітектура фон Неймана
Джон фон Нейман — видатний угорсько-американський математик, фізик, інженер і один із засновників сучасної інформатики. Він зробив вагомий внесок у квантову механіку, теорію ігор, логіку, економіку та розробку комп'ютерів. Запропонована ним у 1945 році архітектура стала основою для більшості сучасних комп'ютерів та носить його імʼя: архітектура фон Неймана.
Що таке архітектура? Архітектура — це слово грецького походження, що означає "будівництво" — мистецтво проєктування, спорудження та художнього оздоблення будов. У розумінні комп’ютерів архітектура — це спосіб побудови компʼютерів, організації різних компонентів та правила, за якими вони взаємодіють між собою.
Архітектура фон Неймана — це модель комп'ютера, яка має наступні компоненти:
- процесор (з арифметично-логічним блоком і регістрами);
- пам'ять;
- пристрої введення-виведення та шина для передачі даних.
Дані та інструкції зберігаються в одній пам'яті, що дозволяє процесору виконувати команди по черзі.
Памʼять або оперативна памʼять призначена для запису, зберігання та читання інформації у процесі її обробки. Кожна комірка пам'яті ідентифікується унікальним номером, який називається адресою. В цієї памʼяті зберігається та програма, що виконується в поточний момент, та усі необхідні дані для її виконання. Наприклад: щоб зробити квартальний звіт до податкової треба, щоб у памʼяті була програма, яка вміє розраховувати податки, та усі дані щодо руху коштів на рахунках організації або підприємця за звітний квартал.
Процесор послідовно зчитує інструкції з оперативної памʼяті та виконує їх. Виконати інструкцію — це означає що треба зробити певну дію, наприклад: прочитати дані з памʼяті, записати дані в памʼять, виконати арифметичну дію або виконати логічну дію. Якщо мені треба підрахувати суму двох чисел, то це можна виконати такою послідовністю інструкцій: зчитати перше число, зчитати друге число, додати числа, зберегти результат у памʼяті. Сучасні процесори вміють виконувати сотні різноманітних операцій.
А як програма підрахунку податків та дані щодо руху коштів потраплять у оперативну памʼять? Та як після підрахунку результати потрапляють на екран монітору або на папір? Це відбувається за допомогою різноманітних пристроїв введення-виведення. Персональні компʼютери обладнані клавіатурою, мишею, мікрофоном, відеокамерою, щоб вводити різноманітну інформацію в памʼять компʼютера. Монітор, колонки та принтер — щоб виводити аудіо, фото, відео та друковану інформацію з памʼяті компʼютера. В мобільних телефонах немає миші та клавіатури, та інформацію ми вводимо в телефон за допомогою дотиків до екрану. Тож екран в мобільному телефоні це одночасно пристрій введення та виведення інформації. Усі сучасні компʼютери: персональні, мобільні або сервери обʼєднує те, що для введення-виведення даних використовуються жорсткі диски та мережеві пристрої, наприклад, вай-фай. Відмінність оперативної памʼяті від памʼяті накопичувачів полягає в тому, що в оперативній памʼяті зберігаються дані лише для поточних обчислень, а на жорсткому диску вони зберігаються увесь час свого життя, доки ми їх не видалимо.
Раніше ще використовувались дивні пристрої введення та виведення інформації. Наприклад, пристрій для читання перфокарт або перфострічки. Інформація кодувалася за допомогою отворів у паперовій або металевій стрічці або карточці.
Цікавий факт, що цей пристрій прийшов до компʼютерної техніки з механічних ткацьких верстатів. У вісімнадцятому сторіччі французький ткач та винахідник Жозеф Жаккар використовував перфокарти щоб кодувати візерунки на тканині. Та спеціальний пристрій до ткацького верстату допомагав робити один й той же візерунок знову та знову.
Раніше дуже широко використовувались накопичувачі на магнітних стрічках. Навіть коли я був у школі в мене в дома був компʼютер ZX Spectrum, усі ігри та програми ми завантажували зі звичайних аудіокасет. Я досі памʼятаю, як треба було чекати пʼять хвилин доки завантажується гра та слухати цей дивний звук.
Але цікавий факт, що накопичувачі на магнітних стрічках досі використовуються та обʼєм продажів касет зростає кожного року. Ці касети використовуються для довгострокового зберігання даних в датацентрах, так званих бекапів. Магнітна стрічка це найкращий вибір з точки зору вартості зберігання інформації.
Сучасні процесори універсальні. Вони розроблені, щоб виконувати будь які завдання. При програмуванні програма за допомогою клавіатури спочатку потрапляє на жорсткий диск у вигляді текстового файлу. Далі процесор завантажує цю програму з жорсткого диска в оперативну памʼять, виконує інструкції одну за одною, зберігає результати спочатку в оперативну памʼять, виводить на екран, а потім зберігає на жорсткому диску. І за цими принципами працюють усі сучасні компʼютери ось вже як 75 років: персональні компʼютери, мобільні телефони, сервери в хмарах, Xbox та Play Station. Якщо людина навчиться програмувати один пристрій, то вивчити програмування для іншого пристрою буде вже набагато простіше. І це все завдяки цьому вченому: Джону фон Нейману.
Історія з мого досвіду. Ще в школі я почав програмувати на 8-бітному компʼютері ZX Spectrum за допомогою мови програмування BASIC. На першому курсі університету я вивчив мови програмування Pascal та Сі і вже розробляв програми для операційної системи Windows 2000 на 32-бітному процесорі. У 2011 році я вивчив мову програмування Objective-C та почав писати програми для мобільного телефону Apple iPhone. У 2014 році я вивчив мову програмування Python та почав розробляти веб-сервіси які виконувались десь на хмарних серверах. Я навіть ніколи не бачив ці компʼютери, де вони, та як виглядають. :) За свою карʼєру я вивчив та використовував більше 10 мов програмування. Та я впевнений що вивчу ще.
Алгоритми
З одного боку компʼютери мають дуже багато памʼяті та вміють виконувати трильйони операцій на секунду. Але з іншого боку компʼютер не може сам розвʼязати ніякого завдання. Він не знає, як його розвʼязувати. Компʼютеру треба надати чітку програму дій, як виконати завдання.
Алгоритм — це набір інструкцій, які описують порядок дій виконавця, щоб досягти результату розв'язання задачі за скінченну кількість дій. Набір інструкцій це і є програма, а виконавець — це компʼютер. Програми розробляють програмісти. Алгоритми можуть бути досить простими, складатися з декількох інструкцій та виконуватися дуже швидко. А можуть бути складними, складатися з тисяч інструкцій та виконуватися довго.
Алгоритми присутні не лише в програмуванні. Люди теж використовують алгоритми. Наприклад, рецепт приготування улюбленої страви — це теж алгоритм. Іноді навіть можна почути таке: "Що будемо робити? Який наш алгоритм дій?" Уявіть собі, що ви прийшли до іграшкового магазину, щоб придбати подарунок дитині ваших друзів. Ви не дуже розумієте, що вона полюбляє, та й витрачати багато грошей на це не хочете. Тому треба купити найдешевшу іграшку. Який міг би бути алгоритм дій, щоб виконати це завдання.
- Перша інструкція. Підійти до полиці з іграшками з будь-якого боку та взяти у руки першу іграшку.
- Друга інструкція. Зробити крок вздовж полиці.
- Третя інструкція. Якщо полиця закінчилася, то йти на касу, сплачувати за іграшку, яку тримаєте в руках, та виходити з магазину.
- Четверта інструкція. Порівняти ціну іграшки яку ви бачите перед собою з ціною іграшки що ви тримаєте у руках.
- Пʼята інструкція. Якщо ціна іграшки з полиці нижча, то взяти у руки іграшку з полиці, а дорожчу покласти на звільнене місце.
- Шоста інструкція. Перейти до другої інструкції.
Цей алгоритм гарантовано допоможе вам обрати іграшку з самою низькою ціною.
Там десь у середині процесор розуміє лише двійковий код, який складається з нулів та одиничок. Вводити інструкції таким чином дуже складно. Люди винайшли мови програмування, які дуже схожі на звичайні мови, щоб записувати алгоритми. А також люди розробили спеціальні програми — компілятори та інтерпретатори які допомагають автоматично перекладати з мови програмування, яку розуміє людина, у двійковий код, який розуміє компʼютер.
Чим займаються програмісти?
Є такий анекдот.
- Ти хто?
- Я програміст.
- Програміст? Тоді йди та заміни тонер в принтері.
Цей анекдот підкреслює стереотипне сприйняття програмістів як "універсальних айтішників", які можуть вирішити будь-яку технічну проблему, навіть якщо вона не пов'язана з їхньою спеціалізацією. Уявлення, що програміст автоматично відповідальний за всі технічні аспекти, включаючи обслуговування принтерів, є абсурдним, але комічним. Кожен програміст у своєму житті хоча б раз чув цю фразу: "ти ж програміст".
Програмування — це вузька сфера, яка потребує глибоких знань у розробці програмного забезпечення, а не універсальної технічної підтримки. Люди часто не розуміють відмінності між програмістом, системним адміністратором чи технічним спеціалістом, тому приписують програмістам обов’язки, що не стосуються їхньої роботи.
Програмісти (або розробники) займаються створенням, тестуванням та підтримкою програмного забезпечення. Їхня робота охоплює різні аспекти роботи з комп’ютерами, але основний акцент робиться на написанні коду для вирішення конкретних завдань.
Ось основні напрями діяльності програмістів.
Перший напрям — це проектування програмного забезпечення. Програмісти аналізують вимоги замовника або користувачів, розробляють архітектуру програми (як різні компоненти будуть взаємодіяти), та вибирають інструменти, технології та підходи для реалізації проєкту.
Другий напрям — це написання програмного коду. Програмісти використовують мови програмування (наприклад, Python, Java, C++, JavaScript), щоб створювати програми, вебсайти, мобільні додатки або інші програмні рішення.
Третій напрям — це тестування. Програмісти шукають і виправляють помилки (які часто називають багами) у програмному коді. Пишуть автоматичні тести для перевірки роботи програми.
Четвертий напрям — це підтримка і оптимізація. Програмісти оновлюють програмне забезпечення, додаючи нові функції або адаптуючи до змін у зовнішньому середовищі. Також програмісти оптимізують продуктивність коду (щоб програма працювала швидше або займала менше памʼяті або місця на диску).
Пʼятий напрям — це взаємодія з іншими фахівцями. Програмісти часто співпрацюють з: дизайнерами — для створення зручного інтерфейсу користувача; з системними адміністраторами — для налаштування серверів і хмарних систем; та з менеджерами проектів — для узгодження цілей та термінів виконання.
Спеціалізації
Існує багато спеціалізацій програмістів. Розробка вебсайтів, мобільних додатків, створення комп’ютерних ігор, створення операційних систем, драйверів, інструментів, аналіз даних, машинне навчання, штучний інтелект, написання коду для пристроїв, наприклад, роботів чи побутової техніки чи навіть авто.
Існує навіть спортивне програмування — це змагання між програмістами, де окремі особи або команди повинні вирішувати алгоритмічні завдання за короткий проміжок часу. Перемагає та команда, яка змогла вирішити більше завдань за менший час.
Усі спеціалізації програмістів об'єднують кілька ключових аспектів, які є основою їхньої роботи.
По-перше, це вміння роботи з кодом. Усі програмісти пишуть, змінюють або аналізують код. Незалежно від мови програмування, принципи розробки та структура коду залишаються схожими. Іноді одна й та сама мова може використовуватися в різних спеціалізаціях. Наприклад, мова Python використовується для створення веб-сайтів, аналізу даних і машинного навчання, автоматизації та створення скриптів, тестування програмного забезпечення, наукових обчислень тощо.
Другий аспект, спільний для всіх спеціалізацій — це алгоритмічне мислення, що дозволяє вирішувати проблеми шляхом чіткого визначення послідовності дій (алгоритму), які потрібно виконати для досягнення результату. Програмісти створюють або використовують готові алгоритми для вирішення конкретних завдань, розбивають складні проблеми на менші частини та знаходять оптимальні способи їх вирішення.
Третій аспект, спільний для всіх програмістів — це робота з даними. Усі спеціалізації програмістів так чи інакше взаємодіють із даними: їх збором, обробкою, зберіганням або аналізом. Це може бути робота з базами даних, файлами, API або навіть потоками даних у реальному часі.
Чи потрібна математика щоб програмувати?
Одне із поширених запитань серед початківців у програмуванні це: "Чи потрібна математика, щоб стати програмістом?" Це питання має нюанси, і відповідь залежить від того, якою спеціалізацією програмування ви плануєте займатися. Математика — це основа багатьох концепцій у програмуванні. Вона допомагає структурувати мислення, формулювати алгоритми, та розуміти складні технічні концепції, такі як обчислювальна складність, графи, або теорія ймовірностей. Проте багато задач програмування можна вирішувати, не маючи глибоких математичних знань. Сучасні фреймворки та бібліотеки спрощують ці аспекти, дозволяючи програмістам зосереджуватись на прикладних завданнях. Дуже багато складних алгоритмічних завдань вже вирішені, запрограмовані та протестовані. Треба лише обрати потрібний готовий алгоритм та застосувати його у вашому коді.
Деякі спеціалізації вимагають глибоких знань з математики. Це машинне навчання та штучний інтелект, комп'ютерна графіка та розробка ігрових двигунів, алгоритми та оптимізація, криптографія.
Але існує багато напрямків, де основні математичні знання достатні: це веб-розробка, мобільне програмування, автоматизація тестування. В цих спеціалізаціях знання мов програмування, бібліотек, фреймворків та технологій відіграє більшу роль, ніж знання математики.
Навіть якщо ваша спеціалізація не вимагає глибоких знань математики, деякі базові поняття корисно знати. Логіка важлива для створення умов у коді; множини та відношення це основа для роботи з базами даних і структур даних; комбінаторика корисна в розробці алгоритмів і під час вирішення задач оптимізації.
Таким чином, щоб почати вивчати програмування шкільних знань про математику буде достатньо.