Обновить

Бэкенд

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

После Ruby/Elixir в Go, часть 1

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

Для рубиста такая консоль почти универсальный пульт управления приложением(но пульт довольно опасный). Если нужно посмотреть, что происходит с конкретным пользователем, можно просто открыть консоль, найти его, вызвать нужный метод и понять, почему, например, не работает какая-то функция.

Набираешь:

bundle exec rails c

И через несколько секунд уже находишься внутри приложения и можешь работать с его кодом и данными. Только вместо кнопок у разработчика код. Надо помнить: «С большой силой приходит большая ответственность». © Дядя Бен.

Например, приходит вопрос:

Почему у этого пользователя не появился доступ к фиче?

В Rails можно открыть консоль, вызвать нужный код и довольно быстро проверить несколько гипотез. Когда я пришёл в Go, первое время постоянно хотелось сделать то же самое. Конечно, проверить код всё равно можно. Можно написать тест или небольшую программу, подключиться к базе, сделать отдельную CLI-команду под конкретный кейс, но это уже не то ощущение: «открыл приложение и начал быстро проверять гипотезы».

Ruby здесь не единственный пример. В Elixir есть интерактивная консоль IEx. Можно запустить прямо внутри неё:

iex -S mix

Благодаря возможностям Erlang VM можно даже подключаться консолью к другому запущенному узлу. И вот после Ruby и Elixir Go ощущается особенно необычно. В Ruby удобную консоль обычно даёт фреймворк. В Elixir сама платформа хорошо приспособлена к интерактивной работе с запущенной системой.

В Go это ощущается так:

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

Поначалу это раздражает. Кажется, что раньше на проверку гипотезы уходило 5–10 минут, а теперь приходится что-то дополнительно писать, но со временем я увидел в этом и другую сторону. Удобная консоль очень легко позволяет разработчику стать частью бизнес-процесса. Про эту боль я подробнее писал в статье. Также можно легко сломать продакшен.

Нет нужной кнопки в админке?

Попросим разработчика выполнить команду.

Нужно поправить состояние пользователя?

Разработчик сделает через консоль.

Для небольшого бизнеса это действительно может быть удобно. Но потом внезапно оказывается, что важная операция в продукте существует только потому, что рядом есть разработчик, который знает правильную команду. Я такой подход называю Developer as an admin panel.

В Go отсутствие такого универсального пульта начинает раздражать раньше. Если одна и та же операция повторяется, довольно быстро хочется сделать для неё CLI, скрипт, админку или нормальный API. Бизнес раньше начинает видеть ценность такого инструмента.

Я всё ещё считаю консоли в Ruby/Elixir невероятно удобными инструментами. Но теперь, когда хочется в очередной раз сделать что-то вручную, полезно задать себе вопрос:

Мне действительно не хватает консоли или не хватает нормального инструмента?

Теги:
+3
Комментарии5

Решил проверить, что обо мне знает Google. И знает он достаточно. Я есть и в SEO, и в GEO выдаче.

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

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

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

Есть смысл в маркетинге для разрабов? Что думаете?

Теги:
-2
Комментарии0
redb 4.0.1
redb 4.0.1

redb 4.0.1: транзакции, изоляция кластеров и SQL-коннектор по канону Camel

Через неделю после мажора 4.0 вышла 4.0.1. Первые внедрения четвёртой версии принесли много обратной связи, и этот выпуск её отрабатывает: больших новых функций немного, зато заметно выросла надёжность под нагрузкой и в транзакциях. Все четыре продукта снова на одном номере, 77 пакетов.

redb.Core

  • Всё, что redb делает внутри общей транзакции .NET (TransactionScope), теперь фиксируется или откатывается вместе с ней, на MSSQL, PostgreSQL и SQLite.

  • Ленивые загрузки идут по соединению того, кто читает, без скрытых соединений.

  • Кэш Props держит нагрузку, а объекты по списку идентификаторов загружаются одним запросом.

  • Нативное расширение SQLite сверяет свою версию при старте и называет устаревший файл, если он попался.

redb.Route

  • Единица работы стала предсказуемой: сначала фиксируется база, потом брокеры, а повтор оборачивает транзакцию целиком. Необработанный сбой везде остаётся сбоем, обработка ошибок ведёт себя как в Apache Camel.

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

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

  • LLM-агенты учитывают побочные эффекты инструментов, сохраняют рассуждения модели, считают бюджет и стоимость.

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

