BA & SA | 10000 Interview questions
10.2K subscribers
172 photos
14 videos
342 links
Вопросы и задачи, которые задают на собеседованиях на позицию Бизнес и Системного аналитика. По вопросам сотрудничества- @DeliveryManager7
Download Telegram
4867. В таблице orders есть колонка order_number с последовательными числами, но некоторые номера пропущены (например, из-за отката транзакций). Как найти все пропущенные номера без циклов?
Anonymous Quiz
42%
Использовать оконную функцию LAG() и найти разрывы
31%
Сделать LEFT JOIN с таблицей всех возможных чисел
17%
Применить GROUP BY и HAVING COUNT(*) = 0
10%
Использовать NOT EXISTS с подзапросом на соседние номера
Объяснение:

Оконная функция LAG() позволяет получить предыдущее значение в отсортированном наборе. Если order_number - LAG(order_number) > 1, значит есть пропуск между предыдущим и текущим номером.
Пример запроса:
sql
WITH gaps AS (
SELECT
LAG(order_number) OVER (ORDER BY order_number) AS prev_num,
order_number AS curr_num
FROM orders
)
SELECT (prev_num + 1) AS missing_start, (curr_num - 1) AS missing_end
FROM gaps
WHERE curr_num - prev_num > 1;


Почему другие варианты хуже:


B (LEFT JOIN с таблицей всех чисел) – требует генерации последовательности, что при больших диапазонах неэффективно.
C (GROUP BY) – не может найти пропуски без генерации всех значений.
D (NOT EXISTS) – потребует для каждого номера подзапрос, что медленно.

Реальный кейс: В интернет-магазине из-за ошибок в интеграции номера заказов иногда пропускались. Аналитик написал запрос с 
LAG() и за 0.1 секунды нашёл все разрывы в таблице из 10 млн записей.

Вывод: 
LAG() – оптимальный инструмент для поиска пропусков в последовательностях без генерации вспомогательных таблиц.
Please open Telegram to view this post
VIEW IN TELEGRAM
№4868 категория вопросов: #SYSTEMDESIGN
4868. Пользователь авторизовался на сайте и начал заполнять корзину. На следующем шаге его запрос попал на другой сервер, и корзина «обнулилась». Как называется механизм, обеспечивающий попадание всех запросов одного пользователя на один сервер?
Anonymous Quiz
65%
Сессионная аффинность (sticky sessions)
12%
Циклический алгоритм (round robin)
13%
Алгоритм наименьших соединений (least connections)
11%
Хеширование IP-адреса (IP hash)
Объяснение:

Когда за сайтом стоит несколько серверов (кластер), балансировщик распределяет запросы между ними. Если балансировщик отправляет каждый запрос на случайный сервер (round robin), то данные сессии (корзина, авторизация) могут храниться на одном сервере, а следующий запрос попадёт на другой, где этих данных нет. Пользователь «теряет» корзину или его выкидывает из системы.

Что такое sticky sessions (сессионная аффинность)?
Балансировщик «привязывает» пользователя к определённому серверу на время его сессии. Обычно это делается:
По IP-адресу (не очень надёжно, так как несколько пользователей могут быть за одним NAT).
По cookie, которую балансировщик устанавливает клиенту (более надёжно).
Все последующие запросы этого пользователя направляются на тот же сервер, где хранятся его сессионные данные.

Почему не подходят другие варианты:
B (round robin) – как раз вызывает проблему, так как запросы распределяются по очереди без учёта сессии.
C (least connections) – направляет запрос на сервер с наименьшим числом активных соединений, тоже не учитывает сессию.
D (IP hash) – один из способов реализации sticky sessions, но это не общее название механизма, а частная техника. Правильным ответом является именно термин «sticky sessions» (сессионная аффинность).

Реальный пример:
В интернет-магазине на платформе Magento с несколькими бэкенд-серверами не настроили sticky sessions. Пользователи жаловались, что корзина очищается при переходе на страницу оформления заказа. После включения sticky sessions на балансировщике (HAProxy) проблема исчезла.

Что должен зафиксировать аналитик:
В требованиях к отказоустойчивости и масштабированию указать необходимость поддержки сессионной аффинности.
Уточнить, где хранить сессии (в памяти сервера, в Redis, в БД).
Если используется Redis для централизованного хранения сессий, sticky sessions не нужны, но требуется надёжный Redis-кластер.

