BA & SA | 10000 Interview questions
10.2K subscribers
173 photos
14 videos
343 links
Вопросы и задачи, которые задают на собеседованиях на позицию Бизнес и Системного аналитика. По вопросам сотрудничества- @DeliveryManager7
Download Telegram
🧑‍🎓Объяснение:
Это классическая ситуация работы с большими таблицами временных данных, где начальный индекс становится неэффективным из-за специфики запросов.

🔍 Почему проблема возникает:

Индекс на user_id позволяет быстро найти ВСЕ документы пользователя за всю историю
У активного пользователя может быть 100K+ документов за несколько лет
После поиска по индексу СУБД всё равно должна просканировать и отсортировать все эти строки
При выборке "за последний месяц" фактически обрабатывается 99% ненужных данных
Почему вариант B правильный:

Составной индекс (user_id, created_at) решает проблему кардинально:

Данные уже отсортированы по пользователю И дате
СУБД находит первую запись пользователя за нужный период и читает последовательно только релевантные строки
Не нужно сортировать результаты или фильтровать лишнее
Статистика эффективности:

До: Сканирование 100K записей пользователя → фильтрация → сортировка
После: Сканирование 1-2K записей (только за нужный месяц) → готовый результат
Пример запроса, который станет эффективным:

```sql
SELECT * FROM documents
WHERE user_id = 12345
AND created_at >= '2024-10-01'
ORDER BY created_at DESC
```

-- Использует индекс (user_id, created_at)
Почему другие варианты не решат проблему:

A (REINDEX): Поможет, если индекс действительно фрагментирован на 40%+, но не изменит принципиальную неэффективность одно-колоночного индекса для такого запроса.
C (Увеличить память): Симптоматичное лечение. Проблема в логике доступа к данным, а не в ресурсах.
D (Кэширование): Маскирует проблему, но не решает её. При первом запросе или сбросе кэша задержки вернутся.
💡 Профессиональный совет аналитику:

При проектировании таблиц с историческими данными всегда задавайте вопросы:

«По каким полям чаще всего будет фильтрация?» → Составные индексы на комбинации этих полей
«Какой типичный диапазон выборки?» → Индексы должны поддерживать типичные сценарии (последние N дней/записей)
«Нужна ли сортировка в результатах?» → Индекс может обеспечивать предварительную сортировку
📊 Реальный пример из практики:
В одной из систем после добавления составного индекса (user_id, created_at, status) время выполнения типовых запросов сократилось:

Поиск документов пользователя: с 14 сек → 120 мс
Отчёт "Документы за месяц": с 8 сек → 90 мс
Нагрузка на БД: снизилась на 40%
🎯 Вывод: Правильные индексы — это не просто техническая оптимизация, а архитектурное решение, которое должно закладываться на этапе проектирования схемы данных. Аналитик, понимающий паттерны доступа к данным, может предотвратить такие проблемы до их возникновения.
Please open Telegram to view this post
VIEW IN TELEGRAM
5
№4695 категория вопросов: #REQUIREMENTS
4695. При сборе требований на модуль «Мгновенные переводы» заказчик хочет: 1) Переводы мгновенные, 2) Максимально безопасные, 3) С возможностью отмены в течение 24 часов, 4) Без нагрузки на основную БД. Что должен сделать аналитик?
Anonymous Quiz
1%
Зафиксировать как есть и передать разработчикам
97%
Структурировать требования, выявить противоречия и организовать сессию с заказчиком
2%
Отклонить требование об отмене как небезопасное
0%
Сразу предложить архитектурное решение
🧑‍🎓Объяснение:
Это классическая ситуация, когда стейкхолдеры выдают смешанные, частично противоречивые требования. Задача аналитика — не просто записать, а проанализировать, структурировать и разрешить противоречия.

