Садик Добрых Дел: добрые дела и эмоции ребёнка
3 поста
Привет!
Я тут уже дважды был с «Садиком Добрых Дел» — это приложение, где ребёнок вечером записывает, что хорошего сегодня сделал, и от этого растёт цветок. Первый раз пришёл за критикой и получил её, второй — отчитался, что починил.
Сейчас третий заход. Я сделал самую большую фичу за всё время — общие сады — и переделал обмен целиком уже после того, как он «работал». Аккаунтов в приложении так и не появилось: сервер не знает ни кто с кем связан, ни что лежит в конверте.
Что за фича. Раньше сад был один и жил на телефоне: ни аккаунтов, ни регистрации, ни сервера вообще. Теперь сады можно связать. Папа видит сад ребёнка, ребёнок — сад папы. И главное: в чужом саду можно записать то, что ты за этим человеком заметил. Родитель пишет «сам заметил, что бабушке тяжело» — и у ребёнка растёт цветок. Прямо при нём, пока они сидят рядом. Ребёнок ничего не нажимал.
Ссылка, чтобы не искать: RuStore.
Условие, которое я себе поставил: аккаунтов не будет. Ни телефона, ни почты, ни входа. Ребёнок семи лет не должен ничего регистрировать, а я не должен хранить базу детей.
Получилось так. Ключ связи рождается на телефоне того, кто зовёт, и уходит в приглашении — во фрагменте ссылки, после решётки. Фрагмент по устройству сети на сервер не уходит вообще: даже если ссылку открыть в браузере, ключ никуда не отправится.
Из ключа обе стороны считают две разные производные:
идентификатор ящика = sha256(ключ + "sadik-box-id")
токен доступа = sha256(ключ + "sadik-box-token")
Сервер хранит идентификатор открыто, а от токена — только его хеш. То есть он может проверить право на ящик, не зная ни ключа, ни токена, и не может ни притвориться участником, ни прочитать содержимое: внутри лежит шифротекст AES-GCM, ключ от которого есть только у двоих.
Весь сервер — это PUT и GET в почтовый ящик. Он не знает, кто с кем связан, сколько у человека связей и что в конверте. Из этого потом вылезет неожиданное следствие, но об этом ниже.
Первая версия обмена передавала участок снимком: счётчики, стадия цветка, архив. Пока сад был один, передавать было нечего вовсе, и снимок казался естественной формой — состояние как состояние. Но у него появился второй писатель, и снимок начал спорить сам с собой: кто приложил последним, тот и прав, чужая запись исчезает.
Разрешать конфликты я не стал. Сначала пересчитал, сколько в системе мест, куда пишут двое, и оказалось, что такое место ровно одно: запись, сделанная про другого человека. Цветок, настроение, пересадки пишет только хозяин сада, и спорить там не с кем.
Поэтому передаются теперь не счётчики, а сами записи, и сливаются объединением: порядок доставки не важен, повтор безвреден, «оба написали одновременно» перестаёт быть особым случаем. Счётчики и стадия цветка пересчитываются из записей на месте — они не данные, а следствие.
Свои слова при этом наружу не передаются вовсе. Другой видит, что момент был, и цветок от него вырос, но текста не читает: в списке стоит строка «Момент, о котором можно спросить». Об этом и разговор — приложение задаёт вопрос и не отвечает на него.
Хотелось, чтобы сад обновлялся быстро: вся сцена ради того, чтобы цветок вырос при вас. Первая мысль — пуши. Посчитал и передумал.
Чтобы отправить пуш, сервер обязан знать: «в ящик X положили → разбудить устройство D». Это таблица «кто с кем связан» плюс пуш-токен — устойчивый идентификатор телефона. Прямо сейчас сервер не знает ничего подобного и не может сопоставить двух людей. Пуши это ломают, и шифрование содержимого тут не помогает: утечёт граф.
Сделал проще: пока приложение на экране, оно ходит за почтой раз в десять секунд, после минуты тишины — раз в тридцать. Арифметика: три связи, опрос раз в десять секунд — 18 запросов в минуту на человека; сто человек одновременно — 30 запросов в секунду. Для Postgres на маленькой машине это ничто.
Как бы вы доставляли обновление на второй телефон, не заводя аккаунтов и не отдавая серверу граф связей?
Есть ли третий путь, который я не вижу?
«Семнадцатая попытка» — сериал про сорокалетнего тимлида Игоря. Семнадцатый раз в жизни он взялся за пет-проект: приложение, которое должно помочь родителям и детям разговаривать. Одна серия — одна неделя, и в каждой у него забирают одну иллюзию.
Эта серия — вторая: попытка поговорить с пятью реальными родителями и список, который оказался на троих. Предыдущие читать не обязательно, каждая сама по себе.
Первая серия: Приложение для разговоров
— Игорь, — говорит Стас, — как прошли встречи?
Я говорю:
— Хорошо.
Это правда. Они прошли хорошо. Все пять. По тридцать минут каждая, я поставил их подряд во вторник, потому что если бы я размазал их по неделе, то думал бы о них всю неделю.
— Что узнал?
И вот тут я понимаю, что мне нечего сказать.
Я разговаривал с пятью людьми два с половиной часа. Я спрашивал, как дела, что мешает, чего не хватает. Они отвечали: нормально, ничего не мешает, всего хватает. Костя сказал, что хорошо бы второй монитор. Я записал: «второй монитор». Это единственная запись, которую я сделал за два с половиной часа.
— Ребята в порядке, — говорю я. — Есть запрос на оборудование.
— Отлично, — говорит Стас. — Видишь, работает. Люди раскрываются, когда ими интересуются. Давай в следующем месяце сделаем это регулярной практикой.
Я киваю.
Люди не раскрылись. Люди сидели с ровными лицами и ждали, когда я отстану, потому что я их начальник, а начальнику не рассказывают, чего не хватает, начальнику говорят «нормально». Я это знаю. Я сам пятнадцать лет говорил «нормально».
Но Стасу я этого не скажу, потому что тогда придётся объяснять, зачем я вообще их проводил, и мы оба окажемся в неудобном месте.
После созвона я сижу и смотрю в свою заметку. «Второй монитор». Пять разговоров. Два с половиной часа. Один монитор.
Вечером я открываю ноутбук и пишу в план на неделю: «поговорить с пятью реальными родителями». И только когда закрываю крышку, до меня доходит, что я сегодня уже провёл пять разговоров и не узнал ничего.
Но это другое, думаю я. Там были подчинённые. А тут будут люди, которым правда интересно.
Я сажусь составлять список.
Мне нужно пять родителей. Реальных. Не жена, не чат, не воображаемая Гала.
Я открываю телефон. У меня в телефоне четыреста контактов.
Первый час я вычёркиваю коллег. Коллега — не родитель, коллега — это человек, с которым я говорю про релизы. Если я напишу Кате из соседней команды «привет, а как ты разговариваешь со своим ребёнком», Катя решит, что меня уволили.
Второй час я вычёркиваю родственников. С ними нельзя: они начнут не отвечать на вопрос, а волноваться за меня.
Потом я смотрю на то, что осталось.
Осталось трое.
Лёха. Женя, с которым мы не виделись четыре года, но он лайкает мои редкие посты, и у него вроде есть дочь. И Марина, мама Мишкиного одноклассника, чей номер у меня есть, потому что мы один раз вместе искали потерянную сменку.
Трое. Не пять. Трое.
Я сижу и думаю: у меня сорок лет жизни, четыреста контактов и три человека, которым я могу написать вопрос, не относящийся к работе.
Я пишу в заметки: «выборка нерепрезентативная». Потому что если написать «выборка нерепрезентативная», то это звучит как методологическая проблема.
А если написать «мне не с кем поговорить», то это звучит как то, что есть.
Вечером Аня спрашивает:
— Ты чего такой?
— Я составил список.
— Какой список?
— Людей, с которыми можно поговорить.
Аня молчит секунду.
— И сколько?
— Достаточно, — говорю я.
— Игорь.
— Трое.
Аня ничего не отвечает. Она просто садится рядом и берёт пульт, и мы двадцать минут смотрим какое-то кулинарное шоу, где мужчина с прищуром пробует суп и говорит «интересно». И это, наверное, лучшее, что она могла сделать.
Начинать надо с Лёхи. Во-первых, он единственный, кому не надо объяснять, кто я такой. Во-вторых, у него Даня, двенадцать лет. В-третьих — и это главная причина, хоть я и не признаюсь себе сразу, — у меня стучит что-то в передней подвеске, и это отличный предлог приехать, не объявляя, что я приехал с вопросом.
Лёха держит бокс на Салова. Друг детства, двор, гаражи, всё как положено. Он чинит машины двадцать лет. У него на стене висит список клиентов, написанный маркером на куске обоев, и он реально им пользуется.
Я приезжаю в четыре. Он загоняет мою машину на подъёмник, лезет под неё и через сорок секунд говорит:
— Стойка.
— Дорого?
— Тебе — дорого.
Он смеётся. Он всегда так шутит, с десятого класса.
Пока он возится, я стою рядом. Мне некуда деть руки. Я предлагаю помочь. Он говорит «подержи», даёт мне фонарь, и я держу фонарь. Потом он говорит «не туда свети», и я свечу туда. Потом он говорит «да блин, дай сюда» и светит себе сам, зажав фонарь между плечом и щекой.
Вот и вся моя помощь. Я тимлид с расширенной зоной ответственности, и я не смог удержать фонарь.
— Лёх, — говорю я. — Можно вопрос?
— Валяй.
— Как ты с Даней разговариваешь?
Он выкатывается из-под машины на своей лежанке и смотрит на меня снизу вверх.
— В смысле?
— Ну, о чём вы говорите.
— О чём надо, о том и говорим. Ты чего, Игорь?
И я начинаю рассказывать.
Я рассказываю, что делаю приложение. Что оно даёт родителю и ребёнку дополнительные поводы для доброго разговора. Что это не «как дела в школе», а что-то настоящее.
— Это то, которое ты мне на даче рассказывал? — говорит Лёха из-под машины.
— Нет. То другое было.
— А, ну да. То было про рецепты.
— Про списки покупок.
— Один хрен.
Я продолжаю. Я говорю «пользовательский сценарий». Я говорю «вовлечённость». Один раз я говорю «эмпатичный онбординг» — клянусь, оно само.
Лёха слушает молча. Потом вытирает руки о тряпку и говорит:
— Слушай. Вот ты сейчас пять минут говорил. Я ни хера не понял.
— Ну смотри...
— Не, ты погоди. Я не тупой. Я договора с поставщиками читаю, я ОСАГО отсуживал. Я не понял не потому, что я не понял. Я не понял, потому что ты не сказал.
Я стою с фонарём, который он у меня уже забрал.
— Ты вот, — говорит Лёха, — зарабатываешь сколько? Не говори. Я и так знаю примерно. У тебя квартира, две машины, дети в кружках, жена не работает, если не хочет. Тебе сорок. И тебе — чего?
— Мне скучно.
— Скучно, — повторяет он. — Игорь, я тебя с десятого класса знаю. Ты мне каждые года два что-нибудь рассказываешь. Я уже не запоминаю названия, я запоминаю, что у тебя глаза блестят. Потом проходит полгода, я спрашиваю — а ты говоришь «да забил».
— В этот раз по-другому.
— Ага.
Он вытирает руки ещё раз, хотя они уже чистые.
— Ко мне вчера приезжала женщина. У неё «Солярис» две тысячи двенадцатого. Ей надо было ездить на работу, а он не заводился, и она мне говорит: Алексей, мне завтра надо, у меня смена. Вот ей не скучно. Ей надо.
— Это другое.
— Это другое, — соглашается он. — Только вы, айтишники, зажрались все. Натурально. Вы сидите в тепле, у вас чай, у вас, как его, лапшетория...
— Ретроспектива.
— Вот. И вам скучно. И вы начинаете спасать человечество. А человечество, между прочим, не просило.
Я хочу сказать, что я не спасаю человечество. Что я просто хочу сделать что-то полезное. Но я эту фразу уже говорил Ольге из чата, и она ответила «понятно, удачи», и это была самая холодная фраза, которую я слышал за год.
Поэтому я говорю:
— Ну, наверное.
— Наверное, — передразнивает Лёха. — Стойку в пятницу привезут. Приезжай к шести, сделаю.
Я еду домой и всю дорогу придумываю, что надо было ответить. Я придумываю отличные ответы. Один из них просто блестящий, я даже притормаживаю, чтобы записать его в телефон.
Дома я его перечитываю. Там написано: «Дело не в скуке, а в ощущении осмысленности своего вклада».
Я удаляю заметку.
Я решаю подготовиться.
Это, если честно, самое идиотское, что я делаю за неделю, — но понимаю я это только в воскресенье.
Я открываю ноутбук и составляю тезисы. У меня получается шесть пунктов. Я их редактирую. Я убираю англицизмы. Я нахожу метафору — про то, что приложение это не костыль, а перила. Мне нравится метафора. Я записываю её отдельно, капслоком.
Потом я репетирую вслух. В ванной, потому что там дверь закрывается.
Аня заходит на кухню, когда я стою у окна и говорю сам себе: «Смотри, это не чтобы за тебя, это чтобы тебе легче».
— Ты с кем?
— Ни с кем.
— Ты репетируешь.
— Я формулирую.
Аня наливает себе чай. Не уходит.
— Игорь. Ты четыре года формулируешь. Ты в прошлом году формулировал, как поговорить со мной про ипотеку. Помнишь, чем кончилось?
— Мы взяли ипотеку.
— Мы взяли ипотеку, потому что я в какой-то момент сказала: давай просто возьмём. Ты к тому времени сделал табличку.
— Табличка была хорошая.
— Табличка была прекрасная, — говорит Аня. — Просто разговор был не про неё.
Она уходит спать. Я сижу с шестью тезисами и метафорой про перила.
В час ночи я понимаю, что готовлюсь к разговору с человеком, которого знаю тридцать лет. Что я собираюсь прийти к Лёхе с тезисами. Что если бы Лёха узнал, что я репетировал разговор с ним в ванной, он бы смеялся полгода и рассказывал это всем в боксе.
Я закрываю ноутбук и иду спать. Тезисы остаются в файле. Файл называется «разговор_лёха_v2».
Ещё раз, вслух: «разговор_лёха_v2». Мне сорок лет.
Я приезжаю в шесть. Лёха меняет стойку. Я стою рядом и на этот раз даже не пытаюсь помочь, просто держу ему стакан с чаем, пока он вытирает руки.
— Лёх.
— М?
— Ты вчера спросил, чего мне. Я тебе соврал, что скучно.
Он поднимает голову.
— Мне сорок, — говорю я. — Я двадцать лет пишу код. Я хорошо его пишу. Я на работе сейчас отвечаю за то, чтобы люди чувствовали причастность к продукту, и это не шутка, это в моих задачах так и написано. Я прихожу вечером, и у меня не остаётся ничего. Я хочу проснуться утром и понять, что то, что я сделал вчера, кому-то нужно. Не команде. Не Стасу. Кому-то живому.
Лёха молчит и пьёт чай.
— Это всё? — говорит он.
— Это всё.
— Ну вот так бы сразу. А то «онбординг».
Он ставит стакан на бампер.
— Только это не про приложение, Игорь. Это про то, что тебе плохо.
— Я знаю.
— А приложение-то твоё зачем?
И я опять не знаю, что ответить. Я знаю шесть тезисов. Я знаю метафору про перила. Но он спросил не это, он спросил — зачем.
— Я хочу, чтобы родители с детьми больше разговаривали, — говорю я наконец.
— Кто не разговаривает — тот и с приложением не будет.
— А кто хочет, но не знает, о чём?
— Да не подсовывай ты ему темы, — говорит Лёха. — Ты чего, тему ему подсунешь, а он тебе что, доклад прочитает? Мой Даня сам приходит. Когда ему есть чего. Я в боксе, он рядом сидит, крутится, и в какой-то момент — пап, а вот у нас в школе такое было. И всё. Я ж его не спрашиваю. Я просто есть.
Он берёт ключ.
— Ты сделай, чтоб ему было чего рассказать. А там сам прибежит.
Я стою и молчу так, как молчат, когда тебе только что сказали то, что ты сам пытался придумать четыре дня.
— Лёх.
— Чего?
— А ты можешь ещё раз, я запишу?
— Иди ты, — говорит он. — Держи вот лучше.
И даёт мне фонарь.
Уже когда я сажусь в машину, он наклоняется к окну.
— Слушай. А ты же в этом всём сечёшь. У меня запись клиентов на обоях, вон, видел. Мне бы такую штуку, чтоб они сами записывались, а не звонили в девять вечера. Сделаешь?
— Сделаю.
— Когда?
— Скоро.
Он кивает и уходит в бокс.
Я знаю, что не сделаю. Я знаю это в ту же секунду, когда говорю «скоро». Но сказать «нет» человеку, который два часа чинил тебе машину и только что бесплатно объяснил тебе твой же продукт, я не могу.
Я не открываю ноутбук до обеда.
После обеда я иду к Мишке в комнату. Он собирает что-то в «Майнкрафте».
— Миш.
— М.
— Ничего. Просто посижу.
Он смотрит на меня подозрительно. Я сажусь на пол у стены, потому что стул завален вещами.
Я сижу двадцать минут. Двадцать минут я ничего не спрашиваю. Это оказывается неожиданно трудно: у меня в голове штук пять вопросов, и все они начинаются с «а как».
На двадцать третьей минуте Мишка говорит, не отрываясь от экрана:
— Пап, а прикинь, у нас Соколов сегодня сказал учительнице, что он не сделал домашку, потому что у него бабушка заболела. А у него бабушка умерла два года назад.
— И что учительница?
— Ничего. Она не знает.
— А ты откуда знаешь?
— Я с ним в одном классе с первого.
Мы молчим.
— Жалко его, — говорит Мишка.
— Соколова?
— Ага.
И всё. Он возвращается к своим блокам. Я сижу ещё немного и выхожу.
На кухне я стою и думаю, что если бы я задал ему вопрос — любой из моих пяти вопросов, начинающихся с «а как», — он бы ответил «нормально». Как отвечали мне в понедельник пятеро моих подчинённых.
Я достаю телефон и пишу в заметки одну строчку:
«Не спрашивать. Быть рядом достаточно долго».
Потом стираю и пишу:
«Продукт должен давать ребёнку, о чём рассказать. Не родителю — о чём спросить».
Смотрю на это. Всё, что я построил ночью в среду, — тема дня, пуш родителю, «дополнительный повод» — оно всё было про родителя. Про меня. Про то, как мне удобно.
Гуляем. Тёмка находит лужу и проверяет её на глубину методом погружения. Аня ловит его на третьем шаге. Мишка идёт рядом и рассказывает про Соколова ещё раз, уже маме, и я слушаю в третий раз, и мне не скучно.
Вечером я открываю ноутбук. Один раз. Ненадолго.
Пишу:
Неделя вторая. Пять родителей? Один. И тот друг. Список оказался на троих, из четырёхсот контактов. Узнал главное и не от себя: тему подсовывать бесполезно, надо чтобы ребёнку было чего рассказать. Это переворачивает всё, что я сделал в прошлый четверг ночью.
Ещё узнал, что я репетирую разговоры с человеком, которого знаю тридцать лет. И что за неделю я провёл шесть разговоров: пять по работе и один настоящий. По работе я узнал про монитор.
Долг: Лёхе — запись клиентов. Сказал «скоро». Скоро не будет.
План на неделю: переделать так, чтобы записывал ребёнок, а не получал родитель. И написать оставшимся двоим из списка.
Сохраняю. Закрываю.
Аня уже спит. Я лежу и смотрю в потолок, и в голове крутится не «пользовательский сценарий», а Лёхино: «Я просто есть».
Я так не умею. Я всё время что-нибудь делаю.
Но, кажется, это и есть та штука, которую надо не сделать, а перестать делать.
Свет с улицы ползёт по потолку. Внизу кто-то заводит машину, и я машинально слушаю, как она заводится. Нормально заводится.
Родители, а бывает у вас такое, что ребёнок сам приходит рассказать? В какие моменты? Я передам Игорю — он теперь это записывает.
Стендап в десять. Я захожу в созвон на минуту позже, с кружкой, в которой чай уже остыл, потому что я залил его кипятком двадцать минут назад и забыл. Это, кстати, метафора моей жизни, но об этом позже.
Стас, наш директор по разработке, включает камеру. У Стаса всегда включена камера. У Стаса всегда включён микрофон. Стас никогда не бывает не готов.
— Коллеги, — говорит Стас, — на этой неделе фокус на вовлечённости. Я посмотрел метрики по команде, у нас проседает ощущение причастности к продукту. Игорь, ты как лид, что планируешь?
Я планирую дожить до пятницы. Но вслух говорю:
— Проведу одну встречу один на один, посмотрю, что там у ребят.
— Одну? — Стас приподнимает бровь так, будто я сказал, что планирую один раз помыть руки на этой неделе.
— Пять, — говорю я. — Пять встреч.
— Отлично. И ещё, коллеги, давайте не забывать: мы тут не просто пишем код. Мы строим культуру. Культура — это ответственность каждого. Но в первую очередь — руководства. Я свою ответственность осознаю. Осознайте и вы.
Я киваю. Я эту фразу слышал на пятнадцати работах. Я её сам произносил на трёх. Она означает ровно одно: «Мы будем требовать от вас больше, а вы будете считать это честью».
Закрываю ноутбук. Смотрю в окно. Питер, серое небо, голубь на карнизе сидит так, будто тоже устал от всех этих процессов.
У меня неплохая зарплата. Даже хорошая. Я тимлид, я архитектор, я «сеньор с расширенной зоной ответственности», как написано в моём профиле, который я сам же и правил, потому что HR попросил «сделать посвежее». Я почти потолок. Выше — только менеджмент, а менеджментом я быть не хочу, потому что менеджмент — это когда ты объясняешь людям, почему им должно быть стыдно, что они хотят домой в семь.
Я устал. Не выгорел — выгорел это когда ты не можешь встать. Я могу встать. Я встаю в 7:10, бужу Мишку, потом Тёмку, потом Аню, потом сам себя уговариваю, что сегодня будет по-другому. Я устал так, как устаёт человек, который тащит на себе культуру, которую не выбирал.
Аня говорит:
— Ты опять в телефоне.
Я в телефоне. Я всегда в телефоне. Я читаю про то, как другие люди делают свои приложения и зарабатывают на них миллионы. Это моя вечерняя медитация.
— Я думаю, — говорю я.
— Ты думаешь уже четыре года.
Она права. Я думаю четыре года. У меня есть папка на ноутбуке, называется «Идеи». Там шестнадцать подпапок. В тринадцати — README, в двух — код, ни в одной — пользователей. Это как кладбище, только с аккуратным версионированием.
Но в этот раз всё будет по-другому. В этот раз я не буду писать код. В этот раз я сначала поговорю с людьми.
Я говорю с Аней. Это первый человек, с которым я решил поговорить.
— Представь, — говорю я, — есть приложение. Оно даёт родителю и ребёнку дополнительные поводы поговорить. По-доброму. Не «как дела в школе», а что-то настоящее. Тебе бы это было нужно?
Аня смотрит на меня так, как смотрят на человека, который предлагает купить пылесос у него же дома.
— То есть ты хочешь сделать приложение, которое будет учить тебя разговаривать с твоими детьми.
— Не учить. Помогать.
— Помогать тебе разговаривать с твоими детьми.
— Ну, в общем, да.
Аня берёт чашку, делает глоток и говорит:
— Игорь. Ты вчера за весь вечер сказал Мишке три слова. «Помой руки», «сядь нормально» и «я работаю».
— Это не три слова.
— Это три фразы. Суть та же.
Я хочу возразить. Но не могу, потому что это правда. Я помню, что был вечер, помню, что был Мишка, помню, что был какой-то деплой. Всё остальное слилось.
— Ладно, — говорю я. — А если бы приложение присылало тебе раз в день одну интересную тему для разговора с ребёнком?
— Раз в день? — Аня ставит чашку. — Игорь. Ты. Мне. Только что. Предложил. Приложение. Которое будет напоминать тебе поговорить с собственным сыном.
— Да.
— А просто поговорить?
Я молчу.
— Просто взять и поговорить, без приложения?
Я молчу ещё.
— Это, — говорит Аня, — самое смешное и самое грустное, что я слышала за месяц.
Она уходит на кухню. Я сижу с открытым ноутбуком и записываю в заметки: «Жена — не репрезентативный пользователь, но её фидбек ценен».
Я сам не верю в то, что пишу. Но если я не запишу, то забуду, а если забуду, то зачем я вообще вчера не писал код.
Я решил выйти к людям.
В чате «Мамы и папы Питера» (я подписался месяц назад, чтобы «изучить аудиторию», и с тех пор прочитал примерно четыре тысячи сообщений про подгузники и одну — про смысл жизни) я пишу пост:
«Привет! Я разработчик, делаю приложение, которое помогает родителям и детям больше и теплее общаться. Хочу понять, с какими сложностями вы сталкиваетесь. Буду благодарен за ответы. Можно в личку».
Отправляю. Жду.
Проходит час. Ноль ответов.
Проходит два часа. Один лайк.
Проходит три часа. Мне отвечает женщина по имени Ольга:
«А это платно?»
«Нет, — пишу я. — Пока нет. Потом, наверное, будет подписка».
«Тогда зачем вам это?»
Я зависаю. Я не знаю, что ответить. Я не могу написать «потому что мне сорок, я устал от корпоративной культуры и хочу проснуться с чувством, что я делаю что-то важное». Это не для чата «Мамы и папы Питера».
Пишу:
«Хочу сделать полезное».
Ольга отвечает:
«Понятно. Удачи».
«Понятно. Удачи» — это самая холодная фраза в русском языке. Это не пожелание. Это диагноз.
Через двадцать минут в чате начинается срач. Не из-за меня. Просто кто-то написал, что мультики после семи вечера — это преступление, и чат на две тысячи человек разделился на тех, кто «преступление», и тех, кто «вы вообще детей видели». Я читаю это, затаив дыхание, потому что это и есть моя аудитория. Это люди, которым я собираюсь помочь.
Я закрываю чат. Я думаю: может, мне не надо было подписываться на «Мамы и папы Питера». Может, надо было подписаться на «Мамы и папы Питера, которые не срутся из-за мультиков». Но такого чата нет, а если бы был, то я бы точно туда не попал, потому что я не мама и не папа Питера, я человек, который сидит в тёмной комнате и хочет, чтобы кто-то написал ему «вау, это то, чего мне не хватало».
Никто не написал.
Я не выдержал.
Я открыл ноутбук в 22:40, сказал себе «только посмотрю, как это может выглядеть», и к 2:17 ночи у меня был работающий прототип. Лендинг. Регистрация. Экран с темой дня. Я даже подключил нотификации. Я на секунду ощутил то самое чувство, ради которого всё это делаю: у меня внутри что-то загорелось. Я забыл про усталость, про Стаса, про «фокус на вовлечённости». Я чувствовал себя живым.
Утром я понял, что нарушил свой же план. Я не поговорил ни с одним реальным родителем. Я просто опять писал код, потому что код — это единственное, что я умею. Я общаюсь с миром через commit. Я не умею через слова, поэтому я собрал себе маленький мир, где всё на своём месте, где git push вместо «привет, как ты».
Это, наверное, и есть самая идиотская ошибка. Не то, что я написал код. А то, что я снова спрятался в него.
Я рассказал про прототип Мишке. Ему десять.
— Смотри, — говорю я. — Приложение. Оно каждый день даёт тему, о которой можно поговорить с родителями. Вот, например: «Расскажи, какой момент за сегодня был самым смешным».
Мишка смотрит на экран. Потом на меня. Потом снова на экран.
— Пап.
— Да?
— А ты у меня это можешь просто спросить.
Я молчу.
— Ты можешь просто спросить, — говорит Мишка. — Зачем приложение?
— Ну, чтобы было интереснее.
— А если ты просто спросишь, будет неинтересно?
Я не знаю, что ответить. Я смотрю на своего десятилетнего сына, который только что, без злобы, без иронии, просто назвал вещи своими именами, и понимаю, что он прав. И что он, скорее всего, даже не понял, что он прав. Он просто сказал, как есть.
Я закрываю ноутбук.
— Миш.
— Что?
— Какой момент за сегодня был самым смешным?
Он думает секунду. Потом улыбается.
— Тёма намазал кота сметаной.
— Что?!
— Он думал, что кот тоже хочет. Кот не хотел.
Я смеюсь. Настоящим смехом, не корпоративным. Мы сидим на кухне, я и мой сын, и мне на секунду становится хорошо. Не драйвово, не «продуктивно», не «с фокусом на вовлечённости». Просто хорошо.
У меня три регистрации.
Я смотрю на них, как смотрят на новорождённых. Я уже готовлю речь «мы только начинаем, но вы — наши первые пользователи, спасибо вам». Потом я смотрю на адреса.
Первый — мой собственный. Я зарегистрировался вчера, чтобы проверить, работает ли форма.
Второй — test@test.test. Это бот. Или человек, который очень старается быть ботом.
Третий — gala1978@mail.ru. Я открываю письмо. Гала пишет:
«Здравствуйте! А это приложение для школы или для детского сада? У меня внук, 5 лет. Хочу понять, надо ли регистрироваться родителям или воспитателям. Спасибо».
Я смотрю на это письмо. Гала, 1978 год рождения, бабушка, внук, 5 лет, хочет понять, для школы или для сада. Она не поняла, что я делаю. Я три ночи собирал продукт, который даёт «дополнительные поводы для доброго общения», и первая живая реакция человека — «это для школы или для сада».
И это, если честно, лучший фидбек за неделю. Потому что он честный. Потому что он показывает, что я не объяснил ничего. Что я, возможно, никому не объясню ничего. Что мой продукт — это пока папка с файлами и моё желание.
Я пишу Гале:
«Здравствуйте! Это для родителей. Бабушки тоже могут. Спасибо, что ответили».
Она не отвечает.
Ночью я не могу уснуть. Я листаю соцсети. Я ищу «приложения для общения с детьми». Нахожу шесть. У пяти — миллионы скачиваний. У одной — «основано в 2014, закрыто в 2018, основатель пишет в LinkedIn, что это был лучший урок в его жизни».
Я закрываю ноутбук. Я думаю: может, это и есть мой путь. Может, через четыре года я буду писать в LinkedIn, что это был лучший урок. Может, мне просто надо честно это признать заранее.
Аня смотрит на меня за завтраком.
— Ты чего?
— Ничего.
— Ты грустный.
— Я не грустный. Я рефлексирую.
— О господи.
— Что?
— Когда ты говоришь «рефлексирую», значит, ты три часа ночью читал про конкурентов.
Она меня видит насквозь. Это пугает и спасает одновременно.
— Аня. Я не знаю, что делаю.
— В смысле?
— Я имею в виду, — я отставляю чашку, — я думал, что смогу сделать приложение, которое поможет людям. А потом я выяснил, что Гала не поняла, для чего оно. Что мой сын не понимает, зачем оно. Что моя жена считает, что это надо заменить на «просто поговорить». И я... я, кажется, не понимаю, зачем оно.
Аня садится напротив.
— Игорь. Ты всю жизнь меняешь работы, потому что не хочешь быть частью того, что тебе не нравится. Ты не хочешь строить культуру, которую тебе навязали. Ты устал. Это нормально. Но твоё приложение — это не про то, что ты устал. Оно про то, что ты хочешь делать что-то своё. Это нормально тоже.
— Но я не знаю, что делаю.
— А кто знает? Ты думаешь, Гала знает? Ты думаешь, Стас знает? Ты думаешь, я знаю? Никто не знает. Все просто делают. И ошибаются. И потом делают опять. Ты на этой неделе впервые за четыре года поговорил с сыном не про «сядь нормально». Так что неделя была не зря.
Она встаёт, чтобы налить себе кофе.
— И вообще, — говорит она, не оборачиваясь, — ты уже четыре года собирался начать. Начал. Поздравляю.
Я смотрю в окно. Снег. Кот (не намазанный, я проверил) спит на подоконнике. Тёмка пытается его намазать, но Аня его ловит.
Это не драйвово. Это ещё не драйвово. Но это уже что-то.
Я не открываю ноутбук до вечера.
Мы идём гулять. Мишка, Тёмка, Аня, я. Тёмка всю дорогу задаёт вопросы. «Почему снег белый?» «Почему вороны чёрные?» «Почему нельзя есть сосульки?» Я отвечаю, как умею. Иногда неправильно. Иногда не знаю ответа и говорю «не знаю, давай узнаем дома». Мишка идёт рядом и молчит, но это нормальное молчание, не то, которое было в понедельник.
Вечером, когда дети спят, я открываю ноутбук. Один раз. Ненадолго.
Я пишу в заметках:
Неделя первая. Код не писал? Писал. Людей спрашивал? Почти нет. Первый фидбек получил? Да. От Гали, 1978 год, внук 5 лет. Не поняла, для чего. Это честно. Я тоже не понял. Но начал понимать, что не понимаю. Это, наверное, прогресс.
План на неделю: поговорить с пятью реальными родителями. Не с женой. Не с чатом. С реальными. Спросить, как они разговаривают с детьми. Слушать. Не продавать. Не кодить.
Я сохраняю. Закрываю. Ложусь.
Перед сном Аня говорит:
— Ты сегодня был нормальный.
— Что это значит?
— Не в телефоне.
Я улыбаюсь в темноту.
— Спасибо.
— Не за что. Спи.
Я закрываю глаза. Внутри тихо. Не драйвово, не «полным сил». Просто тихо. И это пока лучший результат за неделю.
Родители, а как вы общаетесь со своими детьми? Расскажите чего хотите, чего не хватает. Я передам Игорю.
Привет!
Неделю назад я приносил сюда «Садик Добрых Дел» — приложение, где ребёнок вечером записывает,
что хорошего сегодня сделал, и от этого растёт цветок. Просил критику и получил её.
Пришёл отчитаться: несколько замечаний были по делу, и я их починил.
Вы написали, что при вводе доброго дела клавиатура закрывает кнопку «Сохранить», и посоветовали добавить в манифест `android:windowSoftInputMode="adjustResize"`. Я ответил, что контент поднимается через `imePadding`, и «видимо, у вас не сработало».
Я был не прав дважды.
Во-первых, никакого `imePadding` в этой шторке не было вообще. Проверять надо было в коде, а не по памяти.
Во-вторых, совет с манифестом тоже не сработал бы. При `targetSdk 35+` приложение в режиме
edge-to-edge, и потому система не ресайзит окно под клавиатуру. Надо учитывать именно ime padding. То есть баг был настоящий, а чинить его надо было не там, где мы оба думала.
Как починил: шторке заданы инсеты `BottomSheetDefaults.windowInsets.union(WindowInsets.ime)`
— беру максимум, а не сумму, иначе над клавиатурой повисает пустая полоса
в высоту панели навигации. И содержимому добавлен скролл: одного отступа мало. Посчитал на
экране `360×640` — заголовок, готовые фразы, поле и ряд кнопок вместе просят около `416 dp`
при доступных `340`.
Вы же спросили, как менять настроение: выбрал один раз и не понял, как поменять. Это оказалось хуже бага. Настроение меняется тапом по небу, подсказка про это в приложении была — но увидеть ее было сложно, теперь чуть легче. Допом сделал демо прокручивание всех пяти погод.
«Идея хорошая, графика — говно» и «но графику бы посимпатичнее». Пожалуй, про графику мне напихали больше всего.
Не стал менять подход к рисованию цветка т.к. мне крайне важно возможность взаимодействовать с садом. Для этого 3д хочу все таки оставить. Но попытался исправить мертвое окружение - добавить деталей, движения камеры.
Завёл зелень в дальний план — поле было песочным, а «садик» без зелени читается
пустырём. Архивным цветам дал нормальные контактные тени, а горшки у них убрал — типа в горшке вырастили и потом в землю посадили. У главного цветка стало шесть и пять
лепестков с округлым кончиком вместо восьми узких клиньев. И камера теперь тихо дышит и идёт за пальцем.
Главное: у взрослого теперь может быть свой сад.
При первом запуске приложение спрашивает, для кого этот сад. Если для взрослого — он получает точно такие же возможности как ребёнок. Доступа к саду своего ребёнка у него нет и не появится, бэкенда по-прежнему нет вообще. Предполагаю, что поводом для общения может быть желание показать сегодняшний цветок как ребёнком так и родителем.
За неделю карточку в RuStore открыли около 450 раз. Установок с них — 2. Это 0,44% при
магазинной норме 20-30%.
Причём по своим запросам приложение стоит первым: «дневник добрых дел», «добрые дела для
детей», «добрые поступки», «доброта для детей», «настроение ребёнка» — везде первое место. То
есть находят. Открывают. И уходят.
Моя рабочая версия — пустой рейтинг: 0,0 и «Нет оценок» на детском приложении выглядит как
приговор. Но я не уверен, что дело только в нём.
Ссылка: https://www.rustore.ru/catalog/app/com.sadikdobrihdel — в прошлый раз мне справедливо
написали, что зря её не дал.
Откройте карточку и скажите, на чём вы бы ушли. Не «что улучшить вообще», а
буквально: что первое не понравилось и в какой момент вы решили уйти с карточки приложения в сторе, не устанавливая его.
Приветы!
Я андроидщик, давно пишу мобильные приложение и тут решил сделать прилу для общения с моими детьми, но с надеждой на что-то большее.
В конце июня сел делать маленькую штуку на вечер и не смог остановиться: 46 коммитов, 13 700 строк, два с половиной месяца вечеров.
Что получилось. Ребёнок вечером рассказывает, что хорошего он сегодня сделал: помог, поделился, поддержал, убрал за собой. Каждое дело растит цветок. Три дела — цветок расцветает, остаётся в саду навсегда, и можно посадить новое семечко. Ещё можно ткнуть пальцем в небо и отметить настроение — сад отвечает погодой: ясно, облачно, дождь, гроза, туман. Все погоды одинаково красивые, грусть тут не хуже радости, и никто не спрашивает «а почему тебе грустно».
Что внутри: Compose Multiplatform, всё хранится локально, без аккаунтов, без интернета, без рекламы и без единой кнопки «купить». Данные ребёнка никуда не утекают, потому что утекать им некуда — бэкенда нет вообще. Только крашлитику подключил, чтобы сбои ловить.
Теперь неприятная часть.
В магазине приложение с конца лета. Установок — кот наплакал (меньше сотни). Отзывов — ноль. Ни одного, даже злого.
Платная реклама дала ориентир около 1000 руб за одну установку. 10 тыс потратил для пробы и увидел как я просто потратил эти деньги без пользы. Значит, пора нести моё приложение на публичный суд.
Заработало приложение ровно 0 ₽: монетизации в нём нет никакой.
На выходных я сел и посчитал, что будет, если монетизацию всё-таки прикрутить — родительский донат, никаких покупок и цен в детском экране. При честных допущениях (1,5% платящих, 400 ₽ в год с платящего) одна установка приносит около 6 ₽. Против 1000 ₽ за платную установку это окупаемость в полпроцента. То есть реклама тут не «дороговата», она невозможна в принципе: чтобы сходилось, установка должна стоить дешевле пятёрки.
Раз рекламу закупать бессмысленно, остаётся идти к живым людям и получать по шапке. Вот, пришёл.
За чем конкретно — можно сразу по всем трём:
1. Не выращиваю ли я лицемерие. Самый честный аргумент против моего приложения: ребёнок начнёт делать добро ради цветка, а не потому что так надо. Я специально не даю ни баллов, ни рейтингов, ни соревнования с другими, и цветок растёт от любой мелочи - но осадок остается. Особенно интересно мнение тех, кто реально работает с детьми.
2. Кому это на самом деле нужно — ребёнку или родителю. Есть подозрение, что настоящий пользователь тут взрослый. Это ему нужен повод вечером поговорить о чём-то кроме «как дела в школе — нормально».
3. Идея, в которую я сейчас тыкаюсь: класс растит общий сад. Учитель, внеклассная работа, тридцать детей и один сад на всех. По деньгам это единственная схема, где хоть что-то сходится. Но я в школе не работал и не понимаю, живая это идея или кабинетная фантазия человека, который школу помнит по своему детству.
Ссылку не даю, чтобы пост не выглядел рекламой: приложение бесплатное, без рекламы и без покупок, называется «Садик Добрых Дел», лежит в RuStore. Скажете, что ссылка уместна — положу в комментарии.
Напихайте в панамку, за этим и пришёл. Два месяца я разговаривал в основном с компилятором, а он на любой вопрос отвечает «BUILD SUCCESSFUL».