🍀BitBitGo🍀 Системный Анализ
3.22K subscribers
217 photos
153 videos
112 links
Курс «Системный анализ»
https://bitbitgo.by/
Пишем про системный анализ.
Поможем стартануть в карьере IT. Присоединяйся!
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Когда живешь с тем, кто работает на удаленке
😁5
📚 ПРОЧЕЕ #OTHER: ТАЙНЫ LEGACY-КОДА И ПОЧЕМУ АНАЛИТИК ДОЛЖЕН БЫТЬ ДЕТЕКТИВОМ

Привет, коллеги! 👋

Сегодня рубрика #OTHER — всё то, что не влезло в стандартные категории, но без чего системный аналитик не состоялся бы как профессионал. Речь пойдёт о работе с наследием (legacy). О тех моментах, когда документации нет, команда уволилась, а код молчит как рыба. 🕵️‍♂️

Готовы? Устраивайтесь поудобнее — будет история с реального проекта.

🕰 КЕЙС: «ПОТЕРЯННЫЙ МИР»

Контекст:
Крупный логистический оператор. Система управления заказами (1998 год постройки). Язык — Delphi, база — Oracle 9i. Автор системы уволился в 2005-м, документация — пара листов формата А4 с каракулями. Бизнес-процессы за 20 лет изменились до неузнаваемости, но система работает и её надо развивать. Задача: за месяц разобраться в логике расчёта стоимости доставки, чтобы переписать этот модуль на Java.

Первая мысль: «Открыть код и прочитать».
Реальность: 50 000 строк спагетти-кода, комментариев нет, имена переменных типа a1, xxx, superCalc. 🤯

🔎 РАССЛЕДОВАНИЕ: МЕТОД АНАЛИТИКА-ДЕТЕКТИВА

Я не программист, я аналитик. Значит, мой инструмент — не отладчик, а голова и коммуникации.

Шаг 1. Ищем живых свидетелей
Оказалось, в компании ещё работал технолог, который принимал ту систему 20 лет назад. Он помнил бизнес-логику:
*«Доставка по Москве считалась как вес * 15, но если суммарный вес больше 100 кг — дополнительный коэффициент 0,8»*.

📌 Вывод: 80% логики можно восстановить через экспертов, не глядя в код.

Шаг 2. Reverse engineering через данные
Мы выгрузили из базы 10 000 завершённых заказов: входные параметры (вес, габариты, регион) и итоговая стоимость. Построили модель машинного обучения (просто регрессию), которая предсказывала стоимость с точностью 97%. Затем проанализировали, какие признаки важны — так мы вычислили скрытые коэффициенты и формулы. 🧮

Шаг 3. Провокация системы
На тестовом контуре я отправлял «странные» заказы: отрицательный вес, нулевая стоимость, несуществующий регион. Смотрел, какие ошибки вылетают. Иногда ошибки содержали куски кода или названия процедур — это давало зацепки. Например, ошибка «Division by zero in CalculateRegionalCoefficient» подсказала название ключевого метода.

Шаг 4. Археология кода
Не читая всё подряд, я искал маркеры: названия полей из базы, константы, числа. Нашёл блок:

if Region in [1,3,5,7] then
Coef := 1.2
else
Coef := 1.5
Сверил с бизнес-правилами — оказалось, это надбавка за «дальнее Подмосковье».


Результат: Через 3 недели у меня была точная спецификация алгоритма на человеческом языке. Java-разработчик написал новый микросервис за 10 дней, тестирование на исторических данных показало 100% совпадение.

📦 ЧТО ЭТОТ КЕЙС ДАЁТ НАМ, АНАЛИТИКАМ?

1. Аналитик — не писарь, а исследователь
Ваша главная ценность — не в том, чтобы записать то, что говорят. А в том, чтобы докопаться до сути, когда никто не говорит или все забыли.

2. Инструменты бывают разными
SQL, Python, даже Excel — всё это оружие аналитика. В этом кейсе я использовал:

SQL для выгрузки данных 📊
линейную регрессию (sklearn) для обратного инжиниринга формул 🤖
Postman для «провокации» API 🧨
мозг и блокнот 🧠
3. Документация — живой организм
Если документации нет — создайте её сами. После проекта я написал Conceptual Specification на восстановленный модуль. Теперь система готова к эволюции.

4. Люди помнят не код, а смыслы
Общайтесь с ветеранами бизнеса, пока они не ушли. Записывайте интервью, рисуйте блок-схемы, перепроверяйте гипотезы через данные.

