Загрузка

DevLog

Заметки о веб-разработке, архитектуре, оптимизации и инструментах. Пишу о том с чем сталкиваюсь в реальных проектах.

67

статей

11

категорий

616

минут на чтение

Категории Все Битрикс24 (8) C++ (12) Joomla (2) DevOps (7) Kotlin (26) WordPress (3) MODX (2) Laravel (2) PHP (3) OpenCart (1) Плагины (1)

CMake: модульная архитектура для большого C++ проекта — без ad-hoc include путей

Как мы реорганизовали CMake-структуру проекта на 15+ модулей, избавились от хаотичных include_directories и перешли на современный CMake с target-based зависимостями.

CMake C++ Архитектура Модульность Сборка target_link_libraries

Kotlin + C++: реальный кейс — видеопроцессинг на сервере через JNI

Как мы построили сервер видеотранскодинга на Kotlin REST API + C++ FFmpeg через JNI. Прокачка JNI_OnLoad, передача фреймов через DirectByteBuffer, обработка ошибок и бенчмарки.

Kotlin C++ JNI FFmpeg Видеопроцессинг JNI_OnLoad

C++: потоки и потокобезопасность — мьютексы, atomics и deadlock-ы на практике

Разбираем многопоточность в C++ на реальных примерах из продакшена: мьютексы, lock_guard, unique_lock, std::atomic, deadlock-ы и как их избежать. Сравнение с корутинами Kotlin.

C++ Многопоточность std::thread Мьютексы Atomics Deadlock

eBPF: профилирование C++ и Kotlin сервисов в продакшене без оверхеда

Как мы внедрили eBPF для профилирования высоконагруженных C++ и Kotlin сервисов в продакшене без остановки и перекомпиляции. Реальные скрипты bpftrace, поиск утечек памяти и трейсинг JVM-системных вызовов.

eBPF C++ Kotlin Профилирование Linux Производительность

Joomla: MVC-компонент с нуля — архитектура без легаси

Создаём MVC-компонент для Joomla с чистой архитектурой, современным подходом к моделям и видам — без копипаста из документации 2014 года.

Joomla MVC PHP Компонент Архитектура Разработка

Docker Compose для локальной разработки Kotlin-микросервисов — от 10 минут до 30 секунд старта

Как мы оптимизировали локальное окружение из 10+ микросервисов с помощью Docker Compose, multi-stage Dockerfile и правильных health checks.

Docker Compose Kotlin Локальная разработка DevOps Микросервисы PostgreSQL

Terraform vs Pulumi — Infrastructure as Code для Kotlin-команды

Сравниваем Terraform на HCL и Pulumi на Kotlin для управления Kubernetes-инфраструктурой — с реальными примерами кода, болью миграции и нашим итоговым выбором.

Terraform Pulumi Kotlin IaC DevOps Kubernetes

Битрикс24: бизнес-процессы и роботы — автоматизация CRM без написания кода

Как мы автоматизировали воронку сделок в Битрикс24 с помощью бизнес-процессов и роботов — реальный кейс с SLA, автоназначением ответственных и мониторингом сбоев.

Битрикс24 Бизнес-процессы Роботы CRM Автоматизация REST API

Micronaut vs Spring Boot — лёгкий фреймворк для Kotlin-микросервисов

Сравниваю Micronaut и Spring Boot для Kotlin-микросервисов: стартовое время, потребление памяти, холодный старт и реальный опыт миграции одного из сервисов.

Micronaut Spring Boot Kotlin Микросервисы Фреймворк Compile-time DI

Kotlin: sealed interfaces и when-выражения — паттерн-матчинг как в Rust

Как sealed interfaces из Kotlin 1.5+ вместе с when-выражениями дают мощный паттерн-матчинг, похожий на Rust enum+match, и почему мы перешли на ADT для доменных событий.

Kotlin Sealed Interfaces Pattern Matching when ADT Функциональное программирование

Kotlinx Serialization + Protobuf — быстрая сериализация для микросервисов

Разбираюсь с накладными расходами JSON-сериализации при высоких нагрузках и показываю, как интегрировать Protobuf с kotlinx-serialization в микросервисной архитектуре на Kotlin.

