В продукт просились три формата договорённостей. Очевидный путь — три отдельных типа. Мы нашли одну ось — и третий формат лёг почти даром. Как добавлять фичи, не удваивая продукт.
Это шестая часть серии о том, как мы строили «Договорились». Продукт живёт и растёт. Теперь — про то, как добавлять в него новое, не превращая в перегруженную свалку. Самая «инженерная» часть серии, но урок в ней — для любого, кто строит продукт.
Сначала пакт умел ровно одно: отмечаться каждый день N дней подряд. Спорт 7 дней, чтение 14 дней — серия галочек.
Но живые договорённости так не выглядят. «Сдай отчёт к пятнице» — это не серия галочек, это одна цель к сроку. «Спорт по понедельникам, средам и пятницам» — это вообще не каждый день. Нам нужно было добавить эти формы. И тут — развилка, на которой ломается много продуктов.
Очевидный путь: на каждый новый случай завести свой тип пакта. Свой экран, своя логика подсчёта, свои напоминания. Три формы — три отдельные ветки кода. Быстро в моменте, а через полгода у тебя продукт, в котором три почти одинаковых куска, и любая правка делается в трёх местах.
Мы пошли иначе. Вместо трёх типов пактов ввели одну настройку — ритм. И договорились: любой новый ритм не заводит новый экран и новую логику, а отвечает всего на один вопрос — «сегодня вообще контрольный день?»
Вся разница между ритмами свелась к ответу на этот вопрос, в одном-единственном месте:
Всё остальное в продукте — сетка прогресса, отчёт, счётчик — спрашивает только это: «сегодня в счёт или нет?». Им всё равно, какой ритм. Они просто получают список контрольных дней и работают.
Самое приятное случилось, когда через неделю мы добавляли третий ритм — «По расписанию». Он лёг почти даром. Сетка, прогресс, отчёт — всё уже умело работать «по контрольным дням», их вообще не пришлось трогать. Мы лишь объяснили продукту, какие дни недели считать контрольными.
Это и есть дивиденд правильной абстракции: неделю назад мы угадали ось — и новая фича легла на готовое, а не потребовала переписывать пол-продукта.
Но один урок этой части — что главная стоимость фичи прячется не там, где её ждёшь. Сетка и отчёт получились бесплатно. А вот напоминания — нет.
Бот по умолчанию пингует каждый активный пакт каждый день. Для пакта «по понедельникам» это спам в нерабочие дни — придёт напоминание в воскресенье, когда отмечаться не надо. Пришлось научить бота молчать в неконтрольные дни. Вот здесь и была настоящая работа — не в красивой абстракции ритмов, а в скучных напоминалках, о которых сначала никто не думает.
Заодно мы переделали «К сроку» по-человечески. Сначала срок задавался кнопками «через 3 / 7 / 14 дней». Но живая договорённость звучит не «через сколько-то дней», а «к пятнице», «до 20-го». «Через 3 дня» — это перевод, который человек должен сделать в уме, да ещё и от непонятного момента (пакт-то стартует не сейчас, а когда партнёр примет). Переключили на выбор конкретной даты в календаре. «К 20 июня» означает 20 июня — независимо от того, когда второй нажмёт «принимаю».
Когда в продукт просится новая похожая фича, есть две дороги. Первая — добавить ещё один отдельный блок: быстро сейчас, дорого потом. Вторая — остановиться и поискать ось, на которую лягут и старое, и новое, и то, что попросят через месяц.
Признак, что вы нашли ось: следующая фича в том же ряду добавляется почти даром. Если каждая новая похожая штука стоит как первая — оси нет, вы просто плодите экраны.
И второе: считая стоимость фичи, смотрите не на её парадную часть, а на скучную обочину. У нас красивые ритмы легли легко, а съели время невидимые напоминалки. Сюрприз почти всегда там.
Дальше: продукт растёт и обрастает фичами — пора зарабатывать. Где в продукте ставить платную стену, чтобы человек платил за пережитую магию, а не за обещание.
Продукт из этой статьи
Telegram-приложение, которое превращает обещания между людьми в игру: AI делает из договорённости пакт с названием, а вы вдвоём идёте к цели.
Подпишитесь на журнал QuboLab и получайте лучшие материалы первыми.