Обновить

Бэкенд

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

5 ошибок при миграции с PostgreSQL на ClickHouse: как не убить производительность индексами

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

В этой статье разбираем пять конкретных ошибок при миграции индексов, которые мы совершали сами на реальных проектах. Почему B‑tree не работает в колоночной СУБД? Как правильно спроектировать ORDER BY и PRIMARY KEY? Когда использовать bloom_filter, а когда — материализованные представления?

Читать далее

Как я собрал MCP-коннектор для Claude за вечер: FastMCP, Streamable HTTP и грабли деплоя

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

MCP (Model Context Protocol) называют «USB-C для ИИ-агентов»: один протокол, и к модели подключаются десятки готовых интеграций без костылей. Звучит красиво, но настоящее понимание приходит только когда соберёшь сервер руками — где протокол реально экономит, а где придётся повозиться, видно лишь на практике. Я собрал свой за вечер и рассказываю по шагам.

Коннектор отдаёт Claude мою базу знаний — словарь из 90 ИИ-терминов и блок частых вопросов. Спрашиваешь в диалоге «что такое RAG» — и Claude достаёт определение из моей базы, со ссылкой на источник. Дальше — стек, код, деплой за nginx и три грабли, на которых я залип.

Читать далее

Как подключить Payme к Telegram боту на Python

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

В этой статье разберём как подключить Payme к Telegram боту на Python используя библиотеку aiopayme — async-first решение с роутерами и dependency injection как в aiogram и FastAPI.

Читать далее

Task-first агентная разработка: как помочь агенту ориентироваться в контексте долгоживущих проектов

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

Знакома ли вам ситуация, когда никак не получается найти нужный чат в истории Cursor, Codex или Claude Code? Или когда чат настолько вырос, что запустилось сжатие контекста, а важные факты и промежуточные результаты потерялись?

Основной интерфейс взаимодействия с агентом — чат. Такой chat-first подход удобен как входная точка, но плохо подходит на роль рабочей среды для долгоживущих проектов и разработки фич, состоящих из нескольких задач. В чате контекст постепенно расползается: исходный запрос, уточнения, ограничения, промежуточные решения, логи, ошибки, результаты проверок и финальные артефакты оказываются в одной линейной истории.

Агенты очень хорошо работают с файлами: они прекрасно ориентируются в коде, зависимостях, правилах проекта (AGENTS.md) и навыках (skills/). Нативные инструменты любой среды агентной разработки заточены на эффективный поиск информации и другие операции с файлами. Так почему бы не использовать файлы и для хранения контекста задач?

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

Читать далее

Эволюция 'More Like This'

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

Во многих поисковых сценариях пользователь начинает не с пустой строки запроса, а с существующего результата.

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

Этот сценарий традиционно называют More Like This (MLT): функцией поиска документов, похожих на выбранный. В статье под MLT понимается поиск от уже известного документа, а не от заново введённого запроса.

Классический подход MLT (поиск похожих документов) основывался на сравнении текстовых совпадений. Современные реализации всё чаще используют эмбеддинги: числовые представления документов. Поисковый индекс хранит эмбеддинги в виде векторов, а поисковая система может находить документы с близкими векторными представлениями.

Читать далее

Создаём DSL на C#: Пишем парсер

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

Создаю собственный DSL на C#: рассказываю о том, как написать парсер, и как его оптимизировать. Так же покажу как работает обещанный DFA.

Читать далее

Год с Claude Code: главное — не он сам, а то, что в .claude/

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

Claude Code у меня появился в марте 2025-го. Точную неделю не помню — в какой-то момент он у меня просто стал инструментом по умолчанию, и я с ним отработал примерно год.

Это не «AI убил программирование» и не «AI = x10 продуктивность». И то и другое — пустое. Реальность скучнее и интереснее одновременно.

Сразу важная оговорка: я использую Claude Code на максимум. Не «иногда», не «когда подходит» — постоянно, на каждой задаче. Если что-то можно сделать через него, я делаю через него. Под него подстроены CLAUDE.md, hooks, skills, slash-команды, два MCP-сервера. Это контекст для всех выводов ниже. Стек: Python, бэкенд, команда маленькая.

Где он реально помог

Массовые рутинные правки. Самое чистое попадание. Когда у тебя задача «во всех 47 эндпоинтах добавь параметр request_id в логи и пробрось его в нижний слой» — это его работа, а не моя. Открываю агента, описываю абзацем, прошу сначала план, смотрю план, говорю «давай» — и через минут десять у меня PR с тестами. По ощущениям часов тридцать-сорок за год сэкономил только на таких задачах.

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

