50 ответов на вопросы программистов: от базовых до сложных

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Новички в программировании, желающие усвоить базовые концепции
  • Опытные разработчики, заинтересованные в обновлении знаний и практических навыков
  • Студенты и профессионалы, готовящиеся к собеседованиям в сфере IT

    Каждый программист сталкивается с моментами, когда ответы на, казалось бы, простые вопросы ускользают из памяти. Даже опытные разработчики регулярно гуглят базовые концепции, настройки фреймворков или синтаксис редко используемых функций. Сегодня я собрал в одном месте 50 самых частых вопросов от новичков до профи — с ответами, примерами кода и практическими рекомендациями. Эта шпаргалка станет вашим надежным компасом в мире программирования. 📚💻

Хотите не просто знать ответы на вопросы, а понимать суть программирования? Курс Обучение Python-разработке от Skypro раскроет все тонкости от базовых концепций до продвинутых техник. За 9 месяцев вы пройдете путь от новичка до профессионала, создадите реальные проекты под руководством практикующих разработчиков и получите поддержку в трудоустройстве. Вместо отдельных вопросов — целостная картина профессии и актуальные навыки!

Базовые концепции программирования: ТОП-10 вопросов

Начнем с фундамента — концепций, которые должен понимать каждый программист независимо от языка и специализации.

1. Что такое переменная? Переменная — именованное место в памяти компьютера, используемое для хранения данных, которые могут изменяться в процессе выполнения программы. По сути, это контейнер для значения, к которому можно обращаться по имени.

JS
Скопировать код
// JavaScript пример
let userName = "Алексей";
userName = "Мария"; // значение переменной изменено

2. В чем разница между компиляцией и интерпретацией? При компиляции весь исходный код преобразуется в машинный код до выполнения программы. При интерпретации код выполняется строка за строкой без предварительного преобразования всей программы. Компилируемые языки обычно работают быстрее, но интерпретируемые более гибкие и переносимые.

Характеристика Компиляция Интерпретация
Скорость выполнения Высокая Ниже
Обнаружение ошибок На этапе компиляции В процессе выполнения
Платформозависимость Да (требует пересборки) Нет (кросс-платформенность)
Примеры языков C, C++, Rust Python, JavaScript, Ruby

3. Что такое алгоритм? Алгоритм — последовательность четко определенных шагов, необходимых для решения задачи или достижения определенного результата за конечное время. Хороший алгоритм должен быть:

  • Точным — каждый шаг должен быть ясно определен
  • Конечным — должен завершаться после определенного числа шагов
  • Эффективным — использовать минимум ресурсов
  • Детерминированным — при одинаковых входных данных всегда давать одинаковый результат

4. Что такое типы данных? Типы данных определяют, какие операции можно выполнять над данными и как они хранятся в памяти. Основные типы данных:

  • Целые числа (int): 1, 42, -99
  • Числа с плавающей точкой (float): 3.14, -0.001
  • Логические значения (boolean): true/false
  • Строки (string): "Привет, мир!"
  • Массивы/списки: [1, 2, 3, 4]
  • Объекты/словари: {"имя": "Иван", "возраст": 25}

Дмитрий Карпов, Lead Python Developer Однажды я проводил код-ревью для младшего разработчика, который создал функцию поиска в массиве размером 10,000 элементов. Его решение работало за O(n²) и программа зависала на реальных данных. Я спросил: "Почему ты не используешь словарь вместо вложенных циклов?"

"А что такое словарь? У нас же Python, а не английский!" — ответил он с недоумением.

Тогда я создал простой пример, где поиск в массиве занимал 5 секунд, а тот же поиск через словарь — 0.001 секунду. Его глаза расширились: "Но это же 5000 раз быстрее!"

Этот случай напомнил мне, почему понимание базовых структур данных критически важно. Недостаточно знать синтаксис языка — нужно понимать, какие инструменты для каких задач предназначены. Теперь этот разработчик первым делом задает вопрос: "Какая структура данных оптимальна для этой задачи?"

