Pull to refresh
29
German Gorelkin@justwack

Exploration And Exploitation

17
Subscribers
Send message

Экономическая выгода рефакторинга в эпоху AI-агентов

Reading time9 min
Reach and readers7.1K

Осваивая разработку с помощью AI-агентов, я написал веб-приложение для собственной ежедневной работы. Проект получился довольно сложным: с динамическим обновлением интерфейса и поиском, модальными окнами, автосохранением, интеграциями с внешними системами, модулями машинного обучения, текстовым анализом, фоновыми задачами и автоматическим деплоем. Объём кода составил около 150 000 строк, из которых примерно 120 000 написаны на Rust, а остальные - на TypeScript и Terraform.

Весь этот код сгенерировали агенты - в основном Claude Code и частично Cursor. За редкими исключениями я почти не открывал и не читал исходные файлы.

В процессе разработки я начал замечать странности. Когда в терминале мелькнула правка 4000-й строки в одном файле, я решил посмотреть на код ближе. Выяснилось, что слой доступа к данным разросся до 6000 строк. С каждой новой функцией он продолжал расти. В коде каждого запроса, чтения или записи повторялись настройка HTTP-запроса, кодирование и декодирование JSON. В итоге весь слой доступа к данным оказался в одном файле на 17 155 строк Rust.

Читать далее

Надёжная асинхронная коммуникация: повторы, дубликаты и dead letter queues

Reading time27 min
Reach and readers7.9K

Представим обычную обработку заказа. Сервис заказов публикует событие order.created. Сервис склада получает его и резервирует товар в PostgreSQL. После успешной транзакции обработчик должен отправить RabbitMQ подтверждение (Ack), чтобы broker удалил сообщение из queue.

Но процесс может остановиться после записи в PostgreSQL и до отправки Ack. RabbitMQ не знает, успел ли сервис зарезервировать товар. Broker видит только неподтверждённое сообщение, поэтому доставляет его ещё раз. С точки зрения доставки это правильное поведение. С точки зрения бизнеса один заказ теперь может зарезервировать товар дважды.

Другой сбой возникает раньше: PostgreSQL временно недоступен, и обработчик не может начать работу. Если сразу вернуть сообщение в queue через отрицательное подтверждение Nack(requeue=true), RabbitMQ почти немедленно доставит его снова. Пока база не восстановилась, все попытки будут бесполезными. Нужны задержка и ограничение числа повторов. При этом отложенное сообщение может пропустить вперёд более новые события, поэтому отдельно придётся решить вопрос порядка.

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

В статье разберём эти моменты по всему пути сообщения. Затем построим практическую схему для RabbitMQ и Go: добавим ограниченные повторы через retry queues, время жизни сообщения (TTL) и dead letter exchange, сделаем обработчик идемпотентным и определим, куда отправлять сообщения, которые не удалось обработать автоматически. В конце сравним этот подход с Kafka, NATS JetStream и Amazon SQS.

Читать далее

Greenfield и Brownfield: разработка новых и существующих систем в эпоху AI

Reading time17 min
Reach and readers10K

Новый сервис в пустом репозитории легко назвать greenfield. А если он должен заменить часть работающей системы, перенести данные за десять лет, сохранить старый API и пройти аудит? «Чистое поле» быстро заканчивается - обычно где-то между первой интеграцией и миграцией данных.

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

С распространением AI-ассистентов и coding agents это различие стало ещё заметнее. Они впечатляюще быстро создают приложение с нуля. Но сколько профессиональной разработки действительно начинается с пустого репозитория? Гораздо чаще нужно сначала понять существующую систему, а затем безопасно изменить её поведение.

Читать далее

TTPoE от Tesla на выставке Hot Chips 2024: Замена TCP для low latency приложений

Level of difficultyEasy
Reading time5 min
Reach and readers2.9K

Tesla решила адаптировать Ethernet к своим потребностям с помощью изменения протокола транспортного уровня. TCP был заменен на Tesla Transport Protocol over Ethernet, или TTPoE. TTPoE разработан как для обеспечения микросекундных задержек, так и для простой аппаратной нагрузки. Уровни нижнего слоя остались без изменений, что позволило протоколу работать через стандартные коммутаторы Ethernet.

Читать далее

Почему люди злятся из-за итераторов в Go 1.23

Level of difficultyMedium
Reading time8 min
Reach and readers23K

Недавно я увидел сообщение, демонстрирующее будущий дизайн итераторов для Go 1.23 (август 2024 года). Насколько я могу судить, многим людям этот дизайн не нравится. Я хотел высказать свои мысли по этому поводу как разработчик языка.