Protobuf Kotlin Сериализация kotlinx-serialization Микросервисы Производительность

Kotlin + gRPC: streaming и двусторонняя связь в продакшене

Реальный опыт использования gRPC streaming в продакшене на Kotlin: server-side, client-side и bidirectional стриминг для системы отслеживания статусов заказов в реальном времени.

gRPC Kotlin Streaming Protobuf Микросервисы Балансировка

C++: memory-mapped I/O для обработки больших файлов — от 2 часов до 3 минут

Как мы ускорили обработку логов на 40x с помощью mmap. Практическое руководство с бенчмарками, подводными камнями и сравнением с std::ifstream.

C++ mmap Memory-Mapped I/O Производительность Файловый ввод-вывод Linux

C++17/20: structured bindings, concepts и ranges — что реально используется в продакшене

Честный разбор фич C++17 и C++20: что мы взяли в проект, что пропустили и почему. Before/after примеры и компромиссы миграции.

C++17 C++20 Structured Bindings Concepts Ranges Современный C++

C++: умные указатели и ownership — практическое руководство без академизма

Разбираю unique_ptr, shared_ptr и weak_ptr на реальных примерах из продакшена. Какие баги мы ловили из-за неправильного использования и как перестать путаться с ownership.

C++ Smart Pointers unique_ptr shared_ptr Memory Management Ownership

C++20 корутины vs Kotlin Coroutines — сравнение подходов

Реальный опыт использования корутин C++20 и Kotlin Coroutines в одном проекте. Разбираю механику работы, отличия в обработке ошибок и когда стоит брать сложность C++ корутин.

C++20 Корутины Kotlin Coroutines Асинхронность Сравнение co_await

C++ ↔ Kotlin: передача сложных структур через JNI без боли

Три подхода к передаче сложных данных через JNI: примитивное выравнивание, JSON-сериализация и ByteBuffer. Бенчмарки, код и рекомендации из продакшена.

JNI C++ Kotlin Сериализация Производительность Memory Management

CMake + Gradle: сборка C++ библиотеки для Kotlin/JNI проекта

Подробный разбор сборочной цепочки C++ библиотеки для Kotlin/JNI. Структура проекта, кросс-компиляция под Android, линковка сторонних библиотек и типичные ошибки сборки.

CMake Gradle Kotlin JNI C++ Сборка Android NDK

Kotlin Native / cinterop: когда JNI избыточен

Разбираю альтернативу JNI — Kotlin Native cinterop. Прямой вызов C-функций без JVM, бенчмарки против JNI и практические рекомендации, когда какой подход выбрать.

Kotlin Native C++ cinterop JNI Kotlin Multiplatform FFI

Kotlin/JNI: вызов C++ из Kotlin — от Hello World до продакшена

Практический гайд по вызову C++ кода из Kotlin через JNI. Разбираю настройку, передачу типов, управление памятью и реальные продакшен-паттерны на опыте бэкенд-разработчика.

Kotlin JNI C++ FFI Взаимодействие Android NDK

Ktor: Server-Sent Events и WebSockets — реальное использование в продакшене

Нужна была real-time уведомления для дашборда. Выбор: SSE или WebSockets? SSE проще (односторонний, HTTP, автопереподключение), WebSockets мощнее (двусторонний). Для уведомлений хватило SSE, но для чата понадобились WebSockets. Рассказываю, как реализовать оба в Ktor и в каких случаях что выбирать.

Ktor SSE WebSockets Kotlin Real-time Server-Sent Events

WordPress: REST API и кастомные эндпоинты без плагинов

Для интеграции WordPress с мобильным приложением понадобилось создать кастомные REST-эндпоинты. Плагины типа ACF to REST API не подходили — нужна была специфическая логика: фильтрация по пользовательским полям, пагинация, кэширование. Сделали всё через register_rest_route и шорткоды — без единого плагина.

WordPress REST API register_rest_route Кастомные эндпоинты PHP Мобильное приложение

MODX: процессоры и кастомные таблицы — архитектура без костылей

MODX Revolution позволяет писать кастомные процессоры для любой логики, но большинство разработчиков превращают их в спагетти-код с прямыми SQL-запросами. Мы выстроили архитектуру на основе xPDO-моделей, кастомных процессоров с валидацией и отдельного слоя репозиториев. Результат: поддержка проекта перестала быть кошмаром.

