Про що курс, як побудований семестр і що від тебе очікується
Системне програмування вивчає програмне забезпечення, яке працює з ресурсами обчислювальної машини безпосередньо: процесами й потоками, пам'яттю, файлами, мережевими сокетами, набором інструкцій процесора. На відміну від прикладного програмування, де інтерпретатор, збирач сміття або браузер приховують ці деталі, системний програміст має розуміти, що відбувається на кожній межі між його кодом і машиною — і вміти це перевірити.
Слово «перевірити» тут головне. Курс не просить вірити на слово ні лекції, ні документації: майже кожне твердження в ньому супроводжується командою, яка це твердження або підтверджує, або зруйнує. Якщо лекція каже, що контейнер — це звичайний процес, у лабораторній ти побачиш його номер у списку процесів хоста. Якщо каже, що компілятор не дасть зіпсувати пам'ять, ти напишеш код, який він відмовиться збирати, і прочитаєш причину відмови.
Курс побудований навколо трьох таких меж:
Три межі — це три модулі, три модульні контролі і три різні відповіді на одне питання: що насправді відбувається, коли моя програма запускається.
Ця дисципліна не вимагає попереднього досвіду з Linux, Docker чи Rust. Вона вимагає готовності набирати команди й читати те, що машина відповідає. Якщо термінал для тебе новий — цей розділ і є твій нульовий кілометр; далі повертайся до нього, коли щось видається незрозумілим.
Термінал — це вікно, у якому програма-оболонка (bash) чекає від тебе рядок, запускає названу в ньому програму й друкує те, що та вивела. Усе. Ніякої магії: те саме, що клік по іконці, тільки іменем замість картинки — і тому це можна записати, повторити й перевірити.
Рядок команди складається з трьох частин, і їх варто розрізняти з першого дня:
docker run --rm -it ubuntu:24.04 bash
│ │ │ └── аргумент: що запустити всередині
│ │ └── аргумент: з якого образу
│ └── прапорці: як саме запускати
└── програма й підкоманда: що робити
- або -- і змінюють поведінку. Коротка форма -i і довга --interactive — часто те саме. Прапорці можна склеювати: -it = -i -t.Три речі, які треба знати про те, «де ти зараз»:
pwd друкує шлях до поточного каталогу — того, у якому команда шукатиме файли, якщо не сказано інакше;ls показує, що в цьому каталозі лежить (ls -la — з правами й розмірами, разом із прихованими файлами, чиї імена починаються з точки);cd переходить в інший каталог, cd .. — на рівень вище.Половина помилок першого тижня — це не помилки, а робота в іншому каталозі. Коли команда каже «немає такого файлу», перше, що варто набрати, — pwd і ls.
Довідка є в самій машині, і в цьому курсі вона несуча. Не «якщо не знайдеш у пошуку», а перше джерело:
cat README.md # інструкція до роботи — прямо в терміналі
man ls # повний посібник; вихід — клавіша q
ls --help # коротко, найчастіше вистачає саме цього
docker run --help # довідка з підкоманди
man і less відкриваються на весь екран і виходять клавішею q — це найчастіше «залипання» новачка в терміналі.
Як читати помилку. Машина майже ніколи не пише «щось не так». Вона пише, де саме й що саме, і читати це треба знизу вгору або зверху вниз залежно від інструмента, але завжди — цілком. Компілятор Rust, наприклад, у більшості випадків одразу пропонує виправлення. Три звички, які економлять години:
help:, note:) кажуть, як це виправити. Перший рядок — діагноз, останній — рецепт.E0382, exit code 125, permission denied) — це стабільний ключ, за яким її знаходять і в довіднику курсу, і в документації.На сайті курсу є розділ «Коли щось пішло не так» — довідник, зібраний з усіх лабораторних: помилка, чому вона виникає, що зробити. Там працює пошук: вставляєш код помилки — отримуєш свій випадок.
Про копіювання команд. Команди в матеріалах можна і треба копіювати — це не списування, а нормальна робота. Але два рядки копіювати не варто: ті, що починаються з sudo, і ті, що містять rm -rf. Перші діють від адміністратора, другі видаляють без запитань і без відміни. Обидва в курсі трапляються — і в обох випадках у тексті сказано, що саме вони роблять.
Обсяг — 3 кредити ЄКТС (90 годин): 20 годин лекцій, 20 годин лабораторних робіт, 50 годин самостійної роботи. Форма контролю — залік, накопичувальний: підсумок формують рівні, досягнуті в десяти лабораторних роботах, і результати трьох модульних контролів.
Заняття — щоп'ятниці, одна пара на тиждень. 4 вересня — вступне заняття (ця лекція): дисципліна, порядок роботи, середовище. З 11 вересня лекції й лабораторні чергуються тижнями: Лекція 1 — 11 вересня, Лабораторна 1 — 18 вересня, Лекція 2 — 25 вересня, Лабораторна 2 — 2 жовтня і так далі. Матеріали лабораторної відкриваються у п'ятницю її лекції, сама пара — наступної п'ятниці, а здати роботу можна ще два тижні після пари.
Що змінилося після 4 вересня. На цьому занятті було сказано, що курс закінчується в грудні: десята лабораторна й залік — 4 грудня. Це вже не так, і чесніше сказати прямо, ніж тихо замінити числа. Тарифікація дає 20 годин лекцій і 20 годин лабораторних — це двадцять пар, а не десять; при одній парі на тиждень десять тем займають двадцять п'ятниць, і курс переходить у наступний семестр. Тому Лабораторна 10 — 5 лютого 2027, а залік — 12 лютого 2027. Точні дати відкриття й дедлайнів — у розкладі на сторінці курсу: він рахується з ланцюжка занять і сам переставляється, коли посеред семестру трапляється свято.
Лекційне заняття триває дві години й складається з презентації теми (з живим демо в терміналі) та самостійної роботи над двома темами СРС, що відповідають цій лекції. Матеріали СРС публікуються в Google Classroom разом із лекцією. СРС окремо не оцінюється: перша тема готує до захисту рівня 2, друга — до розширення рівня 3 відповідної лабораторної роботи. Тобто самостійна робота — не паралельна колія, а підготовка до оцінки, яку ти хочеш отримати.
Модульні контроли — 30 хвилин, на першій парі після завершення модуля: 23 жовтня 2026 (модуль 1, на парі Лекції 4), 18 грудня 2026 (модуль 2, на парі Лекції 8) і 12 лютого 2027 (модуль 3, того самого дня, що й залік). Відкриваються о 08:30 за київським часом; пише кожна група на своїй парі.
Лабораторна робота має три рівні, і рівень — це оцінка. Ти обираєш його сам, вищий включає виконання попередніх.
| Рівень | Оцінка | Що робиш | Хто перевіряє |
|---|---|---|---|
| 1 | «3» | базове завдання за покроковою інструкцією з очікуваним виводом | автотести за тегом здачі |
| 2 | «4» | те саме + пояснюєш механізм і показуєш наживо | викладач, усний захист |
| 3 | «5» | розширення за контрактом: автоматизація, оптимізація, власне рішення | викладач, усний захист |
Три речі, які варто зрозуміти одразу, бо вони визначають стратегію на семестр:
Варіант завдання залежить від твого номера в списку групи (N % 4 або N % 3, у кожній роботі сказано, як саме). Варіант обов'язково вказується на початку REPORT.md — без нього робота не приймається, бо неможливо перевірити, чи те, що ти зробив, відповідало умові.
Кожна лабораторна живе у власному репозиторії на GitHub, який курс створює тобі на прийняття завдання:
sp-<група>-labNN-<логін>/ 11 таких за семестр, по одному на роботу
<проєкт>/ код рівня 1
REPORT.md звіт: варіант, вивід кроків, відповіді на питання
Рівні 2 і 3 дають опцію працювати не з нуля, а на ядрі, яке росте з першої роботи — це другий репозиторій, vtfk-sid. Його ти створюєш один раз, на першій лабораторній, зі шаблону, і він живий до десятої:
vtfk-sid/ один репозиторій на семестр, твій власний
core/capsule/ контейнер: Dockerfile, deploy.sh (ЛР1–3)
core/sidkit/ crate на Rust, який росте помодульно (ЛР4–7)
core/wasm/ переносне ядро (ЛР8–10)
Чому два, а не один: ім'я репозиторію лабораторної — це первинний ключ, за яким конвеєр перевірки розуміє, хто і яку роботу здав. Один репозиторій на семестр цю відповідь зробив би неможливою. Тому машинна частина (рівень 1) живе в репозиторії роботи, а наскрізна (рівні 2–3) — у твоєму, і здається розмовою, а не тестами. Це не послаблення: рівні 2–3 і раніше ніколи не перевірялися машиною.
Хто не веде ядра — не втрачає нічого: кожна умова рівнів 2–3 має другу версію, «на референсі». Готовий знімок попередньої ночі лежить у відкритому репозиторії курсу, і оцінка за обидві версії однакова.
Усі роботи виконуються в підготовленому контейнері розробника з попередньо встановленими інструментами відповідного модуля (Ubuntu 24.04 + Docker Engine; Rust 1.79 + Cargo; WABT, Node.js, clang, wasm-pack). Опис середовища кожної роботи зафіксований у конфігурації курсу і використовується для ініціалізації робочого простору — у кабінеті курсу або в GitHub Codespaces.
Практично це означає: ти не встановлюєш нічого. Відкриваєш роботу — середовище піднімається з уже потрібними інструментами саме цієї роботи. Однакове вдома, в коледжі й з будь-якого пристрою, де є браузер. Контейнер можна прибрати в будь-який момент — код лежить у репозиторії, а не в контейнері.
Перша перевірка, з якої варто починати кожне заняття, — дві команди й один файл:
cat /etc/os-release | head -2 # яка це система
docker version # чи є інструмент цього модуля
cat README.md # що саме треба зробити
Якщо це працює — середовище готове, і далі все за інструкцією лабораторної. Якщо не працює — це нормальна ситуація першого тижня, і вона розібрана в Лабораторній 0.
Здача рівня 1 — тегом submit/labNN у репозиторії лабораторної. Послідовність завжди та сама:
git status # подивитися, що змінилося
git add . && git commit -m "lab01: рівень 1" # записати зміни в історію
git tag submit/lab01 && git push --tags # здати
Що робить кожен рядок:
git status показує, які файли ти змінив і чи git їх бачить. Найчастіша причина «я здав, а тестів немає» — файл не був доданий.git add . позначає всі зміни в поточному каталозі, git commit записує їх в історію під повідомленням.git tag submit/lab01 вішає на цей коміт іменну позначку. Тег — це і є «я здаю». Формат саме submit/lab01, з префіксом; просто lab01 конвеєр не побачить.git push --tags відправляє коміти й теги на GitHub.Далі за тег береться автоматика: запускаються автотести рівня 1, і результат публікується релізом у тому ж репозиторії. Побачити його можна там само, на GitHub, — окремо питати нікого не треба.
Повторна здача — наступним вільним тегом:
git tag submit/lab01-2 && git push origin submit/lab01-2
Це нормальний, передбачений шлях: перший тег означав «здаю», наступний номер — «здаю кращу версію». Старий тег не переставляється; яка це робота, перевірка визначає за іменем репозиторію, а не тега. Кількість спроб не обмежена, доки відкритий модуль.
REPORT.md — обов'язкова частина рівня 1, а не формальність. У ньому: варіант, вивід команд кожного кроку (саме твій вивід, не з методички) і відповіді на контрольні питання. Звіт — це те, з чим ти приходиш на захист рівнів 2–3, тому писати його краще під час роботи, а не після.
Порядок здачі, перевірка середовища й робота з довідкою (man, --help, cat README.md) описані в Лабораторній 0, яка відкрита протягом усього семестру й не оцінюється. Практичних кроків там немає навмисно: ЛР0 — це читання, а не робота.
Залік накопичувальний: окремого «складання» в кінці немає, є сума того, що зроблено за семестр. Підсумок формують два джерела: рівні, досягнуті в десяти лабораторних роботах, і три модульні контролі. Тому головна стратегічна порада на семестр звучить нудно, але вона правдива: закривати рівень 1 у тиждень своєї роботи, а не в останній тиждень семестру. Десять робіт за останні два тижні семестру не закриваються.
Залік — 12 лютого 2027, 45 хвилин, чотири варіанти по 25 питань; того самого дня пишеться модульний контроль 3. Десята лабораторна на той час уже відпрацьована на парі 5 лютого, а здати її можна до 19 лютого 2027 — тобто на тиждень пізніше за сам залік.
Сертифікати з профільних курсів (Docker, Rust) можуть зараховуватись як рівень 2 відповідної лабораторної — за процедурою, описаною в силабусі.
Репозиторій твоєї лабораторної приватний — його бачиш ти й викладач, і більше ніхто. Це не «щоб ніхто не списав», а технічна необхідність: автотести курсу викликають спільний воркфлоу, що живе в закритому репозиторії викладача, а GitHub не дозволяє робити це з публічного репозиторію. 4 вересня на цьому занятті було сказано протилежне — «репозиторії публічні, роботи одні одних видно». Так планувалося заради безкоштовних хвилин автотестів; 17 вересня, на першій живій здачі, з'ясувалося, що з публічним репозиторієм автогрейдер просто не запускається, і рішення змінили.
Для рівня 1 це нічого не змінює. Рівень 1 — покрокова інструкція з очікуваним виводом; він однаковий у всіх за побудовою, і списувати там нічого.
Для рівнів 2 і 3 не змінюється теж — і це головне, що варто забрати з цього розділу. Оцінку «4» і «5» дає розмова, а не наявність коду. Це правило ніколи не трималося на тому, видно роботу сусідові чи ні: рівні 2 і 3 живуть у твоєму власному vtfk-sid, якого автотести не бачать узагалі, і єдиний спосіб їх зарахувати — пояснити механізм і показати роботу наживо. Код, який ти не можеш пояснити, не приносить оцінки — незалежно від того, звідки він узявся.
ШІ-інструменти дозволені як помічник: пояснити, підказати, перевірити, знайти помилку. Використання зазначається у звіті. Не дозволені як автор роботи, яку ти не можеш пояснити, — і це та сама межа, що й у попередньому абзаці, а не окреме правило.
Кожна лабораторна робота має дві версії з ідентичними вимогами: сюжетну (наскрізна історія, у яку вплетені технічні відомості — основна для студента) та академічну (методична форма: мета, теорія, порядок виконання, критерії). Перемикач — угорі кожної сторінки. Лекції та конспекти — академічні.
Що ще є на кожній сторінці й навіщо:
Матеріали відкриваються за розкладом: лабораторна — у п'ятницю своєї лекції. Лекція 0 і Лабораторна 0 відкриті завжди — з них можна починати сьогодні.
Конкретний список, у порядку виконання:
add → commit → tag → push не була новиною. Ставити пробний тег поки нема де: репозиторій створюється в момент, коли ти приймаєш завдання ЛР1.Якщо після цього списку залишилося питання «а з чого мені почати вчити Linux» — правильна відповідь: ні з чого окремо. Курс уводить кожен інструмент у момент, коли він уперше потрібен, і кожна лекція модуля 1 починається з того, що вважає нульовим досвідом. Досить приходити й набирати команди.
Показати сайт наживо паралельно зі слайдами
Одна ідея на весь семестр: межа. Усі три модулі — про те, де вона проходить і хто її охороняє
Показати на сайті три «стрічки» модулів
Цифри — за тарифікацією 2026/27; Лекція 0 і Лабораторна 0 — поза сіткою годин, додаткові матеріали
СРС має подвійний зв'язок: подається з лекцією, готує до захисту і розширення лабораторної
| № | Тема | Модуль |
|---|---|---|
| Л1 | Три межі курсу: процес, адресний простір, системні виклики | М1 |
| Л2 | Образ як шари, Dockerfile, кеш, багатоетапна збірка | М1 |
| Л3 | Простори імен, групи керування (cgroups), привілеї | М1 |
| Л4 | Чому програми псують пам'ять | М2 |
| Л5 | Володіння і запозичення | М2 |
| Л6 | Зрізи, часи життя і типи без null | М2 |
| Л7 | Result, ? і власні типи помилок | М2 |
| Л8 | WebAssembly як переносний асемблер | М3 |
| Л9 | Асемблер x86-64 | М3 |
| Л10 | Rust у WASM, межа з host-середовищем | М3 |
Кожна лекція — одна ідея й одне живе демо; слайди й конспект — на сайті
| № | Академічна назва | Сюжетна назва | М |
|---|---|---|---|
| ЛР1 | Контейнер розробника й огляд просторів імен | «Ізоляційна Капсула» | М1 |
| ЛР2 | Dockerfile з багатоетапною збіркою і порівнянням розмірів | «Кібер-Дієта» | М1 |
| ЛР3 | Два контейнери разом і ізольована мережа | «Сліпий Канал» | М1 |
| ЛР4 | Перший проєкт на Cargo з юніт-тестом | «Кування Відмички» | М2 |
| ЛР5 | Набір програм, що не компілюються (borrow checker) | «Мертвий Лог» | М2 |
| ЛР6 | Структури і перелічення без null | «Архітектура Ворога» | М2 |
| ЛР7 | Читання файлу з обробкою помилок | «Мінне Поле» | М2 |
| ЛР8 | Модуль на WAT вручну | «Пряма Ін'єкція» | М3 |
| ЛР9 | Той самий алгоритм у двох асемблерах | «Розтин Системи» | М3 |
| ЛР10 | Ядро на Rust у WASM на сторінці з відтворюваною збіркою | «Звільнення» | М3 |
Кожна ЛР має сюжетну й академічну версію з однаковими вимогами; три рівні → «3» / «4» / «5»
| № | Тема | До якої ЛР і рівня готує |
|---|---|---|
| СРС 01 | Простори імен Linux (PID, NET, MNT, UTS, IPC, USER): що ізолює кожен | ЛР1 · рівень 2 → «4» |
| СРС 02 | Групи керування cgroups v2: обмеження CPU та пам'яті контейнера | ЛР1 · рівень 3 → «5» |
| СРС 03 | OverlayFS і шари образу: як влаштовано об'єднану файлову систему | ЛР2 · рівень 2 → «4» |
| СРС 04 | Відтворюваність збірки і довіра до образу (digest, pin версій) | ЛР2 · рівень 3 → «5» |
| СРС 05 | Мережі Docker (bridge/none/host) і службове DNS між контейнерами | ЛР3 · рівень 2 → «4» |
| СРС 06 | Керування секретами: env проти файлів проти docker secrets | ЛР3 · рівень 3 → «5» |
Виконуються на 2-й годині відповідної лекції; окремо не оцінюються
| № | Тема | До якої ЛР і рівня готує |
|---|---|---|
| СРС 07 | Модель володіння Rust проти збирача сміття і ручного керування пам'яттю | ЛР4 · рівень 2 → «4» |
| СРС 08 | Екосистема crates.io, Cargo.toml/Cargo.lock і семантичне версіонування залежностей | ЛР4 · рівень 3 → «5» |
| СРС 09 | Часи життя (lifetimes) у сигнатурах функцій: що саме перевіряє компілятор | ЛР5 · рівень 2 → «4» |
| СРС 10 | Rc | ЛР5 · рівень 3 → «5» |
| СРС 11 | Алгебраїчні типи даних (enum) і вичерпне зіставлення зі зразком (match) | ЛР6 · рівень 2 → «4» |
| СРС 12 | Патерн «зробити некоректний стан непредставним» (make illegal states unrepresentable) | ЛР6 · рівень 3 → «5» |
| СРС 13 | Result<T, E> проти panic!: коли доречна відновна відмова, а коли зупинка програми | ЛР7 · рівень 2 → «4» |
| СРС 14 | Власні типи помилок і трейт std::error::Error: Display, Debug, Box | ЛР7 · рівень 3 → «5» |
Виконуються на 2-й годині відповідної лекції; окремо не оцінюються
| № | Тема | До якої ЛР і рівня готує |
|---|---|---|
| СРС 15 | Стекова машина WebAssembly і структура текстового формату .wat | ЛР8 · рівень 2 → «4» |
| СРС 16 | Лінійна пам'ять WASM і межі безпеки пісочниці | ЛР8 · рівень 3 → «5» |
| СРС 17 | Угоди виклику (calling conventions) x86-64: System V AMD64 ABI | ЛР9 · рівень 2 → «4» |
| СРС 18 | Інструменти дизасемблювання: objdump та wasm-objdump, синтаксис AT&T проти Intel | ЛР9 · рівень 3 → «5» |
| СРС 19 | Межа Rust↔JS через wasm-bindgen: маршалінг типів і виклик з JavaScript | ЛР10 · рівень 2 → «4» |
| СРС 20 | Відтворювані збірки Rust→WASM і цілісність ланцюга постачання (supply chain) | ЛР10 · рівень 3 → «5» |
Виконуються на 2-й годині відповідної лекції; окремо не оцінюються
Перемикач — угорі кожної сторінки; вимоги ідентичні
СРС має подвійний зв'язок: до лекції (коли робимо) і до лабораторної (навіщо робимо)
Підкреслити: «3» — це вже робоча, перевірена автотестами лабораторна, а не «заради галочки»
Демо: відкрити середовище ЛР1, набрати cat /etc/os-release і docker version
cat /etc/os-release | head -2
docker version
cat README.md # інструкція до роботи — прямо в терміналі
docker run --help # довідка з будь-якої командиЯкщо це працює — середовище готове; далі все за інструкцією лабораторної
Показати на сайті Лабораторну 0 — там покроково, з командами git; ядро — наступний слайд
Рівень 1 ніколи не залежить від попередніх робіт; ядро — це опція для «4» і «5»
git add . && git commit -m "lab01: рівень 1"
git tag submit/lab01 && git push origin submit/lab01
# повторна здача після покращень — наступний вільний номер:
git tag submit/lab01-2 && git push origin submit/lab01-2Тег — це «я здаю». Наступний номер — «я здаю кращу версію»
Показати ЛР1 у двох версіях і блок команд; QR — сайт відкриваємо просто зараз
РН17/ЗК9: обґрунтований вибір цифрових інструментів і ШІ з дотриманням доброчесності
Повний список — розділ «Джерела» робочої програми
submit/lab01, а на дні голопроєктора в Лабораторній 0 вигравіювано C1D — шістнадцяткове число, яке дорівнює 3101. Запам'ятай його: воно трапиться в курсі не раз.Кожна команда терміналу з цієї сторінки — одним реченням. Позначка нове — команда зустрічається в курсі вперше; далі вважаємо її знайомою.
catнове/proc/....headновеhead -5 — перші п'ять).docker versionновеdockerновеdocker <підкоманда> --help — довідка).docker runновеdocker run -it ubuntu:24.04 bash — інтерактивно з терміналом; -d — у фоні; --rm — видалити після виходу; -p 8080:80 — прокинути порт).git addновеgit add . — усе, що змінилося в каталозі).gitновеsubmit/labNN.git commitновеgit commit -m "lab01: рівень 1").git tagновеgit tag submit/lab01) — так ти «здаєш» лабораторну.git pushновеgit push --tags).manновеman ps; вихід — q.lsновеls -la — з правами, власником, розміром і прихованими файлами.git statusновеbashновеpwdновеcdновеcd .. — на рівень вище.lessновеq.sudoновеrmновеrm -rf dir — каталог рекурсивно і без запитань (обережно: відміни немає).💡 Прочитати README прямо в терміналі: cat README.md (виведе весь файл) або less README.md (посторінково; вихід — клавіша q).
Довідка з будь-якої команди: man curl (повний посібник, вихід — q) або коротко curl --help; для підкоманд — docker run --help, cargo build --help.