HR_BASE_tg.md: вопросы и ответы под спойлерами для Telegram
This commit is contained in:
+507
@@ -0,0 +1,507 @@
|
||||
**База перед тех-скринингом (HR, видеосвязь)**
|
||||
|
||||
Собрано под вакансию Eltex «Разработчик C/C++» (Новосибирск, 1–3 года, ключевые навыки
|
||||
C/C++, Linux, TCP/IP). Формат — вопрос → короткий ответ. Читать подряд, вслух проговаривая
|
||||
ответы: на скрининге важно не «знаю», а «скажу связно за 20 секунд».
|
||||
|
||||
**1. ООП (спрашивают почти всегда)**
|
||||
|
||||
▪ **1.1 Что такое ООП?**
|
||||
||Парадигма, где программа — набор объектов, обменивающихся сообщениями; объект объединяет данные и поведение.||
|
||||
|
||||
▪ **1.2 Три кита?**
|
||||
||Инкапсуляция, наследование, полиморфизм. (Иногда добавляют абстракцию.)||
|
||||
|
||||
▪ **1.3 Инкапсуляция?**
|
||||
||Сокрытие внутреннего состояния за публичным интерфейсом: поля private, доступ через методы.||
|
||||
|
||||
▪ **1.4 Наследование?**
|
||||
||Переиспользование и расширение: класс-наследник получает члены базового.||
|
||||
|
||||
▪ **1.5 Полиморфизм?**
|
||||
||Один интерфейс — разные реализации. В C++ динамический полиморфизм — через `virtual` (решение принимается в рантайме по фактическому типу), статический — перегрузка и шаблоны (на компиляции).||
|
||||
|
||||
▪ **1.6 Класс и объект?**
|
||||
||Класс — описание (чертёж), объект — экземпляр в памяти.||
|
||||
|
||||
▪ **1.7 struct и class в C++?**
|
||||
||Разница только в доступе по умолчанию: у struct public, у class private.||
|
||||
|
||||
▪ **1.8 Что такое виртуальная функция?**
|
||||
||Функция, вызываемая по фактическому типу объекта. Реализуется через таблицу виртуальных функций (vtable) — отсюда +указатель на объект.||
|
||||
|
||||
▪ **1.9 Зачем виртуальный деструктор?**
|
||||
||Если удалять наследника через `Base*` без него — UB, деструктор наследника не вызовется, ресурсы утекут.||
|
||||
|
||||
▪ **1.10 Можно ли вызвать virtual из конструктора?**
|
||||
||Можно, но вызовется версия текущего класса, а не наследника: объект ещё не достроен.||
|
||||
|
||||
▪ **1.11 Абстрактный класс?**
|
||||
||Класс с хотя бы одной чисто виртуальной функцией (`= 0`), экземпляр создать нельзя. В C++ нет отдельного `interface` — его роль играет такой класс.||
|
||||
|
||||
▪ **1.12 Перегрузка и переопределение — в чём разница?**
|
||||
||Перегрузка: несколько функций с одним именем и разными параметрами в одной области видимости. Переопределение: virtual-функция наследника с той же сигнатурой.||
|
||||
|
||||
▪ **1.13 Что такое static-член?**
|
||||
||Общий для всех объектов класса, живёт вне объекта; у static-метода нет `this`.||
|
||||
|
||||
▪ **1.14 Что такое SOLID?**
|
||||
||S — единственная ответственность, O — открыт для расширения/закрыт для изменения, L — подстановка Лисков, I — разделение интерфейсов, D — инверсия зависимостей. Достаточно назвать и объяснить одну-две.||
|
||||
|
||||
▪ **1.15 Композиция или наследование?**
|
||||
||Предпочитают композицию: наследование жёстко связывает классы, композиция гибче.||
|
||||
|
||||
|
||||
**2. C/C++ (ядро вакансии)**
|
||||
|
||||
▪ **2.1 Указатель и ссылка — разница?**
|
||||
||Указатель — адрес, может быть null, его можно менять и арифметикой ходить. Ссылка — псевдоним существующего объекта, не бывает null, перепривязать нельзя.||
|
||||
|
||||
▪ **2.2 new/delete против malloc/free?**
|
||||
||`new` вызывает конструктор и возвращает типизированный указатель, `malloc` даёт сырой блок; `new` бросает исключение, `malloc` возвращает NULL; `delete` вызывает деструктор.||
|
||||
|
||||
▪ **2.3 Стек и куча?**
|
||||
||Стек — автоматическая память (локальные переменные, быстрая, ограничена). Куча — динамическая (`new`/`malloc`, больше, но освобождать вручную).||
|
||||
|
||||
▪ **2.4 Что такое утечка памяти?**
|
||||
||Выделили и не освободили. Ищется ASAN (LeakSanitizer), valgrind.||
|
||||
|
||||
▪ **2.5 RAII?**
|
||||
||Ресурс захватывается в конструкторе, освобождается в деструкторе — утечек нет даже при исключениях. Так работают `std::vector`, `std::ifstream`, умные указатели.||
|
||||
|
||||
▪ **2.6 unique_ptr и shared_ptr?**
|
||||
||`unique_ptr` — единственный владелец, без счётчика, дешевле. `shared_ptr` — общий, считает ссылки, есть накладные расходы и проблема циклических ссылок (`weak_ptr`).||
|
||||
|
||||
▪ **2.7 Правило трёх/пяти?**
|
||||
||Если класс владеет ресурсом и задан деструктор — надо определить копирование и перемещение (в C++11+: конструктор/присваивание копированием и перемещением).||
|
||||
|
||||
▪ **2.8 Что делает std::move?**
|
||||
||Ничего сам по себе — это `static_cast` к rvalue-ссылке. Перемещение выполняет конструктор/присваивание перемещением.||
|
||||
|
||||
▪ **2.9 Что такое UB?**
|
||||
||Undefined behavior — стандарт не накладывает требований. Примеры: выход за границы, знаковое переполнение, сдвиг в знаковый бит, разыменование null, гонка данных.||
|
||||
|
||||
▪ **2.10 Что проверяют ASAN и UBSAN?**
|
||||
||ASAN — выходы за границы, use-after-free, двойное освобождение, утечки. UBSAN — неопределённое поведение (переполнения, сдвиги, выравнивание).||
|
||||
|
||||
▪ **2.11 sizeof(struct { char a; int b; char c; }) на x86-64?**
|
||||
||12: `a` в 0, padding 1–3, `b` в 4–7, `c` в 8, padding 9–11 до выравнивания структуры по 4.||
|
||||
|
||||
▪ **2.12 Порядок вычисления аргументов f(a(), b()) задан?**
|
||||
||Нет, не определён — нельзя полагаться.||
|
||||
|
||||
▪ **2.13 Что делает const после сигнатуры метода?**
|
||||
||Делает `this` указателем на константу: метод не меняет поля объекта, и его можно вызывать у const-объекта.||
|
||||
|
||||
▪ **2.14 Что такое перегрузка операторов и зачем?**
|
||||
||Своя семантика для `+`, `==`, `[]` и т.п., чтобы тип вёл себя как встроенный. Нельзя перегружать `.`, `::`, `?:`, `sizeof`.||
|
||||
|
||||
▪ **2.15 Компиляция по шагам?**
|
||||
||Препроцессор (`#include`, `#define`) → компиляция в объектные файлы → линковка в исполняемый. Ошибка «undefined reference» — от линковщика.||
|
||||
|
||||
▪ **2.16 Зачем header guards?**
|
||||
||Чтобы заголовок не подключался дважды — иначе повторное определение типа.||
|
||||
|
||||
▪ **2.17 Что такое forward declaration?**
|
||||
||Объявление класса/функции без определения, чтобы не тянуть `#include`; достаточно для указателей и ссылок.||
|
||||
|
||||
▪ **2.18 Что такое шаблон (template)?**
|
||||
||Обобщённый код, тип подставляется при компиляции. Цена — ошибки и раздувание кода.||
|
||||
|
||||
▪ **2.19 Что такое лямбда?**
|
||||
||Анонимная функция с захватом контекста (`[&]`, `[=]`). Синтаксический сахар над функтором.||
|
||||
|
||||
▪ **2.20 Что такое пространство имён?**
|
||||
||Способ избежать конфликта имён; `std::` — пример.||
|
||||
|
||||
▪ **2.21 volatile — что это?**
|
||||
||Говорит компилятору не кэшировать значение в регистре (регистры железа, переменные, меняемые извне). Это не про многопоточность — для неё `std::atomic`.||
|
||||
|
||||
|
||||
**3. STL (обязательно, спрашивают про сложности)**
|
||||
|
||||
▪ **3.1 Какие контейнеры знаешь?**
|
||||
||Последовательные: `vector`, `list`, `deque`, `array`. Ассоциативные: `map`, `set` (деревья, O(log n)). Хеш-таблицы: `unordered_map`, `unordered_set` (O(1) в среднем). Адаптеры: `stack`, `queue`, `priority_queue`.||
|
||||
|
||||
▪ **3.2 vector — сложности?**
|
||||
||Доступ по индексу O(1), push_back амортизированное O(1), вставка/удаление в середине O(n), поиск O(n).||
|
||||
|
||||
▪ **3.3 Почему push_back амортизированное O(1)?**
|
||||
||Ёмкость удваивается, реаллокация O(n) случается редко — в среднем одна операция O(1).||
|
||||
|
||||
▪ **3.4 list — сложности?**
|
||||
||Доступ по номеру O(n), вставка/удаление при известном узле O(1), поиск O(n). Память дороже из-за указателей.||
|
||||
|
||||
▪ **3.5 map против unordered_map?**
|
||||
||`map` — красно-чёрное дерево: O(log n), ключи упорядочены. `unordered_map` — хеш-таблица: O(1) в среднем, порядок не определён, нужен `std::hash`.||
|
||||
|
||||
▪ **3.6 Что быстрее и когда?**
|
||||
||Поиск — обычно `unordered_map`. Если нужен порядок обхода или диапазонные запросы — `map`.||
|
||||
|
||||
▪ **3.7 Итераторы и их инвалидация?**
|
||||
||Итератор — обобщённый указатель на элемент. У `vector` реаллокация инвалидирует все итераторы, у `list` — только итератор удалённого элемента.||
|
||||
|
||||
▪ **3.8 Как удалить элементы из vector по условию?**
|
||||
||Идиома erase-remove: `v.erase(std::remove_if(v.begin(), v.end(), pred), v.end());`.||
|
||||
|
||||
▪ **3.9 reserve и resize?**
|
||||
||`reserve` меняет ёмкость (память), не размер. `resize` меняет размер (создаёт/удаляет элементы).||
|
||||
|
||||
▪ **3.10 emplace_back против push_back?**
|
||||
||`emplace_back` конструирует объект на месте — без копирования/перемещения.||
|
||||
|
||||
▪ **3.11 Как работает priority_queue?**
|
||||
||Бинарная куча поверх `vector`: вставка O(log n), извлечение максимума O(log n), доступ к максимуму O(1). По умолчанию max-куча.||
|
||||
|
||||
▪ **3.12 Какие алгоритмы STL знаешь?**
|
||||
||`sort` (O(n log n), неустойчив), `stable_sort`, `find`, `count`, `lower_bound`/`upper_bound` (O(log n) на отсортированном), `accumulate`, `remove_if`, `unique`, `next_permutation`.||
|
||||
|
||||
▪ **3.13 Что такое функтор и предикат?**
|
||||
||Объект с `operator()`. Предикат — функция/функтор, возвращающий bool, используется в алгоритмах.||
|
||||
|
||||
▪ **3.14 string — это контейнер?**
|
||||
||Да, `std::basic_string<char>`: `size()`, `substr`, `find`, `append`; данные лежат непрерывно, `.c_str()` даёт C-строку.||
|
||||
|
||||
|
||||
**4. Linux и ОС**
|
||||
|
||||
▪ **4.1 Процесс и поток?**
|
||||
||Процесс — программа в исполнении со своим адресным пространством и PID. Поток — единица выполнения внутри процесса: общая память, свой стек и регистры.||
|
||||
|
||||
▪ **4.2 Что делает fork()?**
|
||||
||Создаёт копию процесса. Возвращает дважды: в родителе — PID ребёнка, в ребёнке — 0, при ошибке −1.||
|
||||
|
||||
▪ **4.3 Что с памятью при fork()?**
|
||||
||Copy-on-write: страницы общие, копируются при первой записи.||
|
||||
|
||||
▪ **4.4 exec?**
|
||||
||Заменяет образ текущего процесса (код, данные, стек). При успехе не возвращается. `fork` + `exec` — запуск внешней программы.||
|
||||
|
||||
▪ **4.5 Зачем waitpid?**
|
||||
||Забрать код возврата и не оставлять зомби.||
|
||||
|
||||
▪ **4.6 Зомби и сирота?**
|
||||
||Зомби — завершившийся процесс, чья запись ждёт `wait`. Сирота — процесс, чей родитель умер; его усыновляет init (PID 1).||
|
||||
|
||||
▪ **4.7 Коды возврата 137 и 139?**
|
||||
||137 = 128+9 (SIGKILL), 139 = 128+11 (SIGSEGV). Так кодирует оболочка.||
|
||||
|
||||
▪ **4.8 Сигналы, основные?**
|
||||
||SIGINT (2, Ctrl+C), SIGKILL (9, не перехватить), SIGTERM (15, корректное завершение), SIGSEGV (11), SIGPIPE (13, запись в закрытый сокет), SIGCHLD (17).||
|
||||
|
||||
▪ **4.9 SIGTERM против SIGKILL?**
|
||||
||SIGTERM можно перехватить и завершиться аккуратно, SIGKILL нельзя ни перехватить, ни проигнорировать.||
|
||||
|
||||
▪ **4.10 Файловый дескриптор?**
|
||||
||Число, по которому программа обращается к открытому файлу, сокету, pipe. 0/1/2 — stdin/stdout/stderr.||
|
||||
|
||||
▪ **4.11 Что такое epoll?**
|
||||
||Механизм мультиплексирования: ядро сообщает о готовых дескрипторах, сложность O(1) на событие. `select`/`poll` перебирают все дескрипторы — O(n).||
|
||||
|
||||
▪ **4.12 mmap?**
|
||||
||Отображает файл в память: страницы подгружаются по обращению, вместо read/write работаешь с указателем.||
|
||||
|
||||
▪ **4.13 Виртуальная память и страница?**
|
||||
||Каждому процессу — своё адресное пространство; память делится на страницы (обычно 4 КБ), отображаемые на физическую.||
|
||||
|
||||
▪ **4.14 Что такое swap?**
|
||||
||Выгрузка страниц на диск при нехватке памяти. Медленно, но спасает от OOM.||
|
||||
|
||||
▪ **4.15 Что такое inode?**
|
||||
||Структура метаданных файла (права, размер, владелец, указатели на блоки). Имя файла — отдельно, в каталоге.||
|
||||
|
||||
▪ **4.16 Права доступа 755?**
|
||||
||Владелец rwx, группа r-x, остальные r-x. `chmod`, `chown` — смена прав и владельца.||
|
||||
|
||||
▪ **4.17 Что такое pipe и перенаправление?**
|
||||
||`|` соединяет вывод одной программы со входом другой; `>`, `>>`, `2>&1` перенаправляют потоки.||
|
||||
|
||||
▪ **4.18 Как посмотреть процессы и нагрузку?**
|
||||
||`ps aux`, `top`/`htop`, `pidstat`; `free -h` — память, `df -h` — диски, `iostat` — ввод-вывод.||
|
||||
|
||||
▪ **4.19 Что такое демон?**
|
||||
||Фоновый процесс без управляющего терминала; запускается systemd (unit-файлы, `systemctl start/status`).||
|
||||
|
||||
▪ **4.20 Что такое ядро и системный вызов?**
|
||||
||Ядро управляет ресурсами; программа обращается к нему через системные вызовы (`open`, `read`, `write`, `fork`). `strace` показывает эти вызовы.||
|
||||
|
||||
▪ **4.21 Мьютекс, семафор, атомик?**
|
||||
||Мьютекс — блокировка на одного владельца. Семафор — счётчик на N владельцев. Атомик — операция без блокировки, аппаратно.||
|
||||
|
||||
▪ **4.22 Что такое гонка данных и дедлок?**
|
||||
||Гонка — несинхронизированный доступ к общей памяти (ловит ThreadSanitizer). Дедлок — потоки ждут ресурсы друг друга; лечится единым порядком захвата.||
|
||||
|
||||
▪ **4.23 Условие переменная (condition_variable)?**
|
||||
||Способ ждать событие: ждать в цикле с предикатом (`while (!ready) cv.wait(lock);`) — защита от ложных пробуждений.||
|
||||
|
||||
|
||||
**5. Сети: OSI, TCP/IP, TCP, UDP (ядро вакансии)**
|
||||
|
||||
▪ **5.1 Семь уровней OSI?**
|
||||
||Физический, канальный, сетевой, транспортный, сеансовый, представления, прикладной. Практически работают с пятью.||
|
||||
|
||||
▪ **5.2 Что на каждом уровне?**
|
||||
||L1 — биты и среды (витая пара, оптика). L2 — кадры, MAC, коммутатор. L3 — пакеты, IP, маршрутизатор. L4 — TCP/UDP, порты. L5–L7 — сессии, кодирование, прикладные протоколы (HTTP, DNS).||
|
||||
|
||||
▪ **5.3 TCP/IP модель?**
|
||||
||Канальный, интернет, транспортный, прикладной. Соответствует OSI снизу.||
|
||||
|
||||
▪ **5.4 Инкапсуляция?**
|
||||
||Каждый уровень добавляет свой заголовок: Ethernet (14 байт) → IP (20) → TCP (20) → данные. При передаче пакет кладут внутрь кадра.||
|
||||
|
||||
▪ **5.5 Сколько байт в Ethernet-заголовке?**
|
||||
||14 (MAC получателя 6, MAC отправителя 6, тип 2). VLAN 802.1Q добавляет 4.||
|
||||
|
||||
▪ **5.6 MAC-адрес?**
|
||||
||48 бит, физический адрес интерфейса, действует в пределах сегмента.||
|
||||
|
||||
▪ **5.7 ARP?**
|
||||
||Находит MAC по IP в локальном сегменте: широковещательный запрос → ответ.||
|
||||
|
||||
▪ **5.8 MTU?**
|
||||
||Максимальный размер полезной нагрузки кадра, для Ethernet 1500 байт. Больше — фрагментация или ошибка.||
|
||||
|
||||
▪ **5.9 IPv4-заголовок, что важно?**
|
||||
||Минимум 20 байт: версия/IHL, длина, TTL, протокол, контрольная сумма заголовка, адреса источника и назначения. TTL уменьшается на 1 на каждом маршрутизаторе.||
|
||||
|
||||
▪ **5.10 Маски и подсети?**
|
||||
||Маска делит адрес на сеть и узел. `/24` — 254 узла, `/26` — 62, `/30` — 2 (точка-точка). Широковещательный адрес — все единицы в хостовой части.||
|
||||
|
||||
▪ **5.11 Маршрутизация?**
|
||||
||Узел сравнивает адрес со своей маской: своя подсеть — ARP и напрямую, чужая — на шлюз. Шлюз по умолчанию — выход в другие сети.||
|
||||
|
||||
▪ **5.12 ICMP?**
|
||||
||Служебные сообщения: `ping` (echo request/reply), `traceroute` (истечение TTL), «destination unreachable».||
|
||||
|
||||
▪ **5.13 Порядок установки TCP-соединения?**
|
||||
||SYN → SYN-ACK → ACK (трёхстороннее рукопожатие).||
|
||||
|
||||
▪ **5.14 Как закрывается TCP?**
|
||||
||FIN → ACK → FIN → ACK; сторона, закрывшая первой, ждёт TIME_WAIT (2×MSL), чтобы добить потерянные сегменты.||
|
||||
|
||||
▪ **5.15 Флаги TCP?**
|
||||
||SYN, ACK, FIN, RST, PSH, URG.||
|
||||
|
||||
▪ **5.16 Что даёт TCP?**
|
||||
||Надёжность: нумерация, подтверждения, ретрансмиссии по таймауту, окно (управление потоком), контроль перегрузки, сохранение порядка.||
|
||||
|
||||
▪ **5.17 Что такое окно?**
|
||||
||Сколько байт можно отправить без подтверждения. Управляет скоростью и защищает от переполнения получателя.||
|
||||
|
||||
▪ **5.18 UDP?**
|
||||
||Без соединения и гарантий: заголовок 8 байт, порядок и доставка не гарантируются. Быстро и дёшево: DNS, DHCP, VoIP, игры, стриминг.||
|
||||
|
||||
▪ **5.19 TCP или UDP — когда что?**
|
||||
||TCP — когда важна целостность (файлы, HTTP, SSH). UDP — когда важна задержка или данные самодостаточны (DNS, видео, телеметрия).||
|
||||
|
||||
▪ **5.20 Что такое порт?**
|
||||
||Номер приложения на узле (16 бит). Известные: 22 SSH, 53 DNS, 80 HTTP, 443 HTTPS.||
|
||||
|
||||
▪ **5.21 DNS?**
|
||||
||Превращает имя в IP. Обычно UDP/53, при больших ответах — TCP/53.||
|
||||
|
||||
▪ **5.22 DHCP?**
|
||||
||Автоматическая выдача IP, маски, шлюза, DNS.||
|
||||
|
||||
▪ **5.23 NAT?**
|
||||
||Подмена адресов при выходе в интернет: много внутренних устройств через один внешний IP.||
|
||||
|
||||
▪ **5.24 Сокеты: как устроен сервер?**
|
||||
||`socket` → `bind` → `listen` → `accept` → `read`/`write` → `close`. Клиент: `socket` → `connect`. Для множества соединений — `epoll` и неблокирующие сокеты.||
|
||||
|
||||
▪ **5.25 Что такое неблокирующий сокет и EAGAIN?**
|
||||
||Вызов не ждёт данных: если их нет, возвращает −1 и `errno = EAGAIN` — надо вернуться позже.||
|
||||
|
||||
▪ **5.26 Чем смотрят трафик?**
|
||||
||`tcpdump`, Wireshark. Базово: `tcpdump -i eth0 -nn port 80`.||
|
||||
|
||||
|
||||
**6. Многопоточность (в вакансии: многопоточные приложения)**
|
||||
|
||||
▪ **6.1 Как создать поток в C++?**
|
||||
||`std::thread t(f, args); t.join();` (или `detach`, но тогда следи за временем жизни).||
|
||||
|
||||
▪ **6.2 Как защитить общие данные?**
|
||||
||`std::mutex` + `std::lock_guard`/`std::unique_lock`; для счётчиков — `std::atomic`.||
|
||||
|
||||
▪ **6.3 Что такое ложное пробуждение?**
|
||||
||`wait` может вернуться без сигнала — поэтому ждут в цикле с предикатом.||
|
||||
|
||||
▪ **6.4 Как избежать дедлока?**
|
||||
||Единый порядок захвата мьютексов, `std::lock`/`std::scoped_lock` для нескольких сразу, не держать блокировку при вызове чужого кода.||
|
||||
|
||||
▪ **6.5 Producer/consumer — как?**
|
||||
||Очередь + мьютекс + condition_variable: производитель кладёт и уведомляет, потребитель ждёт и забирает.||
|
||||
|
||||
▪ **6.6 Пул потоков зачем?**
|
||||
||Создание потока дорого; пул переиспользует N потоков и очередь задач.||
|
||||
|
||||
▪ **6.7 Потокобезопасный size()?**
|
||||
||Нужен либо атомарный счётчик, либо мьютекс: без этого чтение и запись — гонка данных.||
|
||||
|
||||
|
||||
**7. Git**
|
||||
|
||||
▪ **7.1 Основной цикл работы?**
|
||||
||`git clone` → `git checkout -b feature` → правки → `git add` → `git commit` → `git push` → pull request.||
|
||||
|
||||
▪ **7.2 Что такое коммит, ветка, HEAD?**
|
||||
||Коммит — снимок состояния с родителями. Ветка — подвижный указатель на коммит. HEAD — где ты сейчас.||
|
||||
|
||||
▪ **7.3 merge и rebase?**
|
||||
||merge создаёт коммит слияния, история ветвится. rebase переносит коммиты поверх другой ветки — история линейная, но переписываются хеши.||
|
||||
|
||||
▪ **7.4 Конфликт — что делать?**
|
||||
||Git помечает файлы, правишь вручную, `git add`, `git merge --continue` (или `--abort`).||
|
||||
|
||||
▪ **7.5 reset, revert, checkout?**
|
||||
||`reset` двигает ветку (может потерять коммиты), `revert` создаёт обратный коммит — безопасно для общей ветки, `checkout`/`switch` переключает ветки и файлы.||
|
||||
|
||||
▪ **7.6 stash?**
|
||||
||Отложить незакоммиченные изменения: `git stash`, потом `git stash pop`.||
|
||||
|
||||
▪ **7.7 fetch и pull?**
|
||||
||`fetch` скачивает без слияния, `pull` = fetch + merge (или rebase).||
|
||||
|
||||
▪ **7.8 Как посмотреть историю и что менялось?**
|
||||
||`git log --oneline --graph`, `git diff`, `git show <commit>`, `git blame`.||
|
||||
|
||||
▪ **7.9 Что не коммитить?**
|
||||
||Секреты, артефакты сборки, большие бинарники — через `.gitignore`.||
|
||||
|
||||
|
||||
**8. Docker**
|
||||
|
||||
▪ **8.1 Образ и контейнер?**
|
||||
||Образ — неизменяемый шаблон (слои файловой системы). Контейнер — запущенный экземпляр образа плюс своё изменяемое состояние.||
|
||||
|
||||
▪ **8.2 Чем отличается от виртуальной машины?**
|
||||
||Контейнер использует ядро хоста и изолирует процессы (namespaces, cgroups) — легче и стартует за секунды; VM несёт своё ядро.||
|
||||
|
||||
▪ **8.3 Dockerfile — ключевые инструкции?**
|
||||
||`FROM`, `RUN`, `COPY`, `WORKDIR`, `ENV`, `CMD`/`ENTRYPOINT`, `EXPOSE`.||
|
||||
|
||||
▪ **8.4 Зачем слои и порядок инструкций?**
|
||||
||Каждая инструкция — слой, слои кэшируются; часто меняющееся (код) ставят после редко меняющегося (зависимости), чтобы кэш работал.||
|
||||
|
||||
▪ **8.5 Volume и bind mount?**
|
||||
||Volume — управляемое Docker хранилище (данные переживают контейнер). Bind mount — каталог хоста внутри контейнера.||
|
||||
|
||||
▪ **8.6 Сети в Docker?**
|
||||
||По умолчанию bridge с внутренними IP; порты публикуются через `-p 8080:80`. Есть host и overlay для swarm.||
|
||||
|
||||
▪ **8.7 docker-compose?**
|
||||
||Описание нескольких сервисов в одном YAML: `docker compose up -d`.||
|
||||
|
||||
▪ **8.8 Где это в Eltex?**
|
||||
||Воспроизводимая сборка и тесты: один образ у всех, «у меня работает» перестаёт быть аргументом.||
|
||||
|
||||
|
||||
**9. GDB и отладка**
|
||||
|
||||
▪ **9.1 Как запустить?**
|
||||
||`g++ -g -O0 prog.cpp -o prog` (обязательно `-g`), затем `gdb ./prog`, `run`.||
|
||||
|
||||
▪ **9.2 Основные команды?**
|
||||
||`break main` / `break file:line`, `run`, `next` (по шагам, через вызовы), `step` (внутрь), `continue`, `print x`, `bt` (стек вызовов), `frame N`, `watch var`, `info threads`.||
|
||||
|
||||
▪ **9.3 Как отладить падение?**
|
||||
||Запустить, получить `bt`, посмотреть кадр с падением, `print` указателей; либо core dump (`ulimit -c unlimited`, затем `gdb prog core`).||
|
||||
|
||||
▪ **9.4 Что такое core dump?**
|
||||
||Снимок памяти процесса в момент падения; позволяет разобраться постфактум.||
|
||||
|
||||
▪ **9.5 Санитайзеры?**
|
||||
||ASAN (память), UBSAN (UB), TSan (гонки), MSan (неинициализированная память) — включаются флагом `-fsanitize=...`.||
|
||||
|
||||
▪ **9.6 valgrind?**
|
||||
||Инструмент поиска утечек и ошибок памяти без пересборки; медленнее санитайзеров.||
|
||||
|
||||
|
||||
**10. Bash и инструменты**
|
||||
|
||||
▪ **10.1 Что такое скрипт и его шапка?**
|
||||
||`#!/usr/bin/env bash` плюс `set -euo pipefail` — падать на ошибках, на необъявленных переменных и в конвейерах.||
|
||||
|
||||
▪ **10.2 Переменные и аргументы?**
|
||||
||`name=value`, `$name`, `$1..$9`, `$#`, `$@`, `$?` (код возврата), `$$` (PID).||
|
||||
|
||||
▪ **10.3 grep, awk, sed — для чего?**
|
||||
||grep — поиск по шаблону, awk — обработка по колонкам и подсчёты, sed — замена/правка потока. Для больших файлов — только они, а не bash-цикл по строкам.||
|
||||
|
||||
▪ **10.4 Пайплайны и перенаправления?**
|
||||
||`cmd1 | cmd2`, `>`, `>>`, `2>`, `2>&1`, `tee`.||
|
||||
|
||||
▪ **10.5 Как найти файлы и выполнить команду?**
|
||||
||`find /path -name '*.log' -mtime -1`, `find ... -exec ... {} +`, `xargs`.||
|
||||
|
||||
▪ **10.6 Полезное на каждый день?**
|
||||
||`ps/top`, `ss -tulpn` (порты), `df -h`, `du -sh`, `tail -f`, `journalctl -u сервис`, `systemctl status`.||
|
||||
|
||||
|
||||
**11. Embedded и SoC (в вакансии «плюс», знать обзорно)**
|
||||
|
||||
▪ **11.1 Что такое bringup?**
|
||||
||Запуск новой платы: uboot → ядро → корневая ФС → периферия. Задача — довести устройство до стабильной работы.||
|
||||
|
||||
▪ **11.2 uboot?**
|
||||
||Загрузчик: инициализирует железо, грузит ядро и передаёт ему параметры (device tree).||
|
||||
|
||||
▪ **11.3 Модуль ядра?**
|
||||
||Код, загружаемый в ядро (`insmod`/`rmmod`), с `init`/`exit`; печатает через `printk`, видно в `dmesg`.||
|
||||
|
||||
▪ **11.4 Символьный драйвер?**
|
||||
||Даёт доступ к устройству как к файлу через `file_operations` (`open`, `read`, `write`, `ioctl`).||
|
||||
|
||||
▪ **11.5 Device tree?**
|
||||
||Описание железа (адреса, прерывания, шины) для ядра — отдельно от кода.||
|
||||
|
||||
▪ **11.6 Cross-compile?**
|
||||
||Сборка под другую архитектуру (например ARM на x86) тулчейном `arm-linux-gnueabihf-gcc`.||
|
||||
|
||||
▪ **11.7 Что сказать честно?**
|
||||
||Опыта продуктовой разработки драйверов нет, теорию знаю: модуль, драйвер, device tree, cross-compile; готов добирать на месте.||
|
||||
|
||||
|
||||
**12. Вопросы, которые задаст HR (и хорошие ответы)**
|
||||
|
||||
▪ **12.1 Расскажи о себе.**
|
||||
||40 секунд: кто, сколько лет в разработке, на чём пишешь (C/C++, Linux), чем занимался последним, почему интересна встраиваемая разработка и сети.||
|
||||
|
||||
▪ **12.2 Почему Eltex?**
|
||||
||Продукт настоящий и низкоуровневый: коммутаторы, маршрутизаторы, GPON. Хочу расти в C++/Linux/сетях на реальном железе, а не на абстрактных сервисах.||
|
||||
|
||||
▪ **12.3 Что знаешь о компании?**
|
||||
||Более 2000 человек, Новосибирск, телекоммуникационное оборудование (Ethernet-коммутаторы, сервисные маршрутизаторы, Wi-Fi, GPON, IoT), свои SoC-устройства.||
|
||||
|
||||
▪ **12.4 Почему уходишь с текущего места?**
|
||||
||Без негатива: хочу ближе к системной разработке и сетям, где больше глубины.||
|
||||
|
||||
▪ **12.5 Готов к офису/гибриду в Новосибирске?**
|
||||
||Отвечай прямо, как есть; если релокация — скажи, что готов обсуждать сроки.||
|
||||
|
||||
▪ **12.6 Ожидания по зарплате?**
|
||||
||Назови вилку с обоснованием по рынку и добавь «готов обсуждать по итогам интервью».||
|
||||
|
||||
▪ **12.7 Сильные и слабые стороны?**
|
||||
||Сильная — довожу до работающего результата, разбираюсь в отладке. Слабая — называй реальную и что делаешь: например, «раньше писал по памяти, теперь веду заметки и проверяю сложности по коду».||
|
||||
|
||||
▪ **12.8 Готов к задачам на алгоритмы?**
|
||||
||Да, тренируюсь: базовые структуры, сложности, типовые задачи на строки/массивы/графы.||
|
||||
|
||||
▪ **12.9 Есть вопросы к нам?**
|
||||
||Обязательно спроси: какой продукт и команда, на каком стеке и железе, как устроен онбординг, как выглядит процесс разработки и ревью, что считается успехом в первые месяцы.||
|
||||
|
||||
▪ **12.10 Что почитать про нас перед интервью?**
|
||||
||Сайт Eltex, раздел про продукты и вакансию; интервью и доклады сотрудников на конференциях.||
|
||||
|
||||
|
||||
**13. Шпаргалка чисел (выучить наизусть)**
|
||||
|
||||
- Ethernet-заголовок 14 байт, VLAN-тег +4, MTU 1500.
|
||||
- IPv4-заголовок 20 байт, TCP-заголовок 20 байт, UDP-заголовок 8 байт.
|
||||
- MAC 48 бит, IPv4 32 бита, порт 16 бит.
|
||||
- Подсети: /24 → 254 узла, /26 → 62, /30 → 2.
|
||||
- log₂(1000) ≈ 10, log₂(10⁶) ≈ 20.
|
||||
- 137 = SIGKILL (128+9), 139 = SIGSEGV (128+11), 143 = SIGTERM (128+15).
|
||||
- Порты: 22 SSH, 53 DNS, 80 HTTP, 443 HTTPS.
|
||||
Reference in New Issue
Block a user