Files
eduplan-cpp-eltex/WEEK7.md
T

175 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ИУП — интенсив 7 дней (фуллтайм, собеседование ≤ 1 неделя)
**Версия 2, 23.09** — пересобрана по результату диагностики (квиз 14/32).
Срок: собеседование максимум через неделю, подготовка фуллтайм (~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++ урезан:
за него отвечает сильная сторона, забирать у неё часы смысла нет.
## Правила интенсива
1. Каждый день — три блока: **карточки (30 мин) → алгоритмы (3 ч) → системное (3 ч) →
разбор и код (1,5 ч)**. Блок не начинается, пока не закрыта вчерашняя точка.
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` — 60 карточек «числа и факты» (algo 20, linux 14, net 14,
c_cpp 12). Маркеры: `>=80%` ок, `50–79%` добор, `<50%` дыра.
- Трекер дня: `TRACKER.md` в корне репозитория.
---
## D0 — 23.09, диагностика (квиз пройден, 14/32)
- Квиз: **пройден** — 14/32, слабейшие домены: алгоритмы, Linux, сети (см. таблицу выше).
- Осталось: `cd diag && python3 grade.py 01 02 03 04 05 06 07 08 09` — 9 практических задач.
- Разбор промахов квиза вместе со мной, калибровка дней (уже сделана в этой версии плана).
- **Точка:** есть `results_quiz.json` и `results_tasks.json`, названы 3 слабейших темы.
## D1 — 24.09: инварианты сложности + хеш-таблицы | fork/COW/сигналы
- Карточки (30 мин) — домен `algo`: бинарный поиск в 1e6, хеш O(1)/worst O(n), heapify O(n),
устойчивость сортировок, Дейкстра и условие применимости.
- Утро, алгоритмы (3 ч) — **формальные свойства, а не «умение решать»**: O-оценки и
амортизация, хеш-таблицы (цепочки vs открытая адресация, загрузка, tombstone, worst O(n)),
сортировки и устойчивость, бинарный поиск и `lower_bound` руками.
Практика: **`tasks/10_hash`** — своя таблица на линейном зондировании; 6–8 задач
Codeforces по тегам `hashing` и `sortings`, рейтинг 800–1400.
- День, системное (3 ч) — Linux: `fork/exec/wait`, **COW-страницы**, зомби и `waitpid`,
сигналы и коды возврата (137 = 128+9 SIGKILL, 139 = 128+11 SIGSEGV), `errno`.
Практика: мини-шелл (fork + exec + wait + `exit` + пайплайн по желанию) — прямой вопрос
на собеседовании; прогнать под ASAN.
- Разбор и код (1,5 ч) — `tasks/01_bits` и `tasks/03_ring` **на чистом C** (без C++-обёрток),
сборка `-Wall -Wextra -Werror -fsanitize=address,undefined`; одна задача вслух; трекер.
- **Точка:** 10_hash PASS; мини-шелл запускает `ls`/`cat`; ASAN чистый; карточки `algo` ≥ 80%.
## D2 — 25.09: деревья и куча | epoll и неблокирующие сокеты
- Карточки (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
- Карточки (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 и подсети
- Карточки (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
- Карточки (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, резюме
- Карточки (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: повтор и два мок-интервью
- 2 ч — повтор: только карточки с промахами и слабые темы из трекера.
- 3 ч — мок-интервью №1: алгоритмы, 2 задачи вслух с таймером (я веду и разбираю).
- 2 ч — мок-интервью №2: C/C++ + Linux + сети, включая разбор дампа.
- 1 ч — вопросы работодателю, легенда по опыту, финальная вычитка резюме.
- **Точка:** ≤ 1 грубая ошибка на сессию; резюме и сопроводительное готовы.
---
## После собеседования
Незакрытое (полный трек `PLAN.md`): M2 хвост (битовые/строковые алгоритмы, математика),
M6 глубина (STP, маршрутизация, HTTP), M7 полностью (Docker в бою, bisect на реальном
репозитории), M8 ядро (полноценный драйвер, uboot/bringup), M9 электроника и схемотехника.