Чтение чужого репозитория. Раньше я тратил полдня на «понять, что тут вообще происходит». Сейчас открываю агента и говорю: «прочти структуру, расскажи как устроена аутентификация». Через минуту — приличный пересказ с указанием файлов.

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

Читать далее

redb.Route — Apache Camel для .NET, который мы написали потому что выхода другого не было

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

У вас не 5 микросервисов — у вас десятки. Бэкенд, который рос три года: монолит, расколотый на куски, GPS-фид от автопарка, мобильное приложение водителя, веб-кабинет диспетчера, интеграции с SAP / 1С / регуляторами / маркетплейсами, отдельный SMTP-воркер, отдельный PDF-генератор, отдельный шедулер ночных пересчётов. Между ними — Kafka (несколько кластеров, по топику на домен), RabbitMQ (RPC + pub/sub + DLQ), Redis (кэш, last-known-state, pub/sub-каналы), пара HTTP-эндпоинтов наружу, SFTP с поставщиком, SQL-polling outbox-таблицы старого монолита, MQTT с трекеров, IBM MQ для одного древнего банковского контура, SignalR-хабы для real-time-дашбордов. На каждом стыке — свой ретрай, свой DLQ (или нет DLQ), своя сериализация, свои метрики (или нет метрик), своя бойлерплейт-обвязка из консьюмеров и try/catch.

Каждый из этих стыков живёт своей жизнью в Program.cs соответствующего сервиса. Каждый — это hand-rolled цикл:

Читать далее

Перевополщение Stable Values в JDK 26

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

В новом переводе от команды Spring АйО рассмотрим ленивую инициализацию в Java , которая почти всегда значит: поле сначала null, потом double-checked locking, volatile, синхронизация. Ошибиться легко, а final не поставить. Итог - код хрупче и JVM хуже делает constant folding.

В JDK 26 (preview, JEP 526) добавили LazyConstant<T>: final поле, рецепт вычисления через Supplier, значение доступно черезget(). Supplier выполнится при первом get и только один раз успешно, даже при гонке потоков. Кроме этого значение помечается как @Stable - JVM может считать его константой и агрессивнее оптимизировать.

Граничные случаи: null нельзя; не сериализуется; исключение из Supplier пробросится и следующая попытка снова пересчитает; equals у LazyConstant - только identity.

Для 1:n есть List.ofLazy и Map.ofLazy: элементы/значения считаются по индексу/ключу по требованию и кэшируются.

Читать далее

DI в TypeScript без декораторов: почему это будущее

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

Каждый, кто пишет на TypeScript хотя бы пару лет, отлично знаком со стандартным DI-сценарием: класс, декоратор @Injectable(), флаг emitDecoratorMetadata в конфиге и рантайм-магия фреймворка. Этот подход казался прорывным в 2015 году, но современный TypeScript ушел далеко вперед. У нас появились мощнейший статический анализ и продвинутый вывод типов, в то время как популярные DI-контейнеры вроде NestJS, InversifyJS или TSyringe будто законсервировались в прошлом.

Слепая приверженность старым паттернам начинает откровенно тормозить индустрию. Из-за legacy-декораторов мы оказываемся заперты в рамках медленного tsc без возможности безболезненно уйти на сверхбыстрые сборщики вроде esbuild или SWC. Наша бизнес-логика намертво заражается инфраструктурными импортами сторонних библиотек, а ошибки в графе зависимостей и скрытые утечки памяти обнаруживаются не на этапе компиляции, а уже в рантайме под нагрузкой на проде.

Но что, если заставить компилятор TypeScript проверять валидность всего графа зависимостей еще до запуска кода? Без декораторов, reflect-metadata, кастомных трансформеров и тяжелой кодогенерации.

В этой статье мы разберем концепцию «экстремальной типизации» на примере InferDI — первого DI-контейнера, где сам граф зависимостей вместе с lifetime-правилами перенесен напрямую в систему типов. Мы поговорим о фундаментальных вещах: почему полный отказ от «удобной» магии аннотаций в пользу 100% ванильного TypeScript — это лучшая инвестиция в архитектуру, безопасность, скорость сборки и долговечность вашего проекта на годы вперед.

Читать далее

HikariCP в проде: пять настроек, которые часто крутят неправильно

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

В проде connection pool редко падает громко — чаще он тихо превращает сервис в очередь ожидания: запросы висят, база задыхается, Kubernetes начинает перезапускать поды, а в логах всплывает знакомое Connection is not available.

В этой статье разбираем пять настроек HikariCP, которые чаще всего крутят «на глаз»: размер пула, minimumIdle, maxLifetime, keepaliveTime и connectionTimeout. Покажем, почему «поставить побольше» почти всегда плохая идея, как таймауты инфраструктуры ломают соединения и какие метрики стоит вывести в Grafana, чтобы увидеть проблему до инцидента.