5. Что такое условные операторы? Условные операторы позволяют выполнять разные блоки кода в зависимости от условий. Основные конструкции — if, else, else if (или elif в некоторых языках).

Python
Скопировать код
# Python пример
age = 18
if age < 18:
print("Несовершеннолетний")
elif age == 18:
print("Только что стал совершеннолетним")
else:
print("Взрослый")

6. Что такое цикл и какие типы циклов существуют? Цикл — конструкция, позволяющая многократно выполнять блок кода. Основные типы:

  • for — цикл с заданным количеством итераций
  • while — цикл, выполняющийся пока условие истинно
  • do-while — цикл, выполняющийся хотя бы один раз, затем пока условие истинно
  • for-each — цикл для перебора элементов коллекции

7. Что такое функция? Функция — блок кода, выполняющий определённую задачу. Функции делают код модульным, повторно используемым и легче сопровождаемым. Функция может принимать параметры и возвращать результат.

JS
Скопировать код
// JavaScript пример
function calculateArea(width, height) {
return width * height;
}

let area = calculateArea(5, 3); // результат: 15

8. Что такое область видимости переменных? Область видимости определяет, где в программе переменная доступна для использования. Основные типы:

  • Глобальная — переменная доступна во всем коде
  • Локальная — переменная доступна только внутри блока кода (функции, цикла)
  • Блочная — переменная доступна внутри блока, ограниченного фигурными скобками

9. В чем разница между параметрами и аргументами функции? Параметры — переменные, указанные в определении функции. Аргументы — конкретные значения, передаваемые в функцию при её вызове.

Python
Скопировать код
# Python пример
# name и age – параметры
def greet(name, age):
print(f"Привет, {name}! Тебе {age} лет.")

# "Анна" и 25 – аргументы
greet("Анна", 25)

10. Что такое рекурсия? Рекурсия — процесс, когда функция вызывает сама себя напрямую или через другие функции. Ключевые элементы рекурсии:

  • Базовый случай — условие выхода из рекурсии
  • Рекурсивный случай — функция вызывает себя с измененными аргументами
JS
Скопировать код
// JavaScript пример вычисления факториала
function factorial(n) {
// Базовый случай
if (n <= 1) {
return 1;
}
// Рекурсивный случай
return n * factorial(n – 1);
}

Пошаговый план для смены профессии

Структуры данных и алгоритмы: 15 ключевых вопросов

Эффективность программы во многом зависит от правильно выбранных структур данных и алгоритмов. Эта область — настоящий фундамент программирования. 🧱

1. Что такое временная сложность алгоритма? Временная сложность характеризует, как растет время выполнения алгоритма при увеличении размера входных данных. Обозначается в Big O нотации:

  • O(1) — константная сложность (доступ к элементу массива)
  • O(log n) — логарифмическая сложность (бинарный поиск)
  • O(n) — линейная сложность (перебор массива)
  • O(n log n) — квазилинейная сложность (эффективные алгоритмы сортировки)
  • O(n²) — квадратичная сложность (сортировка пузырьком)
  • O(2^n) — экспоненциальная сложность (наивный алгоритм для задачи о рюкзаке)

2. Что такое массив и как он работает? Массив — структура данных, хранящая элементы одного типа в смежных ячейках памяти. Доступ к элементам происходит по индексу за O(1). Основные операции с массивами:

  • Доступ к элементу по индексу — O(1)
  • Поиск элемента без сортировки — O(n)
  • Вставка/удаление в конец для динамических массивов — амортизированная O(1)
  • Вставка/удаление в произвольную позицию — O(n)

3. Что такое связный список и чем он отличается от массива? Связный список — структура данных, где каждый элемент (узел) содержит данные и указатель на следующий элемент. В отличие от массивов, элементы могут располагаться в разных участках памяти.

Характеристика Массив Связный список
Доступ к элементу O(1) O(n)
Вставка/удаление в начало O(n) O(1)
Вставка/удаление в середину O(n) O(n) для поиска + O(1) для вставки
Использование памяти Только данные Данные + указатели
Память Непрерывная Разбросанная

