#технический долг

12 постов
пост №2073Разработка и инженерия

Интересно, что эта ситуация касается меня лично: у нас недавно появился необычный клиент. Он разрабатывает суперкрутого голосового ассистента: долина, раунды на десятки млн $, огромная кодовая база на млн строк, написанная целиком нейросетями, под предводительством одного основателя.

Наша задача — привести все это в порядок, стабилизировать, обеспечить развитие и масштабирование.

На текущий момент мы в основном пользуемся моделями от антропика, но как я могу быть уверен, что свежая модель не решит, что мы конкуренты?

пост №2047Управление и команды

22 апреля выступлю на конференции с докладом «ИИ справляется, техдир не нужен!(?)

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

Но 80% сложности начинается после первой версии. ИИ генерирует легаси со страшной скоростью, не умеет говорить бизнесу «нет», не несёт ответственности за обещания.

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

Среди других докладчиков — опытные техдиры, продакты и эйчары. Все будем говорить о роли руководителя в новой реальности.

Конференция называется «Управление ’26», пройдет 20-23 апреля онлайн, делают организаторы AI hard fork, в которой было очень классно! Бесплатно, но нужна регистрация. До встречи!

пост №2004ИИ и машинное обучение

Люблю статьи Антропика, в них чувствуется живой человек, а не только пресс-релизы, как у OpenAI.

В этот раз исследователи нащупали пределы того, на что способны «команды» из агентов, работающие автономно, без участия человека: 16 агентов в параллели, в течении 2000 сессий разработали компилятор языка Си на Rust. Компилятор успешно собирает ядро линукса, QUEMU, ffmpeg, sqlite, postgres, redis, успешно проходит 99% тестов компиляторов.

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

Звучит магически, но мне вся эта история напоминает очень крутую Машину Голдберга. Да, нейросети создают компилятор «самостоятельно», но рядом с ними 7 инженеров тратят несколько недель на филигранную настройку среды под это. Они следили, где модели затыкаются и корректировали упряжь, в первую очередь тесты и инфраструктуру, чтобы в следующий раз их не занесло.

Работу по написанию кода они заменили на работу по настройке упряжи.

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

Это классическая ситуация, в которой оказываются команды со слишком большим техническим долгом. Тот самый легаси! Меня регулярно зовут делать аудиты и приводить такие системы в порядок, до боли знакомая картина.

В видео-анонсе Антропик пишет, что то, что заняло бы у команды людей месяцы, нейросети сделали за 2 недели. Абсолютно верно! Обычные команды разработки доходят до такого жуткого состояния легаси за годы разработки. С помощью нейросетей можно заспридранить этот процесс за 2 недели с минимальным участием людей! И стоит всего 20 тысяч долларов на API запросы!

То есть на выходе мы имеем полурабочее легаси без какого-либо пути к улучшению. Только если в обычном легаси у нас есть хотя бы углубленное понимание задачи, то в этом случае всё понимание задачи ограничивается тестами, которые они взяли на стороне как вводные для проекта. И попробуй ещё найти задачу, для которой существуют настолько же хорошие (восхитительные) тесты, как для компиляторов; человечество вложило в них человеко-годы!

Как говорил персонаж в сериале Чернобыль: «3.6 roentgen—not great, not terrible».

Гораздо важнее траектория развития способней моделей. 4-я модель «Опуса» еле-еле генерировала работоспособный компилятор. 4.5 первым прошел крупные тесты, но не мог скомпилировать реальные проекты. 4.6 вышедший на днях может компилировать реальные проекты. Что сможет следующая модель?

Исследование очень классное и тональность статьи идеальная — без лишнего хайпа. Рекомендую первоисточник.

Иллюстрация — тот самый вечный цикл, в котором крутились агенты.

пост №1902Разработка и инженерия

Хорошая заметка про сервис уборки за вайбкодерами.

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

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

В такой ситуации профессия vibe code cleanup specialist («привожу в вайбкод в порядок») перестаёт быть шуткой. В статье есть ссылки на примеры и даже исследования.

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

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

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

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

Теперь эти «исторические здания» собирают с помощью роботов. :)

пост №1863Разработка и инженерия

Как перезапустить проект технически?

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

Они пользуются уже третьей версией своей платформы. Фронтенд на low-code платформе Bubble, бэкенд частично на flask и частично n8n. Всё работает, приносит пользу, проект поднял больше миллиона долларов инвестиций.

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