ЧЕК-ЛИСТ «LEGACY-ДЕТЕКТИВ» ДЛЯ АНАЛИТИКА

Найти экспертов, работавших с системой на старте
Собрать исторические данные (заказы, логи) — минимум 1000 записей
Проанализировать статистику: какие значения полей, диапазоны, частоты
Построить простую модель предсказания выходного параметра
Провести исследовательское тестирование (негативные сценарии, граничные значения)
Искать в коде ключевые слова из бизнес-лексикона
Фиксировать каждую находку в виде понятной бизнес-логики
Валидировать восстановленную логику с заказчиком

#OTHER
This media is not supported in your browser
VIEW IN TELEGRAM
Когда пришло письмо «Прошу подключиться к вопросу ниже»
📚 ПРОЧЕЕ #OTHER: КАК УБЕДИТЬ ЗАКАЗЧИКА, КОГДА ОН ТРЕБУЕТ НЕВОЗМОЖНОГО

Привет, коллеги! 👋

Сегодня в рубрике #OTHER поговорим о том, чему не учат на курсах по аналитике, но без чего вы не станете профессионалом — о переговорах и управлении ожиданиями. О том, как найти общий язык с заказчиком, когда его требования противоречат здравому смыслу, бюджету или законам физики. 🚧

Готовы? Поехали!

💥 КЕЙС: «САЙТ ДОЛЖЕН ЛЕТАТЬ, НО ДЕНЕГ НЕТ»

Контекст:
Разрабатываем интернет-магазин для крупного ритейлера. Заказчик — владелец бизнеса, человек эмоциональный, далёкий от IT. На одной из встреч он заявляет:

«Сайт должен грузиться за 0.5 секунды! Как у Google! И одновременно держать 100 000 посетителей. И сделать это надо за месяц, потому что через месяц — чёрная пятница». 🚀

Проблема:
Текущий бюджет — 2 миллиона рублей, команда — 5 человек. Реалистичная оценка: для таких характеристик нужна распределённая архитектура, CDN, кэширование, минимум 3 месяца и бюджет в 3-4 раза больше.

Задача аналитика:
Не сказать «это невозможно» и не согласиться на нереальные сроки, а донести реальность, сохранив отношения и предложив альтернативу.

🔧 ИНСТРУМЕНТЫ АНАЛИТИКА-ПЕРЕГОВОРЩИКА:

1. Данные и цифры — ваше оружие 📊
Я подготовил простую таблицу в Excel:

Текущая производительность их старого сайта: 3 секунды загрузки, падает при 5000 посетителей.
Метрики конкурентов (средние по рынку): 1.5-2 секунды.
Стоимость инфраструктуры для 0.5 секунд: расчёт количества серверов, балансировщиков, CDN.
Результат: Цифры отрезвляют лучше любых слов.

2. Перевод с «хотелок» на бизнес-цели 🎯

Я спросил: «Почему именно 0.5 секунды? Что это даст бизнесу?»
Оказалось, заказчик прочитал статью, что каждая секунда задержки снижает конверсию на 7%. Его реальная цель — максимизировать продажи в чёрную пятницу.

3. Предложение альтернатив (trade-offs) ⚖️

Вместо «невозможно» я предложил варианты:

Вариант А (идеальный): 3 месяца, 8 млн руб. — всё как просили.
Вариант Б (компромисс): 1.5 секунды загрузки, кэширование на CDN, масштабирование до 50 000 пользователей — за 2 месяца и 3.5 млн руб.

Вариант В (минимальный): быстрые победы — оптимизация картинок, сжатие, настройка кэша на сервере — 1 месяц, 2 млн руб., загрузка 2.5 секунды, но надёжность вырастет.

4. Визуализация последствий 📉
Я нарисовал простой график: зависимость времени загрузки от бюджета и сроков. Наглядно показал, что попытка вписаться в 0.5 секунд за месяц приведёт к срыву сроков или неработающему сайту.

🎯 ЧТО ЭТОТ КЕЙС ДАЁТ НАМ, АНАЛИТИКАМ?

1. Аналитик — это мост между бизнесом и технологией
Вы не просто записываете требования, вы переводите эмоции и хотелки в измеримые цели и реалистичные планы.

2. Цифры убеждают сильнее слов
Всегда подкрепляйте свои аргументы расчётами, графиками, сравнениями. Заказчик может спорить с мнением, но не с математикой.

3. Ищите истинную потребность
За каждым требованием стоит бизнес-цель. Найдите её — и сможете предложить альтернативные пути достижения.

