🧑💻 Как не оставить археологию после себя
В прошлом посте была история про кодовую базу на Go, где код собирался и тесты проходили, но никто не мог объяснить, зачем половина всего этого существует. Такой долг это не грязный код, а решения, чья причина потерялась. Здесь разберём, что с ним делать и как писать, чтобы не плодить его самому.
Что автор сделал с унаследованным кодом
Он не стал чистить всё подряд, потому что 47 000 строк за пару недель не разберёшь параллельно с обычными задачами. Подход был такой.
• Middleware с мёртвым значением. Удалил сразу. ID запроса протаскивался сквозь четыре слоя ради библиотеки трейсинга, которой давно нет. Правка маленькая и однозначная, поведение не меняется.
• Несогласованность
• Избыточность
• Разделение
Это честный подход к чужому долгу. Чините то, в чём уверены. Документируйте то, в чём нет. И не поддавайтесь желанию вычистить всё, потому что чистка без понимания создаёт новый долг быстрее, чем гасит старый.
Пишите комментарии про «почему», а не про «что»
Go читается достаточно, чтобы понять, что делает код. Ценность в комментарии, который объясняет, почему выбран этот путь, на какое ограничение он отвечает и что должно измениться, чтобы подход перестал быть нужным.
Вот как выглядел бы тот самый legacy-фолбэк, если бы автор оставил после себя контекст:
Такой комментарий пишется три минуты и экономит полчаса тому, кто откроет функцию следующим.
Ставьте дату у технических решений
Комментарий
Трение на онбординге это сигнал долга
Если новому инженеру нужно больше дня, чтобы разобраться в пакете или границе системы, это трение несёт информацию. Код, в который тяжелее всего въехать, обычно и есть тот, где накопилось больше всего необъяснённых решений.
Убирайте абстракции, которые не можете объяснить
Если вы не можете в одном-двух предложениях сказать, зачем существует абстракция и какую проблему она решает, это пассив. Либо разберитесь и задокументируйте, либо удалите. Абстракция без объяснения это цена, которую платят при каждом следующем контакте с кодом.
Самое интересное в той истории было не то, что нашлась необъяснимая часть. А то, что разбор этой части показал историю системы. Где она стабильна, где её латали много раз, какие компромиссы в архитектуре были сделаны осознанно, а какие просто накопились. Чистая кодовая база такого знания не даёт. Археология медленная, но уроки складываются.
➡️ Оригинал
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoToProduction
В прошлом посте была история про кодовую базу на Go, где код собирался и тесты проходили, но никто не мог объяснить, зачем половина всего этого существует. Такой долг это не грязный код, а решения, чья причина потерялась. Здесь разберём, что с ним делать и как писать, чтобы не плодить его самому.
Что автор сделал с унаследованным кодом
Он не стал чистить всё подряд, потому что 47 000 строк за пару недель не разберёшь параллельно с обычными задачами. Подход был такой.
• Middleware с мёртвым значением. Удалил сразу. ID запроса протаскивался сквозь четыре слоя ради библиотеки трейсинга, которой давно нет. Правка маленькая и однозначная, поведение не меняется.
• Несогласованность
transport. Задокументировал, не трогал. Чтобы починить, нужно понять исходные настройки ретраев и актуальны ли они. Вместо правки он написал в пакете подробный комментарий. Что это, когда сделано, под что настроено, какой вопрос открыт. • Избыточность
sync2. Убрал частично. Четыре из семи мест с Pool спокойно заменялись на sync.Pool. Три остальных имели тонкие отличия, в которых он не был уверен. Убрал те, где был уверен, остальные пометил. • Разделение
cache и Redis. Оставил как есть. Самый запутанный кусок с наименьшим пониманием. Менять поведение, не зная, зачем оно, слишком рискованно.Это честный подход к чужому долгу. Чините то, в чём уверены. Документируйте то, в чём нет. И не поддавайтесь желанию вычистить всё, потому что чистка без понимания создаёт новый долг быстрее, чем гасит старый.
Пишите комментарии про «почему», а не про «что»
Go читается достаточно, чтобы понять, что делает код. Ценность в комментарии, который объясняет, почему выбран этот путь, на какое ограничение он отвечает и что должно измениться, чтобы подход перестал быть нужным.
Вот как выглядел бы тот самый legacy-фолбэк, если бы автор оставил после себя контекст:
// fetchWithLegacyFallback существует, потому что основной эндпоинт
// был нестабилен во время миграции БД в 2021 году.
// Legacy-эндпоинт только на чтение и медленнее, но стабилен.
//
// Статус (2023-06). Миграция завершена, но снятие фолбэка требует
// проверки, что стабильность основного эндпоинта закрепилась
// на новой инфраструктуре. Отслеживается в issue #1847.
func (c *Client) fetchWithLegacyFallback(ctx context.Context, req Request) (*Response, error) {
Такой комментарий пишется три минуты и экономит полчаса тому, кто откроет функцию следующим.
Ставьте дату у технических решений
Комментарий
// TODO: remove when migration complete почти бесполезен, если не знать, когда он написан. Вариант // TODO (2021-03): убрать после миграции, tracked in #1204 говорит, когда решение принято и где искать контекст. Через два года вы просто проверяете, закрыт ли issue #1204.Трение на онбординге это сигнал долга
Если новому инженеру нужно больше дня, чтобы разобраться в пакете или границе системы, это трение несёт информацию. Код, в который тяжелее всего въехать, обычно и есть тот, где накопилось больше всего необъяснённых решений.
Убирайте абстракции, которые не можете объяснить
Если вы не можете в одном-двух предложениях сказать, зачем существует абстракция и какую проблему она решает, это пассив. Либо разберитесь и задокументируйте, либо удалите. Абстракция без объяснения это цена, которую платят при каждом следующем контакте с кодом.
Самое интересное в той истории было не то, что нашлась необъяснимая часть. А то, что разбор этой части показал историю системы. Где она стабильна, где её латали много раз, какие компромиссы в архитектуре были сделаны осознанно, а какие просто накопились. Чистая кодовая база такого знания не даёт. Археология медленная, но уроки складываются.
📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Представьте: есть слайс на 10 MB, а нужны только первые 5 байт. Вы пишете
bigSlice = bigSlice[:5] и идёте дальше. Освободит ли сборщик мусора оставшуюся память после этой операции?Подсказка
[:5]📍 Навигация: Вакансии • Задачи • Собесы
#ReadySetGo
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🥱1
🤨 Как заставить AI-агента не ломать архитектуру, а нормально писать код?
Мы привыкли общаться с ИИ промптами, но для автономных систем это путь к бесконечным циклам и сливу бюджета. Чтобы убрать хаос, инженеры переходят на Spec-Driven Development (SDD).
Вот как этот подход меняет работу агента на практике:
🔹Контракт вместо текста. Сначала пишется строгая спецификация (JSON-схема/OpenAPI) и автотесты. Агент зажат в рамки интерфейсов, за которые физически не может выйти.
🔹Контроль на шагах. Внутри петли Think-Act-Observe агент сверяет действия со спецификацией.
🔹Саморефлексия. Если ИИ нарушил типы или «додумал» лишнее, тест падает. Агент получает ошибку в контекст и сам правит код, не выходя за рамки ТЗ.
Это лишь база того, как укротить ИИ-разработку. Если вы хотите глубоко внедрить эту методологию, научиться проектировать архитектурные контракты и собирать отказоустойчивые системы — оставляйте заявку на наш новый курс по Spec-Driven Development. Стартуем совсем скоро🙂
Мы привыкли общаться с ИИ промптами, но для автономных систем это путь к бесконечным циклам и сливу бюджета. Чтобы убрать хаос, инженеры переходят на Spec-Driven Development (SDD).
Вот как этот подход меняет работу агента на практике:
🔹Контракт вместо текста. Сначала пишется строгая спецификация (JSON-схема/OpenAPI) и автотесты. Агент зажат в рамки интерфейсов, за которые физически не может выйти.
🔹Контроль на шагах. Внутри петли Think-Act-Observe агент сверяет действия со спецификацией.
🔹Саморефлексия. Если ИИ нарушил типы или «додумал» лишнее, тест падает. Агент получает ошибку в контекст и сам правит код, не выходя за рамки ТЗ.
Это лишь база того, как укротить ИИ-разработку. Если вы хотите глубоко внедрить эту методологию, научиться проектировать архитектурные контракты и собирать отказоустойчивые системы — оставляйте заявку на наш новый курс по Spec-Driven Development. Стартуем совсем скоро🙂
📍 Навигация: Вакансии • Задачи • Собесы
#GoVisual
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Media is too big
VIEW IN TELEGRAM
🔥 Не называйте любого продвинутого чат-бота «ИИ-агентом»!
Дмитрий Юдин, руководитель AI/ML-направления в Сloud․ru, наглядно разбирает уровни абстракции ИИ-продуктов и убирает путаницу в понятиях.
Что внутри видео:
- Почему ассистент и агент принципиально разные сущности;
- Как ассистент может быть просто «обёрткой» над LLM, а может скрывать под капотом сложнейшую мультиагентную систему;
- Как понимать архитектуру глубже, чтобы проектировать сильные решения.
Начните создавать агентные системы с нашего бесплатного демо-урока. Всего за 2 часа разберем внутреннее устройство агента, научим его чинить свой собственный код и сохранять контекст после перезапуска.
🔗 Забрать бесплатный демо-урок
Дмитрий Юдин, руководитель AI/ML-направления в Сloud․ru, наглядно разбирает уровни абстракции ИИ-продуктов и убирает путаницу в понятиях.
Что внутри видео:
- Почему ассистент и агент принципиально разные сущности;
- Как ассистент может быть просто «обёрткой» над LLM, а может скрывать под капотом сложнейшую мультиагентную систему;
- Как понимать архитектуру глубже, чтобы проектировать сильные решения.
Начните создавать агентные системы с нашего бесплатного демо-урока. Всего за 2 часа разберем внутреннее устройство агента, научим его чинить свой собственный код и сохранять контекст после перезапуска.
🔗 Забрать бесплатный демо-урок
🔮 Прогноз для IT-рынка после 2027 года
Кажется, что рынок умер: вакансий меньше на 20-35%, зарплаты растут медленнее инфляции, hh-индекс в IT перевалил за 14. Но если наложить сегодняшний спад на три предыдущих цикла — доткомы, 2008-й и пандемию — картина выглядит иначе.
Что будет дальше: где ждать взрывного роста вакансий в 2028-2030, почему разрыв в зарплатах может достичь 50-120% и что делать в ближайшие полтора года, чтобы оказаться на правильной стороне этого разрыва.
➡️ Ответы в статье
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
Кажется, что рынок умер: вакансий меньше на 20-35%, зарплаты растут медленнее инфляции, hh-индекс в IT перевалил за 14. Но если наложить сегодняшний спад на три предыдущих цикла — доткомы, 2008-й и пандемию — картина выглядит иначе.
Что будет дальше: где ждать взрывного роста вакансий в 2028-2030, почему разрыв в зарплатах может достичь 50-120% и что делать в ближайшие полтора года, чтобы оказаться на правильной стороне этого разрыва.
📍 Навигация: Вакансии • Задачи • Собесы
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔2❤1🥱1
🛩 FlightRecorder в проде
В Go 1.25 в стандартную библиотеку завезли
Пара примеров:
▪️ Ловля хвостовых задержек
Мидлварь замеряет время обработки запроса, и если оно перевалило за исторический p95 (или прилетела 500-ка) — асинхронно дёргается снапшот.
Бинарный дамп улетает в S3, ссылка логируется в Grafana. Сработал алерт → кликнули по ссылке → скачали дамп →
▪️ Проблемы шедулера и GC
Всё, что живёт между сэмплами профайлера: залипания горутин, GC assist, вытеснение горутин с P — на трассе это видно, в профиле нет.
Но есть и обратная сторона: формат данных не дружит с Pyroscope и Datadog, поэтому дамп нельзя просто открыть в дашборде — приходится вручную гонять
💬 А вы пробовали FlightRecorder? Для чего включали, что нашли такого, чего не показал pprof, и как вытаскивали трейсы с прода?
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoToProduction
В Go 1.25 в стандартную библиотеку завезли
trace.FlightRecorder — кольцевой буфер трассировки, который постоянно крутится в памяти, а по команде Snapshot() отдаёт последние N секунд событий рантайма. Идея: сэмплирующий профайлер видит «среднюю температуру», а тут вы получаете полную картину именно того момента, когда всё пошло не так.Пара примеров:
▪️ Ловля хвостовых задержек
Мидлварь замеряет время обработки запроса, и если оно перевалило за исторический p95 (или прилетела 500-ка) — асинхронно дёргается снапшот.
Бинарный дамп улетает в S3, ссылка логируется в Grafana. Сработал алерт → кликнули по ссылке → скачали дамп →
go tool trace slow-trace.out. ▪️ Проблемы шедулера и GC
Всё, что живёт между сэмплами профайлера: залипания горутин, GC assist, вытеснение горутин с P — на трассе это видно, в профиле нет.
Но есть и обратная сторона: формат данных не дружит с Pyroscope и Datadog, поэтому дамп нельзя просто открыть в дашборде — приходится вручную гонять
go tool по конкретному поду. А когда подов больше тысячи, удовольствие ниже среднего. Инструмент мощный, эргономика — пока нет.💬 А вы пробовали FlightRecorder? Для чего включали, что нашли такого, чего не показал pprof, и как вытаскивали трейсы с прода?
📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥2🥰1😢1
Предложение №12854 висело в трекере с 2015 года и наконец получило статус accepted.
Теперь тип литерала можно будет опускать везде, где компилятор выводит его из контекста:
var x []string = {"a", "b", "c"}
return {}, err
compress.NewReader(r, {Level: compress.BestSpeed})
items = append(items, {id, obj, false})Запись
a := {1, 2, 3} останется ошибкой, слева нет явного типа и выводить нечего.Выигрывают табличные тесты, структуры опций и код с protobuf, где имена типов повторяются десятками. Спор о читаемости команда закрыла так.
gofmt не будет принудительно удалять типы, стиль сложится сам, а gopls получит подсказки, которые покажут пропавшее имя типа прямо в редакторе.В Go 1.27 фича не попадёт. Изменение в компиляторе простое, но нужно обновить экосистему инструментов, поэтому ориентир это Go 1.28.
📍 Навигация: Вакансии • Задачи • Собесы
Please open Telegram to view this post
VIEW IN TELEGRAM
🙏5❤3
📰 Дайджест недели
Здесь нет дождей, здесь только новости
— Go теперь компилирует TypeScript
Microsoft выкатила TypeScript 7.0 — компилятор целиком переписан с TS на Go. Итог: сборки быстрее в 8-12 раз при меньшем потреблении памяти на 6-26%
— Ускорение in-memory кеша до 8 раз
— Фреймворк, где файловая система это карта маршрутов
— Результат джуна близок к нулю
— Бонусы-призраки и грейды из параллельной вселенной
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoLive
Здесь нет дождей, здесь только новости
— Go теперь компилирует TypeScript
Microsoft выкатила TypeScript 7.0 — компилятор целиком переписан с TS на Go. Итог: сборки быстрее в 8-12 раз при меньшем потреблении памяти на 6-26%
— Ускорение in-memory кеша до 8 раз
— Фреймворк, где файловая система это карта маршрутов
— Результат джуна близок к нулю
— Бонусы-призраки и грейды из параллельной вселенной
📍 Навигация: Вакансии • Задачи • Собесы
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
Сервис сохраняет заказ в БД и сразу публикует событие
OrderCreated. Выглядит логично, но БД и очередь это две отдельные системы.Что может произойти: БД коммитилась, но публикация упала. Заказ есть, события нет. Клиент повторяет запрос из за таймаута. Событие публикуется еще раз. Нижестоящий сервис видит два события и создает два заказа вместо одного.
Сохраняем заказ и событие в одной БД транзакции. Отдельный диспетчер читает неотправленные события и публикует их позже. Если диспетчер упадет или повторится, событие уже в БД и не потеряется.
// В одной транзакции
BEGIN
INSERT INTO orders ...
INSERT INTO outbox ...
COMMIT
// Отдельно
func dispatchOutbox() {
events := store.GetUnsent()
for _, e := range events {
publisher.Send(e)
store.MarkSent(e.ID)
}
}
Каждое событие должно иметь уникальный ID. Потребители должны быть идемпотентные (игнорировать дубликаты). Outbox паттерн гарантирует, что событие не потеряется, но не гарантирует ровно одну доставку. Это нормально, если потребители правильно обрабатывают дубликаты.
Добавьте таблицу outbox. Вставляйте заказ и событие одной транзакцией. Запустите диспетчер, который периодически отправляет события из outbox. Добавьте уникальный event_id потребителям для фильтрации дубликатов.
Граница между микросервисами это самое опасное место. Outbox паттерн это простой способ сделать ее безопаснее.
📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3🥱3
🚀 Уже завтра стартует новый поток курса «ИИ-агенты»!
Мы собрали мощнейший состав преподавателей. Учить вас проектировать архитектуру и собирать продакшн-агентов будут инженеры и исследователи из топовых IT-компаний.
Старт уже завтра!
Сомневаетесь, подойдет ли вам программа и подача? Начните с бесплатного демо-урока!
Всего за 2 часа вы заглянете под капот ИИ-агента, поймете, чем мышление модели отличается от ее ответа, и научите систему чинить собственный код. Это идеальный способ протестировать нашу платформу перед покупкой.
🔗 Пройти демо-урок и занять место на курсе
Мы собрали мощнейший состав преподавателей. Учить вас проектировать архитектуру и собирать продакшн-агентов будут инженеры и исследователи из топовых IT-компаний.
Старт уже завтра!
Сомневаетесь, подойдет ли вам программа и подача? Начните с бесплатного демо-урока!
Всего за 2 часа вы заглянете под капот ИИ-агента, поймете, чем мышление модели отличается от ее ответа, и научите систему чинить собственный код. Это идеальный способ протестировать нашу платформу перед покупкой.
🔗 Пройти демо-урок и занять место на курсе
Собрали в карточках ошибки, которые можно отловить на код-ревью.
📍 Навигация: Вакансии • Задачи • Собесы
#GoVisual
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤3😢1😍1
🎸 Конференция, которая заканчивается концертом
ИТ-Пикник 2026 — это не только доклады. Музыкальный хедлайнер — LAB, шоу Антона Беляева и команды Therr Maitz: популярные треки в новых аранжировках с оркестром и хором. А ещё ИТ-Квартирник — отдельная сцена для музыкантов из мира технологий, где семь команд из опен-колла борются за право выйти на главную сцену с Pompeya.
➡️ Собрали всё, что известно о фестивале
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
ИТ-Пикник 2026 — это не только доклады. Музыкальный хедлайнер — LAB, шоу Антона Беляева и команды Therr Maitz: популярные треки в новых аранжировках с оркестром и хором. А ещё ИТ-Квартирник — отдельная сцена для музыкантов из мира технологий, где семь команд из опен-колла борются за право выйти на главную сцену с Pompeya.
📍 Навигация: Вакансии • Задачи • Собесы
Please open Telegram to view this post
VIEW IN TELEGRAM