#рефакторинг

9 постов
пост №1902

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

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

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

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

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

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

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

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

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

пост №1863

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

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

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

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

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

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

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

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

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

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

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

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

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

пост №1644

Как мы помогли Вебиуму привести в порядок разработку; отчитываемся о целом годе своей работы.

Начали с большого старого проекта на руби, поддерживаемого аутсорсерами, а оставили отлично документированный и покрытый тестами (читай можно быстро пилить фичи) python+vue, технического директора и внутреннюю команду разработки.

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

Ура!

Хотите что-то подобное? Пишите мне в личку @samatg.

пост №1451

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

пост №1326

Вдохновляющая статья Coinbase о том, как они переписали свои приложения для iOS и Android на React Native и переформатировали команды под это. Перескажу основные тезисы.

Крупнейшая криптобиржа на свете, 56 миллионов пользователей в 100 странах, полтора миллиарда долларов прибыли в квартал.

200+ экранов, 30 мобильных разработчиков. Кросс-функциональные команды, которые поддерживали фичи, были такие: 8 человек, 2 бэкендера и 6 фронтов, по 2 на каждую платформу — 2 веб, 2 iOS, 2 Android. Цель перехода: из команд по 8 инженеров, сделать команды по 5, 2 бэкендера и 3 React Native.

Как сделали?

1. Не пытались переписать большое приложение по-частям (очень сложно интегрировать react native с нативой), а сделали отдельное приложение с самой сложной частью функциональности для небольшой части Pro-пользователей, чтобы проверить, возможно это вообще или нет — заняло 6 месяцев, всем понравилось.

2. На втором этапе, решили-таки попробовать впилить небольшой кусочек react native в старое приложение — добавили в основное старое приложение новый онбординг на react native из приложения Pro. Разработчикам было больно (вспомните статьи Airbnb), но за 6 месяцев справились.

3. Учитывая опыт из двух предыдущих шагов, переписали основное приложение на React Native за 6 месяцев, не пытались дружить нативу с react native.

4. Profit. Красивые числа о технических и бизнес-метриках смотрите в картинке ниже.

Пишут, что теперь и старые разработчики мобильных приложений и веб-разработчики сайта пишут код мобильных приложений на React Native — всего больше 100 комиттеров в репу.

Дальше собираются выделить общий уровень данных из веб-сайта на react и мобильных приложений на react native в общие библиотеки.

Их бы устами да мед пить! 🚀

пост №1063

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

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

Начнем мы с самых основ — с построения удобной среды разработки: настройка рабочего окружения бэкенд-разработчика должна занимать несколько минут, а не дней (docker, клон продакшен базы с вычищенными персональными данными, etc.)

Далее, заменим старую и неподдерживаемую систему фоновых задач gearman на celery и переедем на python3.

А вот дальше начинается круть: полный аудит текущих мобильных приложений и новая версия API, свободная от легаси. Самый сок: сейчас большая часть данных о пользователе хранится в json-ах внутри одной таблицы «users» — мы её распилим на кусочки. Меняем систему доставки обновлений на клиенты с long-polling на вебсокеты (заодно выпиливаем mongo с сотней гигабайт мусора).

Если всё это звучит для вас не как шум, а как интересные задачи и вызов — пишите мне в личку или на [email protected]. Обязательный список: django, celery, aiohttp (можно хотеть изучить, нужен для бэкенда чатов), postgres. Приложите код, который вы считаете лучшим в своей жизни.

Минусы:
- задачи часто меняются
- процесс ещё не устаканен
- нужно много прогать

Плюсы:
- можно участвовать в формулировке задач
- есть тестировщики и хороший сисадмин (devops)
- удаленка
- вы будете работать с АНТОНОМ ШУРАШОВЫМ.

пост №1029

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

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

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

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

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

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

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

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

——

Что делать?

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

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

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

———

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

пост №687

Долг совести я выполнил, теперь можно о приятном.

Установил вчера первую бету iOS 12 для разработчиков и не нашёл пока ни одного серьёзного глюка.

У меня на iPhone SE (маленькие руки) некоторые вещи раньше работали медленно. В iOS 12 все происходит мгновенно. Это магия какая-то. Конечно, без уменьшения задержек анимации не обошлось, но и объективные тормоза интерфейсов они убрали.

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

Мы в RAWG (4 разработчика, два бэка и два фронта), например, за прошлые две недели серьёзно прокачали фронтенд сайта, который до этого делался год:

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

Вообщем, мы собрали «низковисящие фрукты» и начинаем делать параллельно три (!) крупные задачи:

- AMP - чтобы из результатов поиска игры открывались мгновенно. Хитрость в том, чтобы поженить AMP с существующим сайтом на реакте: не переписывать все заново и не закопаться потом в поддержке;
- SEO - хотим быть первыми по «низкочастотным играм»;
- оптимизация «выбросов» времени ответа API (django) - отдельная большая история, которой мы обязательно поделимся.

Ура рефакторингу.

пост №232

Рассказываем, как переписали почти всё Android приложение и что из этого вышло (для программистов).
Спойл: статьи открываются быстрее, крешится меньше, программировать проще.
Ура Андроиду!

https://dev.meduza.io/%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B5-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BC%D0%B5%D0%B4%D1%83%D0%B7%D1%8B-%D0%BF%D0%BE%D0%B4-android-dda1902fff69