4. Учитесь говорить «нет» через «да»
Не говорите «это невозможно». Говорите: «Да, мы можем это сделать, но для этого потребуется X ресурсов и Y времени. Если бюджет ограничен, можем предложить другой подход, который даст 80% результата за 50% стоимости».

ЧЕК-ЛИСТ «ПЕРЕГОВОРЫ С ЗАКАЗЧИКОМ»

Выясните реальную бизнес-цель за требованием
Соберите данные: текущие метрики, статистику, цены
Подготовьте 2-3 альтернативных сценария с разными trade-offs
Визуализируйте последствия каждого варианта
Не бойтесь задавать уточняющие вопросы
Фиксируйте достигнутые договорённости в протоколе
💬 ИТОГ:

Системный аналитик — это не просто человек, который пишет ТЗ. Это переговорщик, стратег и психолог в одном лице. Умение управлять ожиданиями и находить компромиссы часто важнее знания UML или SQL.

Помните: хороший аналитик делает так, чтобы и заказчик был доволен, и команда разработки могла спокойно работать.

#OTHER
2
📊 SQL ДЛЯ СИСТЕМНОГО АНАЛИТИКА: КАК ЗАПРОСЫ ПОМОГАЮТ НАХОДИТЬ ПРОБЛЕМЫ БЫСТРЕЕ КОФЕ

Привет, коллеги! 👋

Многие думают, что SQL — это для разработчиков и администраторов баз данных. Но на самом деле SQL для аналитика — как микроскоп для биолога. Это инструмент, который позволяет увидеть реальную картину, проверить гипотезы и найти ошибки в требованиях ещё до того, как они уйдут в разработку. 🧐

Сегодня покажу на реальных кейсах, как простые SQL-запросы спасали проекты и помогали принимать правильные решения. Поехали! 🚀

🔍 КЕЙС 1: ДУБЛИКАТЫ, КОТОРЫХ НЕ ДОЛЖНО БЫТЬ

Ситуация:
На тестировании CRM-системы заметили, что некоторые клиенты получают по два одинаковых письма. Разработчики ищут баг в коде, тестировщики проверяют сценарии. Аналитик предлагает заглянуть в данные.

Запрос:

SELECT 
customer_id,
email,
COUNT(*) as duplicate_count
FROM customers
GROUP BY customer_id, email
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;


Результат:
Нашлось 342 записи с одинаковыми customer_id! Оказалось, при интеграции с внешней системой дублировались импорты из-за отсутствия уникального ключа.

Вывод:
Проблема была не в коде, а в процессе загрузки данных. Аналитик инициировал изменение интеграции и очистку дублей. Баг исчез до того, как разработчики начали искать его в логике приложения.

🎯 Что дал SQL:
Сэкономил неделю бесполезных поисков в коде и указал на реальную причину.

📉 КЕЙС 2: «НЕВОЗМОЖНЫЕ» СКИДКИ

Ситуация:
В интернет-магазине маркетологи запустили акцию: «Скидка 20% на второй товар в заказе». Через месяц финансисты заметили, что средний чек упал, а количество заказов не выросло.

Гипотеза:
Возможно, скидка применяется неправильно. Аналитик решил проверить на реальных данных.

Запрос:

SELECT 
order_id,
SUM(item_price) as total_price,
SUM(discount_amount) as total_discount,
CASE
WHEN SUM(discount_amount) > SUM(item_price) * 0.3 THEN 'Подозрительно много'
WHEN SUM(discount_amount) = 0 THEN 'Без скидки'
ELSE 'Нормально'
END as discount_check
FROM order_items
WHERE order_date >= '2024-10-01'
GROUP BY order_id
HAVING SUM(discount_amount) > SUM(item_price) * 0.3
ORDER BY total_discount DESC;


Результат:
Нашлись заказы, где скидка составляла 70-80% от суммы! Причина: в коде скидка применялась к каждому товару, а не ко второму. Баг в бизнес-логике, заложенной в ТЗ, но никто не проверял данные.

Вывод:
SQL помог обнаружить ошибку в требованиях на ранних данных. Акцию приостановили, переписали логику, потери составили всего 2 дня вместо месяца убытков.

📈 КЕЙС 3: ПОЧЕМУ ОТЧЁТ ТОРМОЗИТ 40 МИНУТ

Ситуация:
Руководитель жалуется: ежедневный отчёт по продажам формируется 40 минут. Разработчики предлагают купить более мощный сервер. Аналитик просит показать запрос.

Исходный запрос (упрощённо):