4. Что такое стек и его основные операции? Стек — структура данных типа LIFO (Last In, First Out), где элементы добавляются и удаляются с одного конца, называемого вершиной. Основные операции:

  • push — добавление элемента на вершину
  • pop — удаление элемента с вершины
  • peek/top — просмотр элемента на вершине без удаления
  • isEmpty — проверка, пуст ли стек Применения стека: отмена действий, проверка скобок, вычисление выражений, рекурсия.

5. Что такое очередь и ее основные операции? Очередь — структура данных типа FIFO (First In, First Out), элементы добавляются в конец и удаляются из начала. Основные операции:

  • enqueue — добавление элемента в конец очереди
  • dequeue — удаление элемента из начала очереди
  • peek/front — просмотр первого элемента без удаления
  • isEmpty — проверка, пуста ли очередь Применения очереди: планирование задач, обработка запросов, поиск в ширину (BFS).

6. Что такое хеш-таблица и как она работает? Хеш-таблица — структура данных, использующая хеш-функцию для преобразования ключа в индекс массива, где хранятся значения. Позволяет выполнять операции вставки, поиска и удаления за O(1) в среднем случае. Коллизии (когда разные ключи дают одинаковый хеш) решаются через:

  • Метод цепочек — хранение нескольких значений в виде связного списка
  • Открытая адресация — поиск следующей свободной позиции по определенному алгоритму

7. Что такое дерево и его основные виды? Дерево — нелинейная структура данных, состоящая из узлов, связанных направленными ребрами, образующими иерархию. Основные виды деревьев:

  • Бинарное дерево — каждый узел имеет не более двух потомков
  • Бинарное дерево поиска (BST) — значения в левом поддереве меньше, в правом — больше
  • AVL-дерево — самобалансирующееся бинарное дерево поиска
  • Красно-черное дерево — самобалансирующееся дерево с дополнительными правилами
  • B-дерево — сбалансированное дерево, оптимизированное для систем хранения
  • Куча (Heap) — дерево, где каждый родитель больше/меньше своих потомков

Алексей Смирнов, Senior Algorithm Engineer На собеседовании в крупную технологическую компанию мне задали задачу найти наиболее часто встречающиеся слова в огромном тексте. Первым делом я предложил использовать хеш-таблицу для подсчёта, но интервьюер спросил: "А что если данные не помещаются в оперативную память?"

Я растерялся, начав предлагать различные варианты работы с файловой системой. Интервьюер терпеливо ждал, а затем спросил: "Знаете ли вы, что такое Bloom filter?"

Оказалось, что я никогда не сталкивался с этой структурой данных, позволяющей эффективно проверять принадлежность элемента множеству с возможностью ложноположительных срабатываний, но без ложноотрицательных. Этот алгоритм идеально подходил для предварительной фильтрации огромных наборов данных.

После этого случая я понял, что нестандартные структуры данных могут быть ключом к решению сложных проблем, и добавил изучение специализированных алгоритмов в свой регулярный план развития. Эта встреча изменила мой подход к решению масштабных задач.

8. Что такое граф и основные способы его представления? Граф — структура данных, состоящая из вершин и ребер, соединяющих эти вершины. Графы могут быть направленными или ненаправленными, взвешенными или невзвешенными, циклическими или ациклическими. Основные способы представления:

  • Матрица смежности — двумерный массив, где matrix[i][j] показывает наличие/вес ребра между i и j
  • Список смежности — массив списков, где для каждой вершины хранится список смежных вершин
  • Список ребер — список всех ребер графа

9. Какие основные алгоритмы сортировки существуют? Алгоритмы сортировки упорядочивают элементы в определенной последовательности:

  • Сортировка пузырьком: O(n²), простая, но неэффективная
  • Сортировка вставками: O(n²), эффективна для почти отсортированных данных
  • Быстрая сортировка: O(n log n) в среднем, O(n²) в худшем случае
  • Сортировка слиянием: O(n log n), стабильная, но требует дополнительной памяти
  • Сортировка кучей: O(n log n), использует структуру данных "куча"
  • Сортировка подсчетом: O(n+k), где k – диапазон значений
  • Поразрядная сортировка: O(nk), где k – число разрядов

