Обновить

Бэкенд

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

Чистая архитектура на практике: перестаём ломать сервис при каждом релизе

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

У вас небольшой релиз. Вы меняете пару строк кода, выкатываете обновление - и через несколько минут сервис начинает отдавать странные ошибки. Баги появляются в местах, которые вы вообще не трогали.

Знакомо?

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

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

Посмотрите на функцию загрузки инвойса:

Читать далее

Релизы без боли для тимлида: как собрать предсказуемый процесс из очевидных практик

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

«Релиз» — слово, от которого у многих тимлидов подскакивает артериальное давление. Ведь за ним часто стоит ночь без сна: кто-то внёс правку в последний момент, тесты упали, а в проде уже ждут обновления. Знакомо?

Но релиз может стать предсказуемым процессом. В статье на примерах покажу, какие процессы, правила и инструменты помогают команде SourceCraft Security избежать авралов.

Читать далее

Как мы довели поиск товаров по изображению до 98% совпадений: FastAPI, DINOv2, Qdrant и поиск на фото полки

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

Поиск товара по изображению кажется простой задачей — ровно до момента, пока не сталкиваешься с реальным каталогом.

В теории все выглядит аккуратно: берем фото, считаем embedding, ищем ближайшие вектора, возвращаем совпадения. На практике начинаются нюансы: у товара несколько изображений, ракурсы отличаются, фон мешает, каталог обновляется постоянно, а бизнес ждет не исследовательский прототип, а сервис, который можно поставить в production.

С вами старший программист в Fix Price Константин Репин. И в этом материале разберу, как мы строили сервис визуального поиска товаров, какие инженерные решения реально повлияли на качество и почему текущий результат в 98% совпадений получился не из-за одной удачной модели, а из-за правильно собранного пайплайна.

Читать далее

Как проходят собеседования на Golang-разработчиков в 2ГИС

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

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

Мы решили пересмотреть наймовый процесс, чтобы сделать его честнее для всех. Так мы добавили в процесс больше живого общения: нам важно услышать, как человек рассуждает, какие решения он принимает и как работает с командами. Об этом всём — дальше.

Читать далее

Какие задачи сейчас ищут на Бирже заказов: подборка за неделю

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

По еженедельным подборкам с Биржи заказов удобно смотреть не только новые проекты, но и сам рынок 1С-задач: какие конфигурации чаще фигурируют в работе, где нужны доработки, а где - интеграции, перенос данных или настройка обменов.

С 6 по 12 мая на Бирже появились новые заказы для 1С-специалистов. В этот раз заметно много задач, связанных с УТ, УНФ и Розницей: доработка отчетов и печатных форм, перенос данных, ЭДО, складской учет, CRM и обмены с внешними сервисами. Отдельно выделяются задачи на стыке 1С и ИИ, а также консультации по EnterpriseData и ЕГАИС.

С 6 по 12 мая на Бирже опубликованы следующие задачи...

Читать далее

Production MTProto user-бот на FastAPI + Telethon: WARP для обхода DPI и 5 граблей с Telegram

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

В большинстве туториалов по Telegram-ботам всё начинается с одного куска кода: получили токен у @BotFather, поставили python-telegram-bot или aiogram, написали хендлер, deploy. Это Bot API. И в 90% задач этого хватает.

А потом приходит задача которую Bot API не закрывает в принципе: программно создать супергруппу под конкретный проект и добавить туда нужных людей по @username, и сделать это десятки раз в день. Bot API такое не умеет даже теоретически - метода «создать группу» там нет, метода «добавить юзера в группу» тоже. Лезете в полную документацию Telegram API искать обход, упираетесь в раздел  channels.createChannel  /  channels.inviteToChannel под MTProto, и начинается совсем другая история - не Bot API, а user-бот через telethon.

В этой статье разбираю как мы сделали production MTProto user-бот на FastAPI + Telethon. Под капотом: Cloudflare WARP для обхода DPI (без него с российского VPS просто не подключиться), Singleton-клиент с keepalive, in-memory cache resolve-юзеров, и 5 ограничений Telegram которые знают только те кто лез туда ногами. Реальный production-сервис у клиента в нише строительства/монтажа, обслуживает связку Planfix → Telegram-группы под каждый проект.

Сервис написан на Python 3.11. Стек: Telethon 1.43.2, FastAPI 0.136.1, Uvicorn 0.46.0, Pydantic 2.13.4. На VPS под systemd, наружу через Cloudflare Tunnel. Вызывается из n8n через HTTP-ноду.

Читать далее

Если if вас замедляют, откажитесь от них

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

При работе с современными CPU устранение ошибочного предсказания ветвления — ключевой способ повышения скорости программ. Один из самых эффективных способов снижения количества ошибочных предсказаний— полное устранение ветвлений.

Возьмём для примера простую задачу: итеративный обход массива и копирование всех чисел меньше 500 в новый массив. Если числа распределены случайно, то результат условия if становится непредсказуемым для блока предсказания ветвления CPU. Из-за этого показатель ошибочного предсказания будет высоким, существенно препятствуя производительности, потому что процессору многократно приходится сбрасывать конвейер и начинать исполнение повторно.

