База, которая не устаревает вместе с языками и фреймворками: как растёт сложность, как устроены хеш-таблица и куча, почему быстрая сортировка иногда медленная и как ищут путь на карте. Алгоритмы можно пройти по шагам и на своих данных.
- Что такое алгоритм A* и чем он лучше Дейкстры? Middle
A — Дейкстра с подсказкой направления: вершины выбираются по f = g + h, где g — пройденное расстояние, h — оценка остатка до цели.
- Что такое амортизированная сложность? Junior
Амортизированная сложность — средняя стоимость операции в длинной серии: редкие дорогие операции «размазываются» по многим дешёвым.
- Чем массив отличается от связного списка? Junior
Массив — элементы подряд в памяти: доступ по индексу O(1), вставка в середину O(n); связный список — узлы со ссылками: вставка по известному месту O(1), доступ по индексу O(n).
- Чем асинхронность отличается от многопоточности? Middle
Многопоточность — несколько потоков ОС, их переключает ядро. Асинхронность — одна (или немного) нить выполнения переключается между задачами сама, в точках ожидания (await).
- Что такое атомарные операции и CAS? Middle
CAS (compare-and-swap) — инструкция процессора «если в ячейке ещё A, запиши B» за один неделимый шаг. На ней строят атомарные счётчики и структуры без блокировок.
- Почему индексы в базах данных устроены как B-дерево? Middle
B-дерево — сбалансированное дерево с широкими узлами: в узле сотни ключей, узел = страница на диске (8–16 КБ). Высота 3–4 даже для миллиардов строк — значит, 3–4 чтения страницы.
- Чем обход в ширину (BFS) отличается от обхода в глубину (DFS)? Junior
BFS идёт по уровням через очередь и находит кратчайший путь по числу рёбер; DFS идёт вглубь до упора через стек или рекурсию.
- Что такое О-большое (Big O) и зачем оценивать сложность алгоритма? Junior
О-большое описывает, как растёт время или память алгоритма с ростом входа n, отбрасывая константы и младшие слагаемые.
- Что такое двоичное дерево поиска и зачем его балансировать? Junior
В двоичном дереве поиска для каждого узла слева — меньшие ключи, справа — большие; поиск идёт по одной ветке — O(высоты).
- Как работает бинарный поиск? Junior
В отсортированном массиве сравниваем искомое с серединой и отбрасываем половину, где его быть не может: O(log n) шагов.
- Какие битовые операции вы знаете и где они применяются? Junior
AND &, OR |, XOR ^, NOT ~, сдвиги << и >> работают с каждым битом отдельно и стоят один такт.
- Что такое переключение контекста и почему оно дорогое? Middle
Ядро останавливает один поток, сохраняет его регистры и состояние и загружает другой. Прямая цена — единицы микросекунд, но главное — остывшие кэши процессора.
- Что такое CSRF и как он связан с CORS? Middle
CSRF — чужой сайт заставляет браузер жертвы отправить запрос на ваш сайт; браузер сам приложит cookie, и запрос выполнится от имени пользователя. CORS — правила, когда скрипт с…
- Что такое взаимная блокировка и как её избежать? Middle
Взаимная блокировка — потоки ждут друг друга по кругу: первый держит A и ждёт B, второй держит B и ждёт A. Никто не продвинется.
- Как работает алгоритм Дейкстры? Middle
Дейкстра находит кратчайшие пути от одной вершины во взвешенном графе с неотрицательными весами: каждый раз берёт ближайшую ещё не обработанную вершину и ослабляет рёбра из неё.
- Как работает DNS? Junior
DNS — распределённая иерархическая база «имя → адрес». Рекурсивный резолвер спрашивает по цепочке: корневые серверы → серверы зоны .ru → авторитетный сервер домена.
- Что такое динамическое программирование? Middle
Динамическое программирование — решать задачу через ответы на перекрывающиеся подзадачи, считая каждую один раз и сохраняя в таблицу.
- Что такое файловый дескриптор? Junior
Файловый дескриптор — небольшое целое число, по которому процесс обращается к открытому ресурсу: файлу, сокету, каналу, устройству.
- Почему 0.1 + 0.2 не равно 0.3? Junior
double хранит число как двоичную дробь: знак, порядок и 52 бита мантиссы. 0.1 в двоичной системе бесконечна, как 1/3 в десятичной, — хранится приближение.
- Как представить граф в программе? Junior
Два основных способа: матрица смежности (таблица V×V) и список смежности (для каждой вершины — список соседей).
- Как устроена хеш-таблица? Junior
Хеш-таблица — массив «корзин»: хеш-функция превращает ключ в номер корзины, поэтому поиск, вставка и удаление в среднем — O(1).
- Чем хеширование отличается от шифрования и кодирования? Junior
Кодирование (Base64, URL-кодирование) — смена формата, обратимо без секрета. Шифрование — обратимо только с ключом. Хеширование — необратимый отпечаток фиксированной длины.
- Что такое двоичная куча и очередь с приоритетом? Junior
Двоичная куча — дерево, где родитель не больше потомков (min-heap): минимум всегда в корне, вставка и извлечение — O(log n).
- Чем отличаются HTTP/1.1, HTTP/2 и HTTP/3? Middle
HTTP/1.1 — текст, один запрос за раз в соединении. HTTP/2 — бинарные кадры, много потоков в одном TCP-соединении. HTTP/3 — то же поверх QUIC (UDP), без общей блокировки при потере…
- Что происходит при переполнении целого числа? Junior
Результат не влезает в разрядность — в Java, Go, C# он молча заворачивается по модулю 2ⁿ: MAX_VALUE + 1 = MIN_VALUE.
- Какие аномалии бывают при параллельных транзакциях и от чего защищает каждый уровень изоляции? Middle
Уровни изоляции — компромисс между параллельностью и корректностью: чем ниже уровень, тем больше аномалий пропускается.
- Какие порядки задержек нужно знать разработчику? Middle
Наносекунды — процессор и кэши, ~100 нс — оперативная память, десятки–сотни микросекунд — SSD и сеть внутри дата-центра, миллисекунды — диск HDD и другой город, ~100 мс — другой…
- Что такое LSM-дерево и чем оно отличается от B-дерева? Senior
LSM-дерево превращает случайные записи в последовательные: запись идёт в журнал и в память (memtable), при заполнении memtable сбрасывается на диск отсортированным неизменяемым…
- Почему один поток может не увидеть изменение, сделанное другим? Middle
Компилятор, JIT и процессор переупорядочивают и кэшируют операции с памятью — для одного потока результат тот же, для другого нет. Без синхронизации запись может стать видна…
- Как работает сортировка слиянием? Junior
Делим массив пополам, рекурсивно сортируем половины и сливаем их, каждый раз беря меньший из двух первых элементов.
- Как хранить денежные суммы в коде и в базе? Junior
Деньги — в целых минимальных единицах (копейках) или в десятичном типе: BigDecimal, Decimal, NUMERIC в базе. Не в double.
- Чем мьютекс отличается от семафора? Junior
Мьютекс — замок на одного: в критической секции один поток, отпустить может только владелец. Семафор — счётчик разрешений: одновременно до N потоков.
- Что такое MVCC и как он позволяет читать без блокировок? Middle
Многоверсионность: изменение строки создаёт новую версию, а старая остаётся. Каждая транзакция читает снимок — версии, подтверждённые до её начала (или до начала запроса).
- Чем оптимистическая блокировка отличается от пессимистической и когда какую выбрать? Middle
Пессимистическая — сначала блокируем строку (SELECT ... FOR UPDATE), потом меняем; остальные ждут. Оптимистическая — не блокируем, а при записи проверяем версию: UPDATE ... WHERE…
- Как планировщик ОС решает, какой поток выполнять? Middle
Планировщик выдаёт потокам, готовым к работе, кванты времени на ядрах и вытесняет их по таймеру — так один поток не захватит процессор.
- Расскажите про модель OSI и стек TCP/IP. Junior
Сеть устроена слоями: каждый решает свою задачу и пользуется нижним. OSI — учебная модель из 7 уровней, на практике работает TCP/IP из 4.
- Почему повторное чтение файла быстрее первого? Middle
ОС кэширует содержимое файлов в свободной памяти — page cache. Повторное чтение берётся из памяти, а запись сначала попадает в кэш и на диск уходит позже.
- Как правильно хранить пароли пользователей? Junior
Не хранить пароль вовсе — только результат медленной функции с солью: argon2id, bcrypt или scrypt. При входе считаем то же самое и сравниваем.
- Чем процесс отличается от потока? Junior
Процесс — запущенная программа со своим адресным пространством и ресурсами. Поток — ход выполнения внутри процесса; потоки делят память процесса.
- Как реализовать схему производитель — потребитель? Middle
Производители кладут задачи в ограниченную блокирующую очередь, потребители забирают. Полная очередь останавливает производителя, пустая — потребителя.
- Как работает быстрая сортировка и когда она работает медленно? Junior
Выбираем опорный элемент, разбиваем массив: меньшие — влево, большие — вправо, опорный встаёт на своё место; затем рекурсивно сортируем части.
- Что такое состояние гонки? Junior
Гонка — результат зависит от того, в каком порядке потоки выполнили свои шаги. Классика: count++ — это три шага (прочитать, прибавить, записать), и два потока теряют обновления.
- Что такое рекурсия и мемоизация? Junior
Рекурсия — функция вызывает саму себя для меньшей задачи и останавливается на базовом случае; мемоизация — кэш уже посчитанных результатов.
- Чем строковое хранение отличается от колоночного? Middle
Строковое: строка лежит целиком подряд — быстро прочитать или изменить одну запись (OLTP). Колоночное: каждая колонка лежит отдельно — быстро посчитать агрегат по нескольким…
- Чем SIGTERM отличается от SIGKILL и как правильно завершать сервис? Middle
SIGTERM — вежливая просьба завершиться: процесс может её перехватить и закончить работу. SIGKILL — убийство ядром, перехватить нельзя.
- Можно ли отсортировать быстрее, чем за O(n log n)? Middle
Сравнениями — нельзя: любой алгоритм, который только сравнивает элементы, в худшем случае делает Ω(n log n) сравнений. Без сравнений — можно при ограничениях на ключи.
- Какие алгоритмы сортировки вы знаете и чем они отличаются? Junior
Простые — пузырьком, вставками, выбором — O(n²); эффективные — слиянием, быстрая, пирамидальная — O(n log n). Отличаются худшим случаем, памятью и устойчивостью.
- Что такое SQL-инъекция и как от неё защититься? Junior
Инъекция — данные пользователя попадают в текст запроса и меняют его смысл: ' OR '1'='1 превращает проверку пароля в «всегда истина».
- Что такое устойчивая (стабильная) сортировка и когда это важно? Junior
Устойчивая сортировка сохраняет исходный порядок элементов с равными ключами.
- Чем стек отличается от очереди и где они применяются? Junior
Стек — последним пришёл, первым ушёл (LIFO); очередь — первым пришёл, первым ушёл (FIFO). Основные операции — O(1).
- Чем стек отличается от кучи? Junior
Стек — память для вызовов функций: локальные переменные и адрес возврата, выделяется и освобождается автоматически при входе и выходе. Куча — память для данных, чьё время жизни не…
- Чем симметричное шифрование отличается от асимметричного и что такое цифровая подпись? Middle
Симметричное — один общий ключ шифрует и расшифровывает (AES): быстро, но ключ надо как-то передать. Асимметричное — пара ключей: открытый знают все, закрытый — только владелец…
- Что такое системный вызов и чем режим ядра отличается от пользовательского? Middle
Программы работают в пользовательском режиме без прямого доступа к железу. Всё, что требует привилегий — файлы, сеть, память, процессы, — делается системным вызовом в ядро.
- Как устанавливается и закрывается TCP-соединение? Middle
Установка — SYN → SYN-ACK → ACK: стороны обмениваются начальными номерами последовательности. Один оборот (RTT) до первых данных.
- Как TCP обеспечивает надёжную доставку и не перегружает сеть? Middle
Каждый байт пронумерован, получатель подтверждает принятое (ACK), неподтверждённое отправляется повторно — по таймауту или по трём повторным ACK.
- Чем TCP отличается от UDP? Junior
TCP — надёжный упорядоченный поток байтов с установкой соединения. UDP — отдельные датаграммы без гарантий: быстро и просто.
- Зачем нужен пул потоков и как выбрать его размер? Middle
Пул держит заранее созданные потоки и очередь задач: не платим за создание потока на каждую задачу и ограничиваем параллелизм.
- Что такое компромисс между временем и памятью? Junior
Часто можно ускорить алгоритм, потратив больше памяти — сохранить промежуточные результаты, индекс или предвычисленную таблицу — и наоборот.
- Как работает HTTPS и TLS-рукопожатие? Middle
TLS даёт шифрование, целостность и подлинность сервера. В рукопожатии стороны согласуют общий ключ (обмен Диффи — Хеллмана), сервер доказывает владение сертификатом, дальше данные…
- Как в компьютере хранятся отрицательные целые числа? Junior
Почти везде — дополнительный код (two's complement): старший бит отрицательный, его вес −2ⁿ⁻¹.
- Чем Unicode отличается от UTF-8? Junior
Unicode — таблица: каждому символу номер (кодовую точку), U+0416 — «Ж». UTF-8 — способ записать эти номера байтами.
- Что такое виртуальная память? Middle
Каждый процесс видит своё виртуальное адресное пространство; процессор с ОС переводят виртуальные адреса в физические страницами (обычно по 4 КБ).
- Что такое журнал предзаписи (WAL) и зачем он нужен? Middle
Сначала запись в журнал, потом в данные. Перед изменением страниц база дописывает в конец журнала, что собирается изменить, и делает fsync. После сбоя журнал проигрывается заново…
- Что происходит, когда вы вводите адрес сайта в браузере и нажимаете Enter? Junior
DNS находит IP → TCP-рукопожатие → TLS-рукопожатие → HTTP-запрос → сервер (балансировщик, приложение, база) → ответ → браузер разбирает HTML, догружает ресурсы и рисует страницу.
- Что такое XSS и как от неё защищаться? Junior
XSS — злоумышленник заставляет сайт выполнить его JavaScript в браузере другого пользователя: скрипт работает с правами сайта — читает данные страницы, отправляет запросы от имени…