10. Что такое бинарный поиск и как он работает? Бинарный поиск — эффективный алгоритм поиска элемента в отсортированном массиве с временной сложностью O(log n). Принцип работы:

  1. Сравнить искомый элемент со средним элементом массива
  2. Если они равны, поиск завершен
  3. Если искомый элемент меньше, повторить поиск в левой половине
  4. Если больше — в правой половине
  5. Повторять, пока элемент не найден или диапазон поиска не сузится до нуля
Python
Скопировать код
# Python пример бинарного поиска
def binary_search(arr, target):
left, right = 0, len(arr) – 1

while left <= right:
mid = (left + right) // 2

if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid – 1

return -1 # Элемент не найден

11. Что такое динамическое программирование? Динамическое программирование — метод решения сложных задач путем разбиения их на подзадачи и сохранения результатов решения подзадач для избежания повторных вычислений. Основные характеристики:

  • Перекрывающиеся подзадачи — одна подзадача используется в решении разных задач
  • Оптимальная подструктура — оптимальное решение задачи содержит оптимальные решения подзадач
  • Мемоизация — сохранение результатов подзадач для повторного использования Классические задачи: задача о рюкзаке, нахождение наибольшей общей подпоследовательности, задача о редакционном расстоянии.

12. Что такое "жадный алгоритм"? Жадный алгоритм — стратегия, при которой на каждом шаге выбирается локально оптимальное решение в надежде, что оно приведет к глобально оптимальному результату. Подходит не для всех задач, но когда применим, обычно более эффективен, чем полный перебор. Примеры задач:

  • Алгоритм Дейкстры для поиска кратчайшего пути
  • Алгоритм Краскала или Прима для построения минимального остовного дерева
  • Задача о выборе заявок (Activity Selection)
  • Алгоритм Хаффмана для сжатия данных

13. Что такое алгоритмы обхода графа? Алгоритмы обхода графа — методы посещения всех вершин графа в определенном порядке. Два основных подхода:

  • Поиск в глубину (DFS) — исследует путь до конца, затем возвращается и исследует другие пути. Использует стек (явно или через рекурсию).
  • Поиск в ширину (BFS) — исследует все вершины на текущем уровне, прежде чем перейти на следующий уровень. Использует очередь. Применения: топологическая сортировка, обнаружение циклов, поиск компонент связности, кратчайшие пути.

14. Что такое алгоритм поиска кратчайшего пути? Алгоритмы поиска кратчайшего пути находят оптимальный маршрут между вершинами графа:

  • Алгоритм Дейкстры — для графов с неотрицательными весами ребер. Временная сложность O(E + V log V) с бинарной кучей.
  • Алгоритм Беллмана-Форда — работает с отрицательными весами, обнаруживает отрицательные циклы. Сложность O(V*E).
  • Алгоритм Флойда-Уоршелла — находит кратчайшие пути между всеми парами вершин. Сложность O(V³).
  • A* (A-star) — использует эвристику для ускорения поиска, часто применяется в играх и навигации.

15. Что такое балансировка деревьев и зачем она нужна? Балансировка деревьев — техники поддержания высоты дерева близкой к log(n), что обеспечивает операции вставки, удаления и поиска за O(log n) в худшем случае. Без балансировки бинарное дерево поиска может вырождаться в линейную структуру с временной сложностью O(n). Основные типы самобалансирующихся деревьев:

  • AVL-деревья — разница высот левого и правого поддерева не превышает 1
  • Красно-черные деревья — каждый узел окрашен в красный или черный цвет с определенными правилами
  • B-деревья — обобщение бинарного дерева, узел может иметь более двух потомков
  • Splay-деревья — после обращения к узлу он перемещается к корню с помощью серии вращений

Языки программирования: 10 часто задаваемых вопросов

