Що таке алгоритм у програмуванні. Базові структури програмування (види алгоритму). Сервісне програмне забезпечення ПК та основи алгоритмізації

Курс знайомить слухачів з базовими структурами даних та алгоритмами, знання яких необхідне для ефективного вирішення різноманітних завдань програмування. Автори курсу займаються пошуком та підготовкою обдарованих в галузі інформатики та програмування студентів та школярів. Під їхнім керівництвом студентські команди багаторазово ставали чемпіонами Росії з програмування, чемпіонами світу та Європи.

Про курс

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

Мета курсу – отримання базових знань про основні алгоритми та структури даних, що використовуються для зберігання та пошуку інформації. У курсі використовується система автоматичного тестування програм, що забезпечує об'єктивну оцінку коректності виконання завдань із програмування.

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

Проходження курсу «Алгоритми програмування та структури даних» дозволить суттєво підвищити продуктивність та конкурентоспроможність слухачів при розробці програмного забезпечення.

Формат

До складу курсу входять відеолекції, опитування за матеріалами лекцій та практичні завдання з програмування, що передбачають самостійну реалізацію алгоритмів і структур даних, що вивчаються в курсі, однією з запропонованих сучасних мов програмування. Курс розрахований на десять тижнів. Середнє тижневе навантаження на учня - 14 годин. Загальна трудомісткість курсу становить чотири залікові одиниці.

Інформаційні ресурси

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

  1. Кормен T., Лейзерсон Ч., Рівест Р., Штайн К. Алгоритми: побудова та аналіз. - М: Вільямс, 2012.
  2. Ахо А., Хопкрофт Д., Ульман Д. Структури даних та алгоритми. - М.: Вільямс, 2007.
  3. Онлайн-конспекти лекцій з дискретної математики, алгоритмів та структур даних, що читаються на кафедрі комп'ютерних технологій Університету ІТМО.

Вимоги

Для успішного освоєння курсу необхідні знання основ дискретної математики, вміння писати програми середнього розміру об'єктно-орієнтованою мовою програмування.

Для проходження курсу потрібен будь-який загальнодоступний компілятор однієї з таких мов програмування:

  • Java: версія 8 (посилання для скачування на сайті Oracle)
  • C, C++: MinGW версії 5.1 (для Linux можна використовувати GCC аналогічної версії), а також Microsoft Visual Studio C++ 2013 (завантажити Visual Studio Express можна).
  • C#: Microsoft Visual Studio C# 2013 (завантажити Visual Studio Express можна).
  • Python: версія 3.5 (посилання для завантаження на сайті python.org)
  • Scala: версія 2.11 (посилання для скачування на сайті scala-lang.org)
  • Kotlin: версія 1.0 (посилання на інструкції з встановлення компілятора, плагінів в IntelliJ IDEA та Eclipse).

Програма курсу