🎯 Почему вариант B — правильный:
Разделение требований — первый шаг к ясности:
Функциональные:
«Переводы между клиентами банка»
«Возможность отмены перевода в течение 24 часов»
Нефункциональные:
«Мгновенное проведение» (скорость, latency)
«Максимальная безопасность» (security, compliance)
«Без нагрузки на основную транзакционную БД» (производительность, масштабируемость)
Выявление противоречий:
«Мгновенно» vs «Максимальная безопасность» — усиленные проверки безопасности (3D-Secure, фрод-мониторинг) требуют времени.
«Отмена в течение 24 часов» vs «Безопасность» — может создавать риски мошенничества (chargeback).
«Мгновенно» vs «Без нагрузки на основную БД» — синхронные транзакции нагружают БД.
Организация сессии с заказчиком позволяет:
Выяснить бизнес-цели за каждым требованием.
Определить приоритеты: что критично, а чем можно пожертвовать.
Найти компромиссы: например, «мгновенно» = до 5 секунд, отмена только через службу поддержки с аудитом.

Почему другие варианты ошибочны:
A (Передать как есть): Это позиция безответственного аналитика. Разработчики потратят время на уточнения, возможны переделки, сроки сорвутся. Аналитик — не курьер требований, а их архитектор и валидатор.

C (Игнорировать требование): Аналитик не имеет права самовольно отбрасывать требования бизнеса. Нужно выявить риски и обсудить с заказчиком, предложив альтернативы (например, отмена только для неквалифицированных платежей).

D (Предложить техническое решение сразу): Это преждевременное погружение в реализацию. Сначала нужно согласовать что и зачем, а потом уже как. К тому же, асинхронная очередь с модерацией нарушает требование «мгновенно».

💡 Как правильно действовать аналитику в таком кейсе:
Уточнить и детализировать каждое требование через вопросы:

«Что значит мгновенно? 1 секунда? 5 секунд?»
«Какие сценарии отмены переводов? Кто может инициировать?»
«Какую нагрузку на основную БД считаем допустимой?»
Документировать в формате, например:

```text
FR-001: Перевод между клиентами банка...
NFR-001: Время обработки 95% переводов ≤ 3 сек...
CONSTRAINT-001: Не использовать прямые транзакции в основной БД OLTP...
```

Провести воркшоп с участием бизнеса и техлидов, чтобы:
Обсудить технические ограничения
Оценить риски и стоимость реализации каждого требования
Зафиксировать осознанные компромиссы в согласованном бэклоге
Предложить варианты архитектуры уже после согласования требований:
Кэширование балансов
Event-driven архитектура с сагой для отмены
Отдельный read-only слой для переводов

Вывод для аналитика: Ваша ключевая ценность — не в записи пожеланий, а в управлении ожиданиями, выявлении противоречий и нахождении жизнеспособного баланса между бизнес-целями и техническими возможностями. Именно это отличает профессионального аналитика от простого «сборщика требований».
Please open Telegram to view this post
VIEW IN TELEGRAM
№4696 категория вопросов: #INTEGRATION
🧑‍🎓Объяснение:
Это классический сценарий использования паттерна «Strangler Fig Application» (Удушающий инжир) — стратегии постепенной замены унаследованных систем.

Почему вариант B — оптимальное решение:

Постепенность и бесшовность:
Адаптер выступает «прослойкой», которая скрывает от нового микросервиса детали реализации legacy. Новый сервис вызывает единый REST-интерфейс, адаптер транслирует вызовы в SOAP и преобразует ответы.
Результат: Legacy продолжает работать без изменений, новый сервис разрабатывается в современном стеке.
Минимизация рисков:
Не нужно останавливать бизнес-критичную систему
Нет необходимости в risky big-bang миграции
Возможно поэтапное замещение: по мере готовности отдельных модулей новой системы адаптер перенаправляет вызовы на них
Гибкость и контролируемость:
Адаптер можно развивать: добавлять кэширование, мониторинг, circuit breaker, балансировку — не трогая legacy.
Почему другие варианты хуже или опасны:

