Класифікація знань в області програмування

2 роки тому я написав статтю про класифікації знань в області програмування. Це було на хвилі інтересу і моєї активної діяльності по самоосвіті в комп'ютерних науках. Написав статтю та забув про неї. Публікувати на Хабре не збирався. Зрештою, вона базується на моєму особистому досвіді і знаних, які можуть виявитися дуже суб'єктивні.

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

Але перш, ніж запустити матеріал, ще невеликий відступ. Про те, чому взагалі я все це писав. Справа в тому, що у нас в країнах колишнього СРСР з утворенням в області IT дуже туго. З одного боку немає програм навчання, які підготують фахівців на належному рівні (напевно, за дуже рідкісними винятками, які можна віднести до похибки). З іншого боку, з-за широких можливостей самоосвіти, програмісти і не поспішають вчитися у ВУЗах — всі прагнуть почати практикувати як можна раніше. Часто вивчається тільки один напрямок (наприклад PHP+Mysql — найпопулярніше) і в бій. Причому, на цьому все закінчується. В результаті у нас величезна кількість програмістів, які і базових речей не знають. Звідси випливають проблеми з якістю коду, і з эффекивностью алгоритмів, з велосипедированием.

Але програмування — це повноцінна галузь знань, яка вимагає в тому числі і інженерної підготовки. Точно так само, як будівництво або телекомунікації. Так, побудувати будинок (особняк) можна своїми руками і без освіти. А підняти більшість сайтів можна прочитавши пару книг по PHP і HTML. Але багатоповерхівку без спеціальної підготовки не побудуєш, як і Гугл не напишеш, не знаючи основ.

Можливості для самоосвіти в комп'ютерних науках зараз величезні. Єдине, чого не вистачає, — це системності підготовки. Як розібратися, що і в якій послідовності вивчати? Мені здається, що цей матеріал допоможе розкласти по поличках області знань у комп'ютерних науках та скласти для себе програму вивчення за книгами. Вибір книг — тема окрема, рамки статті не входить, але це можна обговорити в коментарях.

Поїхали.



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

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

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

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

В попередньому абзаці я спеціально ввів термін "інженер-програміст". Як-то виходить так, що програміст — це не обов'язково інженер. Навіть з визначення Вікіпедії слід, що інженер — це в першу чергу проектувальник. Це той, хто створює, тобто проектує системи. А в практиці програмування проектування потрібно не завжди. Іноді досить кодування: використовуючи даний набір технологій, зліпити щось працююче. Типовий приклад — стадо корпоративних або маркетингових сайтів на джумлах, ворпрессах, друпалах і т. д. Це рівень техніка, не інженера. Це рівень середньої освіти. І працювати техніком можна навіть після закінчення курсів будь-якої мови програмування, міцна теоретична база там не потрібна.

І, повертаючись до інженерам-програмістам, я хочу запропонувати свій граф дисциплін, які вивчають програмісти. Очевидно, що одні дисципліни активно використовують знання інших, або зовсім виростають з інших. Відповідно для повного розуміння «верхнього» предмета, необхідний якийсь рівень розуміння нижнього.

Граф складається з предметів (дисциплін) і розбитий на рівні. Самий нижній — Загальна база — взагалі ставлення до комп'ютерних наук не має. Він існує тільки для того, щоб показати, на чому базуються дисципліни комп'ютерних наук.

Між дисциплінами існують 2 види зв'язків: використання (звичайна стрілка) і розширення (контур стрілки). Використання увазі необхідність фрагментарних знань іншого предмета, а розширення — необхідність як мінімум оглядових, але повних знань розширюваної дисципліни.