redb.Tsak

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

  • Модуль, который не смог стартовать, откатывается на работавшую версию, а перезагрузка одного пакета не задевает соседние модули контекста.

  • Дашборд снова обновляется сам и отправляет действия на узел нужного кластера.

redb.Identity

  • API управления больше не считает вызов доверенным только потому, что он пришёл изнутри процесса.

  • Одно DPoP-доказательство нельзя использовать дважды даже при одновременных запросах.

  • Транзакции маршрутов идут в общей транзакции, а недоступность базы больше не вызывает бесконечных повторов.

Что учесть при обновлении

  • Tsak: если на одной базе живут несколько кластеров, перед обновлением остановите все узлы этой базы.

  • Route: параметры в SQL-запросах переходят на синтаксис Camel, а единица работы и обработка ошибок стали строже. Это стоит проверить на своих маршрутах.

Pro по-прежнему бесплатен и не требует ключа. Полные списки изменений на redb.ru/releases, исходники на GitHub.

Если было полезно, ⭐ на GitHub поможет другим это найти.

Другие мои статьи — redb.ru/articles, ещё — на Хабре.

Теги:
-2
Комментарии0

Окно закрылось: стелс-модель union-alpha деанонилась как Pareto от Unbiased... и счёт за токены, который я не получил.

Вчера я опубликовал разбор стелс модели union-alpha: за один вечер она собрала рабочую ветку комментариев для НЕЛЬЗЯgram агента, мы прогнали её через аудит вторым ИИ, три живых теста и проверку памяти. Статья вышла вечером... Ирония: егодня утром стелса нет. Страница union-alpha сменила плашку:

На месте стелса уже платная unbiased/pareto: 2.50 у.е. за миллион входных токенов и 7.50 у.е. за выходной, те же 262K контекста, описание слово в слово то же самое, релиз 17 сентября.

Это уже второй виток одного паттерна. Прошлый стелс (ox-alpha0 неделю отвечал бесплатно, а потом деанонился как GLM 5.3 Flash от Z.ai. У union-alpha бесплатное окно прожило ровно сутки: 16 и 17 сентября. Мои тесты шли 17 = в последний день окна. Конечно хотелось бы почитать ещё, о том как кто протестировал эту union-alpha до её деанона...на Open router уже её "прогнали" за 2е суток по полной вижу:

  • За 17 сентября модель успела обработать небольшой объем: 120 млн входных токенов (Prompt) и 2,61 млн токенов ответа (Completion);

  • За 18 сентября (на момент публикации поста) виден гигантский скачок - суммарно обработано более 1,13 миллиарда Prompt-токенов (входных данных) и 21,7 миллиона Completion-токенов (ответов модели);

Теперь математика расходов:

Вчерашние мои прогоны данной llm - сборка одной ветки: ТЗ на 28200 токенов входа, чтение проекта, генерация семи файлов, итерации правок, три боя. Типичная сессия Cline такого масштаба это единицы миллионов токенов, где большая часть является кэш чтение. Возьмём средние 3 млн. входных (80-85% кеша) и около 50 тысяч выходных и подставим прайс Pareto:

  • вход без кеша: около 0,5 млн умножить на 2.50 у.е. = 1.25 у.е.

  • кеш чтение: около2,5 млн умножить на 0.25 у.е. = 0.63 у.е.

  • выход: 0,05 млн на 7.50 у.е. = 0.38 у.е.

Итого около 2.3 долларов за вечер работы модели, включая аудиты и три прогона. Мне повезло дважды: поймал окно и взял скромный масштаб задачи.

А теперь подставьте прошлый мой тест - эксперимент ( https://habr.com/ru/articles/1076084/) : 60,9 млн токенов за три дня, 85% кэш хитов. По прайсу GLM Flash тот прогон вышел около $4. По прайсу Pareto он же стоил бы в пределах 45-50 долларов. Разница в десять с лишним раз просто за то, что модель "сняла плащ" (и конечно обьём токенов то).

Вывод тем, кто "охотится" за стелсами, короткий:

  1. Окна сужаются: у ox-alpha было неделя, у union-alpha - сутки. Успел за сутки = считай, заработал.

  2. ТЗ и контекст готовь заранее: их цена от окна не зависит, а вот прогон зависит напрямую.

  3. Бенчмарки кончено нужны, однако, когда есть живая задача и стелс окно "здесь и сейчас": моей ветке комментов инсты было всё равно, станет ли модель платной завтра.. ей надо было работать сегодня))

Если интересны подробности и разбор моих тестов - прогонов с кодом скринами , то всё в статье ( https://habr.com/ru/articles/1083578/ ).

Всем добра, и спасибо за внимание =)