У курсі розглядаються такі теми:

  1. Оцінка часу роботи алгоритмів
  2. Алгоритми сортування, засновані на порівнянні (сортування злиттям, швидке сортування, нижня оцінка на час роботи алгоритмів сортування)
  3. Алгоритми сортування з лінійним часом виконання (сортування підрахунком, цифрове сортування, кишенькове сортування)
  4. Елементарні структури даних (стек, черга, пов'язані списки)
  5. Алгоритми, засновані на двійковій купі (сортування купою, черга з пріоритетами)
  6. Введення у алгоритми пошуку (двійковий пошук у відсортованому масиві, двійкове дерево пошуку)
  7. Збалансовані дерева пошуку (огляд збалансованих дерев, АВЛ-дерево, Splay-дерево)
  8. Хешування (хеш-таблиці із закритою та відкритою адресацією)
  9. Введення в пошук підрядків (найпростіший алгоритм пошуку підрядків, алгоритм Рабіна-Карпа)
  10. Пошук підрядків (алгоритм Кнута-Морріса-Пратта, Z-функція, алгоритм Бойєра-Мура)

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

У курсі є два типи дедлайну (граничного терміну виконання оцінювальних заходів):
- м'який дедлайн, при якому необхідно виконати всі оцінювальні заходи цього тижня до її завершення;
– жорсткий дедлайн, при якому на виконання заходів оцінювання після м'якого дедлайну додатково виділяється ще два тижні, після закінчення яких доступ до відповідних заходів закривається.

Результати навчання

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

Формовані компетенції

  • 09.03.02 Інформаційні системи та технології
    1. Здатність до проектування базових та прикладних інформаційних технологій (ПК-11)
    2. Здатність розробляти засоби реалізації інформаційних технологій (алгоритмічні) (ПК-12)
    3. Готовність брати участь у постановці та проведенні експериментальних досліджень (ПК-23)

Так, хороша алгоритмічна підготовка важлива програміста. І ні, хороша - це зовсім не заучування алгоритмів зі списку "Найважливіших Алгоритмів, які повинен знати кожен". На мій погляд, хороша алгоритмічна підготовка повинна прагнути дати програмісту такі три вміння.

По-перше, це вміння вирішувати незрозумілі завдання. У нечітких формулюваннях життєвих завдань бачити можливі суворі трактування. За строгими трактуваннями накидати варіанти рішення. Всебічно аналізувати різні варіанти і вибирати найбільш вдалий.

Вочевидь, цього недостатньо просто знати алгоритми. Потрібно вміти "бачити їх", розпізнавати можливості їх застосування.

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

По-третє, алгоритмічна підготовка має допомагати вміло користуватися готовими інструментами. Бази даних - це суцільні структури даних та алгоритми. Причому на концептуальному рівні досить прості та зрозумілі – дерева пошуку, хештаблиці, SS-Table, …

Наприклад, знаючи, що індекс у БД – це просто дерево пошуку, нескладно зрозуміти, які запити можуть бути виконані швидко, а які приречені на full-scan.
Знаючи, як на яких алгоритмах працює повнотекстовий пошук у Lucene, можна передбачити, які запити до Elastic будуть давати релевантні відповіді, а які – ні, і навіть як це можна доопрацювати.

Якщо підбивати підсумок:

  • Крім самих алгоритмів – вчіться їх розпізнавати у завданнях реального світу.
  • Щеплюйте собі звичку аналізувати ефективність коду, який ви пишете.
  • Вивчайте алгоритми під капотом у інструментів, якими ви користуєтеся - це стане в нагоді при їх експлуатації.

Часто з'являються статті виду «потрібні програмісту алгоритми», і вони мають приблизно однаковий шаблон. Автор статті зазвичай пише: «Я N років пишу сайти/скрипти в 1С, і ніколи не користувався алгоритмами або структурами даних. Тут же наводяться як приклад червоно-чорні дерева або якісь інші екзотичні структури, які в області, в якій працює автор не часто побачиш, якщо побачиш взагалі. Такі статті зводяться до того що, що у конкретної області програмісти не використовують складні структури даних і вирішують NP завдань.

Сама постановка такого питання докорінно не вірна. Кількість спеціальностей в індустрії зростає постійно, і людина, яка пише сайти на.net, займатиметься зовсім іншими речами, ніж людина, яка пише драйвера для сенсорів на ARM архітектурі під екзотичною ОС. Давайте перш за все визначимо, що таке алгоритм. Неформально Кормен визначає алгоритм як строго певну процедуру, яка приймає одне чи кілька значень як введення, і повертає одне чи кілька значень як результат. Формально алгоритм визначається різних моделях обчислень: операції, які можна виконати машиною Тьюринга чи з допомогою лямбда-числений. Таким чином, фактично будь-який код, який щось робить, є алгоритмом. Виходить, що «потрібні програмісту алгоритми» можна перекласти як «чи потрібно програмісту вміти писати код». Правильно таке питання має звучати щось на кшталт: «Чи потрібно програмісту в галузі Х знати просунуті алгоритми та деталі теорії обчислень».

Якщо подивитися на всі ці статті, то можна помітити, що люди, які їх пишуть, фактично скривджені на університети за те, що їх змусили вивчати багато складного матеріалу – у вигляді алгоритмічного аналізу, складних алгоритмів та структур даних – який їм начебто не став у нагоді . По суті, автори статей скривджені університетами через те, що там не змогли передбачити майбутню сферу роботи авторів і дати їм лише мінімально потрібний набір навичок. Адже справді, щоб писати простенькі сайти та скрипти, не потрібно особливого знання алгоритмів та структур даних. Чи все ж таки потрібно?

Давайте подумаємо, що ж потрібно вчити програмісту в університеті, щоб набути необхідних навичок для успішної кар'єри. Бібліотеки? Фреймворки? Вони старіють, інтерфейси до них змінюються, всі вони написані найчастіше під одну мову, яку студенти можуть і не використовувати ніколи в індустрії. Всіх вивчати писати сайти? Чи всіх вивчати писати ОС? Освіта повинна охоплювати якомога більшу аудиторію та давати максимально можливий набір навичок. Програміст в першу чергу повинен вміти аналізувати та вирішувати проблеми – це основна навичка, якою мають набути випускники факультетів інформатики. Написання коду – це просто необхідний інструмент, який використовується для вирішення задач. Хто може знати, які навички вам знадобляться в майбутньому? Таким чином, вчити теорію – це найбільш оптимально з точки зору освіти. Отримані навички можна застосувати в будь-якій області, а вивчити бібліотеку або фреймворк, маючи хорошу базу знань, не складе труднощів. Парадоксально те, що люди, які задають питання про необхідність алгоритмів, зазвичай мають якісь знання в цій галузі. Я не пам'ятаю жодної людини, яка не мала знань у галузі теорії обчислень, і з гордістю кричала про це, стверджуючи, що їй вони не потрібні.

Отже, ви абстрактний програміст у вакуумі, працюєте десять з гаком років клепаючи сайти і вирішуючи прості однотипні завдання клієнтів/компанії. Вам добре і затишно у вашій ніші, і тільки болісно за безцільно витрачений час у класі з теорії обчислень та алгоритмічного аналізу, який вам нічого не дав. Вранці закурюючи цигарку за чашкою кави, в глибині філософських роздумів про тлінність буття ви замислюєтеся: навіщо ж програмістам, які не вирішують складних завдань, знати алгоритми та основи аналізу. Коротка відповідь: щоб бути кваліфікованим спеціалістом та ефективно використовувати доступні інструменти, включаючи мову, якою ви пишите. Теорія алгоритмів та аналізу вчить не тільки екзотичні алгоритми та структури даних у вигляді АВЛ та червоно-чорних дерев. Вона також дає уявлення про те, як ефективно організувати дані, як писати код з максимальною продуктивністю, де в системі можливо пляшкове шийка і як з ним боротися. Вас ознайомлюють з готовими рішеннями, щоб ви не писали велосипедів, і не бігли в гугл щоразу, коли потрібно зробити щось нетривіальне.

Знання теорії аналізу та алгоритмів застосовуються всіма програмістами насправді щодня, просто ми звикли до цих речей настільки, що навіть не замислюємося над цим. Яке б завдання ви не вирішували – чи то простий сайт із вибіркою даних із БД, чи то баш скрипт на сервері, ви використовуватимете якісь структури даних. Як мінімум примітивний масив, а швидше за все і щось складніше. Мови дають нам безліч різних структур, багато з яких взаємозамінні. Часто ми маємо кілька варіацій одного абстрактного типу із різними реалізаціями. Наприклад, С++ є структури даних vector і list. Чим вони відрізняються, і які будуть переваги та недоліки використання одного чи іншого? Як у С++ реалізована map і чим вона відрізняється від multimap? Як реалізований list в Python – через масив чи зв'язковий список і як найкраще з ним працювати? Чому C# небажано використовувати ArrayList, а замість нього використовувати List? Як реалізований SortedDictionary і як він вплине на виконання програми, якщо буде використаний замість Dictionary? Як працює continuation, коли її потрібно використовувати, і чи будуть якісь побічні ефекти під час її використання? Коли ви востаннє використовували каріровані функції, які є майже кожною мовою? Якщо ви думаєте, що map С++ реалізована як хеш-таблиця, ви помиляєтеся. Вона реалізована на червоно-чорних деревах, а хеш-таблицею реалізована unordered_map. Окремо варто згадати про динамічне програмування. Розуміння, що це таке, як можна оптимально переписати рекурсивні функції і що таке мемоізація, часто допоможе уникнути пострілу собі в ногу. Таким чином просто щоб повноцінно та ефективно використовувати мову, якою ви пишите, вже потрібно мати хоча б поверхневі знання про структури даних, що вони собою представляють, і як можуть вплинути на виконання вашої програми.

А як бібліотеки? Адже вони вирішують стільки завдань! Щоб раціонально використовувати бібліотеки, їх також треба розуміти. По-перше, функції в бібліотеці можуть мати побічні ефекти або поведінку, які ви не знатимете без розуміння алгоритмів. Отримавши баг у такому разі можна довго і наполегливо намагатися його зловити та вирішити, коли можна було уникнути. По-друге, різні інструменти та бібліотеки часто потрібно «налаштовувати» - говорити їм якісь алгоритми, структури даних і технології використовувати всередині. Без елементарних знань вам доведеться або читати мани, або вибирати навмання. По-третє, є безліч завдань, які не можна вирішити простим викликом API бібліотеки або фреймворку. Що ви робитимете в такому випадку? Витрачати годинник на пошуки можливих рішень та просити допомоги в друга? По-четверте – безліч завдань вирішується дуже просто кількома рядками коду або вбудованими засобами мови. Якщо для вирішення кожного чіха ви тягтимете бібліотеку, то ваші програми будуть гігантськими монстрами, займаючи по сотні мегабайт і більше на диску, віджираючи всю пам'ять на сервері, і маючи досить мізерний функціонал. Крім того, наявність купи підключених бібліотек спричиняє проблеми сумісності, і програма може падати випадково через дивну поведінку кількох бібліотек в одному проекті. Бездумне використання бібліотек може призвести до досить плачевних наслідків, і розробники, які вміють лише використовувати бібліотеки, але не здатні вирішити навіть просту проблему самостійно, ніколи не цінуватимуться, тому що їхні рішення будуть неконкурентоспроможними.

Зі мною працював один програміст зі стажем понад десять років. Якось нам знадобилася функція, яку використана нами бібліотека на той момент не підтримувала: примітивний text-wrap в одному із візуальних компонентів. Цей програміст подивився, що стандартними засобами це зробити не можна, і відразу заявив, що реалізація такої функції неможлива. Завдання вирішив інтерн-третій курсник з аналітичним мозком, який за дві години написав простий алгоритм і впровадив його в потрібний компонент. Інший проект у вигляді сайту на.net мені дістався у спадок. Головна сторінка була кілька маленьких графіків, і завантажувалася майже 10 секунд. Виявилося, що людина, яка спочатку робила цей проект, нагородила купу жахливих конструкцій із потрійних вкладених циклів, які довго і сумно забирали дані з БД, і потім прив'язували їх до графіків. Після невеликого рефакторингу сторінка почала вантажитися майже миттєво.

Чи може програміст уникнути знань алгоритмів і теорії аналізу? Може, й таких програмістів дуже багато. Тільки назвати їх програмістами можна хіба з великою натяжкою. До мене на співбесіду приходить дуже багато програмістів, зі стажем десять-п'ятнадцять років, і до ладу не розуміють що вони роблять і чому. У них своя ніша, вони ходять від компанії до компанії, не затримуючись у них понад рік. Як правило, у них є невеликий набір завдань, які вони можуть вирішувати, і якщо зробити крок убік, то людина губиться і їй потрібно навчити себе нових навичок. Таких людей запрошують на проект, і їх позбавляються якнайшвидше, тому що вони втрачають купу часу, винаходячи велосипеди і читаючи мани, щоб дізнатися те, що вже мали знати з університету. У них зазвичай немає особливо ніякої кар'єри та нестабільний заробіток.

У результаті навіщо потрібно знати алгоритми і теорію аналізу, якщо можна виконувати роботу і без цих знань? Щоб бути кваліфікованим фахівцем у своїй професії, мати кар'єрне зростання та повагу колег. Щоб ефективно вирішувати поставлені завдання та не винаходити велосипедів. Щоб не писати монстрів з величезною кількістю сторонніх бібліотек, які займають сотні мегабайт на диску, віджирають купу пам'яті на сервері і регулярно падають з випадкової причини в залежності від фази місяця. Щоб ефективно і з максимальними можливостями використовувати мову, якою ви пишете. Щоб приймати інформовані та осмислені рішення щодо вибору бібліотеки та технології для вирішення проблеми. Якщо ж ваша робота полягає в написанні SQL запиту та вбиванні команди в консоль, то хочу вас засмутити: ви не програміст, ви – користувач, вам дійсно не потрібні алгоритми і що з ним, і ви даремно витратили час в університеті, бо для такої роботи достатньо закінчити курси або прочитати пару вступних книжок самостійно.

Тема 1.3: Системне програмне забезпечення

Тема 1.4: Сервісне програмне забезпечення та основи алгоритмізації

Введення в економічну інформатику

1.4. Сервісне програмне забезпечення ПК та основи алгоритмізації

1.4.2. Основи алгоритмізації та мови програмування

Алгоритм та його властивості

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

Алгоритм означає точний опис деякого процесу, інструкцію щодо його виконання. Розробка алгоритму є складним та трудомістким процесом. Алгоритмізація – це техніка розробки (складання) алгоритму на вирішення завдань на ЕОМ.

Образотворчі засоби для опису (подання) алгоритму

Для запису алгоритму розв'язання задачі застосовуються такі образотворчі способи подання:

  1. Словесно-формульне опис.
  2. Блок-схема (схема графічних знаків).
  3. Алгоритмічні мови.
  4. Операторні схеми.
  5. Псевдокод.

Для запису алгоритму існує загальна методика:

  1. Кожен алгоритм повинен мати ім'я, яке розкриває його зміст.
  2. Необхідно позначити початок та кінець алгоритму.
  3. Описати вхідні та вихідні дані.
  4. Вказати команди, які дозволяють виконувати певні дії над виділеними даними.

Загальний вид алгоритму:

  • назва алгоритму;
  • опис даних;
  • початок;
  • команди;
  • кінець.

Формульно-словесний спосіб запису алгоритму характеризується тим, що опис здійснюється за допомогою слів та формул. Зміст послідовності етапів виконання алгоритмів записується природною професійною мовою предметної області в довільній формі.

Графічний спосіб опису алгоритму (блок - схема) набув найширшого поширення. Для графічного опису алгоритмів використовуються схеми алгоритмів чи блокові символи (блоки), які з'єднуються між собою лініями зв'язку.

Кожен етап обчислювального процесу є геометричними фігурами (блоками). Вони поділяються на арифметичні або обчислювальні (прямокутник), логічні (ромб) та блоки введення-виведення даних (паралелограм).


Мал. 1.

Порядок виконання етапів вказується стрілками, що з'єднують блоки. Геометричні фігури розміщуються зверху донизу та зліва направо. Нумерація блоків проводиться у порядку їх розміщення у схемі.

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

Операторні схеми алгоритмів. Суть цього способу опису алгоритму у тому, кожен оператор позначається буквою (наприклад, А – арифметичний оператор, Р – логічний оператор тощо.).

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

Псевдокод – система команд абстрактної машини. Цей спосіб запису алгоритму за допомогою операторів близьких до алгоритмічних мов.

Принципи розробки алгоритмів та програм

Типи алгоритмічних процесів

За структурою виконання алгоритми та програми діляться на три види:

  • лінійні;
  • розгалужені;
  • циклічні;

Лінійні обчислювальні процеси

Лінійний алгоритм (лінійна структура) – це такий алгоритм, у якому всі дії виконуються послідовно один за одним і лише один раз. Схема є послідовністю блоків, які розташовуються зверху вниз у порядку їх виконання. Первинні та проміжні дані не впливають на напрямок процесу обчислення.

Алгоритми структури, що розгалужується

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

Такі завдання можна описати за допомогою алгоритмів структури, що розгалужується. У таких алгоритмах вибір напряму продовження обчислення здійснюється за наслідками перевірки заданої умови. Розгалужені процеси описуються оператором IF (умова).


Мал. 2.

Циклічні обчислювальні процеси

Для вирішення багатьох завдань характерне багаторазове повторення окремих ділянок обчислень. Для вирішення таких завдань застосовуються алгоритми циклічної структури (циклічні алгоритми). Цикл – послідовність команд, яка повторюється доти, доки не буде виконано задану умову. Циклічне опис багаторазово повторюваних процесів значно знижує трудомісткість написання програм.

Існують дві схеми циклічних обчислювальних процесів.


Мал. 3.

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

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

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

Мови програмування

Мови програмування – це штучні мови запису алгоритмів до виконання їх у ЕОМ. Програмування (кодування) – складання програми за заданим алгоритмом.

Класифікація мов програмування. Загалом, мови програмування поділяються на дві групи: операторні та функціональні. До функціональних відносяться ЛИСП, ПРОЛОГ і т.д.

Операторні мови поділяються на процедурні та непроцедурні (Smalltalk, QBE). Процедурні діляться на машино-орієнтовані та машино – незалежні.

До машино-орієнтованих мов належать: машинні мови, автокоди, мови символічного кодування, асемблери.

До машино-незалежних мов належать:

  1. Процедурно – орієнтовані (Паскаль, Фортран та інших.).
  2. Проблемно - орієнтовані (ЛІСП та ін.).
  3. Об'єктно-орієнтовані (Сі ++, Visual Basic, Java та ін).
Останнім часом все частіше зустрічаю думки про перехід на спеціальність розробника. Чи то менеджер, консультант, військовий офіцер, фізик ядерник чи ландшафтний дизайнер - усі захотіли стати програмістами. Спробуємо розібратися, чому це відбувається і чого може призвести.

Мотивуюче зображення:

Проблема

Зазвичай у розробники переходять нові фахівці до 30-ти років. І відразу виникає кілька серйозних проблем:
  • 5-6 років втрачених на вивчення предметів та наук, які більше ніколи не знадобляться;
  • Необхідна зміна мислення з гуманітарного технічного на логічне цифрове;
  • Освоєння 5-6 років програми технічного вишу у найкоротші терміни;
  • Створення загрози життю та благополуччю людей, компаній, бізнесу...

Час

Постає питання, навіщо людина вивчала кілька років не потрібні їй науки? Навіщо піддав себе таким розумовим навантаженням? Щоб потім все кинути та почати все з початку? Навіть 5 років багато. За цей час можна стати мільярдером або отримати Нобелівську премію, так ні, людина вивчає те, що їй не цікаво, спить на парах і каже, що філософія - це цілковите марення!

Добре, якщо він навчається на платному відділенні, а якщо за рахунок держави? Це означає, що хтось мріяв стати архітектором, менеджером, фінансистом, військовим, не потрапив на це місце. Йому довелося шукати інше місце під сонцем, можливо він пішов вчитися на програміста.

Там все просто!

Скільки таких новоявлених програмістів, які прочитали про JAVA у Брюса Еккеля. Усі вони вважають себе геніями програмування, а ОВП, MVC, Agile, двійкова система обчислення, теорія складності обчислень... не їм.

Наведу кілька прикладів життя:

  1. "Програміст" пише другу версію програми. У першій була одна форма на 50 кнопок. Друга версія має більшу функціональність, але її логіка не так прозора. Планується писати програму кілька місяців. У функціонал закладено близько 100 клавіш на одній формі. Після 10-хвилинного введення в теорію графів кількість кнопок скоротилася до однієї (видалення точки), термін написання програми скоротився до двох днів.
  2. "Програмісту" дали завдання написати програму-конвертер. Логіка проста: приходить пакет виду ключ = значення, треба по спеціальній таблиці конвертувати його в пакет 2 виду ключ 2 = значення 2 і відправити далі. Після двох місяців «вивчення платформи» йому було передано каркас програми (прийом пакета, трансформація, відправлення пакетів) старшими товаришами. За місяць конвертер був готовий!
  3. Безліч реалізованих велосипедів;
  4. Який говорить за себе http://govnokod.ru;
Можу сказати лише одне: якби програмування було таким простим, то йому б не навчали в університетах по п'ять років. Достатньо було б і тримісячних курсів.

Таланти

Звісно, ​​не можна не згадати про таланти. Є талановиті люди, які займаються різними роботами, вони скрізь процвітають. Але таких дуже мало. Краще бути компетентним фахівцем в одній області, ніж у кількох потроху.

«Знайди собі справу до душі і жодної хвилини в житті ти не працюватимеш» - Конфуцій. Важливо не витратити на пошук цієї справи все життя, інакше доведеться все життя «колювати».

Запах пороху

Дуже хороша ідея показати, що є розробкою. Понюхати пороху, так би мовити! Ось уже й мери почали вивчати JS.

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

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

Висновок

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

Все ж таки, думаю, більшість «нових програмістів» прагнуть більше заробляти: сидиш собі - гроші отримуєш. Щоправда, потім такі люди сильно підбивають свою команду, працюють не на повну силу. А якщо ще й начальство заплющить на це очі (так, так, таке буває!), то з ними каші не звариш, google не розробиш.

Як показують дослідження. IT в Росії - не найвища оплачувана галузь. Вона посідає лише третє місце. На другому місці сировинні галузі, а на першому – вищий менеджмент. Через специфіку IT програміст ніколи не досягне сходинки вищого менеджменту. Максимум, на що варто розраховувати, це посада керівника відділу, провідного напряму, директора компанії.

Тому робіть висновки. Зміна роду діяльності - серйозний крок, він повинен бути обдуманий. Щонайменше, треба буде вивчити сучасний курс програмування, і це займе не один рік.

P.S. У коментарях запитують про цілі нотатки: серйозніше ставитись у виборі професії, займатися тільки улюбленою справою, вчитися тому, що подобається, професійно рости, а не пробувати все потроху без певної мети. Дивують люди, котрі у 30-40 років так і не змогли знайти собі заняття до душі.