Выбор языка программирования часто определяет, как быстро вы сможете реализовать свои идеи. Разберемся с наиболее распространенными вопросами о языках программирования. 🗣️

1. Чем отличаются компилируемые языки от интерпретируемых? Принципиальные различия кроются не только в скорости, но и в самом процессе разработки:

  • Компилируемые языки (C, C++, Go): весь код преобразуется в машинный код заранее, что дает высокую производительность, но требует перекомпиляции при внесении изменений.
  • Интерпретируемые языки (Python, JavaScript, Ruby): код выполняется построчно, что позволяет быстрее вносить изменения, но обычно работает медленнее.
  • Гибридные подходы (Java, C#): компиляция в промежуточный байт-код, который затем интерпретируется виртуальной машиной, что обеспечивает кросс-платформенность.

2. Что такое статическая и динамическая типизация? Системы типизации определяют, как язык обрабатывает типы данных:

  • Статическая типизация (Java, C++, TypeScript): типы переменных проверяются на этапе компиляции, что помогает выявить ошибки до запуска программы.
  • Динамическая типизация (Python, JavaScript, Ruby): типы проверяются во время выполнения, что обеспечивает большую гибкость, но может привести к ошибкам типов во время работы программы.
typescript
Скопировать код
// TypeScript (статическая типизация)
let name: string = "Андрей";
name = 42; // Ошибка компиляции

// JavaScript (динамическая типизация)
let name = "Андрей";
name = 42; // Работает без ошибок

3. Что такое объектно-ориентированное программирование (ООП)? ООП — парадигма программирования, основанная на концепции "объектов", которые могут содержать данные и код для их обработки. Основные принципы:

  • Инкапсуляция: объединение данных и методов, которые с ними работают, в единый объект и ограничение доступа к внутреннему состоянию.
  • Наследование: возможность создавать новые классы на основе существующих, расширяя их функциональность.
  • Полиморфизм: способность объектов с одинаковым интерфейсом иметь различные реализации методов.
  • Абстракция: выделение существенных характеристик объекта и игнорирование несущественных.

4. Что такое функциональное программирование? Функциональное программирование — парадигма, где программы строятся в основном через применение и композицию функций. Ключевые концепции:

  • Чистые функции: функции без побочных эффектов, всегда возвращающие одинаковый результат при одинаковых аргументах.
  • Неизменяемость данных: объекты не изменяются после создания, вместо этого создаются новые.
  • Функции высшего порядка: функции, которые могут принимать другие функции как аргументы или возвращать их.
  • Рекурсия: предпочтительное использование рекурсии вместо циклов. Языки с сильным функциональным уклоном: Haskell, Clojure, Scala. Языки с поддержкой функциональных концепций: JavaScript, Python, Ruby.

5. В чем разница между и = в JavaScript? Операторы сравнения в JavaScript различаются по строгости проверки:

  • == (нестрогое равенство): сравнивает значения, выполняя приведение типов.
  • === (строгое равенство): сравнивает значения и типы без приведения.
JS
Скопировать код
// JavaScript примеры
console.log(5 == "5"); // true (происходит приведение типов)
console.log(5 === "5"); // false (разные типы)
console.log(null == undefined); // true
console.log(null === undefined); // false

Рекомендуется использовать === для более предсказуемого поведения и избежания неожиданностей, связанных с приведением типов.

6. Что такое замыкания в JavaScript? Замыкание — функция, которая запоминает свое лексическое окружение даже после того, как выполнение родительской функции завершено. Это позволяет функции иметь доступ к переменным из внешней области видимости.

JS
Скопировать код
// JavaScript пример замыкания
function createCounter() {
let count = 0;

return function() {
count++;
return count;
};
}

const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3

Замыкания используются для создания приватных переменных, фабричных функций, каррирования и обработчиков событий.

7. Что такое GIL в Python и как он влияет на многопоточность? GIL (Global Interpreter Lock) — механизм в интерпретаторе CPython, который позволяет выполнять только один поток Python одновременно, даже на многопроцессорных системах. Последствия:

  • CPU-bound задачи не получают преимущества от многопоточности
  • I/O-bound задачи могут выиграть от многопоточности, так как GIL освобождается при ожидании I/O
  • Для параллельной обработки CPU-bound задач лучше использовать модуль multiprocessing Альтернативные реализации Python, такие как Jython и IronPython, не имеют GIL, а PyPy поддерживает STM (Software Transactional Memory) как альтернативу.

8. В чем разница между const, let и var в JavaScript? JavaScript предлагает три способа объявления переменных, которые отличаются по области видимости и возможности переопределения:

  • var: функциональная область видимости, поднимается (hoisting), можно переопределять.
  • let: блочная область видимости, не поднимается, можно переопределять.
  • const: блочная область видимости, не поднимается, нельзя переопределять (но можно изменять свойства объектов).
JS
Скопировать код
// JavaScript
{
var a = 1;
let b = 2;
const c = 3;
}
console.log(a); // 1 (доступна вне блока)
console.log(b); // ReferenceError (недоступна вне блока)
console.log(c); // ReferenceError (недоступна вне блока)

Современная практика рекомендует использовать const по умолчанию, let когда значение должно изменяться, и избегать использования var.

9. Что такое Null и Undefined в JavaScript? В JavaScript есть два отдельных примитивных типа для представления отсутствия значения:

  • undefined: значение, которое переменная получает, когда объявлена, но не инициализирована. Также функции без явного return возвращают undefined.
  • null: намеренное отсутствие значения. Это значение присваивается программистом явно.
JS
Скопировать код
// JavaScript
let a;
console.log(a); // undefined

let b = null;
console.log(b); // null

console.log(typeof undefined); // "undefined"
console.log(typeof null); // "object" (известный баг в JavaScript)

10. Что такое асинхронное программирование? Асинхронное программирование позволяет выполнять операции без блокировки основного потока выполнения. Особенно важно для операций ввода-вывода, сетевых запросов и других действий, которые могут занимать много времени. Основные механизмы асинхронности в разных языках:

  • JavaScript: колбэки, промисы, async/await
  • Python: asyncio, async/await
  • Java: CompletableFuture, потоки, ExecutorService
  • C#: Task, async/await
JS
Скопировать код
// JavaScript пример с async/await
async function fetchUserData(userId) {
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
throw new Error('Failed to fetch user data');
}
const userData = await response.json();
return userData;
} catch (error) {
console.error('Error:', error);
return null;
}
}