Теги:
+5
Комментарии2

Backend без сюрпризов: 15 уроков недели от кода до production

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

На ближайших бесплатных уроках разберём инструменты и подходы, которые помогают backend‑разработчикам решать реальные задачи: проектировать сервисы, работать с данными, понимать поведение приложений под нагрузкой и готовить решения к продакшену. Уроки проведут наши преподаватели – можно будет задать вопросы по теме или формату обучения.

Архитектура и высоконагруженные системы

  • 23 сентября в 20:00. «Узнайте, как использовать Patroni для управления высокодоступными кластерами PostgreSQL». Записаться

  • 6 октября в 20:00. «Практические подходы к переходу от монолита на микросервисы». Записаться

  • 6 октября в 20:00. «Apache Kafka в микросервисной архитектуре – лучшие практики асинхронного обмена». Записаться

  • 22 октября в 19:00. «Основы проектирования бизнес-логики в микросервисной архитектуре». Записаться

Java и Spring

  • 21 сентября в 20:00. «HTTP-сервер на чистой Java за 30 минут». Записаться

  • 30 сентября в 20:00. «Spring AI 2.0 на практике: добавляем AI в Spring Boot и доводим до production». Записаться

  • 22 октября в 20:00. «Spring Boot под нагрузкой: почему сервис работает локально и падает в production». Записаться

Backend на Go и C++

  • 22 сентября в 20:00. «Горутины и каналы: под капотом (under the hood) и нюансы в продакшене». Записаться

  • 1 октября в 20:00. «Паттерн многопоточного программирования Producer–Consumer». Записаться

.NET и ASP.NET Core

  • 1 октября в 20:00. «JIT и AOT в .NET: ReadyToRun и NativeAOT на практике». Записаться

  • 20 октября в 20:00. «OpenTelemetry в .NET: от чёрного ящика к наблюдаемой системе». Записаться

Базы данных и SQL

  • 30 сентября в 20:00. «Подзапросы или CTE – как сделать сложный запрос понятным». Записаться

  • 5 октября в 20:00. «Как SQL Server ищет данные – Scan, Seek и Lookup в плане запроса». Записаться

  • 15 октября в 20:00. «SQL против бардака в данных: поиск по шаблону и регулярные выражения». Записаться

  • 19 октября в 20:00. «Анализируем длинные и сложные запросы в SQL Server». Записаться

Полное расписание бесплатных уроков сентября собрали в дайджесте.

Теги:
+4
Комментарии0

Вот вам еще одна из самых полезных команд в Claude Code для продвинутых
И одна из причин, почему я не фанат Codex Harness -- там такого нет

Это команда /rewind или esc + esc в Claude Code CLI

Эту команду можно воспринимать ее как Ctrl+Z для агента

Сначала вот вам короткое описание из документации Claude Code

Что делает /rewind в Claude Code

Claude Code автоматически создаёт checkpoint перед каждым новым ходом и сохраняет снимки файлов перед своими правками. Команда /rewind или двойное нажатие Esc открывает меню, где можно выбрать прошлое сообщение и:

  • восстановить только разговор;

  • восстановить только изменённые файлы;

  • восстановить и разговор, и файлы;

  • свернуть выбранную часть истории в summary.

Checkpoints сохраняются вместе с сессией, поэтому вернуться к ним можно даже после перезапуска Claude Code. Но если в гит намусорили уже другие сессии, то при измении файлов могут вылезать конфликты

Теперь про юзкейсы и объяснение уже от меня

В основе этой команды лежат две независимые переменные

  1. Состояние git файлов в вашем репозитории

  2. и Conversation — история текущего диалога в context window

При вызове команды /rewind вам предложат выбрать конкретное сообщение и затем выбор из 3-5 вариантов

  1. Restore code and conversation
    Возвращает и файлы, и диалог к выбранной точке Полезно, когда агент долго шёл не туда и оставил после себя плохие изменения. Продолжать поверх такого состояния смысла нет: контекст и файлы уже заполнены ошибочными попытками

  2. Restore conversation
    Диалог откатывается, но код при этом остаётся Сценарий: баг уже исправлен за несколько шагов, но обсуждение бага больше не нужно. Возвращаем разговор до него — следующая итерация видит чистую историю и при этом сохраняет исправленные файлы Полезно и при параллельной работе над одним main

  3. Restore code
    Откатываются только файлы, а разговор остаётся Так можно признать решение неудачным, стереть его из репозитория и продолжить обсуждение в том же контексте Это чище, чем заставлять агента по памяти выискивать и удалять свои изменения

  4. Summarize

    1. Summarize from here
      Сжать сообщения после выбранной точки

    2. Summarize up to here — сжать всё до точки, оставив последние сообщения дословно /compact подводит итог всей сессии В этих сценариях Claude Code делает форк диалога

  5. И ещё есть просто Fork
    Как и в случаях с саммари — старая ветка не стирается: restore code and conversation и restore conversation создают форк