Первый порыв любого программиста — переписать всё с нуля. Благо, проект ещё не очень большой, за месяца 3–4 парой программистов, наверное, можно управиться. Составить список фичей, написать их заново, потушить сервис на пару часов, импортировать данные из старой системы в новую и запуститься.

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

В результате, в момент включения новой платформы в продакшен, точно возникнут проблемы, которые придется героически исправлять «прямо сейчас», в стрессе. Мало предсказуемости, о реальном объеме работы мы узнаем только в самом конце проекта, при попытке переключения. Мы такое не любим.

Правильный ход — это strangler fig pattern. Пишем небольшую обертку для старого бэкенда. Этот новый бэкенд действует как прокси — передает запросы к старому бэкенду, запоминая сами запросы и ответы. Дальше выделяем первые эндпоинты бэкенда, которые мы можем запрограммировать заново, красиво. Дублируем эти запросы пользователей в старый и новые движки. Сравниваем ответы нового движка с ответами старого, исправляем ошибки. Накапливаем информацию в новую, аккуратно составленную базу данных. И только после продолжительного тестирования на живых данных начинаем отдавать пользователю ответы нового бэкенда. Берем следующую пачку эндпоинтов и повторяем процесс.

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

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

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

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

На фотографии тот самый фикус-душитель опутывает дерево, как новый бэкенд опутывает старый.

пост №1815Управление и команды

Встречали это «вечное противостояние» между продактами и разрабами? Каждый думает, что лучше знает, что делать с продуктом:

— нам нужно сделать такую фичу, срок такой
— сорян, у нас всё сыпется, надо технический долг отдавать, сделаем через три недели
— тогда летят наши квартальные цели
— а у нас всё сыпется

Раньше я думал, это — «здоровый производственный конфликт». Теперь я считаю, что это — признаки «бытовой неустроенности», того, что с разработкой в компании есть проблемы. К сожалению, 90% команд живёт в этом состоянии.

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

Я приму участие в этом курсе — но об этом в следующий раз.

пост №1451Разработка и инженерия

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

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

Через 3-6 лет в компании уже 50 разработчиков. Продукт при этом практически не развивается, фичи доставляются разработкой в продакшен со скорость улитки. Добавьте к этому зарплаты разработчиков в 100-400 тысяч в месяц и вы можете представить, что чувствует бизнес. Почему так?

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

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

В общем, искать виноватого смысла нет, а варианты решений следующие:

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

2. Если же вам нужно развивать то, что есть — то впереди вас ждут пот и слёзы.

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

Нужно отдавать технические долги и приводить код в порядок. Технически, есть несколько основных подходов и обычно используется их комбинация. Подход первый: выделить изолированный кусочек проекта и переписать его «начисто», минимально затрагивая остальные части. Подход второй: начать писать тесты поверх функциональности, которая есть. И тд и тп. Это — исключительно сложная инженерная работа. В несколько раз сложнее, чем написать аналогичный проект с нуля. Плюс в том, что вы так потеряете меньше знаний, который вложили в продукт за эти годы.

Организационно, вам придётся выделять на это адское количество времени и сил. Речь о 30-50% времени ваших инженеров. Результаты, в плане увеличения скорости разработки, вы увидите через месяцы в лучшем случае. Другого пути я не знаю.

Также, имеет смысл добавить в команду новых опытных бойцов. Дело тут не только в технической компетентности, но и в отсутствии психологических «долгов», свежести и незамутненности взгляда, в четком мандате на перемены. Желательно, чтобы человек уже имел опыт подобного рефакторинга.

В общем, это — путь смелых.

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

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

пост №1448Разработка и инженерия

Мы перезапустили блоги на Снобе! Блоги — часть Сноба, где можно зарегистрироваться, заплатить и публиковать свои посты. Лучшие посты редакция продвигает на главной, вместе с редакционными статьями. У постов есть комментарии, которые могут оставить только подписчики. Это сообщество с богатой историей: в ходе работы я наткнулся на профиль Бориса Немцова!

Проект создавался как функциональный конкурент фейсбука в 2008 году, над ним работали несколько поколений программистов и за годы накопился огромный технический долг. Блоги медленно загружались; плохо отображались в мобилах; глючили, порой страницы совсем не открывались; часто, у подписчиков не получалось зайти в админку и опубликовать свои посты.

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

