19 KiB
ИУП — интенсив 7 дней (фуллтайм, собеседование ≤ 1 неделя)
Версия 3, 23.09 — пересобрана по диагностике (квиз 14/32, карточки 11/60) и правке формата: сначала урок с теорией, потом задачи ступенями. Срок: собеседование максимум через неделю, подготовка фуллтайм (~8 ч/день). Цель: закрыть ровно то, что спросят на входе в Eltex (C/C++, базовые алгоритмы и структуры данных, Linux, L2/L3-сети, инструменты), и не утонуть в глубине.
Что показала диагностика (это и определило план)
| Домен | Результат | Вывод |
|---|---|---|
| C/C++ | 7/8 | сильная сторона, времени почти не даём |
| Алгоритмы | 1/8 | провал: формальные свойства (сложности, условия применимости) |
| Linux | 3/8 | пропущены fork/COW, epoll, mmap, waitpid — «не был уверен» |
| Сети | 3/8 | пропущены числа и байты (14/4/62/TTL), порядок TCP-хендшейка |
Отдельно: из 32 вопросов 11 пропущены, и это почти все «точные факты» — числа, байты,
сложности. То есть база есть, а не хватает заученных формулировок и уверенности в них.
Поэтому в плане появился ежедневный блок карточек (facts_drill.py), а C++ урезан:
за него отвечает сильная сторона, забирать у неё часы смысла нет.
Как устроен день (v3, после правки 23.09)
Первая версия была проверкой — а проверять пока нечего. Теперь каждый день начинается с материала:
- Урок (30–40 мин чтения).
lessons/D<день>_*.md— теория по-русски, разобранные примеры с кодом, готовые ответы на вопросы собеседования, ссылки на первопартийные материалы. Ничего не решаешь, просто читаешь и запускаешь примеры. - Карточки (20 мин).
python3 facts_drill.py --level base— начинать с базы; в режиме--learnкаждая ошибка объясняется. База закрыта (≥ 80%) — переходишь на уровеньbase,core(по умолчанию), потомall. - Ступени в задаче. Каждая задача разбита на шаги по 10–30 минут, после каждого шага прогон. Не «напиши хеш-таблицу», а «сначала хеш-функция, проверь, что 16/32/48 дают разные индексы».
- Зачёт.
python3 grade.py <номер>— критерийPASS. Это конец дня, а не начало.
Итого: урок → карточки → ступени → зачёт. Задача без урока впереди — моя ошибка,
пиши, и я допишу материал.
2. День закрыт, только если: решены задачи дня без подсказки, написан/починен код дня,
сделана одна задача вслух на таймер (10 мин: разбор + код + сложность), заполнен
трекер.
3. Теория — только под конкретную задачу, максимум 40 минут. Всё остальное — код и разбор
своих ошибок по трекеру.
4. Требования по сложности, которые тест не ловит (например heapify за O(n)) — проверяю
глазами по коду при разборе. Если делаешь «на оценку» не то, что заявлено, увижу.
5. Что осознанно НЕ лезет в неделю: полноценное ядро (модуль+драйвер как продукт),
электроника и схемотехника, Docker в продакшне. Ядро — обзорно на D6, электроника —
после оффера (полный трек PLAN.md, модули M8–M9).
6. Провалил день — не догоняю всё, переношу хвост в D7 и режу второстепенное (ядро, docker).
Материалы: cppreference (C и C++), man7.org (разделы 2/3/7), Beej's Guide to Network
Programming, RFC 791/793, Wireshark wiki, OSTEP (процессы/память), LKMPG, docs.kernel.org.
Задачи: Codeforces с фильтром по тегу и рейтингу 800–1400
(https://codeforces.com/problemset?tags=two+pointers,800-1400 — тег менять),
Яндекс Тренировки по алгоритмам (https://yandex.ru/yaintern/training/algorithm-training),
классика LeetCode — по названию (ссылки на leetcode.com открываются только в браузере).
Пакет задач (каталог diag/)
01..09— диагностика: битовые операции, список, ring buffer, IPv4-заголовок, НВП, потоки, epoll-сервер, bash по логу, разбор падения в gdb.10_hash,11_heap,12_dijkstra,13_subnet— добор под слабые домены: своя хеш-таблица с открытой адресацией, куча (heapifyза O(n), top-K), Дейкстра наpriority_queue, арифметика подсетей.python3 grade.py— все 13 с автопроверкой (ASAN/UBSAN);python3 grade.py 10 13— выборочно;--fast— без санитайзеров.python3 facts_drill.py --level base— 41 карточка базы с пояснениями (начинать отсюда);--level base,core— 93;--level all— 101. Уровеньdeep(8 карточек, нишевое: TID в /proc, ulimit, ICMP Time Exceeded и подобное) в базовый прогон не попадает. Маркеры итога:>=80%ок,50–79%добор,<50%дыра.lessons/— уроки по дням: теория, разборы с кодом, ответы на вопросы собеседования.- Трекер дня:
TRACKER.mdв корне репозитория.
D0 — 23.09, вход: база и знакомство
- Квиз 14/32, карточки 11/60 — значит базы пока нет, и задачи уровня «напиши хеш-таблицу» решать рано. Это нормальный вход, просто порядок другой: сначала уроки.
- Сегодня:
python3 facts_drill.py --level base --learn— 41 карточка базы, каждая ошибка объясняется. Это 20–30 минут и даёт словарь, без которого дальше нечего делать. - Задачи 01–13 сегодня решать не нужно. Смотрим на них как на цель недели, а не как на зачёт.
- Точка: пройдены базовые карточки, записаны 3 темы, которые «совсем не помню» — по ним я усилю соответствующие дни.
D1 — 24.09: сложность и хеш-таблицы | процессы и сигналы
- Урок:
lessons/D1_algo.md(сложность, таблица структур, устройство хеш-таблиц, разбор кода) иlessons/D1_linux.md(fork/exec/wait, COW, сигналы, разбор мини-шелла). Читать 40 минут, примеры из уроков запустить руками — они рабочие. - Карточки:
python3 facts_drill.py --level base(доменalgo— обязателен, остальное по времени). Если база даётся легко —--level base,core. - Задача дня:
tasks/10_hash— но по ступеням из еёtask.md(Глава IV), по 10–30 минут на шаг, после каждого шагаpython3 grade.py 10. Ступень 1 — это хеш-функция и проверка, что 16/32/48 дают разные индексы, и только шестая ступень — перехеширование. - Разминка:
tasks/01_bits(20 минут, четыре функции) иtasks/03_ring(40–60 минут, тоже по ступеням). - Зачёт дня:
PASSпо01,03,10; карточкиbase≥ 80%.
D2 — 25.09: деревья и куча | epoll и неблокирующие сокеты
-
Урок:
lessons/D2_algo.md(деревья, BST-инвариант, обходы, куча,heapifyза O(n), top-K),lessons/D2_linux.md(файловый ввод-вывод,mmap,select/poll/epoll, LT/ET,SO_REUSEADDR),lessons/D2_cpp.md(padding, правило 0/3/5, virtual-деструктор,std::move, UB). -
Карточки (30 мин) —
algo: heap insert O(log n), top-K, обходы деревьев, сложность DFS по памяти. -
Утро, алгоритмы (3 ч) — бинарные деревья и BST: обходы рекурсией и итерацией, валидация BST, LCA; куча:
heapifyснизу вверх за O(n),priority_queue, top-K,nth_element. Практика:tasks/11_heap+ задачи Invert Binary Tree, Validate BST, Kth Largest Element, Top K Frequent Elements. -
День, системное (3 ч) — Linux: файловый ввод-вывод (
open/read/write/lseek),mmap, мультиплексированиеselect → poll → epoll(LT/ET), неблокирующие сокеты,SO_REUSEADDR,EAGAIN/EINTR. Практика:tasks/07_epoll— эхо-сервер держит нагрузку, плюс нагрузочный тест своими руками. -
Разбор и код (1,5 ч) — C++ ровно по промахам: выравнивание и padding (sizeof 12), правило 0/3/5, virtual-деструктор,
std::moveкак каст, UB — 45 минут, не больше; одна задача вслух; трекер. -
Точка: 11_heap и 07_epoll PASS; сервер держит 3+ соединений и не течёт по дескрипторам; карточки
c_cpp= 100%.
D3 — 26.09: списки/стек | многопоточность и gdb
-
Урок:
lessons/D3_algo.md(списки, разворот, цикл Флойда, кольцевой буфер, монотонный стек),lessons/D3_threads.md(мьютекс,condition_variable, атомики иmemory_order, дедлоки, пул потоков),lessons/D3_gdb.md(gdb: break/watch/bt/frame, core dump, почему краш далеко от причины). -
Карточки (30 мин) —
linux: epoll O(1) против select O(n), mmap, waitpid, 137/139. -
Утро, алгоритмы (3 ч) — связные списки (разворот, цикл Флойда, k-й с конца), стек/очередь/ring buffer, монотонный стек. Практика:
tasks/02_list,tasks/03_ring(если ещё не сданы) + Valid Parentheses, Daily Temperatures, Reverse Linked List. -
День, системное (3 ч) — многопоточность:
std::thread, mutex/lock_guard,condition_variableи predicate-цикл, атомики иmemory_order, гонки, дедлоки, ложные пробуждения; паттерны producer/consumer и пул потоков. Практика:tasks/06_threadsдо продакшн-вида + свой пул потоков. (TSan на этой машине может отвалиться по VMA — тогда инварианты + ASAN, в логе это помечено.) -
Разбор и код (1,5 ч) — gdb: breakpoints,
watch,bt,frame, отладка потоков;tasks/09_gdb+ своё падение с письменным разбором; одна задача вслух; трекер. -
Точка: пул потоков проходит счётчики 4×4×20k; падение разобрано письменно; карточки
linux≥ 80%.
D4 — 27.09: графы | L2/L3 и подсети
-
Урок:
lessons/D4_algo.md(BFS/DFS, топосорт, Дейкстра, union-find),lessons/D4_net.md(OSI и инкапсуляция, Ethernet 14 байт, VLAN +4, ARP, IPv4 по полям, TTL, подсети и маски, ICMP). -
Карточки (30 мин) —
net: 14 байт Ethernet, VLAN +4, /26 = 62, TTL, SYN/SYN-ACK/ACK. -
Утро, алгоритмы (3 ч) — графы: представления, BFS/DFS, топологическая сортировка (только для DAG), компоненты связности, Дейкстра (веса ≥ 0), union-find. Практика:
tasks/12_dijkstra+ Number of Islands, Course Schedule, Network Delay Time, Redundant Connection + 6–8 задач с тегамиgraphs,dsu. -
День, системное (3 ч) — сети L2/L3: OSI и TCP/IP, инкапсуляция, Ethernet (14 байт), MAC, ARP, VLAN 802.1Q (+4 байта), IPv4-заголовок (20 байт) и контрольная сумма, TTL, маски и подсети, ICMP. Практика:
tasks/04_ipv4+tasks/13_subnet+ два письменных разбора дампов (tcpdump: ARP-обмен и TCP-handshake). -
Разбор и код (1,5 ч) — задача вслух (граф или подсеть); разбор промахов дня; трекер.
-
Точка: 12_dijkstra и 13_subnet PASS; 2 разбора дампов письменно; карточки
net≥ 80%.
D5 — 28.09: ДП | TCP глубоко, bash и /proc
-
Урок:
lessons/D5_algo.md(рюкзак 0/1, монеты, Edit Distance, НВП за O(n log n)),lessons/D5_net.md(заголовок TCP, автомат состояний, окна и ретрансмиссии, TIME_WAIT, UDP, NAT, DNS/DHCP,tcpdump),lessons/D5_bash.md(пайплайны,set -euo pipefail, awk/sed,/proc,ulimit). -
Карточки (30 мин) —
net+c_cpp(20 байт IPv4/TCP, MTU 1500, DNS 53, ASAN/UBSAN). -
Утро, алгоритмы (3 ч) — ДП: состояния и переходы, рюкзак 0/1, НВП за O(n log n), строки (Edit Distance, Word Break). Практика:
tasks/05_lis+ Climbing Stairs, House Robber, Coin Change, Edit Distance + 5–6 задач с тегомdp. -
День, системное (3 ч) — TCP глубоко: автомат состояний, окно и подтверждения, ретрансмиссии и таймеры, закрытие, UDP, порты, NAT, DNS/DHCP минимум; работа с
tcpdump/Wireshark. Практика: 3 письменных разбора дампов (ретрансмиссия, ICMP unreachable, DNS) + захват трафика своей программой. -
Разбор и код (1,5 ч) — bash и Linux-быт: пайплайны,
set -euo pipefail, awk/sed,/proc,ulimit;tasks/08_bash(лог в 1e6 строк — только awk/sort, не bash-цикл); одна задача вслух; трекер. -
Точка: 05_lis и 08_bash PASS; 3 разбора дампов; скрипт держит лог 100k строк за секунды.
D6 — 29.09: закрытие слабых мест | ядро обзорно, docker, резюме
-
Урок:
lessons/D6_kernel.md(модули,printk,file_operations, device tree, cross-compile, uboot),lessons/D6_docker.md(namespaces и cgroups, слои, multi-stage, volumes). -
Карточки (30 мин) — все домены, полный прогон 60 карточек.
-
Утро, алгоритмы (3 ч) — только слабые места по трекеру: добить
10..13до PASS, повторить hash/BST/heap/Дейкстра/ДП там, где были FAIL или «не знаю». -
День, системное (3 ч) — ядро и embedded обзорно: модуль (сборка, insmod/rmmod, printk, параметры,
/proc), символьный драйвер (file_operations), device tree, cross-compile, uboot/bringup — ровно чтобы отвечать словами; docker (образ под сборку/тесты) — 45 минут. -
Разбор и код (1,5 ч) — резюме + сопроводительное под Eltex (учесть офисный формат), вопросы работодателю, легенда по опыту.
-
Точка: все 13 задач PASS; карточки ≥ 80% во всех доменах; резюме готово к отправке.
D7 — 30.09: повтор и два мок-интервью
-
Урок:
lessons/D7_mock.md— сценарий двух мок-интервью (алгоритмы и системное), карта слабых мест по урокам, вопросы работодателю, легенда по опыту. -
2 ч — повтор: только карточки с промахами и слабые темы из трекера.
-
3 ч — мок-интервью №1: алгоритмы, 2 задачи вслух с таймером (я веду и разбираю).
-
2 ч — мок-интервью №2: C/C++ + Linux + сети, включая разбор дампа.
-
1 ч — вопросы работодателю, легенда по опыту, финальная вычитка резюме.
-
Точка: ≤ 1 грубая ошибка на сессию; резюме и сопроводительное готовы.
После собеседования
Незакрытое (полный трек PLAN.md): M2 хвост (битовые/строковые алгоритмы, математика),
M6 глубина (STP, маршрутизация, HTTP), M7 полностью (Docker в бою, bisect на реальном
репозитории), M8 ядро (полноценный драйвер, uboot/bringup), M9 электроника и схемотехника.