Теги:
-1
Комментарии2
Биржа заказов Инфостарта: новые задачи по 1С со 9 по 16 сентября
Биржа заказов Инфостарта: новые задачи по 1С со 9 по 16 сентября

На Бирже заказов Инфостарта в период с 9 по 16 сентября появились новые задачи для разработчиков и консультантов 1С. В фокусе — интеграции с кассами, маркетплейсы, обмены, мобильная платформа, НДФЛ и автоматизация договорной работы с помощью ИИ.

Свежие заказы:

Подробности — в исходной подборке. Выбирайте задачу по своему профилю и откликайтесь.

Теги:
+3
Комментарии0

В этом небольшом видео показываю работу службы отчётности Digital Q.DataBase и поддержку RDL (Report Definition Language) — формата описания отчётов, используемого в Microsoft SQL Server Reporting Services (SSRS).

► При миграции с Microsoft SQL Server одной из сложных задач становится сохранение существующей отчётности. В корпоративных системах могут годами накапливаться сотни и тысячи RDL-отчётов, а их перенос на другой стек способен превратиться в отдельный большой проект.

В СУБД Digital Q.DataBase (которая понимает PL/pgSQL, PL/SQL, T-SQL) реализована совместимость с RDL и привычными механизмами SSRS, чтобы существующие отчёты и интеграции можно было переносить с минимальными изменениями.

🔹 Служба отчётов Digital Q.DataBase
Аналог SQL Server Reporting Services (SSRS).
Поддержка RDL-отчётов.
Формирование отчётов в HTML и PDF.

Видео также доступно на:
VK
RuTube  
Dzen 
YouTube

► С 1 сентября 2026 года компания «Диасофт» переходит на новую лицензионную политику СУБД Digital Q.DataBase (до 4-х ядер бесплатно). 

🔹 Бесплатное получение дистрибутива: 
https://database.diasoft.ru/?utm_source=andrei
🔹
 Документация: доступна внутри дистрибутива
🔹 Telegram-сообщество Digital Q.DataBase: https://t.me/dqdatabase
🔹
 MAX: https://max.ru/channel_dqdatabase
🔹
 RuDB : https://database.ru

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

СУБД, которая понимает диалекты Oracle, MS SQL и PostgreSQL,– без переписывания кода приложений.

Теги:
+11
Комментарии2

Новые технологии без лишнего шума: что будем разбирать на вебинарах на этой неделе

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

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

ИИ и машинное обучение

  • 14 сентября, 20:00. «AI‑агенты против Junior‑разработчиков: кто кого заменит к концу 2026 года». Записаться.

  • 15 сентября, 20:00. «Настройка виртуального окружения — уверенный старт в мире Python и ML». Записаться.

  • 16 сентября, 18:00. «Задача классификации от 0 до 9». Записаться.

  • 17 сентября, 18:00. «Создаём ИИ‑ассистента для системного аналитика за 1 час». Записаться.

  • 17 сентября, 20:00. «Обзор ИИ‑технологий для разработчиков. От идей до рабочих решений». Записаться.

Разработка и архитектура

  • 17 сентября, 20:00. «RabbitMQ в Production: Transactional Outbox, идемпотентность и DLQ в ASP.NET Core». Записаться.

  • 17 сентября, 20:00. «Создаём первое приложение на Vue 3 с Composition API». Записаться.

Данные и базы данных

  • 15 сентября, 20:00. «Моделирование данных для DWH». Записаться.

  • 16 сентября, 20:00. «Темпоральные данные в PostgreSQL 18: история и версии без триггеров». Записаться.

Аналитика и бизнес‑процессы

  • 15 сентября, 20:00. «Как аналитик 1С ведет задачу от интервью до приемки: сквозной кейс интеграции с мобильным рабочим местом». Записаться.

  • 17 сентября, 20:00. «Событийные подпроцессы в BPMN 2.0: как моделировать процессы, реагирующие на события». Записаться.

  • 17 сентября, 20:00. «Управление релизами в 1С: GitFlow, code review и CI/CD на практике». Записаться.

