— не «вивчити Python[2] і влаштуватися». Це людина, яка живе в системі, ламає її, лагодить і може пояснити, чому так.
Самостійна праця = проєкти, що опираються, а не курси.

Умови, без яких шлях розвалюється

1. Свій комп’ютер, Linux як основна ОС[3] з першого дня. Не «віртуалка на вихідних». Dual-boot[4] або старий ноут із Debian[5] / Fedora[6] достатньо.
2. Англійська як робоча мова. Документація, тексти помилок, man[7], GitHub[8]. Окремий «курс англійської для IT» не потрібен — читати man і чужі розбори помилок щодня.
3. Інтернет і місце, де можна зламати. Свій сервер за кілька доларів, старий ПК, Raspberry Pi[9] — байдуже. Без машини, якої не шкода, інтуїція не виросте.
4. Час шматками по 5–10 годин на тиждень, роками. Не марафон канікул. Школа важливіша: якщо НМТ/ЗНО[10] вбиває все — ІТ зачекає, фундаменту немає.
5. Дорослий не викладає. Ставить машину, не заважає, раз на місяць дивиться *що зроблено*, не «що пройдено». Якщо дорослого немає — той самий режим: артефакт[11], не сертифікат.

НМТ/ЗНО з інформатики до цього майже не стосується. Не оптимізувати під нього.