MODX xPDO Процессоры Архитектура PHP Кастомные таблицы

Flyway vs Liquibase — миграции БД в Kotlin-проекте

Выбор инструмента миграций — кажется мелочью, пока не нужно откатить изменение в продакшене. Flyway — простой SQL-first подход. Liquibase — XML/YAML/JSON с абстракциями и rollback. Мы использовали оба в разных проектах и набили шишки на каждом. Рассказываю, в каком случае что выбрать и как не потерять данные при rollback.

Flyway Liquibase Kotlin Миграции PostgreSQL Spring Boot

Nginx + PHP-FPM: тюнинг под высокую нагрузку — от 500 RPS до 5000 RPS

Сайт на PHP + Nginx выдерживал 500 RPS, а при 1000 начинал отдавать 502. Проблема была не в PHP-коде (он был оптимизирован), а в конфигурации Nginx и PHP-FPM: неправильный worker_connections, отсутствие keepalive к upstream, слишком маленький pm.max_children. Рассказываю пошагово, как мы увеличили пропускную способность в 10 раз.

Nginx PHP-FPM Тюнинг Производительность Оптимизация High Load

Gradle Kotlin DSL: кэширование и configuration avoidance — ускоряем сборку

Сборка Kotlin-проекта занимала 6 минут. После включения build cache, configuration cache и перехода на configuration avoidance API — 45 секунд. Рассказываю, что именно мы сделали, почему большинство туториалов по ускорению Gradle не работают, и как измерять реальный эффект от каждой оптимизации.

Gradle Kotlin Build Cache Configuration Cache CI/CD Оптимизация

GitHub Actions vs GitLab CI — CI/CD для Kotlin-проекта

Переносили CI/CD с GitLab на GitHub Actions. Обе системы решают одни задачи, но подход к кэшированию, параллелизму и reuse workflows принципиально разный. В GitLab всё построено вокруг .gitlab-ci.yml и runners. В GitHub Actions — вокруг reusable workflows и marketplace actions. Рассказываю, что лучше для Kotlin-проекта с тестами, Docker-образами и деплоем в Kubernetes.

GitHub Actions GitLab CI CI/CD Kotlin Kubernetes Docker

Kubernetes health checks: как мы потеряли трафик из-за readiness probe

Микросервис работал нормально, но Kubernetes периодически убирал его из балансировщика. Пользователи видели 503. Оказалось, readiness probe проверял подключение к PostgreSQL, и при кратковременных просадках БД (backup, vacuum) сервис становился «не готовым». Рассказываю, как правильно настроить health checks в Kubernetes, чтобы не терять трафик из-за сторонних проблем.

Kubernetes Health Checks Readiness Probe Liveness Probe Микросервисы Docker

Kotlin + PostgreSQL: подводные камни HikariCP в микросервисах

HikariCP — пул подключений по умолчанию в Spring Boot и Ktor. На первый взгляд — configure and forget. На практике — неправильный размер пула убивает производительность, leak detection срабатывает с ложными позитивами, а connection timeout в Kubernetes приводит к каскадным сбоям. Рассказываю, как мы настраивали HikariCP для продакшена и что пошло не так.

HikariCP PostgreSQL Kotlin Connection Pool Spring Boot Ktor Микросервисы

Event Sourcing на Kotlin с Kafka — от концепции до продакшена

Event Sourcing звучит элегантно: храним не текущее состояние, а все события, которые к нему привели. На практике — это другая архитектура мышления, другая модель данных и куча новых проблем: eventual consistency, snapshotting, replay событий. Рассказываю, как мы внедрили Event Sourcing в Kotlin-микросервисе с Kafka и чему научились на ошибках.

Event Sourcing Kafka Kotlin CQRS Eventual Consistency Микросервисы

GraphQL vs REST в Kotlin-микросервисе — когда имеет смысл переходить

У нас был REST API с 30 endpoint'ами. Фронтенд постоянно просил добавить поля, убрать лишнее, объединить запросы. Перевели один микросервис на GraphQL (graphql-kotlin) и получили: фронтенд запрашивает только нужные данные, один запрос вместо 5-7, меньше нагрузки на сеть. Но появились свои проблемы: N+1 в резолверах, сложность кэширования, versioning.