Читать далее

Как не надо работать с Git'ом

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

Решил поделиться вполне элементарными, но такими полезными приемами работы с гитом, которые нарушаются постоянно не только новичками или молодыми сотрудниками, но и вполне опытными разработчиками !

Читать далее

Реализация Stateful команд в Telegram API

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

Java Telegram API обманывает разработчиков дубликатами запросов при отключении интернета?

Мы команда разработки телеграмм ботов, которая смогла придумать решение для работы с дубликатами в Statefull командах Telegram API используя REST. Прошли путь от наивного решения до работающего продукта.

Читать далее

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

Scala Digest. Выпуск 41

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

Привет, Хабр! Мы Настя, Эвелина и Михаил — бэкенд-разработчики Т-Банка, пишем код на Scala и горим желанием его популяризировать. Мы собираем и агрегируем новости из разных источников, включая Scala Times, блог Petr Zapletal и канал Scala Nishtyaki, добавляем дополнительные материалы и собственные комментарии. Мотивацию черпаем из желания развиваться и делиться полученными знаниями.

Поздравляем читателей с первым днем лета, желаем кайфовой разработки, интересных материалов и комфортных перерывов под летним солнцем!

Приветствуем любую обратную связь! (づ ◕‿◕ )づ

Читать сорок первый выпуск

GigaIDE Pro для FastAPI, Flask и SQLAlchemy

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

Наш предыдущий обзор касался поддержки в GigaIDE — возможно, самого популярного фреймворка Python, который, однако, восходит к эпохе шаблонизаторов, когда веб-страницы формировались на бэке. Кстати, обзор, как реализована поддержка идеологических братьев Django в Java, есть здесь.

Сегодня мы рассмотрим поддержку других популярных Python-фреймворков: FastAPI, Flask, SQLAlchemy и немного Pydantic. В отличие от Django, все из них стали популярны благодаря своей легковесности и узкой специализации. Первые два — это веб-фреймворки, третий — ORM-фреймворк.

Читать далее

Как выкатывать ecommerce в Битрикс по частям и не останавливать продажи (7 часть)

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

Финальная часть серии — про самое нервное в любом ecommerce-проекте: как включать новую архитектуру по частям, не устраивать «большой релиз» и не останавливать продажи. 

К этому моменту у нас уже есть SSO, события, наблюдаемость, быстрый каталог, корзина, цены, checkout, интеграции, Gateway и SDK. Теперь начинается самая чувствительная часть — включать все это в продакшен без большого релиза или остановки продаж.

Сложность — в процессе. Один модуль уже готов, второй еще нет, часть трафика ходит по старому пути, часть — по новому… Поэтому я сделала практическую схему постепенного включения: фича-флаги, канареечный трафик, двойное чтение, shadow-режим и критерии готовности.

Читать далее

Как написать свое расширение postgres?

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

Привет, хабровчане! Сегодня покажу, как писать расширения для PostgreSQL. На примере pg_plan_alternatives, который логирует все пути, рассматриваемые планировщиком. Вы увидите то, что обычно скрывает планировщик.

Нам потребуется:

Не теряй навыков общения работая на удалёнке или Python + Психология

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

В данной статье рассматривается создание приложения для тренировки общения. Реализация на Python с использованием k8s, linux, Redis, Postgres, kafka. Предлагаются варианты переиспользования созданных микросервисов.

Читать далее

Раннее завершение KNN-поиска в Manticore Search

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

Современные поисковые системы уже не просто сопоставляют ключевые слова. Когда вы ищете «уютный детектив, действие которого происходит в Париже», а получаете результаты вроде «атмосферный детективный роман во Франции», это векторный поиск в действии: документы и запросы превращаются в списки чисел — эмбеддинги, — а поисковый движок находит документы, чьи векторы ближе всего к вектору запроса.

Manticore Search поддерживает это из коробки. Внутри используется структура данных HNSW: граф, который соединяет близкие векторы и позволяет быстро находить ближайших соседей без сканирования каждого документа. Благодаря этому векторный поиск по миллионам документов выполняется за миллисекунды.

Читать далее

Фирма «1С» рассказала о возможностях будущего релиза 1.89 «1С: Аналитики»

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

В технологическом блоге «Заметки из Зазеркалья» опубликован обзор будущего релиза «1С:Аналитики» 1.89. Основной акцент сделан на развитии инструментов работы со связями объектов, улучшении интерфейса дашбордов и редактора карт.

Одним из заметных изменений версии 1.89 стало развитие инструмента просмотра связей, который появился в версии 1.88. Теперь в нем доступен режим иерархического отображения: в окне «Связанные объекты» можно переключаться между плоским списком и деревом зависимостей...

Читать далее