Привет, Хабр! Я разработал помощника по поиску жилья HomeBro, который помог десяткам тысяч людей найти новый дом. Расскажу, с чем я облажался, а с чем – нет.
В 2019ом году я работал продактом в Яндекс.Погоде и мечтал запилить что-то свое. Начал смотреть, какие есть большие рынки и в чем их боль. Перебирая варианты, вспомнил, каким изнуряющим был для меня поиск съемного жилья.
Каждый раз на это уходило в районе 50 часов чистого времени, а ведь у меня даже домашних животных нет. Мне приходилось бесконечно рефрешить сайты объявлений – классные квартиры уходят быстро, а уведомления срабатывали не всегда и не быстро. Каждый раз когда в моем запросе что-то менялось, нужно было по несколько раз вводить настройки поиска на разных сайтах. Я ловил дубли одних и тех же квартир, просматривал тысячи фотографий с убитыми интерьерами.
Но разве нельзя по-другому? Это же тупая рутина, которую можно автоматизировать – оперативно собирать данные и присылать подходящие объявления не куда-то, а в любимый телеграм. Может быть, я не догадался поискать, и это уже давно сделано?
Стал гуглить. Нашел украинский телеграм-бот Arendom, который не пиарился и не имел большой аудитории, но собирал хорошие отзывы. Также увидел несколько западных чат-ботов в запрещенной синей сети. А в России… Нет, я нашел какие-то нерабочие остатки старых и очень примитивных попыток в этом направлении. Но ничего, что решало бы проблему. А ведь на дворе уже нейросети в полный рост, можно ну очень удобно все сделать.
Чтобы проверить, что я не один ощущаю проблему острой, поговорил еще с 30 людьми, которые недавно снимали жилье. Что ж, болит не у меня одного, а почти у всех. Надо делать. Сначала думал сделать бота на модели freemium, но вскоре понял, что не хочу, чтобы бот был платным – так можно будет помочь большему количеству людей. А монетизацию уж как-нибудь придумаю, по крайней мере рекламу точно можно будет показывать.
Название придумал быстро – HomeBro. Оставалось сделать. Как? Вспомнить, что программирование это кайф.
Недоразработчик со стажем
Я никогда не работал программистом. Да, я кодил на pascal в школе и C# в универе. Но серьезного ничего не делал, пока в 2015ом мы с друзьями не решили сделать платформу для онлайн-видеоконкурсов. Я на тот момент был проджект-менеджером, но решил разобраться в бекенде и управлении облачной инфраструктурой. Изучил Python и Djangо. Жесткость последнего неплохо структурировала архитектуру приложения в отсутствие у меня большого опыта.
Стартап не полетел, но мы немного подзаработали и получили тонну опыта. Ну а на сдачу я стал сертифицированным AWS Solutions Architect.
Сдуваем пыль со змеи
После первой попытки в стартапах я пошел в Яндекс качать свои продуктовые навыки. К моменту появления идеи HomeBro я уже 3 года почти не кодил, Pornhub заметно выигрывал у Github.
Тем не менее, я с разбега ворвался в разработку. Python решал все мои потребности – и в части бота, и в части парсинга. Да и если вкручивать в проект ML, тоже далеко ходить не надо. База данных – старина Postgres. У плохой вещи слона на лого не будет. К тому же было понятно, что придется много работать с геоданными (координаты домов и других объектов, области поиска и тд), а у Postgres для этих вещей есть замечательный модуль PostGIS.
Также показалось классным использовать AWS Lambda – сервис, который позволяет выполнить код по триггеру, и платить только за время исполнения кода. Бот работает в режиме вопрос-ответ, а в остальное время спит. Зачем серверу простаивать? Парсинг объявлений тоже запускается периодически. Да и мне в целом мне нравился serverless подход, не нужно поддерживать серваки. Из минусов – с Lambda не дружили популярные библиотеки для работы с Telegram. Ну да ладно, не так страшно завелосипедить отправку сообщений.
Для вызова Lambda-функций подключил такой же бессерверный API GateWay. Разве что для базы данных сделал обычный RDS-сервер, который уменьшает головняк с бекапированием и прочим. Хотел сначала поднять бессерверную RDS Aurora PostgreSQL, но ловил какие-то ошибки и в итоге просто забил на эту идею.
В целом за эти стартовые решения мне до сих пор не стыдно. Но вот что выглядит как деменция – то, что я начисто забыл про существование ORM. Начал писать все SQL-запросы к базе данных тупо текстом. Просто рукалицо. Забегая вперед, через пару месяцев я опомнился, вкрутил SQLAlchemy (популярная ORM на Python) и зажил как нормальный человек. А вскоре появился первый персонаж, который попытался дропнуть нашу таблицу с пользователями SQL-инъекцией =D
Первая версия сервиса появилась за месяц плотной работы. Бот присылал новые объявления только с ЦИАНа, было всего несколько фильтров – цена, кол-во комнат, метро.
В качестве стартового полигона была выбрана небезызвестная группа Flats for friends. Откровенно говоря, я не думал, что 74% пользователей запустят поиск. Для этого нужно было ответить на 4 вопроса бота, включая ручной ввод станций метро – это не пару кнопок нажать. Какая мотивация!
Но самое главное – люди начали советовать Бро друзьям и присылать донаты. Я постарался сделать бота “живым” и это дало эффект.
Нагрянули и риелторы, причем некоторые даже предложили купить мой проект. Я не был готов стать богатым так быстро, поэтому отказался.
Люди, которым не зашло, тоже были, но появление фанатов вселило оптимизм. Я увидел, что продукт полюбили.
Доработки
Я начал докручивать функциональность. Добавил еще несколько сайтов – Авито, Яндекс.Недвижимость и Домофонд. Последнее было лишним – не сразу понял, что Домофонд принадлежит Авито, и туда просто дублируются все объявления =/
При появлении нескольких сайтов еще острее встала проблема дубликатов. Одна и та же квартира бывает представлена на одном сайте несколько раз, разные объявления от разных агентов. А когда собираешь несколько площадок начинается просто адок. И ладно бы везде данные были идентичные, но нет – меняют цену, площадь и так далее. Поэтому потребовалось сделать кластеризацию, чтобы выявлять группы объявлений с похожими параметрами. Порадовался, что не зря в универе все это проходили. И самое классное – выявляя дубликаты мы можем показывать пользователю, что есть не только свежее объявление от агента, но и объявление без комиссии про эту же квартиру, даже если оно было размещено некоторое время назад. Начали экономить людям не только время, но и денежки.
Также я быстренько запилил второго бота, который присылал объявления с продажей жилья.
Вот так выглядел бот после первой серии доработок:
Если достали ковры на стенах, пора натравить на них нейросеть
Большинство съемщиков не готовы жить в квартире с бабушкиным ремонтом. Есть и обратное – на покупку нередко ищут убитую квартиру, чтобы купить дешевле и сделать ремонт под себя. Выявить такие варианты – отличная задача для нейросети.
Мне давно было интересно потрогать руками машинное обучение, а вот и повод нашелся. Начал с прохождения бесплатного курса по нейросетям от Google. Оказалось, что не нужно тренировать сеть с нуля – гораздо лучше взять существующую классную нейросеть и дообучить ее под свою задачу.
Для определения типа ремонта я скормил сети тысячи фотографий как очень симпатичных, так и откровенно печальных квартир.
Чтобы не покупать дорогущие сервера, надо было найти решение, которое при обработке сотен тысяч изображений в день будет одновременно быстрым, качественным и экономным по железу. Поэтому взял за основу сеть MobileNetV2, которая изначально задумана для применения на мобильных устройствах с ограниченными ресурсами.
Так в боте появился фильтр «не бабушкин ремонт». А через месяц после запуска фильтра хайпанула статья Петра Бондаренко про похожую нейросеть для просмотра ЦИАНа. Было обидно, что в фокус внимания попал не мой проект, но это стало лишним доказательством того, как у людей наболело. Ну и вывод:
Если сделал хороший продукт, не тормози с пиаром.
И проверяй спрос, проверяй спрос
Когда дневная аудитория бота приблизилась к 1000, я решил добавить в игру владельцев жилья. Арендаторам предлагалось прислать небольшой рассказ о себе со ссылкой на соцсети в обмен на спецпредложения от собственников. А хозяева получили возможность еще до знакомства узнать о заинтересованных жильцах и выбрать подходящих.
До начала работ я проверил интерес со стороны хозяев, но не опросил арендаторов. Для них это казалось очевидно полезной функцией (стоит вообще забыть слово «очевидно»). В итоге уже после запуска стало понятно, что откликнувшихся квартиросъемщиков недостаточно.
Несколько недель напряженной работы насмарку.
В качестве бонуса получил мини-исследование аудитории Бро – за время эксперимента сотни пользователей бота рассказали мне о себе. Да и сервис для владельцев жилья еще получит второй шанс в будущем.
Второе рождение проекта
Я понял, что бот требует все больше и больше внимания, мне дико интересно его развивать, а еще мне очень хочется спать. В будни я кодил вечером и ночью, выходные тоже были посвящены Бро. Поэтому сначала перешел в Яндексе на парт-тайм, а вскоре и вовсе ушел из компании.
За первые 9 месяцев я привлек 8000 пользователей бота, потратив на это 42 тысячи рублей. 30 тысяч вернулись в виде донатов, а рекламу в HomeBro я еще не продавал. Да и запросов, честно говоря, на нее тогда еще не было.
Решил рассказать про Бро на vc.ru. Долго не решался, т.к. считал, что бот еще недостаточно хорош и его захейтят. Но в итоге случился настоящий взрыв – материал завирусился и стал одним их самых популярных в истории площадки. В комментариях люди активно делились впечатлениями от работы с плохими риелторами .
Стоит отметить, что отчасти успех статьи был обеспечен друзьями Бро. Я разослал ссылку пользователям бота и попросил поделиться обратной связью, они откликнулись и помогли статье выйти в популярное.
Следующие две недели я не вылезал со встреч, одна из них закончилась привлечением в проект инвестиций. В общем, очень жалко, что тогда я не написал статью еще и на Хабре. Вот только сейчас исправляюсь =) Но все в один лонгрид не запихнешь, поэтому продолжение истории я расскажу в следующий раз. Подписывайтесь на наш блог, если будет интересно почитать.
Для удобства еще раз ссылочка на бота. Поделитесь, как вам?