Обновить

Бэкенд

Сначала показывать
Порог рейтинга
Уровень сложности

Сравнение моделей конкурентности JVM языков: Нужен ли еще ThreadPool после coroutines, ZIO и Virtual Threads?

Уровень сложностиСложный
Время на прочтение6 мин
Охват и читатели11K

В последней части про модели конкурентности JVM языков мы сравним разные подходы друг с другом. И ответим на вопрос “А зачем теперь тред пулы, если есть столько модных концепций: корутины, файберы, виртуальные потоки ?”

Узнать что есть кроме Java Threads

Я заколебался искать запятую в коде бота — и написал библиотеку, чтобы диалоги жили в YAML

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели9.1K

Я три года пилю Telegram-бот для одного B2C-продукта. В пятницу вечером маркетолог попросил убрать запятую — я потратил двадцать минут на одну запятую, потому что текст был размазан по семи питон-файлам. И тут меня переклинило. Так появилась библиотека, где все диалоги бота живут в одном YAML — с клавиатурами, медиа, условиями и опциональной очередью под лимит Telegram. Выложил на PyPI, делюсь.

И что?

Кэш результатов запросов в Postgres Pro: как ускорить часто выполняющиеся запросы и разгрузить базу

Уровень сложностиСредний
Время на прочтение18 мин
Охват и читатели9.5K

Каждый раз, когда пользователь открывает страницу каталога или дашборд со статистикой, база данных заново считает одно и то же. Запрос к 800 тысячам строк ради одного числа — снова и снова. Расширение pgpro_result_cache в Postgres Pro Enterprise решает эту проблему на уровне СУБД: результат тяжёлого запроса сохраняется в разделяемой памяти и при повторном обращении возвращается за миллисекунду — без сканирования, без нагрузки на процессор, прозрачно для приложения. В этой статье разберём, как это работает, когда кэш действительно полезен и на что нужно обратить внимание при настройке.

Читать далее

Полный гайд по каналам обмена сообщениями: от теории к реальным кейсам

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели9.1K

Первая статья из цикла о каналах обмена сообщениями. Разбираем архитектурные дилеммы, конкурирующих потребителей, message storm, гарантированную доставку и лучшие практики команд, работающих с JMS и Kafka.

Читать далее

Предиктивный автоскейлинг в Kubernetes: масштабируемся на опережение

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели7K

Современный Kubernetes приучил нас к тому, что инфраструктура должна быть эластичной. Для управления ресурсами традиционно мы можем использовать Horizontal Pod Autoscaler (HPA): растёт трафик — увеличивается количество подов, трафик падает — лишние поды удаляются. Но в высоконагруженных системах при быстром росте нагрузки стандартные инструменты масштабирования могут стать менее эффективными. Проблема заложена в самой природе реактивного подхода: система всегда догоняет реальность, а не формирует её. Решение лежит на поверхности: надо повышать осознанность и внедрять ИИ.

Меня зовут Дмитрий Чуринов, я руководитель команды разработки в трайбе Synapse. Хочу поделиться практическим опытом внедрения механизмов предиктивного масштабирования. Мой коллега Александр Козлов курирует разработку нескольких продуктов в СберТехе, в том числе Platform V SynAI, отвечающего за интерактивное управление трафиком на основе систем машинного обучения и моделирования.

Вместе мы разберём, как настроить предиктивное управление в Kubernetes на основе open source-компонентов, и почему нам этого не хватило.

Читать далее

Kotlin переходит к деструктурированию по именам

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели9.6K

В Kotlin деструктурирование выглядело так: val (name, age) = person. Но компилятор берет значения не по именам, а по позиции component1/component2.

Отсюда проблемы. Если поменяли порядок параметров в data class или сделали age вычисляемым свойством: то та же строка начинает доставать другое поле. Причем иногда код даже скомпилируется, но, конечно, смысл изменится: val (age, name) = person.

И вот теперь Kotlin эксперементально переводит круглые скобки на деструктурирование по имени. Синтаксис будет такой: (val name, val age) = person. И порядок внутри скобок не важен. Переименование явно: (val years = age, val theName = name) = person.

Позиционное же деструктурирование остается, но переезжает в квадратные скобки для Pair/Triple и коллекций: val [x, y] = point.

Разбираемся полностью в новом переводе от команды Spring АйО.

Читать далее

Как эволюционировала главная книга по Qt в России и чем удивляет 7-е издание

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели14K

