AREALAB: барахолка для рыбаков за один день и вечер с законами
Как из чата со звонками за день вырос Авито для рыбаков, почему переписку пришлось хранить иначе, чем в Кукареке, и что случается с вайбкодером, когда он открывает законы.
Утром у меня был Кукарек: анонимный чат со звонками, который неделю учился звонить. Вечером у меня было второе приложение: барахолка для рыбаков с объявлениями, переписка и звонки в которой взяты из первого. Рассказываю, как так вышло и где я споткнулся.
Форк вместо второго раза
Запрос был простой: Авито, но только про рыбалку, и чтобы звонить продавцу можно было, не показывая номер. Звонки у меня уже были. Неделю назад я разобрал их до винтиков, пока чинил «гудки в пустоту» и «соединились, но молчим». Писать это второй раз было бы преступлением.
Поэтому первый шаг был не «создать проект», а «скопировать Кукарек и выкинуть лишнее». Случайный собеседник ушёл первым: в барахолке некому и незачем искать «первого, кто тоже ищет». Обмен никами ушёл следом. Осталось ядро: соединение, переписка, звонки, пуши и фильтр всякой дичи.
Тут выяснилась приятная вещь. Пока я неделю чинил звонки в Кукареке, каждую починку я закрывал тестом. Скопировал, запустил набор тестов, всё зелёное. Звонилка заработала в новом проекте раньше, чем я успел придумать ему название. Вот ради этого стоит доводить баги до конца, а не затыкать.
Одно дерево категорий на всех
Первое настоящее решение в новом проекте оказалось не про экран, а про список: удочки и спиннинги, катушки, приманки, лески и шнуры, крючки и оснастка, лодки, моторы, эхолоты, одежда, хранение. У каждой категории подкатегории.
Соблазн был описать этот список дважды: на сервере для проверки объявлений и в приложении для плиток и фильтров. Два списка обязательно разъедутся: в одном добавили «ледобуры», в другом забыли. Поэтому дерево одно, и сервер, и приложение читают его из одного места. Скучное решение, но именно такие потом экономят вечера.
Сообщение знает, о чём разговор
В обычном мессенджере переписка это переписка. В барахолке это переписка об объявлении. Когда у продавца пять лодок и десять покупателей, «здравствуйте, ещё актуально?» без контекста бесполезно.
Поэтому первое сообщение в чате несёт карточку объявления, а в шапке чата она висит постоянно: фото, название, цена. Мелочь, но без неё продавец начинает каждый разговор с «вы про какую?».
Почему переписка хранится не как в Кукареке
В Кукареке история живёт на телефоне, а сервер помнит недоставленное сутки и стирает. Для анонимного чата это правильно: меньше хранишь, меньше можно утечь.
Для барахолки это катастрофа. Ты договорился о цене, о месте встречи, продавец скинул фото царапины на моторе, а через сутки этого нет. Или ты открыл приложение на другом телефоне, а там пусто.
Здесь переписка хранится на сервере: список чатов, история, отметки о прочтении, фото. Это первое место, где два проекта разошлись сознательно, и я записал это в протокол отдельной строкой, чтобы через месяц не «починить» одно по образцу другого.
Заодно закрыл дыру, которой в Кукареке не было, потому что там не было хранения: фото в чате нельзя отдать тому, кто в этом чате не участвует. Проверка есть, тест на неё есть.
Демо-данные, без которых нельзя разрабатывать
Пустая барахолка выглядит как пустая барахолка: серый экран и надпись «объявлений нет». Проверять на ней вёрстку невозможно.
Поэтому появилась команда, которая заводит шесть выдуманных продавцов из разных городов и по пять объявлений у каждого: «Коптильня горячего копчения, нержавейка. Коптил пару раз, была бы рыба». Все имена и объявления выдуманы, команда работает только локально. На боевом сервере ей делать нечего, и она об этом знает.
Утром «Рыбанутые», вечером AREALAB
Проект родился под названием «Рыбанутые». К вечеру пришёл логотип: белые буквы AREALAB на голубом. Переименование заняло час, потому что цвет бренда живёт в одном файле, а название не размазано по кнопкам. В первых коммитах проект до сих пор «Рыбанутые», и пусть.
Вечер с законами
А вот дальше вайбкодинг закончился.
В Кукареке регистрация по нику. Для барахолки в России так нельзя: аккаунт должен быть привязан к номеру телефона. СМС с кодом стоят денег, а стартовать хотелось бесплатно, поэтому вход через VK ID и Яндекс ID: они отдают проверенный номер даром. Ещё два сервиса проверил: один вообще не пускает чужие приложения, второй только по партнёрскому договору.
Дальше список рос сам собой: данные пользователей должны лежать в России; чат и звонки делают тебя «организатором распространения информации»; в приложении нужны согласие, политика, соглашение и правила размещения; в пушах не должно быть ни текста, ни ников, потому что они уходят через Apple; звонки не должны ходить через иностранные серверы, которые видят пользователей.
Из этого списка что-то сделано сразу: пуши стали «Новое сообщение» без деталей, звонки идут только через свой сервер, номер телефона не попадает ни в один ответ приложения, документы написаны, а в журнале сервера нет ничего личного. Что-то ждёт релиза: переезд сервера. Я за вечер прочитал больше законов, чем за всю жизнь, и по-прежнему считаю, что интерфейс проектировать приятнее.
Запрещённые товары
Рыболовная барахолка обязана уметь говорить «нет». Сети, электроудочки и прочее браконьерское не продаются. Проверка при размещении: явное отбивается сразу с объяснением, спорное уходит на ручную проверку, и пока объявление проверяется, его видит только автор. Тест, который пытается продать электроудочку, есть и падает, если проверку случайно сломать.
Что помогло
Два инструмента, без которых день был бы длиннее.
Первый: аргументы запуска для отладочной сборки. Симулятор с командной строки умеет снимать экран, но не нажимать кнопки. Поэтому приложение можно запустить сразу на нужной вкладке, в нужной категории или в чате с нужным продавцом, и снять экран. Все скриншоты на этом сайте сделаны так, руками ничего не нажималось.
Второй: у каждого теста свой сервер на своём порту и свой предел времени. Один раз прогон завис на тесте, который ждал ответа от сервера, а тот ждал его. Полчаса на то, чтобы понять, почему тесты «идут», и одна строка, чтобы это больше не повторилось.
Итог дня
Тридцать с лишним коммитов, приложение в TestFlight, набор тестов зелёный, документы написаны. Дальше: вход через настоящие VK ID и Яндекс ID вместо тестового, переезд сервера и релиз. И, видимо, ещё один вечер с законами. Но это уже другой пост.
Комментарии
Пока никто не написал. Будь первым.