Веб-разработка и базы данных: 10 важных вопросов

Веб-разработка и работа с базами данных — ключевые навыки для создания современных приложений. Разберем основные вопросы, которые возникают у разработчиков в этой области. 🌐

1. Что такое REST API? REST (Representational State Transfer) — архитектурный стиль для создания веб-сервисов. REST API использует HTTP-запросы для выполнения CRUD-операций (Create, Read, Update, Delete). Основные принципы REST:

  • Клиент-серверная архитектура: разделение ответственности
  • Отсутствие состояния (Statelessness): каждый запрос содержит всю необходимую информацию
  • Кэшируемость: ответы должны явно определять, могут ли они кэшироваться
  • Единообразие интерфейса: стандартизация взаимодействия между компонентами
  • Многоуровневая система: клиент не может определить, взаимодействует ли он напрямую с сервером

2. Что такое HTTP-методы и статус-коды? HTTP-методы определяют действие, которое должно быть выполнено с ресурсом:

  • GET: получение данных
  • POST: создание нового ресурса
  • PUT: полное обновление ресурса
  • PATCH: частичное обновление ресурса
  • DELETE: удаление ресурса
  • OPTIONS: информация о доступных методах
  • HEAD: получение заголовков без тела ответа

HTTP-статус коды группируются по категориям:

  • 1xx: Информационные (запрос принят, продолжается обработка)
  • 2xx: Успешно (запрос принят, понят и обработан)
  • 3xx: Перенаправление (требуются дополнительные действия)
  • 4xx: Ошибка клиента (запрос содержит синтаксическую ошибку или не может быть выполнен)
  • 5xx: Ошибка сервера (сервер не смог выполнить запрос)

