
Pydantic для валидации данных: схемы вместо ручных проверок
Как заменить россыпь if-проверок на декларативную схему: валидаторы, разница между Pydantic v1 и v2, где схема ломается на проде и что с этим делать.

Как заменить россыпь if-проверок на декларативную схему: валидаторы, разница между Pydantic v1 и v2, где схема ломается на проде и что с этим делать.

Шаблоны и constexpr переносят работу на этап компиляции, но цена этого — время сборки, распухшие бинарники и нечитаемые диагностики. Разбираем, где абстракция окупается, а где ломает проект.

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

Два потока пишут в соседние переменные, а масштабирования нет — вместо ускорения в 2 раза получаете замедление. Разбираем false sharing на кэш-линиях, замеряем и чиним выравниванием.

Сервис падал с SIGBUS только на ARM-узлах, а на x86 работал годами. Причина — чтение double по невыровненному адресу через reinterpret_cast. Разбираем, почему так вышло и как ловить это до продакшена.

Компилятор выбрасывает половину кода, переставляет операции и удаляет проверки на переполнение. Разбираем, какие места в C++ ломаются от оптимизаций и что искать глазами на ревью.

Сервис работал в отладочной сборке и падал в релизе только под пиковой нагрузкой. Разбираем, как UB даёт компилятору право переписывать логику и почему проблема всплывает именно под нагрузкой.

Почему два потока, которые «просто читают и пишут переменную», дают результат, невозможный ни при какой последовательности операций. Разбор модели памяти C++11 и далее: happens-before, барьеры, порядки memory_order.

На что смотреть в C++-ревью, кроме форматирования: владение ресурсами, время жизни ссылок, исключения и переполнения. Конкретные формулировки замечаний вместо «поправьте качество кода».

co_await не блокирует поток и не создаёт нового — компилятор разбивает функцию на состояния и складывает их в кучу. Разбираем, что генерируется, когда происходит выделение памяти и где это бьёт по производительности.

Concepts, ranges, std::format, std::expected: разбираем, какие возможности C++20 и C++23 действительно используются в рабочем коде, чем платишь за каждую и где компиляторы ещё догоняют стандарт.

Скалярный цикл суммирования float обрабатывает по одному числу за такт, а SSE берёт четыре, AVX2 — восемь. Разбираем, почему автовекторизация ломается на ровном месте и когда стоит спускаться до интринсиков.