GraphQL REST Kotlin graphql-kotlin API Микросервисы

Kotlin + OpenTelemetry: распределённый трейсинг без слёз

В микросервисной архитектуре с 12 сервисами запрос проходит через 4-5 сервисов. Когда что-то тормозит — непонятно где. Добавили OpenTelemetry: теперь каждый запрос имеет trace ID, и мы видим полную цепочку вызовов с таймингами. Рассказываю, как настроить OpenTelemetry в Kotlin-микросервисе на Ktor и Spring Boot без боли.

OpenTelemetry Kotlin Трейсинг Микросервисы Ktor Spring Boot Jaeger

Laravel Horizon: мониторинг Redis-очередей и почему мы ушли от стандартного worker

Стандартный php artisan queue:work работает, но когда у тебя 15 очередей, 3 приоритета и периодические зависания jobs — ты слеп. Нет мониторинга, нет метрик, нет понимания, что происходит. Laravel Horizon добавляет дашборд, retry-логику и автоматический масштабирование worker'ов. Перешли и наконец увидели, что происходит с нашими очередями.

Laravel Horizon Redis Queue Мониторинг Worker

Doctrine ORM + Symfony: N+1 проблема, которая убила производительность

Страница каталога загружалась 8 секунд. В профайлере — 340 SQL-запросов для отображения 20 товаров. Классический N+1 через Doctrine ORM. Проблема усугублялась тем, что часть запросов шла через lazy loading, а часть — через явные вызовы в Twig-шаблонах. Рассказываю, как мы нашли все источники N+1 и сократили количество запросов до 4.

Doctrine Symfony N+1 ORM Оптимизация SQL

PHP 8.4: новые фичи, которые реально полезны в продакшене

Каждый релиз PHP приносит новые фичи, но не все из них попадают в реальный код. В PHP 8.4 есть несколько изменений, которые мы сразу внедрили в проект: property hooks упростили геттеры/сеттеры, new MyClass() без скобок, и улучшенный array_find. Рассказываю, что реально пригодилось, а что оказалось маркетингом.

PHP 8.4 Property Hooks Новые фичи Миграция Backend

Битрикс24: batch-запросы и обработка 10 000 элементов без таймаута

Обычный crm.deal.list возвращает 50 элементов. Для синхронизации 10 000 сделок нужно 200 запросов — и это при условии, что ни один не упадёт по таймауту. Batch-метод Битрикс24 позволяет отправить до 50 команд в одном запросе, но у него свои подводные камни: лимит на размер запроса, ошибки частичной обработки и полное отсутствие транзакционности.

Битрикс24 Batch API REST API Пагинация crm.deal.list Таймауты

Arrow.kt: функциональная обработка ошибок вместо исключений — опыт реального проекта

Try-catch по всему коду — это антипаттерн, но альтернативы кажутся сложными. Arrow.kt предлагает Either, Raise, и ValidationError для типобезопасной обработки ошибок. Перешли на функциональный подход в микросервисе с 40+ endpoint'ами и код стал предсказуемым. Показываю реальный до/после.

Arrow.kt Kotlin Either Функциональное программирование Обработка ошибок Raise

Kapt vs KSP — почему компиляция Kotlin-проекта тормозит и как починить

Время сборки Kotlin-проекта выросло с 30 секунд до 4 минут. Причина — kapt и annotation processing. KSP (Kotlin Symbol Processing) призван это исправить, но миграция не тривиальна. Рассказываю, как мы ускорили сборку в 5 раз, заменив kapt на KSP в реальном проекте с Room, Moshi и Dagger.

Kapt KSP Kotlin Компиляция Annotation Processing Gradle

Kotest vs JUnit 5 — какой фреймворк тестирования выбрать для Kotlin

JUnit 5 — стандарт де-факто, но Kotest предлагает Kotlin-native подход: data-driven тесты, поведение через BehaviorSpec, встроенные assertions. Перешли на Kotest в проекте со 1800 тестами и не пожалели. Но есть подводные камни, о которых молчат туториалы.