Правила самостійної праці

  • Одиниця прогресу — річ, що працює, не пройдений модуль. Скрипт, сервіс, патч[12], свій shell[13], свій HTTP[14]-сервер.
  • Одна тема, поки не впрешся. Стек[15] не міняти кожні два тижні.
  • Спочатку відтворити руками, потім читати теорію. strace ls[16], потім підручник про syscall[17].
  • Чужий код читати стільки ж, скільки писати. Утиліти coreutils[18], простий демон[19], чужий PR[20].
  • Застрягати — норма. Два–три дні на одній помилці корисніші за десять уроків.
  • ШІ[21] — після власної спроби. Спочатку гіпотеза й артефакт (лог, код, вивід команди), потім модель. Інакше вийде людина, яка не відрізнить правдоподібну нісенітницю від відповіді — саме про це [нотатка 7104](http://notes.ur4uqu.com/?action=view&id=7104).

Етап 0. «Це моя машина» (приблизно 12–14 років, 3–6 місяців)

Мета: термінал[22] не страшний. Файли й процеси — конкретні речі, а не іконки.

Робити:

  • Linux щодня: браузер, школа, фільми — усе.
  • Shotts, *The Linux Command Line* — не «прочитати», а виконувати розділи на своїй машині.
  • [OverTheWire: Bandit](https://overthewire.org/wargames/bandit/) — рівні 0–20. Це umask[23], права на файли й пайпи[24] в ігровій формі.
  • [MIT Missing Semester](https://missing.csail.mit.edu/) — shell, git[25], grep[26], налагодження. Короткий курс, без води.
  • git з першого репозиторію[27]. Навіть для шкільних конспектів.

Проєкти (зробити два–три):

  • Скрипт бекапу[28] домашніх файлів через cron[29].
  • Лічильник слів / розбір лога на bash[30] + awk[31].
  • Свій .bashrc[32]: аліаси[33], prompt[34], ssh-config[35].

Перевірка: ставить пакунок, читає man, лагодить «не працює Wi‑Fi / звук» за логами, не за відео. Мова етапу — bash. Python можна для дрібниць, не як «професію».

Етап 1. «Я щось зробив, цим користуються» (14–16 років, близько року)

Мета: один завершений артефакт плюс C[36] достатньо, щоб система перестала бути магією.

Порядок:

1. C: K&R[37], вправи. Не «C за 21 день».
2. Kernighan & Pike, *The Unix Programming Environment* — написати шматками свої ls / cat / grep.
3. Python або Go[38] — *друга* мова, щоб швидко склеювати. Не замість C.

Проєкти (по черзі, не пакетом):

  • Свій міні-shell: розбір рядка, пайпи, редіректи[39], $PATH[40]. Хто дійшов — уже не «користувач курсів».
  • Бот / сайт / утиліта, якою користується хоча б одна людина крім автора (родина, клас, клуб).
  • Простий HTTP-сервер на C або Go. Сокети[41] — за [Beej’s Guide](https://beej.us/guide/bgnet/).
  • Участь у чужому: issue[42], крихітний PR, переклад, патч.

Паралельно: [nand2tetris](https://www.nand2tetris.org/) (частини 1–2). Збірка комп’ютера від NAND[43] до гри. Не обов’язково до кінця, але ALU[44] + асемблер[45] + VM[46] — сильний клац: «з чого взагалі складається машина».

Перевірка: може пояснити, що роблять fork / exec / pipe[47]. За strace каже, чому програма зависла. Є публічний git з історією довшою за місяць.

Етап 2. «Я розумію машину» (16–18 років, 1.5–2 роки)

Мета: академічна рамка з нотатки 7104. Без цього ШІ звучатиме переконливо і брехатиме.

Порядок (не все одразу):

1. CS:APP[48] і labs[49] (bomb, attack, shell, malloc[50]). Лаби важливіші за розділи.
2. OSTEP[51] — [ostep.org](https://pages.cs.wisc.edu/~remzi/OSTEP/). Процеси, віртуальна пам’ять, файлові системи.
3. Ward, *How Linux Works* — уже як мапа тієї системи, в якій живе.
4. Мережа: Kurose або хоча б TCP/IP[52] своїми руками (свій traceroute[53], свій DNS[54]-запит сирими сокетами).
5. APUE[55] / Kerrisk — довідник, не «прочитати 1500 сторінок».

Проєкти:

  • Свій malloc або своє дерево файлів у userspace[56].
  • Linux From Scratch[57] — один раз: зібрати систему, компілюючи все самому.
  • Контейнер[58] руками: namespaces[59] + cgroups[60], без Docker[61]. Потім Docker стає очевидним.
  • Маленька «розподіленість»: реплікація[62] лога на двох машинах. Потім DDIA[63].

Математика — коли вперся, не заздалегідь. Шкільна алгебра плюс дискретна[64] мірою графів і крипти. Erickson, *Algorithms* — коли знадобляться графи, не «весь КОРМЕН»[65].

Перевірка (портрет із 7104):

  • «З’єднання зависло» → сам дивиться ss / netstat[66], стани TCP[67] (зокрема CLOSE_WAIT[68]), а не пише в чат «не працює мережа».
  • Відповідь моделі звіряє з CAP[69] / OSI[70] / обмеженнями ядра, а не з «звучить розумно».
  • Може прочитати чужий YAML[71], лог або стектрейс[72] цілком і виокремити причину.

Етап 3. Розвилка, не «фулстек + DevOps + ML»

Після етапу 2 — одна вузька практика на рік. Інакше вічна вода.

| Вектор | Що робити руками | Що читати |
|---|---|---|
| Системи / DevOps[73] | Свій сервер, CI[74], бекапи, інциденти. Спочатку cgroup і iptables[75], потім Kubernetes[76] | Nemeth, Kerrisk; Kubernetes — як наслідок, не як вхід |
| Backend[77] | Сервіс із БД[78], чергою, деплоєм[79], навантаженням | DDIA, плюс одна мова глибоко |
| Низький рівень | Драйвер, ядро, ембед[80] | Love, *Linux Kernel Development*, потім сирці |

«Фулстек»[81] і ML[82] як мета з нуля — шум. Відкритий код корисніший за стажування «принеси каву», але живий прод[83] із користувачами б’є обидва. Перший найм — побічний ефект портфоліо етапів 1–2, не мета етапу 0.

Як працювати з ШІ, щоб не виростити порожню оболонку

З ~15 років модель буде поруч. Правила, інакше фундамент не виникне:

1. Спочатку своя гіпотеза й артефакти (команда, лог, код).
2. У запит — версії, ОС, точний traceback[84], бажаний результат, обмеження.
3. Відповідь не копіювати: прогнати, зламати, спитати «де це суперечить man 2 bind[85]».
4. На етапах 0–1 заборона: «напиши мені shell/сервер цілком». Дозволено: «ось 20 рядків, чому waitpid[86] повертає −1».
5. Раз на тиждень — день без ШІ. Якщо без нього не можеш прочитати man і написати цикл — залежність уже є.

Це прямий наслідок нотатки: модель підсилює того, хто вже вміє поставити точне питання і перевірити відповідь.

Точки перевірки (замість диплома)

Раз на пів року, за фактами:

  • Є репозиторій, який живе довше ніж три місяці.
  • Є річ, якою користується хтось іще.
  • Може підняти сервіс з нуля на чистій машині, з пам’яті та man.
  • Може прочитати man-сторінку і сирець утиліти.
  • Може розповісти останню зламану штуку: симптом → гіпотези → як спростував → фікс.
  • Англійська: читає RFC[87] і man без перекладу (писати гарно не обов’язково).

Якщо пів року лише «дивлюсь курси» — шлях зламано. Змінити одиницю обліку на артефакт.

Чого не робити

  • Tutorial hell[88]: 40 курсів, 0 своїх репозиторіїв.
  • Лише Python до офера. Для вебу вистачить, для інженера з 7104 — дірка в розумінні машини.
  • Kubernetes і хмара до процесів, мережі й дисків.
  • Олімпіадне програмування як *єдина* практика. Корисне для мислення, не замінює системи.
  • Зміна стека щомісяця.
  • Сертифікати як мета.
  • «Спочатку вся теорія, потім колись практика».

Термін

За 8–12 годин на тиждень паралельно зі школою: 4–6 років до рівня «молодший інженер, якому можна дати прод і ШІ». Прискорити книжками не можна. Можна не гальмувати водою.

Коротко: Linux як дім → речі, що працюють в інших → C і нутрощі машини → одна спеціалізація → ШІ як підсилювач, не як протез.

---

Зноски

1. ІТшник — фахівець з інформаційних технологій: програміст, системний інженер, адміністратор. Не посада з вакансії, а людина, яка розуміє, як улаштовані комп’ютери й мережі.
2. Python — мова програмування з простим синтаксисом. Добра, щоб швидко щось зробити; погана як *єдина* мова, якщо мета — розуміти систему.
3. ОС — операційна система. Програма, що керує залізом і запускає решту програм. Linux, Windows, macOS — це ОС.
4. Dual-boot (подвійне завантаження) — на одному комп’ютері стоять дві ОС, під час увімкнення обираєш, яку запустити. Типовий шлях: Linux поруч із Windows, не «колись потім».
5. Debian — суворий, стабільний дистрибутив Linux. Добра перша «доросла» система.
6. Fedora — дистрибутив Linux ближче до свіжих версій програм. Теж нормальний вибір для щоденної машини.
7. man (manual) — вбудовані довідкові сторінки Linux/UNIX. Пишеш man ls, man 2 fork. Основний підручник, не блог.
8. GitHub — сайт, де зберігають git-репозиторії й спільно пишуть код. «Публічний git» найчастіше означає «лежить на GitHub / GitLab / аналогу».
9. Raspberry Pi — дешевий одноплатний комп’ютер. Зручно як сервер, який не шкода зламати.
10. НМТ / ЗНО — вступні іспити після школи в Україні (національний мультипредметний тест / зовнішнє незалежне оцінювання). Іспит з інформатики майже не перетинається з інженерним фундаментом.
11. Артефакт — конкретний результат: репозиторій, скрипт, сервіс, патч. Не «я дивився курс».
12. Патч — набір змін у коді, який лагодить або додає поведінку. Форма участі в чужому проєкті.
13. Shell (оболонка) — програма, в якій вводиш команди (bash, zsh). «Написати свій shell» — зробити спрощений командний інтерпретатор.
14. HTTP (HyperText Transfer Protocol) — протокол, на якому працює веб: браузер просить сторінку, сервер відповідає.
15. Стек — набір технологій, якими розв’язуєш задачу (мова + БД + деплой). «Міняти стек» = кидати Python/Linux і стрибати в «модний» набір кожні два тижні.
16. strace ls — команда strace показує, які системні виклики робить програма. ls — «показати файли». Разом: побачити, як ls насправді читає каталог.
17. Syscall (system call, системний виклик) — запит програми до ядра ОС: відкрити файл, створити процес, надіслати пакет у мережу. Межа між «твоїм кодом» і «системою».
18. coreutils — базові утиліти Linux: ls, cp, mv, cat, sort. Їхні сирці — добре читання.
19. Демон (daemon) — програма, що працює у фоні: вебсервер, cron, sshd. Не «вірус», а звичайний сервіс.
20. PR (Pull Request / Merge Request) — пропозиція влити твої зміни в чужий репозиторій. Мінімальна одиниця «я поучаствував у відкритому коді».
21. ШІ — штучний інтелект. Тут: мовні моделі на кшталт ChatGPT / Claude / Grok, які пишуть код і відповідають на питання.
22. Термінал — текстове вікно, де вводиш команди. Не «хакерський екран», а основний спосіб роботи з Linux.
23. umask (user file-creation mode mask) — маска прав: які права *не* отримають нові файли. Типове питання людини, яка вже жила в UNIX, а не пройшла курс.
24. Пайп (pipe, |) — конвеєр: вивід однієї команди одразу стає вводом наступної. cat log | grep error | wc -l.
25. git — система контролю версій. Пам’ятає історію змін коду, дозволяє гілкуватися й зливати роботу.
26. grep — пошук по тексту (у файлах, у логах). Базова навичка «знайти, де зламалось».
27. Репозиторій (repo) — тека проєкту під git: код + історія.
28. Бекап (backup) — резервна копія. Скрипт, який копіює важливі файли так, щоб їх можна було відновити.
29. cron — планувальник Linux: «запусти це щодня о 3:00».
30. bash (Bourne Again Shell) — найзвичніший командний інтерпретатор у Linux. Ним пишуть скрипти етапу 0.
31. awk — мова для розбору текстових таблиць і логів. Один рядок awk часто замінює сторінку коду.
32. .bashrc — файл налаштувань bash, який виконується під час старту оболонки. Сюди кладуть аліаси й вигляд запрошення.
33. Аліас (alias) — коротке ім’я для довгої команди. alias ll='ls -la'.
34. Prompt — запрошення в терміналі, рядок перед курсором (user@host:~$). Налаштовується, несе підказки (гілка git, помилка попередньої команди).
35. SSH (Secure Shell) + ssh-config — протокол входу на віддалену машину і файл ~/.ssh/config зі зручними іменами хостів, ключами, портами.
36. C — мова, якою написані ядро Linux, більшість UNIX-утиліт і системні бібліотеки. Потрібна не щоб «нею працювати», а щоб бачити, як програма розмовляє з ОС.
37. K&R — Brian Kernighan і Dennis Ritchie, автори книжки *The C Programming Language*. «Вчити C за K&R» = за цією тонкою книжкою, з вправами.
38. Go (Golang) — мова від Google. Ближча до систем, ніж Python: статична, простий деплой, добрі мережі. Зручна друга мова після C.
39. Редірект (>, <, 2>) — спрямувати ввід/вивід команди у файл або з файла, а не на екран.
40. $PATH — список каталогів, де shell шукає програми. Якщо команди «немає», часто її каталог просто не в PATH.
41. Сокет (socket) — програмний кінець мережевого з’єднання. HTTP-сервер = слухає сокет і відповідає клієнтам.
42. Issue — тікет у репозиторії: баг, ідея, питання. Можна закрити навіть без коду: уточнити, відтворити, запропонувати фікс.
43. NAND — логічний елемент «І-НІ». У nand2tetris з нього збирають увесь комп’ютер: ідея «складне = комбінація простого».
44. ALU (Arithmetic Logic Unit) — арифметико-логічний пристрій. Частина процесора, яка додає, порівнює, робить логічні операції.
45. Асемблер — мова, майже один-в-один відповідна інструкціям процесора. Нижче за C, вище за сирі байти.
46. VM тут — віртуальна машина nand2tetris: проміжний шар між мовою високого рівня і залізом. Не плутати з VirtualBox.
47. fork / exec / pipe — системні виклики UNIX. fork — клонувати процес; exec — замінити програму в процесі іншою; pipe — зв’язати два процеси каналом. На цьому стоїть shell.
48. CS:APP — *Computer Systems: A Programmer’s Perspective* (Bryant, O’Hallaron). Як програма бачить машину: байти, пам’ять, процеси, лінкування, мережа.
49. Labs (лабораторні) CS:APP — практичні завдання: bomb (розміновувати бінарник), attack (переповнення буфера), shell (написати оболонку), malloc (свій розподільник пам’яті). У них книжка «в’їжджає».
50. malloc (memory allocation) — функція купи: «дай N байт». Написати свій malloc = зрозуміти, як програма взагалі отримує пам’ять.
51. OSTEP — *Operating Systems: Three Easy Pieces*. Безкоштовний підручник з ОС: віртуалізація, конкурентність, персистентність (диск/файли).
52. TCP/IP — стек інтернету. IP доставляє пакет до машини, TCP робить надійний потік (сайти, SSH). «Своїми руками» = зібрати пакет, а не викликати готову бібліотеку.
53. traceroute — показує шлях пакета вузлами мережі. Написати свій — зрозуміти TTL і ICMP.
54. DNS (Domain Name System) — «імена в адреси»: google.com142.250.x.x. Сирий DNS-запит = UDP-пакет за правилами, без dig.
55. APUE — *Advanced Programming in the UNIX Environment* (Stevens / Rago). Довідник системних викликів і прийомів UNIX.
56. Userspace (простір користувача) — усе, що не ядро: твої програми. Ядро — kernelspace. «Файлове дерево в userspace» — емуляція каталогів без написання драйвера.
57. LFS / Linux From Scratch — книжка-ритуал: зібрати Linux, компілюючи кожен пакунок самому. Після цього boot, бібліотеки й залежності перестають бути магією.
58. Контейнер — ізольований процес (не легка «віртуалка»): свої процеси, мережа, файли, ліміти. Docker — зручна обгортка над цим.
59. Namespaces (простори імен) — механізм ядра Linux: у процесу свій вигляд мережі, процесів, файлів. Цеглина контейнерів.
60. cgroups (control groups) — механізм ядра: ліміти CPU, пам’яті, I/O для групи процесів. Друга цеглина контейнерів.
61. Docker — інструмент запуску контейнерів. Має сенс *після* namespaces/cgroups, інакше це магічна команда docker run.
62. Реплікація — копія даних на другу машину, щоб переживати відмову першої. Мінімальний досвід «розподілених систем».
63. DDIA — *Designing Data-Intensive Applications* (Kleppmann). Реплікація, партіції, транзакції, консенсус — робоча рамка, не набір модних слів.
64. Дискретна математика — множини, логіка, графи, комбінаторика. Потрібна ІТшнику шматками, не як окремий «скласти курс».
65. КОРМЕН (CLRS) — Cormen, Leiserson, Rivest, Stein, *Introduction to Algorithms*. Товстий академічний том. Цілком школяреві не потрібен.
66. ss / netstat — команди: які сокети відкриті, в якому стані, хто слухає порт. ss новіша, netstat частіше трапляється в старих інструкціях.
67. TCP-стани — етапи життя з’єднання: LISTEN, ESTABLISHED, TIME_WAIT, CLOSE_WAIT тощо. За ними видно, хто не закрив зв’язок і з якого боку проблема.
68. CLOSE_WAIT — стан TCP: «віддалена сторона закрила, а наша програма ще не закрила сокет». Приклад точного терміна замість «з’єднання зависло».
69. CAP (Consistency, Availability, Partition tolerance) — теорема: при розриві мережі не можна одночасно гарантувати і строгу узгодженість даних, і доступність. Рамка, щоб ловити брехню про «і консистентно, і завжди доступно».
70. OSI — семирівнева модель мережі (фізичний → канальний → мережевий → транспортний → сеансовий → представлення → прикладний). Потрібна не щоб зубрити номери, а щоб розуміти, на якому шарі проблема (кабель / IP / TCP / HTTP).
71. YAML — формат конфігів (Docker Compose, Kubernetes, Ansible). Чутливий до відступів; «переказ своїми словами» якраз губить поломку.
72. Стектрейс (stack trace) — ланцюжок викликів функцій у момент помилки. Читати його цілком — навичка, без якої ШІ й чати ворожать.
73. DevOps — практика, де розробка й експлуатація не розведені: код, збірка, викладка, моніторинг, інциденти. Не синонім «Kubernetes» і не назва курсу.
74. CI (Continuous Integration) — автоматична перевірка коду за кожної зміни: тести, збірка, лінтер. «Свій CI» = не сподіватися, що «в мене на ноуті працювало».
75. iptables (і новіший nftables) — фаєрвол Linux: які пакети пускати, куди прокидати. Мережа «руками» до хмарних кнопок.
76. Kubernetes (k8s) — оркестратор контейнерів: сам запускає, лагодить, масштабує сервіси. «k8s» = 10 літер між K і s. Вчити до розуміння процесів і мережі — вода.
77. Backend — серверна частина: API, БД, черги, бізнес-логіка. Те, чого не видно в браузері, але без чого сайт не працює.
78. БД — база даних (PostgreSQL, SQLite тощо). Місце, де стан живе довше, ніж процес.
79. Деплой (deploy) — викладка програми на машину, де нею користуються. «Написано» ≠ «крутиться в людей».
80. Ембед (embedded, вбудовані системи) — програми на пристроях не-ПК: роутер, контролер, плата. Близько до заліза й ядра.
81. Фулстек (full-stack) — і інтерфейс, і сервер однією людиною. Як *мета навчання з нуля* розмиває фундамент: занадто багато поверхневих шарів одразу.
82. ML (machine learning, машинне навчання) — моделі, що вчаться на даних. Окрема професія. Не обов’язковий пункт «підготувати ІТшника».
83. Прод (production) — середовище, де системою користуються живі люди. Ламається болісніше, вчить швидше за підручник.
84. Traceback — те саме сімейство, що стектрейс: повний друк помилки з номерами рядків. У запит до ШІ кладуть його, а не «в мене не працює».
85. man 2 bind — сторінка розділу 2 (системні виклики) про bind: прив’язати сокет до адреси/порту. Зразок «перевірити відповідь моделі за першоджерелом».
86. waitpid — системний виклик: батьківський процес чекає завершення дочірнього. Повернення −1 означає помилку; причина в errno. Типове питання «після власної спроби».
87. RFC (Request for Comments) — документи, в яких описані інтернет-протоколи (TCP, HTTP, DNS…). Читати шматками, коли робиш протокол руками.
88. Tutorial hell («пекло туторіалів») — дивитися уроки один за одним і ніколи не зробити свою річ, яка може зламатися. Головний спосіб не стати ІТшником, зображуючи навчання.