Основная идея клиента заключается в том, что человек — существо социальное. Наш вид не достиг бы сегодняшнего положения, если бы каждый действовал в одиночку. Мысль не новая. В мире более 450 краудфандинговых платформ и, если доверять Википедии, существует такой тип финансового донорства уже 100 лет. Уникальность именно нашей платформы была и есть в win-win стратегии: чтобы получить финансы на свой проект, нужно донатить другим пользователям.
Картинка №1
Картинка № 2
Мы разрабатывали платформу не с нуля: помимо своего видения, клиент принёс уже рабочий прототип. Но между прототипом и рабочим сервисом — огромное поле для трансформации, поэтому первой задачей было оценить фронт работ.
Мы провели нагрузочное и регрессионное тестирования. Выяснили, что прототип способен стабильно обслуживать максимум 100 пользователей одновременно. Кроме того, обнаружили множество визуальных багов при открытии сайта в разных браузерах и на разных мобильных устройствах.
Мы обсудили результаты с клиентом и оказались единодушны в решении: mvp нужен глобальный upgrade. Его нужно было делать более надёжным, производительным, расширяемым. Начали с того, что:
Изначально в команде было 6 человек:
Спустя 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.
Впоследствии по сравнению с прототипом добавилось много интересного. А именно:
У клиента были причины не запускать продукт пока не будут идеально реализован функционал, включая дополнительные фичи. Для нас это был первый опыт, когда мы ориентировались только на результаты внутреннего тестирования и на данные фокус-групп. Это примерно как вести подводную лодку по перископу: вполне реализуемо, но с обзором на 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 года, в четверг. Клиент запустил рекламу, и на сайт пошёл реальный пользовательский трафик.
Логичным продолжением этой истории могло стать то, как наши сотрудники выходят из-за новогоднего стола, чтобы срочно пофиксить баги или поднять упавший сервер. Но ничего такого не случилось: уже после праздников мы узнали, что всё прошло хорошо. Не зря мы писали столько тестов: первый блин не вышел комом, и при запуске ничего не сломалось.
После запуска команда клиента проанализировала работу платформы и пришла к выводу, что пора активнее привлекать новых пользователей. Тогда мы изменили стартовый пользовательский сценарий. Раньше всё начиналось с подписки, но на этом участке воронки терялось слишком много пользователей. Поэтому теперь всё начинается с доната.
Пользователь видит чью-то карточку, донатит и «примеряет» этот сценарий на себя: понимает, что и его также поддержат другие люди. Кроме того, сумма доната может быть меньше стоимости подписки, и на него легче решиться. В итоге процесс вовлечения пользователя становится более эффективным.
Контент №3
Сейчас проект полноценно функционирует и активно набирает пользователей и наращивает новый функционал.
Работа с платформой была интересна для нас не только с технической точки зрения — она заставила шире смотреть на мир. Мы буквально видели, о чём мечтают люди: открыть бизнес, собрать деньги на лечение, помочь животным, построить дом, поддержать жителей родной деревни. И это — далеко не все вдохновляющие примеры.