Kotest JUnit 5 Kotlin Тестирование TDD Assertions

Kafka vs RabbitMQ — выбор брокера сообщений для Kotlin-микросервисов

При росте микросервисной архитектуры встал вопрос: Kafka или RabbitMQ? Оба брокера используются в Kotlin-экосистеме, но выбор между ними — это не про «какой лучше», а про «какая проблема у вас». Рассказываю на опыте реального проекта, где мы переписали messaging-слой с RabbitMQ на Kafka и что из этого вышло.

Kafka RabbitMQ Kotlin Микросервисы Messaging kafka-clients

Koin vs Dagger/Hilt — выбор DI-фреймворка для Kotlin-проекта

Dependency injection — фундамент архитектуры. Koin — лёгкий, на чистом Kotlin, без кодогенерации. Dagger/Hilt — compile-time, от Google, промышленный стандарт. Сравниваю скорость компиляции, runtime overhead, DX и реальный опыт миграции с одного на другой на проекте с 150 зависимостями.

Kotlin Koin Dagger Hilt DI Архитектура Dependency Injection

gRPC vs REST — что выбрать для межсервисного взаимодействия на Kotlin

REST — привычный, универсальный, работает через JSON. gRPC — бинарный протокол, контракты через Protobuf, стриминг из коробки. На реальном проекте с 12 микросервисами сравниваю latency, размер полезной нагрузки, DX и почему выбор протокола зависит не только от производительности.

Kotlin gRPC REST Protobuf Микросервисы Архитектура HTTP/2

Testcontainers: интеграционные тесты для Kotlin-микросервисов без боли

Мокать PostgreSQL в тестах — путь к ложной уверенности. Testcontainers поднимает настоящие контейнеры с БД, Redis, Kafka — и убивает после теста. В статье разбираю настройку Testcontainers с Ktor, Exposed, Flyway, совместное использование тестовых баз данных и ускорение тестов в CI/CD.

Kotlin Testcontainers Тестирование Docker CI/CD PostgreSQL Kafka

Redis: стратегии кэширования в Kotlin-микросервисах — от Cache-Aside до CQRS

Redis — не просто key-value хранилище. Pub/Sub, Streams, Sorted Sets, Lua-скрипты — Redis позволяет реализовать сложные паттерны кэширования и event sourcing. Разбираю Cache-Aside, Write-Through, Write-Behind, паттерн Cache Stampede и реальный опыт оптимизации задержки с 80 мс до 5 мс.

Kotlin Redis Кэширование Микросервисы Производительность Архитектура

Логирование в Kotlin: klogging vs SLF4J + Kotlin Logging — что выбрать

Логирование — первая линия расследования при P0-инцидентах. Но в Kotlin есть нюансы: string interpolation, ленивые вычисления, структурированное логирование, correlation ID. Сравниваю klogging, SLF4J + Logback, Kotlin Logging и объясняю, почему формат логов важнее библиотеки.

Kotlin Logging SLF4J Kotlin Logging klogging Logback Observability

WordPress REST API: где пропадает кастомное поле в сообщении о заказе WooCommerce?

Добавили кастомное поле в заказ WooCommerce через REST API — поле в админке видно, а в письме покупателя его нет. Знакомая ситуация? Разбираю, почему WooCommerce email-шаблоны игнорируют произвольные поля заказа, и показываю три способа заставить их отображаться без копипаста шаблонов.

WordPress WooCommerce REST API Email-шаблоны meta_data

WordPress Gutenberg: custom-блоки без JavaScript — как создать блок через PHP

Все гайды по Gutenberg-блокам заставляют писать React и собирать через wp-scripts. Но что если вы backend-разработчик и не хотите тащить node_modules в проект? В WordPress 5.9+ появилась возможность регистрировать серверные блоки полностью на PHP. Разбираю этот подход.

WordPress Gutenberg Серверные блоки PHP register_block_type REST API

Битрикс24: вебхуки и ограничение 1000 событий — как мы потеряли данные

На портале Битрикс24 можно создать максимум 2000 входящих вебхуков. Но мало кто знает, что каждый вебхук обрабатывает максимум 1000 событий в очереди. Если ваша интеграция не успевает — события удаляются. Рассказываю, как мы обнаружили потерю данных и построили систему надёжной обработки.