Управление командами

  • 14 сентября, 19:00. «Анти‑паттерны управления: Почему "помощь" заказчиков убивает проекты и как вернуть контроль». Записаться.

  • 16 сентября, 20:00. «Диагностика команды: как выявить проблемы до того, как они повлияют на результат». Записаться.

  • 16 сентября, 20:00. «Сложные разговоры в команде: как давать обратную связь без эскалации». Записаться.

Инфраструктура

  • 17 сентября, 20:00. «Где Linux хранит настройки и логи: разбираем файловую структуру на практике». Записаться.

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

А полный список бесплатных уроков сентября можно посмотреть в дайджесте.

Теги:
+4
Комментарии0

Летний ТехФест 2026: главные итоги

Мы объехали офисы партнёров, встретились с коллегами и обсудили самое актуальное: AI в разработке, продуктовые циклы, управление изменениями и не только. На практических сессиях разбирали реальные кейсы, а на дискуссиях искали ответы на сложные вопросы.

Собрали цифры нашего фестиваля, чтобы показать масштаб:

  • 5 площадок

  • 5 компаний организаторов

  • Более 600 участников

  • 10 докладов от экспертов отрасли

  • 3 активности — мастермайнд, круглый стол и практикум с живыми кейсами

  • 12 экспертов и спикеров

  • 5 кейсов решено на практикуме по инженерной оптимизации.

Отдельное спасибо организаторам — вы сделали эту неделю незабываемой. Увидимся в следующем году!

Финальный день: как это было.

Ещё больше о мероприятиях — в нашем TG-канале.

Теги:
0
Комментарии0

Границы между системным администрированием, DevOps и DevSecOps сегодня настолько размыты, что часто на сайтах поиска работы пишут: «Ищем DevOps-инженера со знанием безопасности».

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

Обсуждаем это всё в новом подкасте #Криптонит_говорит о системных инженерах!

Смотрите на любой удобной платформе:

В выпуске приняли участие:

  • Александр Телевной, директор департамента инфраструктуры в «Криптоните»;

  • Артём Пузанков, руководитель отдела консалтинга безопасной разработки в «Бастионе»;

  • Иван Морщагин, ИТ-консультант

Теги:
+1
Комментарии0

Как разглядеть инженера за AI-агентом?

У вашего удалённого коллеги может быть идеальное резюме, GitHub, живой аватар в корпоративном чате и безупречно заполненные документы любого вида - да хоть на японском. Количество кода и даже его функциональность тоже мало что о нём скажут: результат его труда, весьма вероятно, произведён или основательно переработан LLM и несёт её характерный «акцент». Да, известно, что все носят маски. Однако теперь эту маску обеспечивает технология.

Распределённые инженерные команды уже стали нормой: доступ к широкому рынку труда перевешивает неудобства. Однако лёгкой такая работа не бывает - фокус, общий ритм, культура команды и обмен опытом на удалёнке держатся плохо, и оптимальной схемы мы, похоже, так и не нашли. А AI-агенты ещё и добавляют сложности в эту, несовершенную, систему.

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

Зачем нам вообще знать реальное положение дел? Что в действительности умеет коллега? Насколько он вдумчив и ответственен, насколько критичен к результатам своего труда? Без ответов нельзя планировать, оценивать трудоёмкость и прикидывать сроки. Но важнее другое: нельзя решить, кому доверить архитектурно значимый кусок системы.

Внимательный читатель резонно спросит: если результат проекта — это продукт, и он создаётся по графику, какая разница, что происходит на стороне удалённого коллеги?

Разница в том, что AI напишет не только код, но и регрессионные и нагрузочные тесты — вне зависимости от квалификации инженера. И часть этой большой работы может оказаться подгонкой под результат, чем AI частенько грешит: тест, подкрученный так, чтобы позеленеть, выглядит ровно как честный. Какие шаги предпринимает коллега, чтобы этого не случилось, мы не знаем, его техпроцесс работы с AI непрозрачен. И ещё: расширяемость кода, простота поддержки и количество потенциальных проблем - слищком абстрактные понятия для нынешного AI. А как решил эти вопросы инженер и почему из кода не видно.

Приведу пример из практики — Self-Join Elimination в PostgreSQL. Фича шла в ядро семь лет, один раз откатывалась уже после коммита и после релиза 18 продолжала собирать багфиксы. Недавно Tom Lane переделал её. Раньше, обнаружив самосоединение, Postgres удалял избыточный JOIN и перестраивал все ссылки на него в дереве запроса и структурах плана. Tom от этого отказался: новая реализация правит только дерево запроса и перезапускает планирование с нуля уже по новому дереву. По формальным меркам решение выглядит хуже - планирование дорожает. Выигрыш в другом: исчезает целый класс ошибок, которыми фича успела обрасти.

