20 000 000
Финансы, инвестиции, банки
Россия, Волгоград
Апрель 2025
Основная идея клиента заключается в том, что человек — существо социальное. Наш вид не достиг бы сегодняшнего положения, если бы каждый действовал в одиночку. Мысль не новая. В мире более 450 краудфандинговых платформ и, если доверять Википедии, существует такой тип финансового донорства уже 100 лет. Уникальность именно нашей платформы была и есть в win-win стратегии: чтобы получить финансы на свой проект, нужно донатить другим пользователям.
Мы разрабатывали платформу не с нуля: помимо своего видения, клиент принёс уже рабочий прототип. Но между прототипом и рабочим сервисом — огромное поле для трансформации, поэтому первой задачей было оценить фронт работ.
Мы провели нагрузочное и регрессионное тестирования. Выяснили, что прототип способен стабильно обслуживать максимум 100 пользователей одновременно. Кроме того, обнаружили множество визуальных багов при открытии сайта в разных браузерах и на разных мобильных устройствах.
Мы обсудили результаты с клиентом и оказались единодушны в решении: mvp нужен глобальный upgrade. Его нужно было делать более надёжным, производительным, расширяемым. Начали с того, что:
1. Обновили версию Python;
2. Проанализировали код с помощью SonarCube и исправили замечания;
3. Сделали CI/CD через GitLab;
4. Настроили Nginx + Gunicorn.
Изначально в команде было 6 человек:
1 project-менеджер
2 тестировщика + 1 QA-лид;
3 python-разработчика;
1 frontend-разработчик;
1 бизнес/системный-аналитик.
Спустя 5 месяцев команда выросла уже почти вдвое: добавились 3 разработчика на Python, один QA-инженер и один фронтендер. В дальнейшем количество специалистов в команде колебалось в районе 10 –12 человек.
Процессы постепенно менялись, адаптируясь к текущим нуждам. Сначала работали по Scrumban. В начале спринта собирались с заказчиком, слушали его пожелания и оборачивали всё это в задачи. Каждой задаче выставляли приоритет:
0 — задача 100% должна быть сделана в этом спринте;
1 — когда заканчиваем с нулевым приоритетом, занимаемся этим;
2 — было бы неплохо начать действия по этой задаче;
3 — задача уходит в бэклог.
Затем договаривались о датах релиза и приступали.
Когда проект вышел в прод, то появился поток пользователей, от которых поступала обратная связь. Нам потребовалась более жесткая приоритизация, чтобы оперативно реагировать на пользовательский фидбек.
Технологически мы работали по GitFlow, с CI/CD на базе Gitlab и обильным тестированием: более 700 тестов только на backend, в целом покрытие более 80% функционала.
Антон Седов, технический директор в wpp.digital (ex- WEB++)
«Технологически мы работали по GitFlow, с CI/CD на базе Gitlab и обильным тестированием: более 700 тестов только на backend, в целом покрытие более 80% функционала. При сборке релиза прогон автотестов занимает где-то полчаса — довольно долго, зато точно знаешь, что ничего не сломалось».
Frontend на Vue + Vuex. Backend — Python 3.9, FastAPI. Backend написан максимально асинхронно. База данных — PostgreSQL 14.
Изначально использовался GraphQL, но мы быстро поняли, что это не наш вариант. У платформы нет мобильного приложения, единственный вид клиента — это сайт, поэтому запросам не нужна гибкость, которую предоставляет GraphQL. А гибкость даётся не бесплатно — это человеко-часы труда, которые при таком раскладе уходили бы впустую. Поэтому мы перешли на старый добрый REST.
Впоследствии по сравнению с прототипом добавилось много интересного. А именно:
1. Server-side rendering для лендинга с помощью Nuxt и NodeJS. Последний выступает прослойкой между клиентом и основным сервером и занимается исключительно SSR. Серверный рендеринг ускоряет загрузку лендинга и дружит с поисковиками — сайт поднимается в выдаче и становится более отзывчивым.
2. Чат на сокетах и Redis Pub/Sub, где пользователи могут общаться в реальном времени. Для платформы, основанной на социальных механиках, чем больше социальности, тем лучше.
3. Последним добавился RabbitMQ для тяжёлых фоновых задач. Используя брокер сообщений, можно запускать их асинхронно, не блокируя сервер — это повышает доступность платформы, позволяя ей быстро обрабатывать пользовательские действия.
У клиента были причины не запускать продукт пока не будут идеально реализован функционал, включая дополнительные фичи. Для нас это был первый опыт, когда мы ориентировались только на результаты внутреннего тестирования и на данные фокус-групп. Это примерно как вести подводную лодку по перископу: вполне реализуемо, но с обзором на 360° было бы намного быстрее и точнее.
Дмитрий Шварев, project-менеджер в wpp.digital (ex- WEB++)
«Например, что касается адаптивной вёрстки, изначально мы ориентировались на iPhone 10 и выше. Небольшая вариативность размеров, простая задача. Но потом пришла фокус-группа с Android-устройствами, и мы сделали адаптив. А это уже совсем другая история: очень много вариантов размеров, соотношений сторон».
Большинство задач — это мелкие изменения UI. Но когда сервис сложный, одно изменение UI — это 4–5 мест в коде, которые надо скорректировать, а затем протестировать на разных устройствах. В результате мы выпустили тщательно проработанный продукт, но это заняло больше времени, чем могло бы.
В 2023 году случился драматический момент. Команда клиента решила подать проект на большую ежегодная конференция, в ней участвуют представители крупнейших компаний мира, знаменитости. Удачно выступить — значит заявить о себе, привлечь внимание и инвестиции.
В связи с поездкой на конференцию возникла необходимость срочно, буквально за неделю, добавить в интерфейс португальский и испанский. Хоть механизм интернационализации уже был, но добавление нового языка — трудоемкая задача в любом случае.
Дмитрий Шварев, project-менеджер в wpp.digital (ex- WEB++)
«У нас серьёзно относятся к work-life balance. Было понятно, что если не работать в выходные, то шансы успеть с переводами малы. Но всё было в добровольном порядке: предложили всем желающим поработать внеурочно за двойной оклад. И желающими вызвались практически все, кто был на проекте. И дело не в финансах — просто выступление на саммите стало бы первым осязаемым результатом долгой работы».
Уже после мы добавили автоперевод пользовательского контента — переводить его вручную было бы долго и дорого. Сначала хотели использовать бесплатный сервис и нашли подходящий API. Но когда стали тестировать — ахнули. Проекты вроде «Собрать деньги для жертв вулкана» или «Отдых на пляже» превращались в нечто странное: «Животное убежище», «Клоуны-убийцы», «Суицидальные мысли на Мальте»… В общем, языковая модель галлюцинировала. В итоге ушли в сторону API переводов Google.
Иногда проблемы не случаются, и это хорошо.
Плохая примета — релиз перед выходными. Очень плохая примета — релиз перед новогодними праздниками. Проект официально стартовал в конце декабря 2023 года, в четверг. Клиент запустил рекламу, и на сайт пошёл реальный пользовательский трафик.
Логичным продолжением этой истории могло стать то, как наши сотрудники выходят из-за новогоднего стола, чтобы срочно пофиксить баги или поднять упавший сервер. Но ничего такого не случилось: уже после праздников мы узнали, что всё прошло хорошо. Не зря мы писали столько тестов: первый блин не вышел комом, и при запуске ничего не сломалось.
После запуска команда клиента проанализировала работу платформы и пришла к выводу, что пора активнее привлекать новых пользователей. Тогда мы изменили стартовый пользовательский сценарий. Раньше всё начиналось с подписки, но на этом участке воронки терялось слишком много пользователей. Поэтому теперь всё начинается с доната.
Пользователь видит чью-то карточку, донатит и «примеряет» этот сценарий на себя: понимает, что и его также поддержат другие люди. Кроме того, сумма доната может быть меньше стоимости подписки, и на него легче решиться. В итоге процесс вовлечения пользователя становится более эффективным.
Сейчас проект полноценно функционирует и активно набирает пользователей и наращивает новый функционал.
Работа с платформой была интересна для нас не только с технической точки зрения — она заставила шире смотреть на мир. Мы буквально видели, о чём мечтают люди: открыть бизнес, собрать деньги на лечение, помочь животным, построить дом, поддержать жителей родной деревни. И это — далеко не все вдохновляющие примеры.
WPP.DIGITAL (ex WEB++) с удовольствием обсудит вашу задачу