Битрикс24 Вебхуки REST API Синхронизация crm.deal.list Polling

Docker + Kotlin: оптимизация Dockerfile для микросервисов — от 800 МБ до 50 МБ

Базовый Dockerfile для Spring Boot на Kotlin — 800 МБ. После оптимизации — 50 МБ. Разбираю multi-stage builds, GraalVM native image, Alpine vs distroless, jlink для кастомной JRE и реальные метрики по времени сборки, cold start и memory footprint.

Docker Kotlin GraalVM Kubernetes DevOps CI/CD Микросервисы

PHP: типизирование насквозь через array, список и null — опыт реального проекта

Строгая типизация в PHP 8.2+ отличная, но реальный код завален mixed и array. Как я вёл постепенную миграцию большого PHP-монолита на строгие типы, какие инструменты использовал для автоматического анализа, и почему array — это худший тип, который можно прописать в сигнатуре метода.

PHP Типизация DTO Enum PHPStan Rector

Exposed vs jOOQ: SQL DSL для Kotlin — сравнение на реальном проекте

Hibernate/JPA — не единственный вариант. В Kotlin-мире есть Exposed от JetBrains и jOOQ от Data Geekery. Обе библиотеки дают типобезопасный SQL без ORM-магии. Сравниваю DX, производительность, миграции и реальный опыт на проекте с 80 таблицами.

Kotlin Exposed jOOQ SQL Базы данных ORM JDBC

OpenCart: массовое обновление цен через API без падения сервера

Поставили задачу обновить 15 000 цен в OpenCart 3 из внешней ERP-системы. Простой цикл по товарам убил сервер на 3-й минуте. В этой статье рассказываю, почему модель OpenCart требует очистки кэша после каждого сохранения, как использовать batch-запросы к базе, и почему индексы — ваш лучший друг при массовом обновлении.

OpenCart Массовое обновление База данных Кэш Batch-запросы 1С

MODX Revolution: сниппеты, которые вызывают leak памяти на каждой странице

Сайт на MODX Revolution ест по 128MB RAM на каждую страницу — это не норма. Разбираю, почему getCollection с большими выборками убивает память, как правильно использовать xPDO для постраничной загрузки данных, и почему простой сниппет вывода ресурсов может съесть весь сервер.

MODX xPDO getCollection getIterator Memory Leak TV-поля

Joomla: кастомные поля и кэш — как я потерял 2 дня на одном неинспектируемом null

Создал кастомное поле для com_content в Joomla 4, значение сохраняется в админке, но при выводе на фронтенде — null. Оказалось, Joomla кэширует вывод модулей и плагинов, а кастомные поля в кэш не попадают. Разбираю, как работает система кэширования кастомных полей и как правильно получать их значения в overrides.

Joomla Кастомные поля Кэш mod_articles_latest jcfields Override

Kotlin Coroutines vs Project Reactor — что выбрать для реактивного бэкенда

Корутины и Reactor — две парадигмы асинхронного программирования. Корутины выглядят как синхронный код, Reactor — как цепочка операторов. В статье разбираю когда какая модель выигрывает, как они соотносятся по производительности и почему выбор фреймворка уже определил ваш стек.

Kotlin Coroutines Project Reactor WebFlux Асинхронность Бэкенд

Laravel Queue Workers: как я сломал Redis и что я понял о retry-логике

Запустил queue:work на production с --tries=0 — и все джобы начали падать в бесконечный цикл, забивая Redis на 100%. В этой статье разбираю, как работает retry-механизм в Laravel, чем отличаются backoff-стратегии, и почему supervisor не спасает от переполнения очередей.

Laravel Queue Redis Supervisor Retry Production

Ktor vs Spring Boot — выбор фреймворка для Kotlin микросервиса

Два фреймворка, два мира. Spring Boot — монолит экосистемы с тысячей стартёров и аннотаций. Ktor — лёгкий, корутин-нативный фреймворк от JetBrains. Сравниваю DX, производительность, время старта и реальный опыт миграции с одного на другой.

Kotlin Ktor Spring Boot Микросервисы Бэкенд Фреймворки

