Подготовка к собеседованию — Full-Stack разработчик
Колода из 812+ карточек с вопросами для собеседования по направлению «Full-Stack разработчик» — по темам и уровню сложности, с повторениями по вашим оценкам. Посмотрите несколько карточек ниже, затем выберите доступ, чтобы учить всё направление по расписанию в стиле Anki (SM-2).
Новым подписчикам месяца или года может быть доступен бесплатный пробный период 7 дней. Условия и сумму подтвердит страница оплаты.
С чего начать
Подойдёт после создания небольшого веб-приложения. Нужны основы Python, JavaScript, SQL и HTML/CSS: карточки помогают повторять концепции, а не учат программированию с нуля.
Первый проход: Python → Базы данных. Начните с базовых вопросов в этих модулях, затем продолжайте по плану. К сложным и senior-вопросам возвращайтесь по требованиям вакансии; все карточки доступны с самого начала.
Общие темы могут входить в несколько направлений и сохраняют одну историю повторений. План ниже отмечает общие основы и профильные модули; выбирайте глубину под свою вакансию.
Что внутри
Все темы направления, сгруппированные так, как вы будете их учить.
Python
133 карточкиПрофильный модуль
Базы данных
108 карточекПрофильный модуль
Бэкенд
176 карточекПрофильный модуль
Фронтенд
149 карточекПрофильный модуль
Веб-безопасность
8 карточекОбщие основы
Основы CS
101 карточкаПрофильный модуль
DevOps и инфраструктура
47 карточекПрофильный модуль
Системный дизайн
52 карточкиПрофильный модуль
Поведенческое интервью
38 карточекПрофильный модуль
Примеры вопросов
Несколько карточек из колоды — откройте ответ, затем выберите доступ, чтобы учить весь набор по расписанию.
Чем отличаются изменяемые (mutable) и неизменяемые (immutable) типы?
Чем отличаются изменяемые (mutable) и неизменяемые (immutable) типы?
Короткий ответ: Изменяемый объект можно менять на месте (list, dict, set), неизменяемый — нельзя (int, str, tuple). Перепривязка переменной и изменение объекта — разные действия.
items = [1, 2]
alias = items
items.append(3)
assert alias is items and alias == [1, 2, 3]
text = "hello"
original = text
text += " world"
assert original == "hello" # исходная строка не изменилась
Подробно:
id()идентифицирует объект и постоянен в течение его жизни. То, что это адрес памяти, — деталь реализации CPython.- В кортеже нельзя заменить элементы, но вложенный список может изменяться. Неизменяемость не означает автоматически глубокую неизменяемость или потокобезопасность.
- Ключ словаря и элемент множества должны быть хешируемыми: хеш остаётся стабильным, а равные объекты имеют равные хеши. Кортеж со списком нехешируем. Изменяемый экземпляр пользовательского класса может хешироваться по идентичности: хешируемость не синоним неизменяемости.
- Функция получает ссылки на объекты. Мутация аргумента может быть видна вызывающему коду; перепривязка локального параметра не перепривязывает переменную снаружи.
Источники: Хешируемость Python, идентичность объектов.
Что делает SELECT и в каком порядке выполняются части запроса?
Что делает SELECT и в каком порядке выполняются части запроса?
Короткий ответ: SELECT извлекает строки из таблиц. Логический порядок выполнения НЕ совпадает с порядком написания: сначала FROM, затем WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY, LIMIT.
Подробно:
Порядок написания (синтаксический):
SELECT DISTINCT col1, agg(col2)
FROM t
WHERE cond
GROUP BY col1
HAVING agg_cond
ORDER BY col1
LIMIT 10 OFFSET 20;
Логический порядок исполнения:
1. FROM / JOIN -- какие таблицы, как соединить
2. WHERE -- фильтр строк ДО группировки
3. GROUP BY -- группировка
4. HAVING -- фильтр групп ПОСЛЕ агрегации
5. SELECT -- выражения, алиасы, оконные функции
6. DISTINCT -- удаление дублей
7. ORDER BY -- сортировка
8. LIMIT / OFFSET -- срез
⚠️ Ловушка: алиас из SELECT нельзя использовать в WHERE (т.к. WHERE выполняется раньше SELECT), но можно в ORDER BY и часто в GROUP BY (зависит от СУБД). Пример ошибки:
SELECT salary * 12 AS annual FROM emp WHERE annual > 100000; -- ОШИБКА
SELECT salary * 12 AS annual FROM emp ORDER BY annual; -- ОК
Что такое HTTP и как устроен цикл запрос-ответ?
Что такое HTTP и как устроен цикл запрос-ответ?
Короткий ответ: HTTP (HyperText Transfer Protocol) — текстовый прикладной протокол клиент-сервер поверх TCP (в HTTP/3 — поверх QUIC/UDP). Клиент отправляет запрос, сервер возвращает ответ; соединение без сохранения состояния между запросами (stateless).
Подробно:
Запрос состоит из стартовой строки (метод + путь + версия), заголовков и опционального тела:
POST /api/v1/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Accept: application/json
Content-Length: 38
{"name": "Анна", "email": "a@ex.com"}
Ответ состоит из строки статуса (версия + код + reason phrase), заголовков и тела:
HTTP/1.1 201 Created
Content-Type: application/json
Location: /api/v1/users/42
{"id": 42, "name": "Анна", "email": "a@ex.com"}
⚠️ Ловушка: «HTTP работает только поверх TCP» — неверно для HTTP/3, который использует QUIC поверх UDP. И reason phrase («OK», «Created») носит чисто информативный характер — клиенты должны опираться на числовой код, а не на текст.
Типы данных: примитивы vs объекты?
Типы данных: примитивы vs объекты?
Короткий ответ: В JS 7 примитивных типов (string, number, boolean, null, undefined, symbol, bigint) и один ссылочный тип — объект (включая массивы, функции, даты). Примитивы иммутабельны и копируются по значению, объекты — по ссылке.
Подробно:
// Примитивы — копируются по значению
let a = 10;
let b = a;
b = 20;
console.log(a); // 10 — a не изменилось
// Объекты — копируются по ссылке
let obj1 = { x: 1 };
let obj2 = obj1;
obj2.x = 99;
console.log(obj1.x); // 99 — обе переменные указывают на один объект
// Примитивы иммутабельны: "изменить" строку нельзя, можно только создать новую
let str = "hello";
str[0] = "H";
console.log(str); // "hello" — не изменилось
// bigint — для целых чисел больше 2^53 - 1
const big = 9007199254740993n;
console.log(big + 1n); // 9007199254740994n
// symbol — уникальный идентификатор
const id = Symbol("id");
Примитивы хранят значение напрямую. У них «есть методы» благодаря автоупаковке (autoboxing): "abc".toUpperCase() временно оборачивает строку в объект-обёртку String.
⚠️ Ловушка: typeof function(){} возвращает 'function', хотя функция — это объект. А typeof [] — 'object', поэтому для массивов используйте Array.isArray([]).
Почему браузер блокирует ваш fetch с ошибкой CORS, что такое preflight-запрос и что должен вернуть сервер?
Почему браузер блокирует ваш fetch с ошибкой CORS, что такое preflight-запрос и что должен вернуть сервер?
Короткий ответ: Same-origin policy разрешает скриптам страницы читать ответы только своего origin (схема + хост + порт). CORS — это согласие сервера: заголовки ответа вроде Access-Control-Allow-Origin сообщают браузеру, каким другим origin можно читать ответ. Проверку выполняет браузер, поэтому чинить нужно на сервере (или через same-origin прокси), а не во фронтенд-коде.
Подробно:
- Простые запросы —
GET,HEADилиPOSTтолько с safelisted-заголовками иContent-Typetext/plain,multipart/form-dataилиapplication/x-www-form-urlencoded. Они уходят сразу, а браузер потом прячет ответ, еслиAccess-Control-Allow-Originне совпал. - Запросы с preflight — всё остальное:
PUT/PATCH/DELETE,Content-Type: application/json, заголовокAuthorizationили кастомный. Браузер сначала шлётOPTIONSи отправляет настоящий запрос, только если ответ это разрешает.Access-Control-Max-Ageкэширует разрешение (Chromium ограничивает его 2 часами). - Credentials — при
fetch(url, { credentials: "include" })сервер должен вернуть точный origin (не*) иAccess-Control-Allow-Credentials: true, а cross-site cookie нужныSameSite=None; Secure. - Чтение заголовков — кроме safelisted-заголовков ответа, JS видит только перечисленные в
Access-Control-Expose-Headers.
OPTIONS /orders/42 HTTP/1.1
Origin: https://app.example.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: authorization, content-type
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Methods: GET, PUT
Access-Control-Allow-Headers: authorization, content-type
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 600
Vary: Origin
⚠️ Частая ошибка: «чинить» CORS на клиенте — добавлять Access-Control-Allow-Origin в запрос или включать mode: "no-cors", который лишь возвращает непрозрачный (opaque) ответ, недоступный для чтения.
Что такое Big O нотация?
Что такое Big O нотация?
Короткий ответ: Big O описывает, как растёт время работы или потребление памяти алгоритма при увеличении размера входных данных n, отбрасывая константы и младшие члены. Это верхняя оценка скорости роста.
Подробно:
Big O отвечает на вопрос «что произойдёт, когда n станет очень большим?». Нас не интересует точное число операций, а только характер роста. Поэтому O(2n + 100) упрощается до O(n), а O(3n² + n) — до O(n²).
Основные классы роста (от лучшего к худшему):
# O(1) — константа: не зависит от n
def first(arr):
return arr[0] if arr else None
# O(log n) — логарифм: каждый шаг делит задачу пополам (бинарный поиск)
def binary_search(arr, target):
lo, hi = 0, len(arr) - 1
while lo <= hi:
mid = (lo + hi) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
lo = mid + 1
else:
hi = mid - 1
return -1
# O(n) — линейная: один проход
def total(arr):
s = 0
for x in arr: # n итераций
s += x
return s
# O(n log n) — эффективные сортировки (merge, quick в среднем, Timsort)
def sort_it(arr):
return sorted(arr)
# O(n^2) — квадрат: вложенный цикл
def has_dup_naive(arr):
for i in range(len(arr)):
for j in range(i + 1, len(arr)):
if arr[i] == arr[j]:
return True
return False
# O(2^n) — экспонента: наивный Фибоначчи, перебор подмножеств
def fib_naive(n):
if n < 2:
return n
return fib_naive(n - 1) + fib_naive(n - 2)
Как оценивать код: последовательные шаги складываются, и остаётся старший член (O(n) + O(n log n) = O(n log n)); вложенные циклы перемножаются (O(n·m), при m = n — O(n²)); отбрасывание половины задачи с постоянной работой на шаге даёт O(log n). Если входов два, сохраняйте обе переменные: O(n + m) нельзя сокращать до O(n), пока не известно, что m ≤ n.
⚠️ Ловушка: Big O — это про асимптотику (поведение при больших n), а не про реальное время. O(n) алгоритм может быть медленнее O(n²) на маленьких данных из-за больших констант. Также путают: Big O (верхняя граница, Ω — нижняя, Θ — точная), в собесах под «O» обычно подразумевают Θ.
Готовы лучше запоминать?
Посмотрите пример, выберите направление и настройте регулярную практику под свою подготовку.
Вопросы об этом направлении
Как готовиться к собеседованию на «Full-Stack разработчик»?
Учите концепции, которые придётся объяснять, а не только те, что умеете кодить. Направление «Full-Stack разработчик» в RecallDeck даёт 812+ отобранных вопросов и возвращает каждый по расписанию в стиле Anki (SM-2), основанному на ваших оценках — чтобы тренировать вспоминание и объяснение. Дополняйте повторения кодингом и пробными собеседованиями.
Какие темы охватывает направление «Full-Stack разработчик»?
Направление «Full-Stack разработчик» разбито на ключевые области, которые реально проверяют на таких собеседованиях, — по темам и уровню сложности (Concept, Junior, Middle, Senior). Полный план и примеры вопросов можно посмотреть выше до входа.
Помогает ли интервальное повторение в подготовке к «Full-Stack разработчик»?
Да. Активное вспоминание и честная самооценка помогают закреплять знания. RecallDeck назначает повторения карт по направлению «Full-Stack разработчик» на основе ваших оценок: знакомые карты возвращаются реже, а сложные получают больше практики.
Можно попробовать направление «Full-Stack разработчик» до оплаты?
Новым подписчикам месячного или годового тарифа может быть доступен пробный период 7 дней со всем направлением «Full-Stack разработчик» и всеми функциями. Право на него и сумму подтвердит страница оплаты; при повторной подписке списание может быть сразу. Отмените подписку онлайн до конца пробного периода, чтобы избежать первого списания. У вечного доступа пробного периода нет.