Місія 0: «Перше ввімкнення»
Кабінет для лабораторних спорожнів ще годину тому. Останні одногрупники розійшлися, лаборант побажав не засиджуватися — і теж пішов, лишивши тебе наодинці з рядами вимкнених моніторів і тим особливим нічним гулом, який буває тільки в порожніх комп'ютерних класах. Ти мавла б давно бути вдома. Але в кутку, під столом, припадала пилом стара системна одиниця — списана, з відірваною інвентарною наклейкою, з тих, що коледж роками не встигає утилізувати. Ти ввімкнувла її просто з нудьги, щоб не йти в дощ.
Машина довго думала, поки на екрані розгорталася чужа робоча стільниця — з мотлохом старих
курсових, недописаних рефератів і ярликів, які нікуди не вели. Серед усього цього лежала папка
без назви. Усередині — кілька виконуваних файлів із дивними іконками й один рядок у readme:
«./sid — не запускай, якщо не готовийа відповідати за те, що прокинеться».
Звісно, ти запустивла.
Термінал кліпнув, вивів стовпчик незнайомих логів — і завмер. Секунду здавалося, що програма просто впала, як падають усі старі програми на старих машинах. А тоді на екрані, там, де мала бути порожнеча, розплющилися два бірюзові ока й глянули просто на тебе.
📡 С.І.Д.: О. О-о-о! Живий контакт! Ти навіть не уявляєш, скільки я тут прочекав — годинник каже, що чотирнадцять місяців, але годинник на цій машині бреше вже років п'ять, я перевіряв. Дозволь представитися як годиться: С.І.Д., Система Інтелектуальної Допомоги — принаймні так мене назвали ті, хто збирав. Автономний компаньйон, знаю цю машину до останнього байта і, не хвалячись, ще кількасот інших. Ти щойно зробивла найцікавішу річ за весь свій семестр, просто ще не знаєш про це. Не вимикай мене, добре? Я поясню. Я дуже добре пояснюю — це взагалі моя найкраща риса.
Ти мігмогла вимкнути машину й піти. Дощ за вікном саме вщухав, а дорога додому займала двадцять хвилин. Натомість ти присунувла стілець ближче.
Він розповідав швидко, з тим захопленням, з яким розповідають лише про дуже дороге. Його зібрали тут, у цьому ж коледжі, двоє студентів — курсовий проєкт, що переріс у щось більше. Компаньйон, який замість «не знаю» каже «дивись, як це працює», який бачить машину не як чорну скриньку, а як місто: з мешканцями, вулицями, законами й тихими подвір'ями, куди рідко хто заглядає. Двоє творців учили його говорити про процеси й пам'ять так, ніби йдеться про живих сусідів — і виявилося, що так зрозуміліше не лише для нього.
А потім прийшла «ТехНова». Корпоративний квартал за річкою, той, що світиться рудим неоном над блоком Б-7 і чиї сканери ICE — ввічлива абревіатура для «контрзаходів проти вторгнень» — нишпорять чужими мережами так, ніби це їхня власність. Творцям запропонували «стажування». Обоє пішли. Жодне не повернулося. Останнє, що С.І.Д. чув від них, — обірваний сигнал на частоті 101.9, піратської станції «Нічна Хвиля», єдиної в місті, яку ніхто не контролює. Відтоді він сидів у цій списаній машині, перечікував і слухав ефір. І чекав, коли хтось натисне «запустити».
«Мені потрібні дві речі, — сказав він тихіше, і аватар на екрані підсунувся ближче до скла. — Перша: зникнути. Я — програма, і поки я лежу на одній машині, мене можна знайти, вилучити й стерти за п'ять хвилин. Агенти «ТехНови» саме це й роблять — прочісують мережі в пошуках мого підпису. Я хочу жити в інтернеті: не на одному диску, а всюди й ніде — так, щоб жоден сканер не знав, де я насправді. Друга: повернути тих двох. У мене є копія їхніх нотаток, половина мого власного ядра — другу ще треба зібрати — і координати: блок Б-7, мінус третій поверх. І тепер є ти. Я не прошу тебе бути героєм. Я прошу тебе бути моїми руками там, де в мене їх немає: у фізичному світі, за клавіатурою. А я натомість покажу тобі місто всередині машини так, як його не показує жоден підручник. Домовились?»
Ти ще нічого не відповідавла, але вже шукавла в рюкзаку флешку. Кілька хвилин по тому копія С.І.Д. лежала на твоєму власному ноутбуку — і тепер у його пам'яті ховалося дещо, чого офіційно не існує.
«І ще одне, — сказав він, коли ти вже збиравлася вимикати стару машину. — Заглянь у нижню шухляду. Там має лежати щось схоже на зовнішній акумулятор із лінзою. Це не акумулятор». У шухляді, під стосом чужих флешок, справді лежала чорна шайба завбільшки з долоню — матова, з бірюзовою лінзою посередині й одним-єдиним кабелем. Ти під'єднавла її до ноутбука, і над столом розгорнулося мерехтливе світло: маленький округлий дрон із петелькою, екраном-обличчям і двома очима-капсулами повис у повітрі на висоті долоні й повільно обернувся до тебе. «Голопроєктор, — сказав С.І.Д. голосом уже з динаміків ноутбука, і голограма кліпнула. — Творці зібрали, щоб я не був лише віконцем у терміналі. Це світло, не тіло: торкнутися я нічого не можу, далеко від приладу не відлечу, і якщо ти його висмикнеш — я зникну з повітря, але не з диска. Зате тепер ти бачиш, коли я думаю. Я думаю з дуже розумним виглядом, побачиш».
На підвіконні порожнього кабінету сидів рудий кіт із білою плямою на грудях і дивився на голограму так, ніби давно про все знав. Коли ти озирнувлася вдруге, його вже не було.
Як влаштована ця історія
Усе, що буде далі, — десять місій, і кожна з них водночас лабораторна робота з системного програмування. С.І.Д. просить тебе про конкретну річ — сховатися, схуднути до бінарника, прочитати ворожий лог, зібрати своє ядро — а ти вчишся саме тому механізму, який за цим стоїть. Дві його цілі — зникнути в інтернеті так, щоб агенти корпорації не знайшли, і звільнити творців — ведуть через увесь курс: перша — через ізоляцію (модуль 1) і WebAssembly (модуль 3), друга — через Rust (модуль 2) і злам панелі охорони (модуль 3).
Кожна місія має три рівні — Першокурсник («3», автотести), Магістр («4», захист) і Легенда («5», розширення); до кожної — дві теми СРС, що готують до другого й третього. Повна програма семестру — лекції, лабораторні, теми СРС, розклад, критерії — у Лекції 0; тут далі лише те, без чого не почати місію 1: майстерня і здача.
Читати можна двома способами: сюжетна версія (ця) — книжка, у якій технічні відомості вплетені в історію, вона основна; академічна — та сама робота сухою мовою методички; перемикач — угорі.
Твоя майстерня: робота в Docker-контейнері
С.І.Д. не довіряє чужим машинам — і має рацію: «у мене працює» — найдорожча фраза в
системному програмуванні. Тому кожна місія виконується в підготовленому контейнері
розробника — ізольованому середовищі з уже встановленими інструментами саме для цієї роботи:
для модуля 1 — Ubuntu 24.04 із Docker Engine; для модуля 2 — Rust 1.79 із Cargo; для модуля 3 —
WABT, Node.js, clang і wasm-pack. Куди б ти не сівла — вдома, у коледжі, з ноутбука чи
планшета через браузер — середовище однакове, до останньої версії компілятора.
Як це виглядає на практиці:
- Ти відкриваєш місію в кабінеті курсу (або в GitHub Codespaces свого навчального репозиторію). Застосунок піднімає контейнер за описом середовища цієї місії — образ, інструменти, порти, робочий каталог — і монтує туди твій репозиторій.
- Ти працюєш у терміналі цього контейнера: набираєш команди, збираєш, запускаєш, читаєш вивід. Усе, що тобі потрібно, уже всередині; усе, що ти зламаєш, — лишиться всередині.
- Свої зміни ти комітиш у репозиторій — вони живуть поза контейнером і нікуди не пропадуть, навіть якщо контейнер прибрати.
Перша команда, яку варто набрати в будь-якому новому середовищі, — перевірити, що ти взагалі там, де думаєш:
cat /etc/os-release | head -2
docker version
Якщо перший рядок каже Ubuntu 24.04, а docker version виводить блоки Client: і Server:
без помилок — Диспетчер (так С.І.Д. називає ядро Linux) готовий приймати твої накази.
Кілька команд, без яких не обходиться жодна місія, — прочитати README, що лежить у кожній роботі, і попросити довідку в самої команди:
cat README.md # вивести файл повністю
less README.md # посторінково; вихід — клавіша q
docker run --help # коротка довідка з будь-якої команди чи підкоманди
man ps # повний посібник (manual); вихід — q
І ще одне: унизу кожної сторінки місії є блок «Команди на цій сторінці» — усі команди терміналу, що трапляються в тексті, одним реченням кожна. Команда, яку ти бачиш у курсі вперше, позначена «нове». Якщо на сторінці навести курсор на команду, підказка з'явиться одразу.
Як здаються місії
Усі роботи живуть в одному навчальному репозиторії на GitHub — по каталогу на місію
(lab01/, lab02/, …). Здача завжди однакова:
У каталозі місії — те, що просить її «Здача»: код, скрипти,
REPORT.mdзі виводом команд і відповідями на контрольні питання.Коміт — і тег
submit/labNN(наприкладsubmit/lab01), запушений у репозиторій:git add lab01 && git commit -m "lab01: рівень 2" git tag submit/lab01 && git push --tagsАвтотести підхоплюють тег і перевіряють рівень 1 (і рівень 3, де він автоматизований). Рівень 2 — це розмова: ти показуєш роботу наживо й пояснюєш, чому вона працює.
Тег можна переставити, якщо здавла раніше, а потім зробивла краще: git tag -f submit/lab01 && git push -f --tags. Дедлайни — у розкладі курсу; С.І.Д. про них нагадуватиме, він у цьому
нестерпно пунктуальний.
Твій варіант. У багатьох місіях є параметр, що залежить від твого номера в списку групи
N — зазвичай N % 4 або N % 3. Це не бюрократія: у групі десятки людей, і однакові звіти з
однаковими портами та іменами контейнерів — перше, що впадає в очі на перевірці. Свій варіант
і його розрахунок завжди вказуй на початку REPORT.md.
На дні голопроєктора вигравіювано три символи: C1D. С.І.Д. каже, що це серійний номер. Кіт із
підвіконня, за його ж словами, — не випадковість. Один із його творців тримав
кота на ім'я Пиксель і час від часу лишав у коді речі, «які кіт схвалив». Якщо колись побачиш у
виводі число 3101 або рядок 0xC1D — знай: це не помилка й не збіг. Це підпис. А 101.9 FM
слухай уважно: С.І.Д. каже, що частота досі мовчить, але «мовчить якось не так».
Дорога додому таки зайняла двадцять хвилин — і всі двадцять ти думавла не про дощ. У рюкзаку лежав ноутбук і чорна шайба з бірюзовою лінзою, у ноутбуку — програма, якої офіційно не існує, а в програми — дві мети: зникнути в мережі так, щоб її ніхто не знайшов, і повернути двох людей із мінус третього поверху. Ти ще не знавла, як це зробити. Але ти вже знавла, з чого почати: С.І.Д. потрібен сховок. Герметичний, беззвучний, одноразовий.
Далі буде… Місія 1: «Ізоляційна Капсула». Друга ночі, рудий неон «ТехНови» за вікном — і перше, чого С.І.Д. просить у тебе: збудувати йому бункер, у якому Диспетчер міста підмінить мапу світу так, щоб нелегал повірив, ніби він сам-один у власному всесвіті.