Вывод: Sticky sessions — простой способ решить проблему «потери» сессии при масштабировании, но он создаёт свою проблему: при отказе сервера пользователь теряет сессию. Более современный подход — централизованное хранилище сессий (Redis) и отказ от липких сессий. Аналитик должен понимать оба варианта и выбирать под требования.
Please open Telegram to view this post
VIEW IN TELEGRAM
№4869 категория вопросов: #ARCHITECTURE
4869. В приложении онлайн-кинотеатра при падении сервиса рекомендаций пользователь не может смотреть фильм, так как запрос на получение рекомендаций блокирует загрузку плеера. Какой принцип архитектуры был нарушен?
Anonymous Quiz
3%
Горизонтальное масштабирование
81%
Отказоустойчивость с сохранением основной функции
3%
Событийная архитектура
13%
Изоляция данных
Объяснение:

Graceful degradation – это способность системы сохранять основную функциональность при отказе второстепенных компонентов. В примере основной функционал – просмотр фильма. Рекомендации – дополнительная функция, но из-за синхронного вызова их падение блокирует плеер.

Как правильно:
Разделить критический и не критический функционал.
При ошибке рекомендаций показывать пользователю плеер, а рекомендации загружать асинхронно (или не показывать вовсе).
Использовать таймауты и fallback-значения.

Реальный кейс: В Netflix при падении сервиса рекомендаций пользователь всё равно может смотреть фильм. Это достигается за счёт асинхронных вызовов и fallback.

Вывод: Аналитик должен закладывать в требования graceful degradation: «При недоступности модуля рекомендаций плеер должен работать, а рекомендации не должны блокировать показ».
Please open Telegram to view this post
VIEW IN TELEGRAM
№4870 категория вопросов: #TESTING
4870. Нужно протестировать форму заказа с 5 параметрами, каждый из которых может принимать 10 значений. Полный перебор даст 100 000 комбинаций. Какая техника тест-дизайна сократит количество тестов, сохранив покрытие всех пар параметров?
Anonymous Quiz
18%
Эквивалентное разбиение
55%
Попарное тестирование (Pairwise / All-pairs)
24%
Анализ граничных значений
3%
Исследовательское тестирование
2
Объяснение:

Попарное тестирование основано на наблюдении, что большинство дефектов возникает из-за взаимодействия двух параметров, а комбинации трёх и более встречаются редко. Техника генерирует минимальный набор тестов, покрывающий все возможные пары значений.
Пример для 5 параметров × 10 значений: полный перебор = 100 000 тестов. Pairwise сокращает до ~50–100 тестов при том же покрытии пар. Инструменты: PICT от Microsoft, Hexawise, AllPairs.

Реальный кейс: В тестировании поисковой системы (параметры: регион, язык, категория, сортировка, фильтры) pairwise позволил сократить количество тестов с 10 000 до 200, найдя при этом 95% багов.

Вывод: Аналитик должен рекомендовать pairwise для сложных комбинаторных форм, экономя время тестирования.
Please open Telegram to view this post
VIEW IN TELEGRAM
№4871 категория вопросов: #INTEGRATION
4871. При оформлении заказа нужно: зарезервировать товар на складе и списать деньги. Если списание не удалось, резерв должен быть отменён. Сервисы имеют свои базы. Какой паттерн обеспечит согласованность?
Anonymous Quiz
9%
Двухфазная фиксация (2PC)
78%
Сага (Saga) с компенсирующими транзакциями
13%
Распределённая блокировка
0%
Общая база данных
2
Объяснение:

Сага – это последовательность локальных транзакций, каждая из которых обновляет данные в одном сервисе. Если шаг не удаётся, запускаются компенсирующие транзакции для отката предыдущих шагов.

В примере:
Сервис склада резервирует товар.
Сервис платежей списывает деньги. Если ошибка → сервис склада компенсирует резерв (отменяет резерв).
Двухфазная фиксация (2PC) медленна и не масштабируется. Общая БД – антипаттерн.

Реальный кейс: В Uber используется Saga для согласования поездки: создание заказа, поиск водителя, списание средств. При сбое любого этапа запускается компенсация.