Заметьте, где здесь виден инженер. Ни диф, ни зелёные тесты не покажут, что человек осознанно заплатил скоростью планирования за надёжность. Мы знаем об этом только потому, что он это проговорил. И это, пожалуй, единственная зацепка, которая у нас остаётся: требовать от коллеги не код с тестами, а сформулированные компромиссы — почему так, чем заплатили, от чего отказались. Ровно то, чего pgsql-hackers требует от любого патча: без обоснования он принят не будет.

Таким образом, качественный и сложный код сам по себе перестал быть мерилом уровня инженера и что должно придти этому на смену, пока непонятно. А какие методы работают у вас при управлении распределённой командой в эпоху AI-агентов? Что помогает, а что уже очевидно устарело?

THE END.
11 сентября 2026 г., Утрехт, Голландия.

Теги:
+6
Комментарии4
Биржа заказов Инфостарта: новые задачи по 1С со 2 по 9 сентября
Биржа заказов Инфостарта: новые задачи по 1С со 2 по 9 сентября

Со 2 по 8 сентября на Бирже заказов Инфостарта появились новые заказы для разработчиков, аналитиков и консультантов 1С. Среди задач — доработка конфигураций, интеграции, перенос данных, автоматизация учета и консультации.

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

Теги:
+7
Комментарии0

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

🤔 Как не терять requestId в логах не пробрасывая его через параметры методов?

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

import { scoped } from "di-scoped";

export interface IRequestContext {
  userId: string;
  requestId: string;
  serviceName: "mobile" | "desktop";
  version: number;
}

export const RequestContextService = scoped(
  class {
    constructor(readonly context: IRequestContext) {}
  }
);

export type TRequestContextService = InstanceType<
  typeof RequestContextService
>;

export default RequestContextService;

Согласно MVC, делается два слоя: View и Controller. На уровне view кладем requestId в контекст исполнения через RequestContextService.runInContext

import { inject } from "di-kit";

export class SocketViewService {
  readonly loggerService = inject<LoggerService>(TYPES.loggerService);
  readonly socketControllerService = inject<SocketControllerService>(TYPES.socketControllerService);

  public sendNewOrder = async (
    request: TRequest<{ room: string; orderId: string }>,
  ): Promise<TResponse<SendNewOrder>> => {
    this.loggerService.log("socketViewService sendNewOrder", { request });
    try {
      const data = await RequestContextService.runInContext(
//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        async () =>
          await this.socketControllerService.sendNewOrder(request.data),
        request,
      );
      return { status: "ok", serviceName: request.serviceName, version: request.version, userId: request.userId, requestId: request.requestId, data };
    } catch (error: any) {
      this.loggerService.log("socketViewService sendNewOrder error", { request, error: errorData(error) });
      return { status: "error", error: VerificationError.getErrorMessage(error), errorCode: VerificationError.getErrorCode(error), serviceName: request.serviceName, version: request.version, userId: request.userId, requestId: request.requestId };
    }
  };
}

Voila! Во всех вложенных сервисах к записи в лог будет приложен идентификатор requestId. Дополнительно, этот код позволяет сериализовать ошибки так, чтобы передавать их по шине gRPC

import { inject } from "di-kit";
import { createLogger } from 'pinolog';

const logger = createLogger("socket.log");

export class LoggerService {

  readonly requestContextService = inject<TRequestContextService>(TYPES.requestContextService);

  private get context() {
    if (RequestContextService.hasContext()) {
      // в лог - только конверт IRequestContext; scoped-контекст. но дебаггеру виден весь запрос
      const { serviceName, version, userId, requestId } = this.contextService.context;
      return { serviceName, version, userId, requestId };
    }
    return {};
  }

  public log = (topic: string, ...args: any[]) => {
    logger.log(topic, ...args, this.context);
  }

}
Теги:
+4
Комментарии0

Как не провалить пилот ESB: разберем два реальных сценария на онлайн-конференции

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

На практике вопросов гораздо больше.

  • Что именно включать в пилот?

  • Какие сценарии действительно показательны?

  • Нужно ли проверять только функциональность или еще производительность, мониторинг и удобство сопровождения?

  • Стоит ли отдавать пилот интегратору или пробовать силами внутренней команды?