Мы планировали завершить перезапуск блогов за 6 месяцев, а заняло это все 8. Когда я примерно в середине проекта завел разговор о том, что очень стыдно и как вообще быть, Марина Геворкян, издатель Сноба, ответила мне следующее: «вы за 4 месяца сделали то, что мы не могли сделать 4 года».

В общем, горжусь нашими ребятами. Герои:
- Никита Алёшников, бэкенд-разработчик
- Фёдор Борщёв, технический директор
- Михаил Бурмистров, ведущий фронтенд-разработчик
- Вячеслав Набатчиков, бэкенд-разработчик
- Всеволод Скрипник, бэкенд-разработчик, руководитель проекта
- Денис Сурков, бэкенд-разработчик
- Владимир Тарановский, фронтенд-разработчик.

Отдельное спасибо Марине Геворкян за доверие и Валерии Тищенко за отличную продуктовую работу.

Дальше со Снобом планы такие: перевести оставшуюся редакционную часть сайта на эту же техническую платформу. Увидимся ещё примерно через полгода :)

P.S. Федя опубликовал подробную техническую статью о том, что мы делали под капотом. Рекомендую технарям!

P.P.S. Постараюсь больше не пропадать и рассказывать о том, что и как мы делаем по работе.

пост №1422Разработка и инженерия

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

Классный пример в тему — хороший сантехник быстро стал облачным инженером (первоисточник на английском). Статья хоть и с юмором, но на самом деле глубокая — доходчиво объясняет основные принципы работы системного инженера.

Проблемы у профессий тоже схожие: код и инфраструктура частенько пахнут и даже СМЕРДЯТ, это вам любой человек с опытом копания в старых системах подтвердит.

Если вы фронтендер, бэкендер или менеджер и хотите работать на не-вонючих проектах — пишите Феде. Мы расширяем свою команду.

пост №1029Управление и команды

Представьте, вы - столяр. Перед вами свободный рабочий стол, вокруг по порядку расставлены инструменты. Это рабочее место профессионала.

Теперь представьте: стол стоит на попах, чтобы не завалился — его подпирают инструменты; вокруг грязь.

К сожалению, отличить эти две ситуации в IT неспециалисту не просто.

Оценить скорость работы в IT, её объем — очень трудно.

Следите за качеством. Качество — надежный и заметный неспециалисту прокси инженерной культуры. Если качество страдает — значит под техническим капотом и в процессах есть проблемы.

> Очень классное исследование про врачей хирургов. Камеры записывали видео операций. Отличить хорошего хирурга от плохого может любой. У хорошего хирурга швы аккуратненькие, рука будто летает по полю. И пациенты выздоравливают лучше.

Почему ломается инженерная культура? Я знаю две основные причины:

1. Руководители не дают времени на наведение порядка. Вина в таком случае обычно не только на руководителе, но на и на инженере, который не смог донести важность _рефакторинга_ (это термин для наведения порядка в IT). Классический рецепт катастрофы: продакт знает, каких изменений хочет в продукте, а про технологии понимает мало, умеет убеждать; технари плохо доносят необходимость постоянных инвестиций в наведение технического порядка. Говорить с бизнесом о своей работе понятным языком — часть профессиональной компетенции программиста. 🧨 Быстрый способ: не доверять программистам, считать, что они идиоты и/или не иметь с ними диалога.
2. Технари недостаточно компетентны и оказываются погребены под сложностью монстра, которого сами соорудили. Бонус очки, если инженер имеет завышенную самооценку и/или боится признаться в ошибке.

——

Что делать?

Хорошо бы исправить ситуацию с текущими программистами. Они обладают знанием вашей системы, вашей предметной области. Это дорого стоит

Инженерная культура для программиста — это про самоуважение и уровень профессионального развития. Я не знаю, как вернуть самоуважение. Я не знаю, как вернуть человеку потерянное чувство брезгливости, продолжая находиться в грязи. .

Мой рецепт — избавиться от самых замученных и добавить «свежую кровь». Людей, которые ещё не привыкли мириться с проблемами. Людей, у которых есть четкий мандат и кредит доверия на то, чтобы привести дела в порядок.

———

Мне везло работать в компаниях, где с инженерной культурой всё ок. Сделать в Pure классно — для меня профессиональный вызов. Интересно и сложно.