Перший рівень з CS (computer science) — Спеціальна база. Це стартовий майданчик для будь-якого програміста за чотирма фронтам:

  1. арифметичні основи ЕОМ (системи числення та операції з числами, логічні операції);
  2. фізичні основи ЕОМ (напівпровідники, транзистори, логічні елементи, схеми, інтегральні мікросхеми);
  3. теорія алгоритмів (алгоритми і структури даних; складність, ефективність; способи представлення інформації в пам'яті);
  4. мови програмування (завдання і поняття ЯП, рівні, типи мов, абстракція, рівні абстракції, трансляція/компіляція, шаблони, принципи, парадигми — огляд).


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

Рівнем вище розташовуються дисципліни, що є базовими саме в програмуванні. По-цьому я назвав цей рівень Основи. У нього входять:

  1. архітектура ЕОМ (процесори, мікроархітектура, пам'ять, шини, введення/висновок);
  2. обробка інформації (теорія інформації, статистика, моделі, пошук даних, лінгвістичні аспекти, обробка інформації засобами табличних процесорів);
  3. основи C/C++ (базові властивості мови, синтаксис, покажчики, введення/висновок, масиви, основи STL).


Слідом за Основами йде Рівень 1. Це перший прикладний рівень, і особливо нетерплячі можуть почати комерційну практику, оволодівши цим рівнем. Він включає 5 дисциплін:

  1. основи ASM (розвиток архітектури ЕОМ у напрямку програмування, написання найпростіших драйверів і алгоритмів, асемблерні вставки в C/C++);
  2. C/C++ (ООП, розробка прикладних програм, бібліотеки, WinAPI, make utils, паралельне програмування).
  3. операційні системи (архітектура ОС, процеси, межпроцессное взаємодія, потоки, планування, роботи з пам'яттю та переферією, POSIX-системи);
  4. системний аналіз (предметна область, бізнес-процеси, потоки, діаграми, принципи і теорія системного аналізу);
  5. бази даних (теорія множин, види СУБД, реляційні СУБД, моделі даних, SQL, конкретні БД).


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

Рівень 2 включає:

  1. розробку (життєвий цикл ПЗ, етапи розробки, основи ведення програмних проектів, інструменти);
  2. аналіз даних (Data Mining, OLAP, машинне навчання, нейронні мережі, ІІ);
  3. комп'ютерні мережі (за рівнями стеків TCP/IP та/або ISO/OSI «від і до», протоколи, мережеве програмування на C/C++);
  4. мови програмування з керованим кодом (керований код, віртуальні машини, збирачі сміття, юніт-тестування, власне практика на C# або Java);


Рівень 3 — останній рівень для середнього програміста. Він самий об'ємний і включає тільки ті дисципліни, які безпосередньо пов'язані з розробкою ПЗ. Усього їх вийшло 6:

  1. розробка UI і юзабіліті (принципи побудови інтерфейсів користувача);
  2. управління командами і проектами (методології розробки та інші питання управління);
  3. тестування (оглядово: види тестування, інструменти);
  4. веб-технології (HTTP-протокол, веб-сервер, CGI, кешування і проксіювання, клієнтське програмування);
  5. розподілені системи (архітектури розподілених систем, протоколи мережевої взаємодії компонентів, інструменти, принципи, підходи до побудови розподілених систем, відмовостійкість, великі дані, високі навантаження);
  6. інтерпретовані мови програмування (особливості, основи по двом-трьом мовам, практика по одному-двом мовам: JS, PHP, Python, Ruby).


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

Цікаво у графі те, що він не тільки показує кращий порядок вивчення предметів, а також:

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


Граф — це модель. А хороша модель як правило дає відповіді одразу на безліч питань. Я поставив перед собою завдання зробити хороший граф, близьке до реальності. Природно, він заснований на моєму особистому досвіді і не претендує на ідеал. Я старався зробити його найбільш об'єктивним. І ще раз нагадую, що це граф для програміста. Тобто для тестувальника, сисадміна і інших близьких до програмування професій він буде більш або менш близьких, але явно іншим.



P. S. Переконливе прохання не розвивати холивары на тему, що має і що не повинен знати програміст. Це особистий вибір кожного і стаття зовсім не про це. Тут наведена класифікація знань і взаимосви між ними. Це цікаво не всім, це потрібно не всім.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.