A (Полная перепись legacy):
Это Big Bang migration — высокорисковый подход. Legacy-система часто не имеет тестов, документации, в ней скрыта критическая бизнес-логика. Ошибки при переписывании могут остановить работу склада на недели.
C (Общая база данных):
Антипаттерн интеграции. Нарушает инкапсуляцию, создаёт жёсткую связанность, усложняет развитие и масштабирование. Новый сервис будет завязан на схему данных legacy, которую сложно менять.
D (Остановка legacy на время миграции):
Бизнес-критичная система склада не может быть остановлена — это остановка отгрузок, приёмки товаров, работы всего e-commerce. Недопустимо.
📌 Роль аналитика в этом кейсе:

Вы должны:

Выявить ограничения: Legacy-систему нельзя менять, её схема данных не оптимизирована для новых нагрузок.
Предложить архитектурный паттерн: Strangler Fig, Anti-Corruption Layer.
Специфицировать функционал адаптера: какие методы SOAP маппятся на какие REST-эндпоинты, форматы данных, обработку ошибок, таймауты.
Заложить требования к наблюдаемости: логирование, метрики, алерты для мониторинга качества трансляции.
💡 Инсайт:
Адаптер — это не временный костыль, а полноценный стратегический компонент архитектуры. Он позволяет провести миграцию без остановки бизнеса и даёт время на тщательное тестирование новой системы. Десятки крупных компаний (Amazon, Netflix) прошли этот путь именно через Strangler Fig.

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

Вывод:
Правильная стратегия интеграции с legacy — не разрушать, а оборачивать. Адаптер — ваш главный инструмент для эволюционной миграции.
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Разобраться в IT без перегруза

Сейчас легко утонуть в потоке новостей про AI, автоматизацию и цифровые инструменты. Каждый день - новые сервисы, громкие заголовки.

Мы сделали проще

В папке «IT» собраны Telegram-каналы экспертов, которые объясняют технологии по делу: что реально работает, где экономит ресурсы, где даёт рост. Папка сэкономит вам часы поиска и десятки случайных подписок.

Добавить можно здесь 🔡 https://t.me/addlist/kUCHduSsW5IxZjRi

Ссылка действительна только 24ч, успейте сохранить!

Попасть в папку
Please open Telegram to view this post
VIEW IN TELEGRAM
2
№4697 категория вопросов: #SECURITY
4697. Права зависят от должности, отдела, типа проекта и статуса. Какую модель доступа выбрать?
Anonymous Quiz
4%
DAC — владелец ресурса назначает права
2%
MAC — метки конфиденциальности
49%
RBAC — права назначаются ролям
44%
ABAC — доступ на основе атрибутов
🧑‍🎓Объяснение:
ABAC позволяет строить правила на основе множества атрибутов (должность, отдел, статус проекта, тип данных).
Ни одна другая модель не даёт такой гибкости:

DAC — создаст хаос из личных назначений
MAC — слишком жёсткая, не учитывает бизнес-атрибуты
RBAC — потребует сотни узких ролей (например, «Руководитель_Продаж_Активные_Проекты»)

ABAC описывает всё несколькими декларативными правилами:

text
Если должность = Руководитель отдела И отдел сотрудника = отдел проекта → полный доступ
Если должность = Аудитор И статус проекта = Закрыт → чтение
Вывод: Когда доступ зависит от контекста — выбирайте ABAC.
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥1
№4698 категория вопросов: #SECURITY
4698. Вы проектируете интеграцию с государственным порталом для получения персональных данных клиентов (паспортные данные, СНИЛС). Портал предоставляет REST API. Какое требование по безопасности обязательно должно быть в спецификации?
Anonymous Quiz
94%
Использовать шифрование TLS и взаимную аутентификацию (mTLS)
1%
Передавать данные в открытом виде внутри корпоративной сети
4%
Хранить логи всех запросов с персональными данными в открытом доступе
1%
Передавать данные через общую базу данных, доступную обоим системам
🧑‍🎓Объяснение:
Почему вариант А — единственно верный:

Шифрование при передаче (TLS) — обязательное требование
Любая передача персональных данных по открытым каналам (интернет) должна быть зашифрована. TLS (Transport Layer Security) гарантирует, что данные не будут перехвачены или изменены в пути. Это базовое требование и 152-ФЗ, и PCI DSS, и здравого смысла.