15 сентября в 11:00 вместе с DATAREON проведем онлайн-конференцию «Архитектурная лаборатория: как выбрать ESB под вашу ИТ-архитектуру». Разберем не только возможности платформы, но и то, как организовать пилот так, чтобы он действительно помог принять решение.

Что будет в программе

Сергей Скирдин, технический директор «Белого кода», расскажет:

  • как сегодня выглядит российский рынок шин данных;

  • какие критерии стоит учитывать при выборе ESB;

  • в чем преимущества DATAREON Platform;

  • зачем пилотировать платформу на реальном ИТ-ландшафте;

  • какие задачи стоит закладывать в пилот.

Иван Макушов, аналитик Ikon Tyres, поделится опытом пилота с внешним подрядчиком:

  • как в компании подходили к выбору новой интеграционной платформы;

  • какие технические требования сформировали;

  • какие сценарии включили в пилот;

  • на что стоит обратить внимание при работе с интегратором..

Дмитрий Сидоренков, архитектор 1С «Уральской Агропромышленной Группы», расскажет про другой путь — пилот и дальнейшее внедрение внутренними силами:

  • почему одного обучения недостаточно, чтобы начать реальный проект;

  • какие специалисты нужны внутри команды;

  • почему хотя бы один человек должен быть глубоко погружен в проект;

  • где самостоятельной команде все же полезна внешняя экспертная поддержка;

  • как перейти от первого работающего обмена к самостоятельному развитию интеграций.

По сути, сравним два сценария:

пилот с подрядчиком
и
пилот внутренней командой.

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

15 сентября, 11:00 по МСК

Участие бесплатное, нужна регистрация.

Регистрация

Теги:
0
Комментарии0

🤡 Новый фреймворк на NodeJS

Это не draft, а работающий код из прода. Посмотрите код сервиса, код http контроллера и код декларации

Шутки шутками, а существующие реализации DI на ноде либо перегружены, либо используют декораторы, для которых нет единого стандарта у старого и нового кода.

import { provide, inject } from "di-kit";

export class WalkerLogicPublicService {

  private readonly loggerService = inject<LoggerService>("loggerService");

  ...

}

...

provide("loggerService", () => new LoggerService());

Вот почему нельзя просто вот так? Никаких минусов нет, выносите типы в enum, создавайте изолированные пространства имен.

import { createActivator } from "di-kit";

export const { init, inject, provide } = createActivator("separate-scope");
Теги:
+8
Комментарии0

RAG (Retrieval-Augmented Generation) — подход, при котором генеративные модели ищут ответы не только в своей внутренней «памяти», но и в ваших данных через векторный поиск и используют их для ответа. Так вы получаете более точные результаты без дообучения модели.

На бесплатном вебинаре «Создание RAG-системы на базе Qdrant» покажем процесс создания RAG-системы с использованием векторной базы данных Qdrant.

📆 Когда: 10 сентября в 18:00 (Мск)
👨‍🎓 ️Спикер: Елисеев Илья, эксперт в области Python и машинном обучении, анализе данных и бизнес-процессов

Вы узнаете:
👾 Что такое RAG и как расширить «память» генеративных моделей без их дообучения.
👾 Типы векторных данных. Полнотекстовый и семантический поиск.
👾 Чанкинг данных: как разбивать текст на части для эффективного поиска.
👾 Основы работы с Qdrant: установка, настройка и использование.
👾 Создание RAG-системы: пошаговое руководство по интеграции генеративной модели с Qdrant.
👾 Практика: пример создания RAG на базе редких литературных текстов и LLM.

✍️Записаться

Теги:
+4
Комментарии0

Как оптимизировать хранение строк в ClickHouse

Помню как-то спорили с дата-инженерами, стоит ли использовать LowCardinality в DDL-запросах на создание объектов или это бесполезная фича и особого профита вообще не дает. С их стороны даже исследование какое-то было проведено. Как итог, LowCardinality стали использовать, но никто так и не смог наглядно показать в чем его преимущество.

На самом деле достаточно провести несколько тестов и все становится очевидно.

Создадим две таблицы. В одной тип данных определим как String во второй LowCardinality:

-- Таблица с обычным String
CREATE TABLE test_string (
    id UInt64,
    category String
) ENGINE = MergeTree()
ORDER BY id;

-- Таблица с LowCardinality
CREATE TABLE test_low_cardinality (
    id UInt64,
    category LowCardinality(String)
) ENGINE = MergeTree()
ORDER BY id;

Загружаем в каждую по 100 млн строк:

-- Заполняем первую таблицу (это займет пару секунд)
INSERT INTO test_string
SELECT 
    number AS id, 
    concat('category_name_', toString(number % 50)) AS category