Вывод: Для распределённых транзакций в микросервисах аналитик должен требовать Saga с явными компенсациями.
Please open Telegram to view this post
VIEW IN TELEGRAM
№4872 категория вопросов: #REQUIREMENTS
4872. Команда разработки использует относительные оценки (стори-поинты) и проводит Planning Poker. Какой основной недостаток этого метода?
Anonymous Quiz
10%
Занимает много времени на каждой итерации
76%
Оценки не отражают реальное время в часах или днях
11%
Требует участия всех членов команды
4%
Не учитывает сложность задач
🤔1
Объяснение:

Что такое Planning Poker?
Это метод относительной оценки трудоёмкости, где каждый член команды даёт оценку в стори-поинтах (например, 1, 2, 3, 5, 8, 13). Поинты отражают сложность, объём и неопределённостьзадачи, но не переводятся напрямую в часы или дни. Разные команды имеют разную «скорость» (velocity) – количество поинтов, которое команда закрывает за спринт.

Основной недостаток:
Поинты не являются абсолютной мерой времени. Две разные команды могут оценить одинаковую задачу в разные поинты. Даже внутри одной команды поинты не гарантируют точного перевода в часы, так как скорость может меняться (болезни, праздники, сложность интеграции). Бизнесу часто нужны прогнозы в реальных днях/часах, а не в абстрактных поинтах.

Почему не другие варианты?
A – Planning Poker не занимает много времени (обычно 15–30 минут на планирование спринта).
C – участие всех членов команды – это преимущество, а не недостаток.
D – метод как раз учитывает сложность через поинты.

Реальный кейс:
Команда оценила задачу в 5 поинтов, а другая команда – в 13. Скорость первой – 30 поинтов за спринт (2 недели), скорость второй – 50 поинтов. Реальное время разное. Бизнес, требующий сдачи к определённой дате, не может полагаться только на поинты.

Вывод: Аналитик должен объяснять стейкхолдерам, что поинты – это относительная мера для команды, а для прогнозирования сроков нужно использовать историческую скорость (velocity).
Please open Telegram to view this post
VIEW IN TELEGRAM
№4873 категория вопросов: #INTEGRATION
4873. Сервис А вызывает внешний API, который иногда начинает отвечать с ошибкой 500. Без защиты все вызовы ждут таймаута, исчерпывая ресурсы. Какой паттерн предотвращает повторные вызовы к проблемному сервису на заданный период?
Anonymous Quiz
13%
Экспоненциальный ретрай
70%
Circuit Breaker (предохранитель)
11%
Идемпотентный потребитель
6%
Dead Letter Queue
Объяснение:

Проблема:
При синхронном вызове к нестабильному внешнему сервису каждый запрос ждёт таймаута (например, 30 секунд). Если таких запросов много, потоки приложения исчерпываются, и система перестаёт отвечать даже на свои внутренние запросы. Экспоненциальный ретрай (A) помогает при временных сбоях, но не защищает от длительной недоступности – ретраи всё равно будут исчерпывать ресурсы.

Что делает Circuit Breaker:
Замкнут (closed) – вызовы идут к внешнему сервису. Счётчик ошибок увеличивается.
Разомкнут (open) – при превышении порога ошибок (например, 5 ошибок за 10 секунд) все вызовы мгновенно возвращают fallback (кэш, сообщение об ошибке) без реального запроса к сервису. Это даёт сервису время на восстановление.
Полуоткрыт (half-open) – через заданное время (например, 30 секунд) пропускается один пробный вызов. Если успех – предохранитель замыкается, если ошибка – снова размыкается.

Реальный пример:
В Netflix, Hystrix (библиотека Circuit Breaker) используется для защиты от падения зависимых сервисов. Если сервис рекомендаций падает, предохранитель размыкается, и пользователь видит заглушку, а не бесконечную загрузку.

Что должен зафиксировать аналитик:
Порог ошибок (например, 5 ошибок за 10 секунд).
Таймаут открытого состояния (например, 30 секунд).
Fallback-стратегия (кэш, сообщение, пустой результат).

Вывод: Circuit Breaker обязателен для всех интеграций с внешними сервисами, чтобы избежать каскадных отказов.
Please open Telegram to view this post
VIEW IN TELEGRAM
1
№4874 категория вопросов: #DBMS