Взаимная аутентификация (mTLS) — best practice для B2B-интеграций
Взаимный TLS (mutual TLS) позволяет обеим сторонам удостовериться в подлинности друг друга: не только клиент проверяет сертификат сервера, но и сервер проверяет сертификат клиента. Это исключает риск подключения к поддельному порталу или приёма данных от неавторизованного отправителя.

Соответствие законодательству
Статья 19 152-ФЗ «Персональные данные» прямо требует обеспечивать конфиденциальность при обработке, в том числе при передаче. Роскомнадзор при проверках запрашивает наличие шифрования.

Почему другие варианты опасны или недопустимы:

В (Открытая передача внутри сети):
Даже внутри корпоративной сети могут быть внутренние угрозы, перехват, скомпрометированные сегменты. PCI DSS и стандарты безопасности требуют шифрования везде, где данные покидают доверенную среду.

C (Открытые логи с ПДн):
Хранение персональных данных в логах в открытом виде — грубейшее нарушение. Логи часто имеют более слабую защиту, чем основные базы данных, и становятся источником утечек. Требуется либо не логировать ПДн вовсе, либо обезличивать/шифровать их.

D (Общая база данных):
Предоставление прямого доступа к своей БД внешней системе — антипаттерн интеграции и безопасности. Это создаёт неприемлемые риски: избыточный доступ, сложность контроля, масштабирование проблем доступа. Нарушается принцип наименьших привилегий.

📌 Что ещё должен учесть аналитик в требованиях:

Протокол и версия TLS — не ниже 1.2, с запретом устаревших шифров.
Управление сертификатами — кто выпускает, как обновлять, кто отвечает за отзыв.
Логирование без ПДн — фиксировать факт обмена, но не содержимое, либо маскировать данные.
Контракт данных — какие поля передаются, в каком формате, с какой периодичностью.

💡 Реальный кейс из практики:
При интеграции с Госуслугами (ЕСИА) обязательным требованием является использование ГОСТ-криптографии и взаимной аутентификации по сертификатам. Если аналитик этого не заложит в ТЗ, разработка интеграции остановится на этапе подключения к песочнице.

🎯 Вывод:
Безопасность при интеграциях начинается с простых, но критических вещей: шифрование канала и проверка сторон. Аналитик обязан включать эти требования в спецификацию на самом раннем этапе, иначе вся система может быть признана несоответствующей регуляторам и уязвимой для атак.
Please open Telegram to view this post
VIEW IN TELEGRAM
2
№4699 категория вопросов: #SQL
4699. В системе управления задачами есть запрос для получения списка задач, назначенных на конкретного сотрудника. Таблица tasks содержит 10 миллионов записей. Запрос выполняется медленно (более 30 секунд). Какой способ оптимизации даст наибольший эффект?
Anonymous Quiz
25%
Добавить индекс на поле assignee_id
51%
Добавить составной индекс на поля (assignee_id, status, created_at)
2%
Увеличить объем оперативной памяти на сервере БД
23%
Разделить таблицу на две: активные и архивные задачи
🧑‍🎓Объяснение:
Это классическая задача оптимизации запросов в больших таблицах, где важно понимать, как работают индексы и какие данные реально выбираются.

Почему вариант B — оптимальное решение:

Покрывающий индекс (covering index)
Составной индекс (assignee_id, status, created_at) включает все поля, которые, скорее всего, участвуют в типичном запросе:
assignee_id — для фильтрации по сотруднику
status — для фильтрации по статусу ("в работе", "завершена")
created_at — для сортировки по дате (обычно задачи показывают от новых к старым)
Эффективность использования

Такой индекс позволяет СУБД:
Быстро найти все задачи конкретного сотрудника по первой части индекса
Сразу отфильтровать по статусу (вторая часть)

Получить данные уже отсортированными по дате (третья часть) — без дополнительной сортировки
В идеальном случае вообще не обращаться к таблице, если запрашиваются только эти поля
Реальный прирост производительности