SELECT 
customer_id,
(SELECT COUNT(*) FROM orders o2 WHERE o2.customer_id = o1.customer_id) as total_orders,
(SELECT SUM(amount) FROM payments p WHERE p.order_id IN
(SELECT order_id FROM orders o3 WHERE o3.customer_id = o1.customer_id)
) as total_paid
FROM customers o1
WHERE created_at >= '2024-01-01';


Проблема:
Подзапросы выполняются для каждой строки — это миллионы обращений к таблицам.

Оптимизированный запрос:

SELECT 
c.customer_id,
COUNT(DISTINCT o.order_id) as total_orders,
SUM(p.amount) as total_paid
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
LEFT JOIN payments p ON o.order_id = p.order_id
WHERE c.created_at >= '2024-01-01'
GROUP BY c.customer_id;


Результат:
Время выполнения упало с 40 минут до 8 секунд. Никакого нового сервера не понадобилось.

Вывод:
Аналитик, понимающий SQL, спас компанию от ненужных трат на железо и сделал отчёт мгновенным.

💡 ИТОГ:

SQL для системного аналитика — это не просто «плюшка в резюме», а рабочий инструмент, который:

Экономит время команды
Спасает от ошибок в требованиях
Даёт факты вместо догадок
Повышает ваш профессиональный уровень

#SQL
1👍1
🧪 #TESTING ДЛЯ СИСТЕМНОГО АНАЛИТИКА: КАК ПОМОЧЬ QA НАЙТИ БАГИ ЕЩЁ ДО КОДА

Привет, коллеги! 👋 Многие думают: «Тестирование — забота QA, аналитик написал требования и забыл». Но аналитик и тестировщик — два сапёра в одном минном поле. Покажу на реальных кейсах, как аналитик усиливает тестирование. Поехали! 🚀

🐛 КЕЙС 1: «ЭТО НЕ БАГ, ЭТО ФИЧА?» — КОГДА ТРЕБОВАНИЯ ВРУТ

Ситуация: В ТЗ: «Дата рождения в формате ДД.ММ.ГГГГ». Всё работает, но в базе каша — пользователи вводили через слеш.

Что должен был сделать аналитик:
Заложить валидацию на бэкенде и критерии приёмки:

1. Только формат DD.MM.YYYY
2. Ошибка при неверном формате
3. В БД тип DATE


Код для автотеста:

def test_birth_date_format():
response = client.post("/profile", json={"birth_date": "01/01/1990"})
assert response.status_code == 400


📊 КЕЙС 2: SQL КАК ИНСТРУМЕНТ ВАЛИДАЦИИ ЛОГИКИ

Ситуация: Акция «третий товар со скидкой 15%». Тесты проходят, но в 5% заказов скидка на первый товар, а не на самый дорогой.

Аналитик проверил SQL:

SELECT order_id, CASE WHEN SUM(discount) != MAX(price)*0.15 
THEN 'Ошибка' END as check
FROM order_items GROUP BY order_id HAVING COUNT(*)>=3;


Вывод: Аналитик нашёл баг, невидимый в тестовых данных.

📝 КЕЙС 3: JSON-СХЕМА КАК КОНТРАКТ

Ситуация: В интеграции поле phone передали числом, а сервис ждал строку — доставки встали.

Аналитик внёс JSON Schema:

{
"type": "object",
"properties": {
"phone": {"type": "string", "pattern": "^\\+7\\d{10}$"}
}
}


Автотест:

