haiodo.blog
Генери и выгоняй или как работать с людьми которые отстают от мира и только начали использовать ГЕНУ

Генери и выгоняй или как работать с людьми которые отстают от мира и только начали использовать ГЕНУ

История одного проекта

Вводная тема, или как я рулил роботами на ROS

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

Проект на Java + Go, все знакомо: на Go у меня года три коммерческой разработки, на Java лет пятнадцать. UI на React, и он мне тоже знаком, только нелюбим до отвращения. Ну что поделать, на чем просят, на том и пишем.

С Геной я в тот момент играл еще не очень активно. Был какой-то Qwen, тогда еще бесплатный, был GitHub Copilot с базовыми версиями Sonnet, а больше всего я пользовался Raptor, тоже в Copilot. Я коммитер в одном из проектов Linux Foundation (внезапно), поэтому Pro-доступ к GitHub у меня до сих пор есть.

Начал я потихоньку писать код системы, а в начале, как обычно, нарисовал mind map: вспоминаем мой инструмент и пользуемся. Но ехать на чистом Go/gRPC заказчик не решился. На роботах стоит ROS (Robot Operating System), поэтому туда водрузили rosbridge: он на питоне заворачивает этот протокол в websocket и передает все в виде JSON.

“Давайте сделаем нормально”, - говорил я. Но, как всегда, все считают себя самыми умными, и меня не услышали. Может, это моя проблема, и мир постоянно макает меня в это носом :-) В итоге огребли и настроили велосипедов вокруг rosbridge, потому что поначалу он зависал очень часто.

С этого момента начался мой первый опыт портирования кода с Opus. Буквально за неделю я получил работающего клиента к rosbridge на Go, портированного с open-source roslibjs. Думаю, с той же скоростью можно было написать его и с нуля по спецификации. Но модели тогда были туповаты, плотного опыта общения с ними у меня было мало, и казалось, что работающий код проще переложить на другой язык не только в своей голове, но и в голове модели. Так что портировал пофайлово. Получилась библиотечка на 10 тысяч строк на Go, и это казалось очень много. Наверное, я был наивным и все еще полностью привыкшим к ручному программированию.

Команда мастерит кривой велосипед из труб рядом с роботом

Потом я встроил ее в свое общее видение архитектуры, и поехало. Доделывать ее после пришлось совсем чуть-чуть, и она до сих пор ведет себя как нужно.

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

Что могу сказать в итоге: Spec Driven разработка себя оправдывает. Можно получить вполне работающий сервис, но его все равно приходится дописывать руками. И самое интересное, что написание кода - не главное. Много времени уходит на эксперименты и перебор вариантов архитектуры, чтобы получить решение, которое можно поддерживать. Решение, из-за которого тебя не дергают. Решение, которое просто работает и не тревожит.

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

Из интересного попутно: на основе turtlesim из ROS 2 Humble я сделал докер-образ с полноценным симулятором для QA. Почему-то QA никто не уважает. А я большую часть карьеры делал инструменты для разработчиков, и мне очевидно, что любой продукт нужно еще и правильно тестировать: проверить все сценарии и не посшибать себе нос по углам. Так что на выходе получились и инструменты для QA: можно развернуть весь стенд со всеми сервисами и прогнать все тесты.

QA-инженер на тестовой площадке с роботами-черепахами

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

Как отличить странного менеджера от нормального?

Думаю, все мы уже используем Гену, чтобы писать “драфтовый” код. Его нужно выверять и проверять, и только после этого куда-то пускать. Но это понимают еще не все. И вот пришел он, включил две свои подписки за Nx$, и поехало: 100% покрытие кода для фронта, полное покрытие e2e, +500 тестов, которые идут час на Mac mini M4 Pro. Думаете, кто-то в состоянии просмотреть все, что там генерируется?

Инженер у горы распечатанных тестов, менеджер кормит автомат подписками

Что еще печально, даже описания к пулл-реквестам он делает через модель. Я ему даже скинул свой скилл, чтобы он перестал писать слоп по 50 строк в описаниях git-коммитов и портянки строк в тестах. Но тщетно. Пока человек сам не поймет, никто ему ничего не объяснит.

Вот как это выглядит в цифрах. Обезличенная статистика по 24 репозиториям проекта с конца января по начало октября: коммиты по всем веткам без merge, сгенерированный код, lock-файлы и выгрузки не считаются.

код, якод, разработчик 1код, остальныетестысохранилось в основной ветке
050k100k150k200k250kЯ292 496 · жив. 69%Разработчик 1221 854 · жив. 33%Разработчик 292 012 · жив. 38%Разработчик 386 298 · жив. 34%Разработчик 468 706 · жив. 52%Разработчик 555 061 · жив. 60%Разработчик 647 588 · жив. 57%Разработчик 744 237 · жив. 49%Разработчик 840 767 · жив. 40%Разработчик 920 677 · жив. 32%Разработчик 1012 253 · жив. 32%

Полоса показывает, сколько строк кода и тестов участник добавил за все время, светлая часть - тесты. Риска на полосе - сколько его строк живет в основных ветках сейчас, по git blame. Разработчик 1 - это и есть тот самый менеджер. Он начал коммитить 21 августа и за шесть недель добавил почти половину всех строк тестов проекта (48%). В основных ветках из его кода осталось 20%, из тестов - 37%. У меня 65% и 75%. И это без 5,5 миллиона строк CSV-выгрузок, которые он закоммитил вдобавок: это 96% всех его добавленных строк.

яразработчик 1остальные вместе
020k40k60k80k100kфевмарапрмайиюниюлавгсен34 62127 00993 093

По неделям видно, как это происходило: до конца августа линия разработчика 1 лежит на нуле, а потом за одну неделю он добавляет 93 тысячи строк. Остальные участники вместе, не считая меня, ни за одну неделю не добавляли больше 35 тысяч.

Что еще настораживает: некоторые люди считают, что 100-процентное покрытие гарантирует качество. Да как бы нет :-) На моей практике раньше такое покрытие было недостижимо, и при этом выпускали вполне качественные продукты. А тут вуаля, захотелось 100%.

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

Предрассудки multi-repo и как с ними бороться

Что было мучительно больно. В Платформе у нас один репозиторий, из которого мы собираем весь продукт. В этом есть плюсы: всегда понятно, что стоит версия v0.8.x и все компоненты в ней свежие. Накладных расходов на сборку чуть больше, зато всегда можно по одной версии проверить и найти, что и где сломано.

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

Цирк с конями: разработчики на моноциклах, каждый у своего контейнера

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

Заключение

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