Для таблицы в 10 млн записей разница между простым индексом на assignee_id и составным покрывающим индексом может составлять:
Простой индекс: сначала поиск по индексу → затем чтение строк таблицы → затем фильтрация → затем сортировка
Составной индекс: всё делается за один проход по индексу

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

A (Индекс на assignee_id):
Поможет найти задачи сотрудника, но после этого СУБД придётся читать сами строки из таблицы (возможно, тысячи), фильтровать по статусу в памяти и сортировать. Это всё ещё дорого.

C (Увеличить память):
Это временное решение. Если запрос неоптимален, память просто откладывает проблему. При первых запросах после перезагрузки или новых данных всё вернётся.

D (Разделение таблиц):
Хорошая стратегия для управления данными, но:
Требует изменений в коде приложения (понимать, в какую таблицу писать/читать)
Не решает проблему сортировки и фильтрации в рамках активной таблицы
Может быть полезно, но как дополнительная оптимизация, а не первичная

📌 Роль аналитика в оптимизации:

Аналитик должен:

Понять типичные запросы к системе (через логи, интервью с пользователями)
Выявить частые паттерны фильтрации и сортировки
Заложить в требования необходимость индексов под эти паттерны
Согласовать с разработчиками возможность и стоимость создания индексов

💡 Пример из практики:
В одном проекре аналитик заметил, что 90% запросов к таблице заказов фильтруются по customer_id и status, а сортируются по created_at. Составной индекс (customer_id, status, created_at) сократил время выполнения типового запроса с 45 секунд до 200 миллисекунд.

🎯 Вывод:
Правильно спроектированные индексы — это не техническая деталь, а архитектурное решение, напрямую влияющее на пользовательский опыт. Аналитик, понимающий это, создаёт системы, которые не тормозят при росте данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31
№4700 категория вопросов: #SQL
4700. Вам нужно для каждого клиента интернет-магазина получить полную информацию о его самом последнем заказе (с самой поздней датой). Какой подход к написанию запроса даст правильный результат и будет оптимальным по производительности?
Anonymous Quiz
44%
Сгруппировать записи по клиентам и выбрать максимальную дату заказа
19%
Использовать левое соединение таблицы с самой собой с условием, что более поздний заказ отсутствует
22%
Применить оконную функцию для нумерации заказов каждого клиента
14%
Отсортировать все заказы по клиенту и дате, но не фильтровать – результат будет содержать все строки
1
🧑‍🎓Объяснение:
Задача на первый взгляд простая, но на практике требует понимания современных возможностей SQL и особенностей работы с группами данных.

Почему вариант C — лучший:

Полнота данных – в отличие от простой группировки (вариант A), оконная функция позволяет получить все поля исходной таблицы, а не только ключ и дату.
Читаемость и стандарт – конструкция с ROW_NUMBER() понятна большинству разработчиков и поддерживается всеми современными СУБД (PostgreSQL, MySQL 8+, Oracle, SQL Server).
Производительность – при наличии индекса на (customer_id, order_date DESC) запрос выполняется за один проход по данным, без многократных вложенных сканирований, как в варианте B.

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

A – не решает задачу, так как возвращает только дату, а не все поля заказа.

B – классический «анти-джойн» технически рабочий, но:
Тяжеловесен: требует полного сканирования и сравнения таблицы с самой собой.
Трудночитаем и сложен в поддержке, особенно для начинающих.
При больших объёмах данных (миллионы строк) выполняется неприемлемо долго.

D – просто сортировка без фильтрации не выделяет последний заказ; результат содержит все записи, что не соответствует требованию.

📌 Роль аналитика:
Понимание оконных функций позволяет грамотно формулировать требования к отчётам и выборкам. Зная, что для задачи «последний заказ клиента» оптимально использовать ROW_NUMBER(), вы помогаете команде избежать неэффективных решений и закладываете правильную логику с самого начала.
Please open Telegram to view this post
VIEW IN TELEGRAM
№4701 категория вопросов: #ARCHITECHTURE