``python
validate(instance=response, schema=schema)
```

Ошибка ловится автоматически.

ЧЕК-ЛИСТ АНАЛИТИКА:

Acceptance Criteria с примерами
Таблицы решений для сложной логики
Граничные значения
Примеры запросов/ответов
Негативные сценарии

🎯 ИТОГ: Хороший аналитик проектирует тестируемую систему. Тогда QA ловит баги до релиза, а не пользователи на проде.

#TESTING
🥰1
🧪 #TESTING ДЛЯ СИСТЕМНОГО АНАЛИТИКА: КАК ПОМОЧЬ QA
Привет, коллеги! 👋 Аналитик и тестировщик — два сапёра в одном минном поле. Если аналитик плохо заложил логику, QA будет искать баги бесконечно. Покажу на реальных кейсах, как усилить тестирование. 🚀

🐛 КЕЙС 1: «ЭТО НЕ БАГ, ЭТО ФИЧА?»

Ситуация: В ТЗ: «Дата рождения в формате ДД.ММ.ГГГГ». Всё работает, но в базе каша — пользователи вводили через слеш.

Что должен был сделать аналитик:

Acceptance Criteria:
1. Только формат DD.MM.YYYY
2. Ошибка при неверном формате
3. В БД тип DATE


Код для автотеста:

def test_birth_date_format():
response = client.post("/profile", json={"birth_date": "01/01/1990"})
assert response.status_code == 400


📊 КЕЙС 2: SQL КАК ИНСТРУМЕНТ ВАЛИДАЦИИ

Ситуация: Акция «третий товар со скидкой 15%». Тесты проходят, но в 5% заказов скидка на первый товар.

Аналитик проверил SQL:

SELECT order_id, CASE WHEN SUM(discount) != MAX(price)*0.15 
THEN 'Ошибка' END as check
FROM order_items GROUP BY order_id HAVING COUNT(*)>=3;


Вывод: Аналитик нашёл баг, невидимый в тестовых данных.

📝 КЕЙС 3: JSON-СХЕМА КАК КОНТРАКТ

Ситуация: В интеграции поле phone передали числом, а сервис ждал строку — доставки встали.

Аналитик внёс JSON Schema:

{
"properties": {
"phone": {"type": "string", "pattern": "^\\+7\\d{10}$"}
}
}


Автотест:

``python
validate(instance=response, schema=schema)
```

ЧЕК-ЛИСТ АНАЛИТИКА:

🚀Acceptance Criteria с примерами
💻Таблицы решений
💻Граничные значения
💻Примеры запросов/ответов
💻Негативные сценарии

🎯 ИТОГ: Хороший аналитик проектирует тестируемую систему. Тогда QA ловит баги до релиза.

#TESTING
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Когда ко встрече подключился ОЧЕНЬ важный тех специалист
😁4
📐 UML ДЛЯ СИСТЕМНОГО АНАЛИТИКА: КОГДА КАРТИНКА ГОВОРИТ ГРОМЧЕ СЛОВ
Привет, коллеги! 👋 UML — не просто "рисовалки", а мощный инструмент коммуникации. Покажу на кейсах, как диаграммы спасают проекты. 🚀

📌 КЕЙС 1: ДИАГРАММА ПОСЛЕДОВАТЕЛЬНОСТИ

Спорили 3 часа, как обрабатывать ошибки SMS-шлюза. Нарисовали схему — споры ушли.

User -> CRM: Заказ
CRM -> SMS: POST /send-sms
alt Успешно
SMS --> CRM: 200 OK
else Таймаут
SMS --> CRM: 504
CRM -> User: "Будет отправлено позже"
end


Вывод: Sequence Diagram лучший для описания взаимодействия компонентов во времени.

📊 КЕЙС 2: ДИАГРАММА СОСТОЯНИЙ

Путались в статусах заказа. State Machine Diagram навёл порядок.

[*] → Создан → Оплачен → В сборке → Доставлен
Создан → Отменён
Доставлен → Возврат → Завершён
Вывод: Незаменима для объектов со сложной статусной моделью.

🧩 КЕЙС 3: ДИАГРАММА КЛАССОВ

Новички не могли спроектировать БД. Class Diagram дал чёткую структуру.

text
User 1 ----many Enrollment
Course 1 ----many Enrollment
Course 1 ----many Lesson
Вывод: Это чертёж будущей системы до написания кода.

🏗 КЕЙС 4: C4-МОДЕЛЬ

В 15 микросервисах никто не видел общей картины. C4 + PlantUML спасли.