Более тридцати лет назад норвежские разработчики Ховард Норд и Эйрик Чамбэ-Энг создали Qt — фреймворк, которому суждено было стать стандартом де-факто для кроссплатформенной разработки. Широкому распространению Qt во многом способствовал Маттиас Эттрих: основатель проекта KDE выбрал его в качестве фундамента этой среды, а затем занял руководящую позицию в команде разработчиков Qt. А уж тем более трудно было предвидеть, что у Qt появится свой «летописец» в России, книги которого разойдутся тиражом более 25 000 экземпляров.

Вот как сам Эттрих напутствовал читателей в первом издании книги Макса Шлее:"Давайте начнём с вымышленной истории. Представьте, десять лет назад кто-то пришёл ко мне и спросил: «Возможно ли написать многофункциональное графическое приложение, а затем скомпилировать и запустить его на всех основных операционных системах? На Linux, на UNIX, на Windows и на Macintosh?» Тогда — будучи молодым прграммистом — я, вероятно, ответил бы: «Нет, это невозможно. А если бы и было возможно, то система была бы очень сложной в использовании и ограниченной самой слабой платформой. Лучше выберите одну платформу или напишите свой код несколько раз». Несколько лет спустя я открыл для себя Qt — и понял, как сильно я ошибался! Qt делает настоящую кроссплатформенную разработку реальностью, не ограничивая ваш выбор и творчество. Слишком хорошо, чтобы быть правдой? Не верите? Что ж, доказать легко. Я передаю слово Максу, который расскажет вам, как именно это делается. Макс, твой выход.

И Макс Шлее принял вызов!

Почему сеньор-разработчик не может донести ценность своего опыта

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели14K

Какие чувства возникают у вас при прочтении такого предложения?

«ИИ-агенты — будущее разработки ПО. Нам больше не нужны разработчики, замедляющие прогресс бизнеса».

Если вы сеньор-разработчик и считаете, что оно верное, то у меня появляются подозрения о вашем опыте (ниже я объясню, почему).

Но если вы не сеньор-разработчик, то я считаю, что вы правы.

А? Что здесь происходит?

Суть копирайтинга заключается в соотнесении послания и его аудитории.

Поэтому для меня, копирайтера, в этом случае одно и то же послание означает разное для двух разных аудиторий.

Если вы сеньор-разработчик и уже поэкспериментировали со всеми этими агентами, скиллами, моделями и прочим, что потрясает воображение людей, и если ваша интуиция по-прежнему шепчет про ошибочность утверждений об устаревании вашей работы, то в этом посте я постараюсь вербализировать то, что говорит вам интуиция.

Но постойте! Многие опытные и известные разработчики тоже заявляют о том, что профессия разработчика умерла.

Как же так? Чья точка зрения верна? И в чём причина такого расхождения мнений?

Читать далее

Kafka, таксономии и удаление событий: как исключить обработку неактуальных сообщений

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели8.2K

В рамках задачи по обработке XBRL-таксономий возникло требование: если таксономия удалена до обработки событий расчёта кэша, эти события не должны приводить к созданию данных для уже неактуальной сущности.

На первый взгляд кажется, что достаточно найти соответствующие сообщения и удалить их из Kafka topic. Но Kafka хранит данные как commit log, поэтому точечное удаление сообщений по версии таксономии или другому бизнес-признаку оказывается небезопасным.

В статье рассмотрим, почему прямое удаление сообщений не подошло, какие варианты были рассмотрены и как в итоге был применён комбинированный подход: стабильный Kafka key, tombstone-сообщения, compact/delete policy и проверка состояния таксономии на стороне consumer.

Разберём решение

Каналы и авторизация в Centrifugo: как безопасно подключить real-time в Laravel

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели6.1K

Real-time без авторизации опасен. Если пользователь может подписаться на чужой канал, он может получать чужие уведомления, статусы заказов, сообщения, события админки или финансовые обновления. В обычном HTTP API такая ошибка выглядела бы как доступ к чужому endpoint. В WebSocket-архитектуре ошибка такая же, просто выглядит менее очевидно.

Разбираем в Centrifugo: публичные и приватные подписки, connection token, subscription token, права доступа и безопасное подключение

Читать далее

Devise в Ruby on Rails

Уровень сложностиПростой
Время на прочтение1 мин
Охват и читатели4.8K

Авторизация пользователей в создаваемом нами интернет магазине. Отличный гем Devise поможет вам в вопросах добавления разных пользователей на сайт

Читать далее

Телеграм-бот переклички автовладельцев на Kotlin Native

Время на прочтение4 мин
Охват и читатели5.2K

Очередной рассказ про вайбкодинг, про то что Kotlin Native на что-то годится и в целом может потягаться с Go, пиар моего бота и история неуспеха.