3. Что такое СУБД и какие типы существуют? СУБД (Система Управления Базами Данных) — программное обеспечение для создания, хранения, обновления и управления данными в базе данных. Основные типы СУБД:

  • Реляционные (SQL): данные хранятся в таблицах с предопределенной схемой (MySQL, PostgreSQL, Oracle)
  • NoSQL:
  • Документоориентированные: хранят данные в документах (MongoDB, CouchDB)
  • Ключ-значение: простые хранилища пар ключ-значение (Redis, DynamoDB)
  • Колоночные: оптимизированы для хранения и запроса колонок данных (Cassandra, HBase)
  • Графовые: специализируются на связях между данными (Neo4j, JanusGraph)
  • NewSQL: сочетают масштабируемость NoSQL с ACID-свойствами SQL (Google Spanner, CockroachDB)

4. Что такое SQL и какие основные команды существуют? SQL (Structured Query Language) — язык для взаимодействия с реляционными базами данных. Основные категории команд:

  • DDL (Data Definition Language):
  • CREATE — создание объектов БД
  • ALTER — изменение объектов
  • DROP — удаление объектов
  • TRUNCATE — очистка таблицы
  • DML (Data Manipulation Language):
  • SELECT — извлечение данных
  • INSERT — добавление данных
  • UPDATE — обновление данных
  • DELETE — удаление данных
  • DCL (Data Control Language):
  • GRANT — предоставление прав
  • REVOKE — отзыв прав
  • TCL (Transaction Control Language):
  • COMMIT — применение транзакции
  • ROLLBACK — откат транзакции
  • SAVEPOINT — создание точки сохранения
SQL
Скопировать код
-- SQL пример сложного запроса
SELECT 
departments.name AS department_name,
COUNT(employees.id) AS employee_count,
AVG(employees.salary) AS avg_salary
FROM 
departments
LEFT JOIN 
employees ON departments.id = employees.department_id
WHERE 
employees.hire_date > '2020-01-01'
GROUP BY 
departments.name
HAVING 
COUNT(employees.id) > 5
ORDER BY 
avg_salary DESC;

5. Что такое индексы в базах данных? Индексы — специальные структуры данных, которые ускоряют поиск информации в базе данных. Они работают по принципу, схожему с оглавлением книги. Типы индексов:

  • Первичный ключ: уникальный идентификатор записи
  • Уникальный индекс: гарантирует уникальность значений в столбце
  • Составной индекс: создается по нескольким столбцам
  • Полнотекстовый индекс: для поиска по текстовому содержимому
  • Пространственный индекс: для географических данных Преимущества: ускорение запросов, оптимизация сортировки и группировки. Недостатки: увеличение размера БД, замедление операций вставки, обновления и удаления.

6. Что такое нормализация базы данных? Нормализация — процесс организации данных в БД для минимизации избыточности и зависимостей. Основные формы нормализации:

  • 1NF (Первая нормальная форма): атомарность данных, уникальный идентификатор для каждой записи
  • 2NF (Вторая нормальная форма): 1NF + неключевые атрибуты полностью зависят от первичного ключа
  • 3NF (Третья нормальная форма): 2NF + неключевые атрибуты не зависят друг от друга
  • BCNF (Нормальная форма Бойса-Кодда): усиленная 3NF
  • 4NF (Четвертая нормальная форма): BCNF + нет многозначных зависимостей
  • 5NF (Пятая нормальная форма): 4NF + нет зависимостей соединения Большинство практических баз данных нормализованы до 3NF или BCNF, что обеспечивает хороший баланс между целостностью данных и производительностью.

7. Что такое ACID-свойства транзакций? ACID — набор свойств, гарантирующих надежность транзакций в базе данных:

  • Atomicity (Атомарность): транзакция выполняется полностью или не выполняется вообще
  • Consistency (Согласованность): транзакция переводит БД из одного согласованного состояния в другое
  • Isolation (Изолированность): параллельные транзакции не влияют друг на друга
  • Durability (Долговечность): результаты завершенной транзакции сохраняются, даже при сбое системы Реляционные БД обычно поддерживают ACID, многие NoSQL системы ослабляют некоторые из этих гарантий для повышения производительности и масштабируемости (BASE-модель).