```text
Клиент → [Платформа] → [Платёжный шлюз]
Курьер → [Платформа] → [SMS-сервис]


Вывод: Идеально для документирования архитектуры кодом.

🛠 ЧТО ИСПОЛЬЗОВАТЬ?

PlantUML — текст → диаграмма
Draw.io — быстро
Miro — для совместной работы

🎯 ИТОГ: UML экономит часы переговоров и делает систему прозрачной для всех.


#UML
1
Media is too big
VIEW IN TELEGRAM
Рабочие переписки с ChatGPT
😁6
🔗 #INTEGRATION: КАК НЕ ПОТОНУТЬ В КОНТРАКТАХ И НЕ ПОТЕРЯТЬ ДАННЫЕ

Привет, коллеги! 👋

Сегодня покажу на реальных кейсах, как чёткие контракты и идемпотентность спасают проекты. Поехали! 🚀

📌 КЕЙС 1: КОГДА ФОРМАТЫ НЕ СОШЛИСЬ

CRM с датами DD.MM.YYYY интегрировали с сервисом, ждущим YYYY-MM-DD. Месяц отчёты строились по несуществующим датам. 😱

Решение: JSON Schema

{
"properties": {
"birth_date": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
}
}


Код проверки:

validate(instance=request, schema=schema)  # Ошибка при неверном формате


Вывод: JSON Schema — обязательный контракт для каждой интеграции. 📝

🔄 КЕЙС 2: ДУБЛИКАТЫ В ОЧЕРЕДИ

Из-за сбоя сети служба доставки получила дубликаты заказов из очереди. 💔

Решение: Идемпотентность

if redis.exists(f"processed:{msg_id}"):
return # уже обработано
create_delivery(order_id)
redis.setex(f"processed:{msg_id}", 86400, "1")


Вывод: Уникальный message_id и проверка на дубликаты — обязательное требование. 🛡

🧪 КЕЙС 3: ТЕСТИРОВАНИЕ КОНТРАКТОВ

Интеграция упала на проде из-за неожиданного статуса ответа.

Решение: Pact (контрактное тестирование)

provider.uponReceiving('запрос')
.withRequest({ body: { order_id: 123 } })
.willRespondWith({ status: 201, body: { delivery_id: 456 } });


Вывод: Тесты на контракты ловят нестыковки до выкатки. 🧪

ЧЕК-ЛИСТ АНАЛИТИКА

Контракт: JSON Schema, примеры, правила трансформации
Надёжность: Уникальный ID, retry policy, DLQ

Тестирование: Контрактные тесты, негативные сценарии
Мониторинг: Метрики, алерты, логи с ID запроса

🎯 ИТОГ:

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

#INTEGRATION
🔗 #INTEGRATION: КАК НЕ УТОНУТЬ В API И НЕ ПРОСПАТЬ ИЗМЕНЕНИЯ

Привет, коллеги! 👋 Интеграции — это не просто «дёрнуть API». Это управление контрактами, версиями и нагрузкой. Покажу на кейсах, как инструменты спасают проекты. 🚀

📌 КЕЙС 1: REST API — OpenAPI как контракт

CRM и биллинг ссорились из-за формата телефона. 😫

Решение: OpenAPI-спецификация с жёсткой схемой.

phone: { type: string, pattern: '^\+7\d{10}$' }


Код валидации (Pydantic):

Customer(phone="+79991234567")  # ok
Customer(phone="89991234567") # error


Вывод: OpenAPI — стандарт для REST. 📝

🔄 КЕЙС 2: АСИНХРОН — Avro + Schema Registry

Добавили поле в событие Kafka — аналитика упала. 💥

Решение: Avro-схемы с default-значениями.

{"name": "promo_code", "type": ["null", "string"], "default": null}
Schema Registry хранит версии — потребители не ломаются.


Вывод: Avro + Registry для асинхронных шин. 📦

⏱️ КЕЙС 3: RATE LIMITING

SMS-шлюз отвечал 429 в час пик, уведомления терялись. 📉

Решение: Асинхронная очередь с лимитером.

async with AsyncLimiter(100, 1):
await send_sms(phone, text) # не превысит лимит

Вывод: Rate limiting и retry policy обязательны.

ЧЕК-ЛИСТ АНАЛИТИКА:

Контракт: OpenAPI / AsyncAPI / Avro
Валидация: схемы на всех уровнях
Версионирование: политика совместимости
Ошибки: retry policy, DLQ, rate limiting
Мониторинг: метрики, алерты, логи

🎯 ИТОГ: Интеграция — это контракты, версии и защита. Закладывайте это в требования.
🧪 #TESTING: КАК АНАЛИТИКУ ЗАКЛАДЫВАТЬ КАЧЕСТВО ДО КОДА

Привет, коллеги! 👋 Аналитик не просто пишет требования — он создаёт тестируемую систему. Покажу на кейсах, как формализация помогает QA. Поехали! 🚀

📌 КЕЙС 1: ПЛОХИЕ ACCEPTANCE CRITERIA

Было: «При сумме >5000 скидка». Разработчик сделал 5%, а нужно было 10% для новых клиентов. 😱

Решение: Given-When-Then

Scenario: Постоянный клиент с суммой >5000
Given клиент постоянный (более 5 заказов)
And сумма 6000
When считаем итог
Then скидка = 600 (10%), итог = 5400


Вывод: Сценарии исключают разночтения.

📦 КЕЙС 2: JSON SCHEMA ДЛЯ КОНТРАКТОВ

Интеграция упала: телефон передали числом, а API ждал строку с +7. 💥

Решение: JSON Schema

{
"properties": {
"phone": {"type": "string", "pattern": "^\\+7\\d{10}$"}
}
}


Код проверки:

python
validate(instance=request, schema=schema) # ошибка при неверном формате
Вывод: Контракты ловят нестыковки до прода. 🛡

🛠 КЕЙС 3: ГЕНЕРАЦИЯ ТЕСТОВЫХ ДАННЫХ

Тестировщики вручную создавали заказы. Аналитик написал скрипт.

def generate_order():
total = random.choice([3000, 6000, 10000])
discount = total * 0.1 if total > 5000 else 0
return {"total": total, "discount": discount}


Вывод: Готовые данные по бизнес-правилам экономят часы. ⏱️

ЧЕК-ЛИСТ АНАЛИТИКА:

Acceptance Criteria в Given-When-Then
JSON Schema для всех интеграций
Скрипты генерации тестовых данных
Примеры запросов-ответов
Негативные сценарии

🎯 ИТОГ: Чем чётче требования — тем меньше багов в проде. Инструменты выше — must-have для аналитика.

#TESTING
🗄 #DBMS ДЛЯ СИСТЕМНОГО АНАЛИТИКА: КАК НЕ УТОНУТЬ В ДАННЫХ

Привет, коллеги! 👋 Решения аналитика на этапе проектирования определяют, будет ли система тормозить или рухнет под нагрузкой. Покажу на кейсах, как понимание БД спасает проекты. 🚀

📌 КЕЙС 1: НОРМАЛИЗАЦИЯ

Всё хранили в одной таблице заказов. Клиент сменил телефон — обновляли 1000 записей. 😱

Было (плохо):

CREATE TABLE orders (customer_name, customer_phone, product_name, ...);
Стало (хорошо):


CREATE TABLE customers (id, name, phone);
CREATE TABLE products (id, name, price);
CREATE TABLE orders (id, customer_id, date);
CREATE TABLE order_items (order_id, product_id, qty);


Вывод: Нормализация устраняет аномалии. Проектируйте структуру, а не «табличку».

📊 КЕЙС 2: ИНДЕКСЫ

Поиск клиента по email в таблице users (10 млн строк) — 30 секунд.

До:

SELECT * FROM users WHERE email = 'ivan@example.com'; -- 30 сек
После:


CREATE INDEX idx_users_email ON users(email); -- 10 мс


Вывод: Индексы на полях в WHERE обязательны. Это дёшево и эффективно.

🔒 КЕЙС 3: ТРАНЗАКЦИИ

Два менеджера одновременно забронировали последний номер в отеле. Двойная продажа! 💔

Решение: Блокировка строки.

BEGIN;
SELECT * FROM rooms WHERE id = 123 AND status = 'free' FOR UPDATE;
-- теперь никто не изменит строку
INSERT INTO bookings (room_id, customer_id) VALUES (123, 456);
COMMIT;


Вывод: Аналитик должен предусматривать конкурентный доступ и блокировки.

📈 КЕЙС 4: ВЫБОР БД

10 000 датчиков шлют показания каждую секунду. PostgreSQL раздулся и тормозит.

Решение: Time Series DB (InfluxDB).

INSERT sensors,device_id=101 temperature=22.5
SELECT MEAN(temperature) FROM sensors WHERE time > now() - 1h


Вывод: Выбирайте СУБД под задачу: реляционные, документные, временные ряды, графовые.

ЧЕК-ЛИСТ АНАЛИТИКА:

Нормализация (до 3НФ)
Индексы на частые WHERE
Транзакции и блокировки
Выбор типа СУБД под задачу

🎯 ИТОГ: База данных — сердце системы. Ошибки в проектировании на этапе анализа приводят к миллионным потерям позже. Хороший аналитик — архитектор данных.

#DBMS
🛠 #SYSTEMDESIGN: КАК ПРОЕКТИРОВАТЬ СИСТЕМЫ, КОТОРЫЕ НЕ РАЗВАЛЯТСЯ

Привет, коллеги! 👋 Проектирование — это компромиссы и предвидение. Разберём на реальных кейсах, какие решения спасают проекты, а какие — убивают. 🚀

📌 КЕЙС 1: МОНОЛИТ VS МИКРОСЕРВИСЫ

Стартап доставки, команда 5 человек, MVP за 2 месяца. Техлид хотел микросервисы — это убило бы сроки.

Решение: Модульный монолит с чёткими слоями. Запустились вовремя, через год выделили сервис доставки без переписывания.
Вывод: Для маленькой команды — модульный монолит. Микросервисы нужны для независимых команд, а не для «модности».

🔒 КЕЙС 2: ПОСЛЕДНИЙ БИЛЕТ

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

Решение: Пессимистическая блокировка SELECT FOR UPDATE. Второй пользователь ждёт и видит, что место уже занято.
Вывод: Для уникальных ресурсов (места, товары) закладывайте блокировки.

📊 КЕЙС 3: IoT-ПОТОК

10 000 датчиков в секунду. Пытались писать в PostgreSQL — БД раздулась, запросы тормозили.

Решение: Потоковая обработка (Kafka + Flink) + ClickHouse для агрегатов. Сырые данные не храним — только 5-минутные средние.
Вывод: Для временных рядов — специализированные БД (Time Series).

🚀 КЕЙС 4: КЭШИРОВАНИЕ

Интернет-магазин: страницы товаров грузились 5 секунд. DevOps хотел сервер за 2 млн руб.

Решение: Внедрили Redis. Кэш на 5 минут, нагрузка на БД упала на 95%, время загрузки — 200 мс. Сервер не купили.
Вывод: Кэширование — первое средство от высокой нагрузки на чтение.

🧩 КЕЙС 5: CQRS

Система задач: отчёты строились 5 минут, потому что читали те же таблицы, куда активно писали.

Решение: Разделили модели записи (PostgreSQL) и чтения (MongoDB). Синхронизация через события.
Вывод: При дисбалансе чтения и записи помогает CQRS.

ЧЕК-ЛИСТ АНАЛИТИКА:

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

🎯 ИТОГ: Проектирование — это выбор компромиссов. Хороший аналитик помогает команде найти баланс между скоростью, стоимостью и масштабируемостью.

#OTHER
1👍1
🛠 #SYSTEMDESIGN: 5 РЕШЕНИЙ, КОТОРЫЕ СПАСУТ ВАШ ПРОЕКТ

Привет, коллеги! 👋 System Design — это компромиссы. Разберём 5 кейсов, где правильные решения спасли бизнес. 🚀

🔁 КЕЙС 1: RETRY + CIRCUIT BREAKER

Платёжный шлюз падал с 503. Сервис терял деньги.

Решение:

@retry(stop_max_attempt_number=3)
@circuit_breaker(failure_threshold=5)
def process_payment(data):
return gateway.charge(data)


Retry спасает от временных сбоев, Circuit Breaker — от лавины.

Вывод: Интеграции = Retry + Circuit Breaker.

📨 КЕЙС 2: АСИНХРОННОСТЬ ДЛЯ УВЕДОМЛЕНИЙ

При регистрации email и SMS тормозили 10 секунд.

Решение:

user.save()
queue.send('email', user) # асинхронно
queue.send('sms', user)
return "OK" # 200 мс
Пользователь не ждёт, сбои не ломают UX.


Вывод: Всё не критичное — в очередь.

🔢 КЕЙС 3: ВЕРСИОНИРОВАНИЕ API

Изменили формат ответа — мобильное приложение упало.

Решение:

GET /api/v1/orders  # старый формат
GET /api/v2/orders # новый формат
Старые клиенты работают, новые используют v2.


Вывод: Версионируйте API с первого дня.

📁 КЕЙС 4: ЗАГРУЗКА ФАЙЛОВ В S3

Аватарки через бэкенд убивали сервер.

Решение: Подписанные URL.

1. Бэкенд выдаёт временную ссылку на S3
2. Клиент загружает файл напрямую
3. S3 уведомляет бэкенд
Бэкенд не тратит ресурсы на файлы.


Вывод: Файлы — в облако, через подписанные URL.

⏱️ КЕЙС 5: АСИНХРОННЫЙ КОЛЛБЭК

Внешний сервис отвечал 30 секунд — пользователь ждал.

Решение:

1. Запрос → получаем request_id
2. "Ждите уведомление"
3. Webhook с результатом
Пользователь не ждёт, сервер не блокируется.


Вывод: Долгие операции — асинхронно.

ЧЕК-ЛИСТ:

Retry + Circuit Breaker для интеграций
Асинхронность для не критичного
Версионирование API
Файлы через подписанные URL
Webhook для долгих операций

🎯 ИТОГ: System Design — это умные компромиссы. Хороший аналитик помогает команде выбрать решения, которые работают сегодня и не убьют завтра.

#SYSTEMDESIGN
#SYSTEMDESIGN
👍1