Читать далее

Два проекта и восемь часов практики: бесплатное введение в профессию 1С-разработчика

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

«1С:Предприятие» — одна из самых распространённых учётных систем на территории СНГ. Её используют в бухгалтерии, торговле, на складах, в производстве. Соответственно, 1С-разработчики нужны практически везде: в небольших компаниях, крупном ритейле, производственных холдингах.

В бесплатной вводной части курса «1С-разработчик» от Практикума вы узнаете о профессии, путях развития и требованиях, а также попробуете себя в реальных задачах начинающего разработчика на 1С — на всё потребуется около восьми часов. Рассказываем, что вас ждёт. 

Читать далее

Открытое ТЗ для пет-проекта: сервис поиска пропавших людей

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

Долго думал, в каком формате это написать, в итоге решил по-простому - рассказать, что есть, и кому это может пригодиться.

Мы с коллегой делали выпускной проект для курсов CloudJava и CloudJava K8S. Это техзадание на бэкенд распределенной системы - четыре микросервиса, Gateway, обвязка. Изначально оно было доступно только участникам курсов, теперь решили открыть бесплатно, без регистрации или “оставьте email”. Просто страница с текстом и тремя OpenAPI-спеками.

Ссылки сразу, чтобы не листать:

Описание проекта: https://javaops.ru/view/cloudjava3

Само ТЗ: https://javaops.ru/view/cloudjava3/rescue-service.html

Читать далее

Сравнение моделей конкурентности JVM языков: Треды, Пулы и Structured Concurrency

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

Вы пробовали что-нибудь кроме new Thread() ?

Конечно пробовали: Future !

И всё ?!

Разберемся с разными моделями конкурентности в Java, Kotlin, Scala/ZIO и Clojure: у всех JVM под капотом, но подходы разные. Начнём с разбора тредов, пулов, virtual threads из Project Loom и Structured Concurrency. Дальше: корутины, fibers, ZIO runtime и Clojure.

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

Команда Spring о Spring Framework 7 и Spring Boot 4

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

В новом переводе от команды Spring АйО рассмотрим выход Spring Boot 4 и Spring Framework 7. InfoQ взяли интервью у core команды Spring с целью узнать, куда движется самая популярная в Java экосистема.

Spring Boot 4 модуляризировал автоконфигурацию. Теперь при запуске проверяется меньше классов в classpath, а uber-jar будет более компактным: будут подключаться только нужные модули. Параллельно Spring Boot 4 переходит на Jackson 3, но добавлен модуль совместимости с Jackson 2, потому что экосистема ещё догоняет.

Spring Framework 7 тащит core resilience в ядро: RetryTemplate, @Retryable и @ConcurrencyLimit доступны без отдельной зависимости. @Retryable работает и с реактивными типами (через Retry из Project Reactor); для обычных вызовов используется RetryTemplate с политикой retry/backoff. @ConcurrencyLimit помогает ограничивать доступ к ресурсу, что особенно полезно с Virtual Threads.

Читать далее

Твой async fn на самом деле enum, а Pin нужен потому, что Rust наступил на грабли самоссылающихся структур

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

async fn в Rust — это не магия и не зелёный поток, а обычный enum, который компилятор генерирует за тебя. Разбираем, почему Future это машина состояний, зачем нужен Pin, как работает Waker и executor, и как одна .await-точка может незаметно заставить твой сервис есть память гигабайтами.

Читать далее

Локализация Apache Superset

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

Столкнулась с задачей локализации Apache Superset — и внезапно оказалось, что «из коробки» он переводится только частично.

Поделюсь пошаговой инструкцией по локализации и сборке Docker image. Бонусом — сразу подключим PostgreSQL и Redis вместо дефолтных SQLite и встроенного кеша.

Читать далее

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

Как работает Low-code: инструменты, платформы, в чем польза для бизнеса

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

Привет, Хабр!

На связи Александр Сахаров, директор по работе с партнерами, член правления компании Диасофт. В этой статье разберу, как работают low-code платформы, почему компании все чаще выбирают этот подход, и как он помогает сократить расходы на разработку.

Бизнес сегодня работает в режиме постоянных изменений: рынок требует новых решений быстрее, чем ИТ-команды успевают их разрабатывать. Классический путь от технического задания до готового продукта занимает месяцы, а требования за это время уже устаревают. Именно здесь на сцену выходит low-code — подход, который позволяет создавать рабочие приложения в разы быстрее, не нанимая армию разработчиков и не переписывая код с нуля каждый раз, когда что-то меняется.

Читать далее

Как я сделал desktop‑версию мессенджера на vanilla Electron, не на React Native for Desktop. И не пожалел

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

Это четвёртая статья из серии про инженерные решения в ONEMIX — моём мессенджере на React Native. В предыдущих разбирал трёхуровневый кэш сообщений, Double Ratchet E2E и WebRTC звонки с trickle ICE. Последняя про звонки набрала больше всего просмотров, и в комментариях несколько раз спрашивали про десктоп: «а как у тебя там устроено?».

