Подготовка к собеседованию — Full-Stack разработчик
Колода из 716+ карточек с вопросами для собеседования по направлению «Full-Stack разработчик» — по темам и уровню сложности, с повторениями по вашим оценкам. Посмотрите несколько карточек ниже, затем выберите доступ, чтобы учить всё направление по расписанию в стиле Anki (SM-2).
Новым подписчикам месяца или года может быть доступно 7 дней бесплатно. Условия и сумму подтвердит страница оплаты.
С чего начать
Подойдёт после создания небольшого веб-приложения. Нужны основы Python, JavaScript, SQL и HTML/CSS: карточки помогают повторять концепции, а не учат программированию с нуля.
Первый проход: Python → Базы данных. Начните с базовых вопросов в этих модулях, затем продолжайте по плану. К сложным и senior-вопросам возвращайтесь по требованиям вакансии; все карточки доступны с самого начала.
Общие темы могут входить в несколько направлений и сохраняют одну историю повторений. План ниже отмечает общие основы и профильные модули; выбирайте глубину под свою вакансию.
Что внутри
Все темы направления, сгруппированные так, как вы будете их учить.
Python
122 карточкиПрофильный модуль
Базы данных
104 карточкиПрофильный модуль
Бэкенд
169 карточекПрофильный модуль
Фронтенд
146 карточекПрофильный модуль
Основы CS
76 карточекПрофильный модуль
DevOps и инфраструктура
35 карточекПрофильный модуль
Системный дизайн
29 карточекПрофильный модуль
Поведенческое интервью
35 карточекПрофильный модуль
Примеры вопросов
Несколько карточек из колоды — откройте ответ, затем выберите доступ, чтобы учить весь набор по расписанию.
Чем отличаются изменяемые (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([]).
Что такое 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)
Ориентир по росту при n = 1 000 000: O(1) — 1 операция, O(log n) — ~20, O(n) — миллион, O(n log n) — ~20 млн, O(n²) — триллион (уже слишком), O(2^n) — нереально даже при n = 50.
⚠️ Ловушка: Big O — это про асимптотику (поведение при больших n), а не про реальное время. O(n) алгоритм может быть медленнее O(n²) на маленьких данных из-за больших констант. Также путают: Big O (верхняя граница, Ω — нижняя, Θ — точная), в собесах под «O» обычно подразумевают Θ.
Что такое Docker и какую проблему он решает?
Что такое Docker и какую проблему он решает?
Короткий ответ: Docker упаковывает приложение и его зависимости пользовательского пространства в образ, а затем запускает из него изолированный процесс. Это уменьшает различия между разработкой, CI и продакшеном.
Для Go-сервиса образ может содержать бинарник, сертификаты CA и необходимые динамические библиотеки. Совместимые ядро и архитектуру CPU предоставляет хост; конфигурация, секреты, лимиты ресурсов и внешние сервисы задаются отдельно.
docker build -t myapp:1.0 .
docker run -d -p 127.0.0.1:8000:8000 --name myapp myapp:1.0
docker logs -f myapp
Приложение должно слушать интерфейс контейнера, например :8000. Здесь порт опубликован только на loopback хоста для локальной работы.
Ограничение: одинаковый образ не гарантирует одинаковое поведение на любой машине. Linux-контейнеры на macOS/Windows обычно работают внутри Linux-VM; архитектура CPU, возможности ядра, сеть и внешняя конфигурация остаются важны. Собирай варианты для нужных платформ и проверяй реальное окружение запуска.
Источники: Документация 1, Документация 2.
Готовы лучше запоминать?
Посмотрите пример, выберите направление и настройте регулярную практику под свою подготовку.
Вопросы об этом направлении
Как готовиться к собеседованию на «Full-Stack разработчик»?
Учите концепции, которые придётся объяснять, а не только те, что умеете кодить. Направление «Full-Stack разработчик» в RecallDeck даёт 716+ отобранных вопросов и возвращает каждый по расписанию в стиле Anki (SM-2), основанному на ваших оценках — чтобы тренировать вспоминание и объяснение. Дополняйте повторения кодингом и пробными собеседованиями.
Какие темы охватывает направление «Full-Stack разработчик»?
Направление «Full-Stack разработчик» разбито на ключевые области, которые реально проверяют на таких собеседованиях, — по темам и уровню сложности (Concept, Junior, Middle, Senior). Полный план и примеры вопросов можно посмотреть выше до входа.
Помогает ли интервальное повторение в подготовке к «Full-Stack разработчик»?
Да. Активное вспоминание и честная самооценка помогают закреплять знания. RecallDeck назначает повторения карт по направлению «Full-Stack разработчик» на основе ваших оценок: знакомые карты возвращаются реже, а сложные получают больше практики.
Можно попробовать направление «Full-Stack разработчик» до оплаты?
Новым подписчикам месячного или годового тарифа может быть доступен пробный период семь дней со всем направлением «Full-Stack разработчик» и всеми функциями. Право на него и сумму подтвердит страница оплаты; при повторной подписке списание может быть сразу. Отмените подписку онлайн до конца пробного периода, чтобы избежать первого списания. У вечного доступа пробного периода нет.