FROM numbers(100000000);

-- Заполняем вторую таблицу такими же данными
INSERT INTO test_low_cardinality
SELECT 
    number AS id, 
    concat('category_name_', toString(number % 50)) AS category
FROM numbers(100000000);

Смотрим сколько данные занимают на диске:

SELECT 
    table,
    column,
    type,
    formatReadableSize(data_uncompressed_bytes) AS uncompressed_size,
    formatReadableSize(data_compressed_bytes) AS compressed_size_on_disk
FROM system.columns
WHERE table IN ('test_string', 'test_low_cardinality') 
  AND column = 'category'
ORDER BY table;

table               |column  |type                  |uncompressed_size|compressed_size_on_disk|
--------------------+--------+----------------------+-----------------+-----------------------+
test_low_cardinality|category|LowCardinality(String)|95.68 MiB        |750.46 KiB             |
test_string         |category|String                |1.56 GiB         |9.19 MiB               |

Можно заметить невооруженным глазом, что с LowCardinality данные на диске (compressed_size_on_disk) занимают в разы меньше места чем если бы мы просто хранили их в String. При распаковке данных (uncompressed_size) при чтении LowCardinality также сильно выигрывает. В оперативку будет загружено на порядок меньше данных, следовательно и сами запросы должны будут выполняться быстрее.

Проверим это на простых запросах на агрегацию:

-- Без LowCardinality
SELECT 
    category, 
    count() AS cnt
FROM test_string
GROUP BY category;

50 rows in result, 0.10 sec.
100.0%, Read 100.00 million rows, 2.38 GB
-- С LowCardinality
SELECT 
    category, 
    count() AS cnt
FROM test_low_cardinality
GROUP BY category;

50 rows in result, 0.02 sec.
100.0%, Read 100.00 million rows, 100.00 MB 
 

Запрос с LowCardinality выполнился в 5 раз быстрее и задействовал всего 100 MB RAM против 2.38 GB.

Вот и говорите потом, что LowCardinality не дает профита.

P.S. Главное правило: используйте LowCardinality только для полей с небольшим количеством уникальных значений (статусы, категории, типы). Для уникальных ID или URL он только навредит.

Ссылка на доку.

Мои статьи по ClickHouse на Хабре.

Теги:
+4
Комментарии0

Если вы знакомы с ISA-L, Jerasure, Leopard-RS, klauspost/reed-solomon, то полагаю пояснений к картинке выше не нужно, вот ссылка -- забирайте.

Ну а теперь некоторые пояснения: выше перечислены известные библиотеки, реализующие коды Рида-Соломона под CPU для задачи стирания, т.е. у вас есть k блоков, вы к ним добавляете еще n-k блоков и получаете право потерять любые n-k блоков изn, РС код позволит восстановить потерянное. РС код состоит из нескольких рутин с многочленами, реализация за \mathcal{O}(n^2) -- уровень сложного практического задания на курсе по вычислительной алгебре. В теории еще с 80-х годов было подозрение, что эти рутины можно полностью сделать на основе FFT, получить вычислительную сложность хотя бы \mathcal{O}(n\log^2k) и быстрый алгоритм на его основе. На практике с этим было много проблем, первая и по большому счету единственная практическая реализация со сложностью \mathcal{O}(n\log k) появилась в 2016 году в Leopard-RS на основе работы Лина-Чуна-Хана и соответствующего FFT-подобного преобразования (LCH transform). В этом году вышел обновленный алгоритм от авторов исходного подхода с улучшенным декодером, реализация доступна тут. Моя роль тут инженерная: я скрестил Leopard с XDRS, добавил GFNI, отполировал интерфейс и получил

  • Совместимый с Leopard РС код с произвольными параметрами (Leopard только поддерживает только 2k\geq n, у XDRS параметры должны быть степенями двойки)

  • Выделенные интерфейсы для LCH преобразования и затьюненные вычислительные ядра под AVX2 и GFNI

  • Ускорение по сравнению и с Leopard, и с XDRS

  • Единый воспроизводимый бенчмарк

Спасибо за внимание

Теги:
+3
Комментарии0

Четвёртый день Летнего ТехФеста — в нашем влоге

Мы встретились в пространстве Garage Eight, чтобы поговорить об AI для работы. Доклады, живые дискуссии и тёплая атмосфера — всё это мы засняли для тебя.

Смотри видео, чтобы погрузиться в событие!

Ещё больше о мероприятиях — в нашем TG-канале.

Теги:
+3
Комментарии0