Сегодня — отдельная статья про desktop‑версию. Сразу скажу: я не использовал React Native for Desktop, не Tauri, не React, не TypeScript. Чистый Electron + vanilla HTML/JS. Это нестандартное решение, и я объясню почему пошёл этим путём, что от этого выиграл, и где это бьёт по голове.

Читать далее

Как мы научили AG2 дружить с нормальным DI (и почему это вообще нужно)

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

Как соединить LLM-агента на AG2 с Dishka в одном DI-контейнере. На рабочем примере: FastAPI + SSE-стрим по AG-UI + Postgres, тулзы с типизированным внедрением сценариев, отдельная транзакция на каждый tool call. Плюс грабли при сборке.

Читать далее

Кто набрал сотни звёзд в Open Source СНГ? И как ваш проект может оказаться следующим

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

⭐️ Каждый месяц мы собираем топ open source проектов СНГ по приросту звёзд!

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

Если вы тоже развиваете Open Source проект, возможно следующий топ будет уже с вашим репозиторием :)

Читать далее

Почему spec-driven development плохо работает на микросервисах: часть 1. Где теряется контекст

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

Я работаю в большой продуктовой компании с тысячей микросервисов. В такой системе даже небольшая фича часто проходит через несколько сервисов, событий и внутренних контрактов. Spec-driven development с LLM уже применяется в некоторых командах для планирования и ревью фич, поэтому мне было важно понять, где этот подход помогает, а где начинает ошибаться. Пока задача живёт внутри одного сервиса, всё обычно идёт быстро: спека короткая, описание и реализация помещаются в контекст модели. Но как только фича проходит через несколько сервисов, начинаются проблемы. По отдельности каждый кусок выглядит нормально: разбиение на слои, именование по код стайлу, прохождение тестов и ревью. Но в целом система не работает должным образом. Типичные ошибки: нет идемпотентности, LLM упускает сценарии и edge case-ы, появляются циклические вызовы сервисов. Чем больше делаешь правок, тем больше ошибок она допускает.

Для эксперимента я собрал отдельный стенд: Go-проект - платформа для поиска фрилансеров. Внутри 12 микросервисов, связанных через gRPC и брокер сообщений; в этом проекте брокером выступает NATS. Одни сервисы хранят задачи и профили исполнителей, другие подбирают кандидатов, считают расстояния, проверяют портфолио и отправляют уведомления. Проект специально спроектирован с шестью категориями архитектурных ловушек: они проявляются не внутри одного сервиса, а на границах между сервисами.

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

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

На это можно ответить, что нужен end-to-end тест на весь сценарий, но это не закрывает проблему целиком. End-to-end тесты есть не везде, их дорого поддерживать, и они не покрывают все развилки: особенно редкие edge case-ы, дубликаты событий, гонки и редкие комбинации условий. Главное же в другом: на этапе spec-driven разработки модель должна помочь собрать требования, ограничения и контекст, а именно там она часто ошибается.

Разработчик тоже не всегда заранее знает, где спрятана проблема. Он может помнить про Outbox, дедупликацию уведомлений или особые требования конкретного сервиса к входным данным, но не сформулировать это как ограничение для новой фичи. LLM читает документы по сервисам, задаёт уточняющие вопросы и всё равно может пропустить связь между ними.

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


Где LLM теряет контекст

Изнанка Remote Desktop. Протокол SPICE в современном графическом стеке, часть 1

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

Вы когда‑нибудь пользовались виртуальной машиной в Linux? Весьма вероятно, что это был QEMU/KVM + SPICE.

Виртуальные машины на spice://localhost:5900 работают достаточно бодро, тогда как подключение по сети может вызвать самые разные эмоции. Причиной тому является специфическая архитектура, которая идёт вразрез с современными диспетчерами среды рабочего стола. И вялая поддержка протокола open‑source сообществом.

Но нас, безбашенных русских инженеров, это нисколько не останавливает! Открываю цикл статей, где мы заглянем внутрь протокола SPICE и графической подсистемы Windows, чтобы провести увлекательный экскурс и разобраться в деталях. После чего создадим пилот нового решения — стриминговый агент для виртуальной машины на ОС Windows.

В первой части мы возьмёмся за сам протокол и увидим, почему SPICE ориентирован на Windows (да, я не шучу). В следующих частях пойдём разбираться в богатствах Windows и в возможностях для нас присосаться подключиться через системное API к потоку фреймов.

Приглашаю под кат всех, кто работает или сталкивается с системами виртуализации, с протоколом SPICE, с виртуальными машинами в принципе; кто интересуется такими темами как удалённый доступ и компьютерная графика; да и вообще всех любознательных.

Поехали!

Email в Bitrix24 и amoCRM: техническая архитектура отправки, типичные узкие места и как починить доставляемость

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

Bitrix24 и amoCRM — две доминирующие CRM в России — отправляют email принципиально разным образом, но имеют общую проблему: ни одна из них не показывает, дошло ли письмо до инбокса получателя. Зелёный статус «Письмо отправлено» в карточке сделки означает только то, что SMTP‑сервер получателя принял письмо. Куда оно легло у клиента — спам, входящие, промоакции — CRM не знает.

В статье:

Читать далее