Читать далее

Потрясающе быстрые теневые стеки для Go

Level of difficultyMedium
Reading time7 min
Reach and readers5.7K

Программные теневые стеки могут обеспечить до 8 раз более быструю трассировку стека в Go рантайме по сравнению с раскруткой указателя фрейма, которое было реализовано в go1.21. Это не означает, что данная идея должна сразу же вырваться из лаборатории, но она предлагает интересный взгляд на потенциальное будущее трассировки стека с аппаратным ускорением через теневые стеки.

Читать далее

Дизайн высоконагруженных приложений будущего. Путешествие без сценария с Мартином Клеппманом

Level of difficultyEasy
Reading time19 min
Reach and readers3.7K

Jesse Anderson, директор Big Data Institute, и Martin Kleppmann, автор книги «Высоконагруженные приложения. Программирование, масштабирование, поддержка», вместе исследуют меняющийся ландшафт обработки данных. Они начинают с истории создания книги Мартина, подчеркивая важность искусства задавать правильные вопросы. Мартин рассказывает об изменениях, произошедших в отрасли с 2017 года, подчеркивая рост облачных сервисов. Затем беседа приобретает новый поворот, когда Мартин погружается в академические круги, делясь своими соображениями о программном обеспечении для совместной работы на основе локального подхода и увлекательном мире Automerge. Начинающие инженеры‑программисты получат несколько советов о том, как найти тонкий баланс между простотой и гибкостью. В завершение обсуждают о различных карьерных путях в динамичной сфере инженерии данных, что делает разговор полезным для профессионалов на любом этапе их пути.

Читать далее

Эффективные трассировки в Go

Level of difficultyMedium
Reading time6 min
Reach and readers5.9K

Пакет runtime/trace содержит мощный инструмент для понимания программ Go и устранения неполадок. Функциональность внутри позволяет создавать трассировку исполнения каждой горутины за определенный период времени. С помощью go tool trace command (или превосходного инструмента gotraceui с открытым исходным кодом) можно визуализировать и исследовать данные в этих трассировках.

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

Читать далее

Что нового в планировщике / оптимизаторе запросов Postgres 16

Level of difficultyMedium
Reading time18 min
Reach and readers8.6K

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

Если вы посмотрите на PG16 release notes, то увидите некоторые из этих улучшений. Но из-за объема изменений, вносимых в каждом выпуске PostgreSQL, невозможно предоставить достаточно подробную информацию о каждом изменении.

В этом посте вы получите глубокое представление о 10 улучшениях, внесенных в планировщик запросов PostgreSQL 16. Для каждого из улучшений будет сравнения выходных данных планировщика PG15 и PG16, а также примеры того, что изменилось, в виде автономного теста, который вы можете попробовать сами.

Читать далее

Алгебраические Типы Данных

Level of difficultyEasy
Reading time3 min
Reach and readers10K

Что же такое Алгебраические Типы Данных(Algebraic Data Types(ADT))? Обычно определение состоит из терминов теории типов и обязательно с примером на Haskell. Но на практике всё не так сложно.

Читать далее

Profile-guided optimization в Go 1.21

Level of difficultyMedium
Reading time16 min
Reach and readers4.6K

В Go 1.20 была выпущена предварительная версия profile-guided optimization (PGO), которую пользователи могли протестировать. После устранения ограничений в предварительной версии и дополнительных доработок благодаря отзывам и вкладу сообщества, PGO в Go 1.21 готова к использованию!

Читать далее

Не без паники в Go

Reading time8 min
Reach and readers18K

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

Читать дальше →

Итерируемый объект, итератор и генератор

Reading time10 min
Reach and readers222K
Привет, уважаемые читатели Хабрахабра. В этой статье попробуем разобраться что такое итерируемый объект, итератор и генератор. Рассмотрим как они реализованы и используются. Примеры написан на Python, но итераторы и генераторы, на мой взгляд, фундаментальные понятия, которые были актуальны 20 лет назад и еще более актуальны сейчас, при этом за это время фактически не изменились.


Читать дальше →

Мемоизация и каррирование (Python)

Reading time4 min
Reach and readers54K
Привет, уважаемые читатели Хабрахабра. В этой статье попробуем разобраться что такое мемоизация и каррирование, и как эти методы реализованы в стандартной библиотеке Python.
Читать дальше →

Information

Rating
Does not participate
Registered
Activity