Kotlin'овые суспензии: приложенное исполнение и загадочный suspend — как я начал понимать

Когда я впервые увидел слово suspend перед функцией в Kotlin, я был уверен, что это какая-то магия компилятора. Оказалось, что за этим стоит принципиально иной подход к асинхронности. В этой статье разбираю, как работают корутины под капотом, зачем нужен Continuation, и почему State Machine — это не страшный монстр, а ваш друг.

Kotlin Корутины suspend Асинхронность State Machine

Kotlin: сериализация — Moshi vs kotlinx.serialization — что выбрать для REST API микросервиса

Обе библиотеки решают одну задачу — превращают JSON в объекты и обратно. Но разница в подходах колоссальная. Moshi использует рефлексию в рантайме, kotlinx — компиляторный плагин. В статье сравниваю производительность, DX и грабли каждой библиотеки на реальном проекте.

Kotlin Сериализация Moshi kotlinx.serialization JSON REST API

Kotlin Flow — от основ до продакшена: практическое руководство

Flow — это реактивные потоки Kotlin, но с корутин-нативным подходом. В статье разбираю горячие и холодные потоки, SharedFlow, StateFlow, backpressure, error handling и реальный опыт использования Flow в production на нагрузке 50K rps.

Kotlin Flow Coroutines SharedFlow StateFlow Reactive Бэкенд

Как я разрабатывал виджет для Android с нуля: Kotlin, Jetpack Glance и архитектура, которая не разваливается через месяц

Я занимаюсь Android-разработкой, и через мои руки прошло немало приложений, где рано или поздно вставал вопрос: а не завезти ли нам виджет? Пользователи просили, продакты настаивали, метрики показывали, что конкуренты с виджетами имеют Retention на 20-30% выше. И каждый раз я откладывал эту задачу в бэклог с пометкой «когда-нибудь потом».

виджеты kotlin

Как правильно очистить поле в Битрикс24 через REST API: тайна передачи null

Как удалить значение из кастомного поля сделки в Битрикс24? Казалось бы, передай пустую строку. Но не тут-то было! В этой статье я рассказываю, почему метод crm.deal.update игнорирует пустые строки, как работает механизм очистки полей под капотом, и почему передача null — это не всегда правильное решение для списков.

Битрикс24 REST API PHP Очистка данных crm.deal.update

Как я релизовал динамический виджет партнёров для туров на WordPress + Bitrix24

При разработке одного из проектов на WordPress с использованием конструктора туров TourMaster передо мной встала задача: связать каждый день тура с конкретным партнёром, а затем синхронизировать эти данные с CRM системой Bitrix24. В этой статье я расскажу, как мне удалось решить эту задачу, не модифицируя исходный код плагина.

битрикс24 wordpress плагины

Почему нельзя использовать входящий вебхук Битрикс24 для двусторонней синхронизации

Вы дергаете Битрикс из 1С через входящий вебхук (строку с секретом в URL)? Это огромная дыра в безопасности и архитектурная ошибка. Рассказываю, чем входящий вебхук отличается от OAuth, почему у него нет прав на новые сущности, и как правильно переписать коннектор.

Битрикс24 Безопасность OAuth Вебхуки Архитектура

Как привязать новый контакт к сделке в Битрикс24 через REST API

Создали контакт через API, создали сделку, передали CONTACT_ID в полях, а они не связаны в карточке! Разбираю, почему передача CONTACT_ID при создании сделки работает криво, если контакта секунду назад не было в Битрикс24, и как правильно использовать метод crm.deal.contact.add.

Битрикс24 PHP Связи сущностей Контакты REST API

Как я писал микро-сервис для назначения партнёров турам в Битрикс24: разбор реального кода и боль работы со списками (Enum)

Как назначить партнёра туру в Битрикс24, если фронтенд присылает только текст, а REST API требует числовой ID? В этой статье я разбираю свой боевой PHP-скрипт: от вытягивания справочников enum до реализации нечеткого поиска подстрок и борьбы с «молчащими» ошибками метода crm.product.update. Реальный код, паранойя с логированием и обходные пути для неидеальных данных.

Битрикс24 Bitrix24 REST API PHP Интеграция с Битрикс24 Разработка на PHP