Читать далее

Async/Await в C# это синтаксический сахар для конечного автомата

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели10K

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

Читать далее

Ближайшие события

Строки в Python: всё не так просто, как кажется

Уровень сложностиПростой
Время на прочтение18 мин
Охват и читатели8.3K

Начинающим разработчикам строки обычно кажутся едва ли не самым простым, что есть в языке программирования. Возможно, причина в том, что знакомство с новым языком зачастую начинается с вывода на экран строки Hello, world!.

«Это же просто набор символов, заключённый в кавычки!» — обычно восклицает джуниор Python-разработчик.

Но в Python всё немного интереснее. И за простым синтаксисом скрывается большой набор возможностей, правил и нюансов. Более того, если посмотреть внимательнее, окажется, что в Python целый зоопарк строковых представлений и связанных с ними особенностей.

Привет, я Евгений Бартенев, автор и техлид курса «Python-разработчик» в Практикуме. В этой статье последовательно разберу, какие бывают строки в Python, чем они отличаются друг от друга, какие возможности дают и какие подводные камни могут встретиться в работе с ними. Поговорим и о базовом использовании, и о важных деталях, которые стоит помнить каждому разработчику.

Читать далее

Сравнение моделей конкурентности JVM языков: Kotlin coroutines, ZIO runtime и Clojure

Уровень сложностиСложный
Время на прочтение9 мин
Охват и читатели7.4K

Coroutine, Fiber, Virtual thread - это всё одно и то же?

Или нет ?

Или нет.

А если под капотом всё равно JVM, почему нельзя просто везде включить virtual threads и успокоиться? Разберемся!

Узнать что есть кроме Java Threads

Я написал свой DNS-резолвер на Go вместо того, чтобы взять Unbound. Вот почему и что из этого вышло

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели8.7K

Три месяца назад я начал делать NextDNS-clone для Европы. Рекурсивный DNS с фильтрацией рекламы, трекеров и malware. Первый день: открываю Unbound, читаю man, всё понятно. К вечеру понимаю, что не подходит. Через неделю пишу свой резолвер на Go и вспоминаю поговорку про человека, который решил написать почтовый сервер. Никогда такого не было, и вот опять. Сейчас в проде: 10 нод по миру, отвечает на DoH/DoT, фильтрует по миллионам доменов, RAM 60 МБ на ноду. Расскажу, почему ушёл от готового, что было больно, и где Unbound всё ещё быстрее. Спойлер: почти везде, но в наших условиях это не имеет значения.

Зачем я полез в DNS

CTE в PostgreSQL: как писать сложные запросы просто

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели12K

Запутались в многоэтажных SQL‑запросах? Обобщённые табличные выражения (CTE) — тот инструмент, который превращает лапшу из JOIN и подзапросов в читаемый, модульный код.

Разберем на реальных примерах из FinTech и e‑commerce, как разбивать сложную логику на цепочку простых шагов, использовать CTE в UPDATE/DELETE, строить рекурсии для иерархий и избегать ловушек оптимизатора в PostgreSQL.

Разобраться с CTE

CRUD без боли: форма запроса как граница безопасности поверх Prisma

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели5.6K

Стек: prisma-generator-express + prisma-guard: генерация CRUD-роутера, валидация ввода, ограничение формы запроса и изоляция тенантов. Подход я для себя называю shape-as-boundary: форма запроса становится исполняемой границей доступа.

В примерах ниже - сайт аренды/продажи недвижимости. Реальный проект был другим, кадровой платформой, но я перевожу примеры на недвижимость, чтобы не добавлять лишний контекст.

Читать далее

Codex 5.3 vs Claude Opus 4.6 на реальном Java‑монолите

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели19K

Я сравнил Codex 5.3, Claude Opus 4.6 и GPT-5.5 на реальном многомодульном Java-монолите: скопировал проект в отдельные ветки, дал агентам похожие задачи и прогнал их через цикл правок, ревью и e2e-тестов.

Результат: чем дешевле - тем лучше результат.

Читать далее

Техники GenAI в Spring AI

Уровень сложностиСредний
Время на прочтение26 мин
Охват и читатели10K

В статье рассмотрим ряд техник GenAI, реализованных в модуле Spring AI, и ответим на вопрос: является ли ChatClient лишь тонкой оберткой над API провайдеров LLM или предоставляет функциональные возможности, которые имеет смысл применять в реальных проектах. В качестве примера будем итеративно разрабатывать приложение, интегрированное с Anthropic, и разбирать возникающие по ходу проблемы.

Читать далее