8. Что такое DOM и как с ним работать в JavaScript? DOM (Document Object Model) — программный интерфейс, представляющий HTML-документ в виде дерева узлов, с которым можно взаимодействовать с помощью JavaScript. Основные операции с DOM:

  • Выбор элементов:
JS
Скопировать код
document.getElementById('id')
document.querySelector('.class')
document.querySelectorAll('tag')

  • Изменение содержимого:
JS
Скопировать код
element.textContent = 'Новый текст'
element.innerHTML = '<strong>HTML-разметка</strong>'

  • Изменение стилей:
JS
Скопировать код
element.style.color = 'red'
element.classList.add('active')
element.classList.remove('hidden')

  • Работа с атрибутами:
JS
Скопировать код
element.getAttribute('src')
element.setAttribute('href', 'https://example.com')

  • Создание и удаление элементов:
JS
Скопировать код
const newDiv = document.createElement('div')
parent.appendChild(newDiv)
parent.removeChild(element)

  • Обработка событий:
JS
Скопировать код
element.addEventListener('click', function(event) {
console.log('Элемент был кликнут!');
});

9. Что такое CORS и как решать проблемы с ним? CORS (Cross-Origin Resource Sharing) — механизм безопасности браузера, который ограничивает запросы с одного домена (источника) к ресурсам другого домена. Причины ограничений CORS:

  • Предотвращение атак типа Cross-Site Request Forgery (CSRF)
  • Защита приватных API от несанкционированного доступа
  • Контроль над тем, какие сайты могут взаимодействовать с вашими ресурсами Решения проблем с CORS:
    1. На стороне сервера: настройка правильных заголовков
http
Скопировать код
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization

  1. Прокси-сервер: создание прокси на своем домене, который будет перенаправлять запросы
  2. JSONP: устаревший подход, использующий теги script (только для GET-запросов)
  3. Серверные запросы: выполнение запросов на сервере, а не в браузере

10. Что такое WebSocket и в чем его отличие от HTTP? WebSocket — протокол связи, обеспечивающий постоянное двунаправленное соединение между клиентом и сервером. Отличия от HTTP:

Характеристика HTTP WebSocket
Тип соединения Одноразовое (запрос-ответ) Постоянное
Направление связи Клиент -> Сервер Двунаправленное
Накладные расходы Высокие (заголовки при каждом запросе) Низкие (после установки соединения)
Инициатор передачи Только клиент Клиент или сервер
Применения Обычные веб-страницы, API Чаты, уведомления в реальном времени, онлайн-игры

Пример использования WebSocket в JavaScript:

JS
Скопировать код
// Создание WebSocket соединения
const socket = new WebSocket('wss://example.com/socketserver');

// Обработка событий
socket.onopen = function(event) {
console.log('Соединение установлено');
socket.send('Привет, сервер!');
};

socket.onmessage = function(event) {
console.log('Получено сообщение: ' + event.data);
};

socket.onclose = function(event) {
console.log('Соединение закрыто');
};

socket.onerror = function(error) {
console.error('Ошибка WebSocket: ' + error);
};

Подготовка к собеседованию: 5 сложных вопросов с ответами

Технические собеседования часто включают сложные вопросы, требующие глубокого понимания программирования. Рассмотрим пять наиболее трудных вопросов и стратегии ответа на них. 🎯

1. Как оптимизировать производительность веб-приложения? Оптимизация производительности — многоаспектная задача:

  • Frontend оптимизации:
  • Минификация и объединение CSS/JavaScript файлов
  • Использование современных форматов изображений (WebP, AVIF)
  • Ленивая загрузка изображени

Читайте также

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой язык программирования часто рекомендуют начинать для новичков?
1 / 5

Загрузка...