Пояснительная записка
Каждый разбор относится к одному узлу сборки и объясняет, что в нём ломается, почему и что с этим делать.
36 разборов · 6 узлов
Ядро
Место, где живёт логика вашего продукта и принимаются решения. Всё остальное обслуживает его.
-
Пирамида тестов: сколько юнит и сколько интеграционных
Что такое пирамида тестов, чем юнит-тест отличается от интеграционного, почему покрытие кода в процентах меряет не то и по какому признаку решать, где ставить тест.
-
Race condition: почему гонка видна только на бою
Что такое состояние гонки, почему race condition не воспроизводится локально, чем гонка отличается от дедлока и почему блокировки не дают потокобезопасности.
-
Почему добавление потоков снижает пропускную способность
Закон Амдала объясняет, почему ускорение упирается в потолок. Он не объясняет, почему после некоторого числа потоков система начинает работать хуже.
-
Четыре языка — это выбор, а не коллекция
Чем PHP, Java, Python и C++ действительно отличаются для одной серверной задачи, и почему цена второго языка в проекте измеряется не синтаксисом.
-
Где на самом деле живёт бизнес-логика
Одно и то же правило оказывается реализовано в базе, в сервисе и на клиенте — с тремя разными поведениями. Разбор того, кто и что должен вынуждать.
-
Ошибка — часть контракта, а не случайность
Почему «бросим исключение, наверху разберутся» — это решение не проектировать контракт, и чем ожидаемый отказ отличается от дефекта.
Хранилище
Где лежат данные и как достать нужное быстро, когда их станет в сто раз больше.
-
Redis: кеш или база, и как инвалидировать кеш
Зачем нужен Redis, чем кеширование отличается от хранения, как работают TTL и инвалидация кеша, что такое лавина промахов и когда вместо Redis хватит Memcached.
-
Как хранить пароли: хеш — это не шифрование
Чем хеширование отличается от шифрования, почему SHA-256 для паролей не годится, зачем нужна соль и какие алгоритмы и параметры рекомендует OWASP в 2026 году.
-
SQL или NoSQL: когда реляционная база перестаёт подходить
Чем отличается SQL от NoSQL, почему «NoSQL» — это четыре разных вида баз, и по какому признаку выбирать. Разбор с процедурой выбора, а не «зависит от задачи».
-
Уровни изоляции: что стандарт не смог определить
ANSI SQL определяет уровни изоляции через три аномалии. В 1995 году было показано, что это определение неполно и допускает несовместимые прочтения.
-
Индекс есть, а планировщик его не берёт
Почему «добавьте индекс» — не ответ, и как читать решение планировщика, который считает полный проход дешевле поиска по дереву.
-
Миграции без простоя: почему «просто добавить колонку» врёт
Схема и код меняются в разные моменты, и между ними всегда есть окно, где работают обе версии. Разбор того, что из этого следует.
-
ORM: что вы отдаёте за удобство
ORM берёт плату не производительностью. Она прячет границу между памятью процесса и состоянием базы — и поэтому N+1 переживает любое код-ревью.
Обмен
Как система разговаривает с другими: с приложением, с партнёрами, с платежами, с почтой.
-
Зачем нужен nginx: прокси и балансировка
Зачем ставить nginx перед приложением: обратный прокси, терминация TLS, буферизация, таймауты, upstream и балансировка нагрузки. И нужен ли ещё apache.
-
REST или GraphQL: что выбрать для API
Чем GraphQL отличается от REST, какую задачу он решает на самом деле и что приходится строить заново после перехода: кеш, коды ответов, ограничение сложности запроса.
-
JWT или сессии: чем платят за отсутствие состояния
Чем JWT отличается от сессий, почему токен нельзя отозвать и когда список отзыва обнуляет весь смысл JWT. Разбор с вердиктом для браузерных приложений и для сервисов.
-
Kafka или RabbitMQ: журнал против брокера
В чём разница между Kafka и RabbitMQ, почему вопрос «что быстрее» поставлен неверно и по какому признаку выбирать. Плюс третий вариант, который часто лучше обоих.
-
CAP: теорема, которую цитируют неправильно
Формулировка «выберите два из трёх» не соответствует доказанному. Что именно доказали Гилберт и Линч, что признал Брюер и почему PACELC точнее.
-
Exactly-once не существует
Доставку ровно один раз продают как свойство очереди. Разбор того, почему это свойство получателя, и что делать вместо надежды на брокера.
-
Ретрай, который устраивает DDoS вам же
Повтор без джиттера и без бюджета превращает частичный отказ в полный. Разбор механики лавины и трёх вещей, которые её останавливают.
-
Таймаут по умолчанию — это отсутствие таймаута
Незаданный таймаут не «разумный», а чаще всего бесконечный. Разбор того, как один медленный сосед выедает пул соединений и утаскивает за собой сервис.
Сборка и выкат
Чтобы обновление выходило по кнопке и откатывалось за минуту, а не роняло работу на вечер.
-
Зачем нужен CI/CD, если выкатывать можно руками
Что означают буквы CI и CD на самом деле, чем доставка отличается от развёртывания и почему автоматический выкат — дешёвая половина, которую внедряют вместо дорогой.
-
Docker: что он изолирует на самом деле
Чем контейнер отличается от виртуальной машины, какие механизмы ядра его изолируют и почему контейнер не является границей безопасности. Разбор устройства без метафор.
-
Воспроизводимая сборка: от Томпсона до SOURCE_DATE_EPOCH
Кен Томпсон в 1984 году показал, что исходный код не доказывает свойств бинарника. Что из этого следует и какие источники недетерминизма приходится закрывать.
-
Kubernetes раньше, чем он нужен
Оркестратор решает задачу, которой у вас может не быть, и создаёт задачу, которая появится обязательно. Разбор того, что именно он покупает и чем за это платят.
-
Секрет в переменной окружения — это не секрет
Переменные окружения видны в дампе, в отчёте о падении, в списке процессов и в панели оркестратора. Разбор того, где они утекают и что ставить вместо.
Наблюдаемость
Чтобы об отказе вы узнавали от системы, а не от клиента, который до вас дозвонился.
-
Что писать в логи, чтобы они пригодились в аварию
Почему подробные логи не помогают в разборе, что такое структурированное логирование, зачем сквозной идентификатор запроса и как на самом деле различаются уровни.
-
Prometheus или Zabbix: что ставить для мониторинга
Чем Prometheus отличается от Zabbix, почему сравнивать их по числу возможностей бессмысленно и какой единственный признак решает выбор на практике.
-
Среднее лжёт, перцентиль тоже
Почему перцентили нельзя усреднять, почему задержка взрывается задолго до полной загрузки и что такое согласованное умолчание в нагрузочном замере.
-
Алерт, на который никто не идёт
Правило, которое срабатывает и не требует действия, — это лог с уведомлением. Разбор того, почему такие правила вреднее отсутствия мониторинга.
-
Логи, метрики, трассировка: что из трёх вам действительно нужно
Три столпа продают набором. Они отвечают на разные вопросы, стоят по-разному, и начинать надо не с того, что модно.
Каркас
Чтобы через год код можно было менять, а не переписывать с нуля вместе с командой.
-
Технический долг: когда его отдавать, а когда нет
Что такое технический долг, чем осознанный отличается от случайного, по какому признаку выбирать рефакторинг legacy кода и почему переписать с нуля дороже.
-
Чистая архитектура: что от неё остаётся на практике
Что такое чистая архитектура, какое у неё единственное несущее правило и почему четыре кольца со схемы не выживают в реальном проекте. Разбор с границей применимости.
-
Что из метрик кода действительно предсказывает поломки
Цикломатическая сложность, связность, расстояние до главной последовательности. Что из этих метрик подтверждено эмпирически, а что осталось фольклором.
-
Границы модулей дороже, чем стиль кода
Линтер спорит о кавычках, а проект тонет в том, что модули знают друг о друге слишком много. Разбор того, как границу описать и как заставить её держаться.
-
Микросервисы — ответ на организационную проблему
Распил решает вопрос независимости команд и выкатов, а не производительности. Разбор того, что покупается и чем платят, если команда одна.