user9700619

user9700619

Пикабушник
Дата рождения: 26 октября
117 рейтинг 2 подписчика 0 подписок 5 постов 0 в горячем
Награды:
Пикабу 17 лет!
6

Сделал общие сады без аккаунтов: сервер не знает ни кто с кем связан, ни что в конверте⁠⁠

Серия Садик Добрых Дел: добрые дела и эмоции ребёнка

Привет!

Я тут уже дважды был с «Садиком Добрых Дел» — это приложение, где ребёнок вечером записывает, что хорошего сегодня сделал, и от этого растёт цветок. Первый раз пришёл за критикой и получил её, второй — отчитался, что починил.

Сейчас третий заход. Я сделал самую большую фичу за всё время — общие сады — и переделал обмен целиком уже после того, как он «работал». Аккаунтов в приложении так и не появилось: сервер не знает ни кто с кем связан, ни что лежит в конверте.

Что за фича. Раньше сад был один и жил на телефоне: ни аккаунтов, ни регистрации, ни сервера вообще. Теперь сады можно связать. Папа видит сад ребёнка, ребёнок — сад папы. И главное: в чужом саду можно записать то, что ты за этим человеком заметил. Родитель пишет «сам заметил, что бабушке тяжело» — и у ребёнка растёт цветок. Прямо при нём, пока они сидят рядом. Ребёнок ничего не нажимал.

Ссылка, чтобы не искать: RuStore.

Сервер, который про людей ничего не знает

Условие, которое я себе поставил: аккаунтов не будет. Ни телефона, ни почты, ни входа. Ребёнок семи лет не должен ничего регистрировать, а я не должен хранить базу детей.

Получилось так. Ключ связи рождается на телефоне того, кто зовёт, и уходит в приглашении — во фрагменте ссылки, после решётки. Фрагмент по устройству сети на сервер не уходит вообще: даже если ссылку открыть в браузере, ключ никуда не отправится.

Из ключа обе стороны считают две разные производные:

идентификатор ящика = sha256(ключ + "sadik-box-id")
токен доступа = sha256(ключ + "sadik-box-token")

Сервер хранит идентификатор открыто, а от токена — только его хеш. То есть он может проверить право на ящик, не зная ни ключа, ни токена, и не может ни притвориться участником, ни прочитать содержимое: внутри лежит шифротекст AES-GCM, ключ от которого есть только у двоих.

Весь сервер — это PUT и GET в почтовый ящик. Он не знает, кто с кем связан, сколько у человека связей и что в конверте. Из этого потом вылезет неожиданное следствие, но об этом ниже.

Что передаётся между телефонами

Первая версия обмена передавала участок снимком: счётчики, стадия цветка, архив. Пока сад был один, передавать было нечего вовсе, и снимок казался естественной формой — состояние как состояние. Но у него появился второй писатель, и снимок начал спорить сам с собой: кто приложил последним, тот и прав, чужая запись исчезает.

Разрешать конфликты я не стал. Сначала пересчитал, сколько в системе мест, куда пишут двое, и оказалось, что такое место ровно одно: запись, сделанная про другого человека. Цветок, настроение, пересадки пишет только хозяин сада, и спорить там не с кем.

Поэтому передаются теперь не счётчики, а сами записи, и сливаются объединением: порядок доставки не важен, повтор безвреден, «оба написали одновременно» перестаёт быть особым случаем. Счётчики и стадия цветка пересчитываются из записей на месте — они не данные, а следствие.

Свои слова при этом наружу не передаются вовсе. Другой видит, что момент был, и цветок от него вырос, но текста не читает: в списке стоит строка «Момент, о котором можно спросить». Об этом и разговор — приложение задаёт вопрос и не отвечает на него.

Почему не пуши

Хотелось, чтобы сад обновлялся быстро: вся сцена ради того, чтобы цветок вырос при вас. Первая мысль — пуши. Посчитал и передумал.

Чтобы отправить пуш, сервер обязан знать: «в ящик X положили → разбудить устройство D». Это таблица «кто с кем связан» плюс пуш-токен — устойчивый идентификатор телефона. Прямо сейчас сервер не знает ничего подобного и не может сопоставить двух людей. Пуши это ломают, и шифрование содержимого тут не помогает: утечёт граф.

Сделал проще: пока приложение на экране, оно ходит за почтой раз в десять секунд, после минуты тишины — раз в тридцать. Арифметика: три связи, опрос раз в десять секунд — 18 запросов в минуту на человека; сто человек одновременно — 30 запросов в секунду. Для Postgres на маленькой машине это ничто.

Вопрос к вам

Как бы вы доставляли обновление на второй телефон, не заводя аккаунтов и не отдавая серверу граф связей?

Есть ли третий путь, который я не вижу?

Сделал общие сады без аккаунтов: сервер не знает ни кто с кем связан, ни что в конверте
Показать полностью 1
0

Семнадцатая попытка. Серия 2: четыреста контактов, три человека⁠⁠

Серия Приложение для разговоров

«Семнадцатая попытка» — сериал про сорокалетнего тимлида Игоря. Семнадцатый раз в жизни он взялся за пет-проект: приложение, которое должно помочь родителям и детям разговаривать. Одна серия — одна неделя, и в каждой у него забирают одну иллюзию.

Эта серия — вторая: попытка поговорить с пятью реальными родителями и список, который оказался на троих. Предыдущие читать не обязательно, каждая сама по себе.

Первая серия: Приложение для разговоров

Понедельник

— Игорь, — говорит Стас, — как прошли встречи?

Я говорю:

— Хорошо.

Это правда. Они прошли хорошо. Все пять. По тридцать минут каждая, я поставил их подряд во вторник, потому что если бы я размазал их по неделе, то думал бы о них всю неделю.

— Что узнал?

И вот тут я понимаю, что мне нечего сказать.

Я разговаривал с пятью людьми два с половиной часа. Я спрашивал, как дела, что мешает, чего не хватает. Они отвечали: нормально, ничего не мешает, всего хватает. Костя сказал, что хорошо бы второй монитор. Я записал: «второй монитор». Это единственная запись, которую я сделал за два с половиной часа.

— Ребята в порядке, — говорю я. — Есть запрос на оборудование.

— Отлично, — говорит Стас. — Видишь, работает. Люди раскрываются, когда ими интересуются. Давай в следующем месяце сделаем это регулярной практикой.

Я киваю.

Люди не раскрылись. Люди сидели с ровными лицами и ждали, когда я отстану, потому что я их начальник, а начальнику не рассказывают, чего не хватает, начальнику говорят «нормально». Я это знаю. Я сам пятнадцать лет говорил «нормально».

Но Стасу я этого не скажу, потому что тогда придётся объяснять, зачем я вообще их проводил, и мы оба окажемся в неудобном месте.

После созвона я сижу и смотрю в свою заметку. «Второй монитор». Пять разговоров. Два с половиной часа. Один монитор.

Вечером я открываю ноутбук и пишу в план на неделю: «поговорить с пятью реальными родителями». И только когда закрываю крышку, до меня доходит, что я сегодня уже провёл пять разговоров и не узнал ничего.

Но это другое, думаю я. Там были подчинённые. А тут будут люди, которым правда интересно.

Вторник

Я сажусь составлять список.

Мне нужно пять родителей. Реальных. Не жена, не чат, не воображаемая Гала.

Я открываю телефон. У меня в телефоне четыреста контактов.

Первый час я вычёркиваю коллег. Коллега — не родитель, коллега — это человек, с которым я говорю про релизы. Если я напишу Кате из соседней команды «привет, а как ты разговариваешь со своим ребёнком», Катя решит, что меня уволили.

Второй час я вычёркиваю родственников. С ними нельзя: они начнут не отвечать на вопрос, а волноваться за меня.

Потом я смотрю на то, что осталось.

Осталось трое.

Лёха. Женя, с которым мы не виделись четыре года, но он лайкает мои редкие посты, и у него вроде есть дочь. И Марина, мама Мишкиного одноклассника, чей номер у меня есть, потому что мы один раз вместе искали потерянную сменку.

Трое. Не пять. Трое.

Я сижу и думаю: у меня сорок лет жизни, четыреста контактов и три человека, которым я могу написать вопрос, не относящийся к работе.

Я пишу в заметки: «выборка нерепрезентативная». Потому что если написать «выборка нерепрезентативная», то это звучит как методологическая проблема.

А если написать «мне не с кем поговорить», то это звучит как то, что есть.

Вечером Аня спрашивает:

— Ты чего такой?

— Я составил список.

— Какой список?

— Людей, с которыми можно поговорить.

Аня молчит секунду.

— И сколько?

— Достаточно, — говорю я.

— Игорь.

— Трое.

Аня ничего не отвечает. Она просто садится рядом и берёт пульт, и мы двадцать минут смотрим какое-то кулинарное шоу, где мужчина с прищуром пробует суп и говорит «интересно». И это, наверное, лучшее, что она могла сделать.

Среда

Начинать надо с Лёхи. Во-первых, он единственный, кому не надо объяснять, кто я такой. Во-вторых, у него Даня, двенадцать лет. В-третьих — и это главная причина, хоть я и не признаюсь себе сразу, — у меня стучит что-то в передней подвеске, и это отличный предлог приехать, не объявляя, что я приехал с вопросом.

Лёха держит бокс на Салова. Друг детства, двор, гаражи, всё как положено. Он чинит машины двадцать лет. У него на стене висит список клиентов, написанный маркером на куске обоев, и он реально им пользуется.

Я приезжаю в четыре. Он загоняет мою машину на подъёмник, лезет под неё и через сорок секунд говорит:

— Стойка.

— Дорого?

— Тебе — дорого.

Он смеётся. Он всегда так шутит, с десятого класса.

Пока он возится, я стою рядом. Мне некуда деть руки. Я предлагаю помочь. Он говорит «подержи», даёт мне фонарь, и я держу фонарь. Потом он говорит «не туда свети», и я свечу туда. Потом он говорит «да блин, дай сюда» и светит себе сам, зажав фонарь между плечом и щекой.

Вот и вся моя помощь. Я тимлид с расширенной зоной ответственности, и я не смог удержать фонарь.

— Лёх, — говорю я. — Можно вопрос?

— Валяй.

— Как ты с Даней разговариваешь?

Он выкатывается из-под машины на своей лежанке и смотрит на меня снизу вверх.

— В смысле?

— Ну, о чём вы говорите.

— О чём надо, о том и говорим. Ты чего, Игорь?

И я начинаю рассказывать.

Я рассказываю, что делаю приложение. Что оно даёт родителю и ребёнку дополнительные поводы для доброго разговора. Что это не «как дела в школе», а что-то настоящее.

— Это то, которое ты мне на даче рассказывал? — говорит Лёха из-под машины.

— Нет. То другое было.

— А, ну да. То было про рецепты.

— Про списки покупок.

— Один хрен.

Я продолжаю. Я говорю «пользовательский сценарий». Я говорю «вовлечённость». Один раз я говорю «эмпатичный онбординг» — клянусь, оно само.

Лёха слушает молча. Потом вытирает руки о тряпку и говорит:

— Слушай. Вот ты сейчас пять минут говорил. Я ни хера не понял.

— Ну смотри...

— Не, ты погоди. Я не тупой. Я договора с поставщиками читаю, я ОСАГО отсуживал. Я не понял не потому, что я не понял. Я не понял, потому что ты не сказал.

Я стою с фонарём, который он у меня уже забрал.

— Ты вот, — говорит Лёха, — зарабатываешь сколько? Не говори. Я и так знаю примерно. У тебя квартира, две машины, дети в кружках, жена не работает, если не хочет. Тебе сорок. И тебе — чего?

— Мне скучно.

— Скучно, — повторяет он. — Игорь, я тебя с десятого класса знаю. Ты мне каждые года два что-нибудь рассказываешь. Я уже не запоминаю названия, я запоминаю, что у тебя глаза блестят. Потом проходит полгода, я спрашиваю — а ты говоришь «да забил».

— В этот раз по-другому.

— Ага.

Он вытирает руки ещё раз, хотя они уже чистые.

— Ко мне вчера приезжала женщина. У неё «Солярис» две тысячи двенадцатого. Ей надо было ездить на работу, а он не заводился, и она мне говорит: Алексей, мне завтра надо, у меня смена. Вот ей не скучно. Ей надо.

— Это другое.

— Это другое, — соглашается он. — Только вы, айтишники, зажрались все. Натурально. Вы сидите в тепле, у вас чай, у вас, как его, лапшетория...

— Ретроспектива.

— Вот. И вам скучно. И вы начинаете спасать человечество. А человечество, между прочим, не просило.

Я хочу сказать, что я не спасаю человечество. Что я просто хочу сделать что-то полезное. Но я эту фразу уже говорил Ольге из чата, и она ответила «понятно, удачи», и это была самая холодная фраза, которую я слышал за год.

Поэтому я говорю:

— Ну, наверное.

— Наверное, — передразнивает Лёха. — Стойку в пятницу привезут. Приезжай к шести, сделаю.

Я еду домой и всю дорогу придумываю, что надо было ответить. Я придумываю отличные ответы. Один из них просто блестящий, я даже притормаживаю, чтобы записать его в телефон.

Дома я его перечитываю. Там написано: «Дело не в скуке, а в ощущении осмысленности своего вклада».

Я удаляю заметку.

Четверг

Я решаю подготовиться.

Это, если честно, самое идиотское, что я делаю за неделю, — но понимаю я это только в воскресенье.

Я открываю ноутбук и составляю тезисы. У меня получается шесть пунктов. Я их редактирую. Я убираю англицизмы. Я нахожу метафору — про то, что приложение это не костыль, а перила. Мне нравится метафора. Я записываю её отдельно, капслоком.

Потом я репетирую вслух. В ванной, потому что там дверь закрывается.

Аня заходит на кухню, когда я стою у окна и говорю сам себе: «Смотри, это не чтобы за тебя, это чтобы тебе легче».

— Ты с кем?

— Ни с кем.

— Ты репетируешь.

— Я формулирую.

Аня наливает себе чай. Не уходит.

— Игорь. Ты четыре года формулируешь. Ты в прошлом году формулировал, как поговорить со мной про ипотеку. Помнишь, чем кончилось?

— Мы взяли ипотеку.

— Мы взяли ипотеку, потому что я в какой-то момент сказала: давай просто возьмём. Ты к тому времени сделал табличку.

— Табличка была хорошая.

— Табличка была прекрасная, — говорит Аня. — Просто разговор был не про неё.

Она уходит спать. Я сижу с шестью тезисами и метафорой про перила.

В час ночи я понимаю, что готовлюсь к разговору с человеком, которого знаю тридцать лет. Что я собираюсь прийти к Лёхе с тезисами. Что если бы Лёха узнал, что я репетировал разговор с ним в ванной, он бы смеялся полгода и рассказывал это всем в боксе.

Я закрываю ноутбук и иду спать. Тезисы остаются в файле. Файл называется «разговор_лёха_v2».

Ещё раз, вслух: «разговор_лёха_v2». Мне сорок лет.

Пятница

Я приезжаю в шесть. Лёха меняет стойку. Я стою рядом и на этот раз даже не пытаюсь помочь, просто держу ему стакан с чаем, пока он вытирает руки.

— Лёх.

— М?

— Ты вчера спросил, чего мне. Я тебе соврал, что скучно.

Он поднимает голову.

— Мне сорок, — говорю я. — Я двадцать лет пишу код. Я хорошо его пишу. Я на работе сейчас отвечаю за то, чтобы люди чувствовали причастность к продукту, и это не шутка, это в моих задачах так и написано. Я прихожу вечером, и у меня не остаётся ничего. Я хочу проснуться утром и понять, что то, что я сделал вчера, кому-то нужно. Не команде. Не Стасу. Кому-то живому.

Лёха молчит и пьёт чай.

— Это всё? — говорит он.

— Это всё.

— Ну вот так бы сразу. А то «онбординг».

Он ставит стакан на бампер.

— Только это не про приложение, Игорь. Это про то, что тебе плохо.

— Я знаю.

— А приложение-то твоё зачем?

И я опять не знаю, что ответить. Я знаю шесть тезисов. Я знаю метафору про перила. Но он спросил не это, он спросил — зачем.

— Я хочу, чтобы родители с детьми больше разговаривали, — говорю я наконец.

— Кто не разговаривает — тот и с приложением не будет.

— А кто хочет, но не знает, о чём?

— Да не подсовывай ты ему темы, — говорит Лёха. — Ты чего, тему ему подсунешь, а он тебе что, доклад прочитает? Мой Даня сам приходит. Когда ему есть чего. Я в боксе, он рядом сидит, крутится, и в какой-то момент — пап, а вот у нас в школе такое было. И всё. Я ж его не спрашиваю. Я просто есть.

Он берёт ключ.

— Ты сделай, чтоб ему было чего рассказать. А там сам прибежит.

Я стою и молчу так, как молчат, когда тебе только что сказали то, что ты сам пытался придумать четыре дня.

— Лёх.

— Чего?

— А ты можешь ещё раз, я запишу?

— Иди ты, — говорит он. — Держи вот лучше.

И даёт мне фонарь.

Уже когда я сажусь в машину, он наклоняется к окну.

— Слушай. А ты же в этом всём сечёшь. У меня запись клиентов на обоях, вон, видел. Мне бы такую штуку, чтоб они сами записывались, а не звонили в девять вечера. Сделаешь?

— Сделаю.

— Когда?

— Скоро.

Он кивает и уходит в бокс.

Я знаю, что не сделаю. Я знаю это в ту же секунду, когда говорю «скоро». Но сказать «нет» человеку, который два часа чинил тебе машину и только что бесплатно объяснил тебе твой же продукт, я не могу.

Суббота

Я не открываю ноутбук до обеда.

После обеда я иду к Мишке в комнату. Он собирает что-то в «Майнкрафте».

— Миш.

— М.

— Ничего. Просто посижу.

Он смотрит на меня подозрительно. Я сажусь на пол у стены, потому что стул завален вещами.

Я сижу двадцать минут. Двадцать минут я ничего не спрашиваю. Это оказывается неожиданно трудно: у меня в голове штук пять вопросов, и все они начинаются с «а как».

На двадцать третьей минуте Мишка говорит, не отрываясь от экрана:

— Пап, а прикинь, у нас Соколов сегодня сказал учительнице, что он не сделал домашку, потому что у него бабушка заболела. А у него бабушка умерла два года назад.

— И что учительница?

— Ничего. Она не знает.

— А ты откуда знаешь?

— Я с ним в одном классе с первого.

Мы молчим.

— Жалко его, — говорит Мишка.

— Соколова?

— Ага.

И всё. Он возвращается к своим блокам. Я сижу ещё немного и выхожу.

На кухне я стою и думаю, что если бы я задал ему вопрос — любой из моих пяти вопросов, начинающихся с «а как», — он бы ответил «нормально». Как отвечали мне в понедельник пятеро моих подчинённых.

Я достаю телефон и пишу в заметки одну строчку:

«Не спрашивать. Быть рядом достаточно долго».

Потом стираю и пишу:

«Продукт должен давать ребёнку, о чём рассказать. Не родителю — о чём спросить».

Смотрю на это. Всё, что я построил ночью в среду, — тема дня, пуш родителю, «дополнительный повод» — оно всё было про родителя. Про меня. Про то, как мне удобно.

Воскресенье

Гуляем. Тёмка находит лужу и проверяет её на глубину методом погружения. Аня ловит его на третьем шаге. Мишка идёт рядом и рассказывает про Соколова ещё раз, уже маме, и я слушаю в третий раз, и мне не скучно.

Вечером я открываю ноутбук. Один раз. Ненадолго.

Пишу:

Неделя вторая. Пять родителей? Один. И тот друг. Список оказался на троих, из четырёхсот контактов. Узнал главное и не от себя: тему подсовывать бесполезно, надо чтобы ребёнку было чего рассказать. Это переворачивает всё, что я сделал в прошлый четверг ночью.

Ещё узнал, что я репетирую разговоры с человеком, которого знаю тридцать лет. И что за неделю я провёл шесть разговоров: пять по работе и один настоящий. По работе я узнал про монитор.

Долг: Лёхе — запись клиентов. Сказал «скоро». Скоро не будет.

План на неделю: переделать так, чтобы записывал ребёнок, а не получал родитель. И написать оставшимся двоим из списка.

Сохраняю. Закрываю.

Аня уже спит. Я лежу и смотрю в потолок, и в голове крутится не «пользовательский сценарий», а Лёхино: «Я просто есть».

Я так не умею. Я всё время что-нибудь делаю.

Но, кажется, это и есть та штука, которую надо не сделать, а перестать делать.

Свет с улицы ползёт по потолку. Внизу кто-то заводит машину, и я машинально слушаю, как она заводится. Нормально заводится.


Родители, а бывает у вас такое, что ребёнок сам приходит рассказать? В какие моменты? Я передам Игорю — он теперь это записывает.

Показать полностью 2
2

Приложение для разговоров⁠⁠

Серия Приложение для разговоров

Неделя первая: я не пишу код

Понедельник

Стендап в десять. Я захожу в созвон на минуту позже, с кружкой, в которой чай уже остыл, потому что я залил его кипятком двадцать минут назад и забыл. Это, кстати, метафора моей жизни, но об этом позже.

Стас, наш директор по разработке, включает камеру. У Стаса всегда включена камера. У Стаса всегда включён микрофон. Стас никогда не бывает не готов.

— Коллеги, — говорит Стас, — на этой неделе фокус на вовлечённости. Я посмотрел метрики по команде, у нас проседает ощущение причастности к продукту. Игорь, ты как лид, что планируешь?

Я планирую дожить до пятницы. Но вслух говорю:

— Проведу одну встречу один на один, посмотрю, что там у ребят.

— Одну? — Стас приподнимает бровь так, будто я сказал, что планирую один раз помыть руки на этой неделе.

— Пять, — говорю я. — Пять встреч.

— Отлично. И ещё, коллеги, давайте не забывать: мы тут не просто пишем код. Мы строим культуру. Культура — это ответственность каждого. Но в первую очередь — руководства. Я свою ответственность осознаю. Осознайте и вы.

Я киваю. Я эту фразу слышал на пятнадцати работах. Я её сам произносил на трёх. Она означает ровно одно: «Мы будем требовать от вас больше, а вы будете считать это честью».

Закрываю ноутбук. Смотрю в окно. Питер, серое небо, голубь на карнизе сидит так, будто тоже устал от всех этих процессов.

У меня неплохая зарплата. Даже хорошая. Я тимлид, я архитектор, я «сеньор с расширенной зоной ответственности», как написано в моём профиле, который я сам же и правил, потому что 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 лет. Не поняла, для чего. Это честно. Я тоже не понял. Но начал понимать, что не понимаю. Это, наверное, прогресс.

План на неделю: поговорить с пятью реальными родителями. Не с женой. Не с чатом. С реальными. Спросить, как они разговаривают с детьми. Слушать. Не продавать. Не кодить.

Я сохраняю. Закрываю. Ложусь.

Перед сном Аня говорит:
— Ты сегодня был нормальный.

— Что это значит?

— Не в телефоне.

Я улыбаюсь в темноту.

— Спасибо.

— Не за что. Спи.

Я закрываю глаза. Внутри тихо. Не драйвово, не «полным сил». Просто тихо. И это пока лучший результат за неделю.


Родители, а как вы общаетесь со своими детьми? Расскажите чего хотите, чего не хватает. Я передам Игорю.

Показать полностью
3

Неделю назад вы разнесли моё приложение. Вот что я починил⁠⁠

Серия Садик Добрых Дел: добрые дела и эмоции ребёнка

Привет!

Неделю назад я приносил сюда «Садик Добрых Дел» — приложение, где ребёнок вечером записывает,
что хорошего сегодня сделал, и от этого растёт цветок. Просил критику и получил её.

Пришёл отчитаться: несколько замечаний были по делу, и я их починил.

@OneClickStudio, про клавиатуру

Вы написали, что при вводе доброго дела клавиатура закрывает кнопку «Сохранить», и посоветовали добавить в манифест `android:windowSoftInputMode="adjustResize"`. Я ответил, что контент поднимается через `imePadding`, и «видимо, у вас не сработало».

Я был не прав дважды.

Во-первых, никакого `imePadding` в этой шторке не было вообще. Проверять надо было в коде, а не по памяти.

Во-вторых, совет с манифестом тоже не сработал бы. При `targetSdk 35+` приложение в режиме
edge-to-edge, и потому система не ресайзит окно под клавиатуру. Надо учитывать именно ime padding. То есть баг был настоящий, а чинить его надо было не там, где мы оба думала.

Как починил: шторке заданы инсеты `BottomSheetDefaults.windowInsets.union(WindowInsets.ime)`
— беру максимум, а не сумму, иначе над клавиатурой повисает пустая полоса
в высоту панели навигации. И содержимому добавлен скролл: одного отступа мало. Посчитал на
экране `360×640` — заголовок, готовые фразы, поле и ряд кнопок вместе просят около `416 dp`
при доступных `340`.

Вы же спросили, как менять настроение: выбрал один раз и не понял, как поменять. Это оказалось хуже бага. Настроение меняется тапом по небу, подсказка про это в приложении была — но увидеть ее было сложно, теперь чуть легче. Допом сделал демо прокручивание всех пяти погод.

@TldM7 и @AnsyAgeeva, про графику

«Идея хорошая, графика — говно» и «но графику бы посимпатичнее». Пожалуй, про графику мне напихали больше всего.

Не стал менять подход к рисованию цветка т.к. мне крайне важно возможность взаимодействовать с садом. Для этого 3д хочу все таки оставить. Но попытался исправить мертвое окружение - добавить деталей, движения камеры.

Завёл зелень в дальний план — поле было песочным, а «садик» без зелени читается
пустырём. Архивным цветам дал нормальные контактные тени, а горшки у них убрал — типа в горшке вырастили и потом в землю посадили. У главного цветка стало шесть и пять
лепестков с округлым кончиком вместо восьми узких клиньев. И камера теперь тихо дышит и идёт за пальцем.

Что поменялось кроме этого

Главное: у взрослого теперь может быть свой сад.

При первом запуске приложение спрашивает, для кого этот сад. Если для взрослого — он получает точно такие же возможности как ребёнок. Доступа к саду своего ребёнка у него нет и не появится, бэкенда по-прежнему нет вообще. Предполагаю, что поводом для общения может быть желание показать сегодняшний цветок как ребёнком так и родителем.

Цифра, которой у меня в прошлый раз не было

За неделю карточку в RuStore открыли около 450 раз. Установок с них — 2. Это 0,44% при
магазинной норме 20-30%.

Причём по своим запросам приложение стоит первым: «дневник добрых дел», «добрые дела для
детей», «добрые поступки», «доброта для детей», «настроение ребёнка» — везде первое место. То
есть находят. Открывают. И уходят.

Моя рабочая версия — пустой рейтинг: 0,0 и «Нет оценок» на детском приложении выглядит как
приговор. Но я не уверен, что дело только в нём.

Ссылка: https://www.rustore.ru/catalog/app/com.sadikdobrihdel — в прошлый раз мне справедливо
написали, что зря её не дал.

Одна просьба

Откройте карточку и скажите, на чём вы бы ушли. Не «что улучшить вообще», а
буквально: что первое не понравилось и в какой момент вы решили уйти с карточки приложения в сторе, не устанавливая его.

Показать полностью 7
4

Приложение, где ребёнок растит цветок за добрые дела. Пришёл за критикой⁠⁠

Серия Садик Добрых Дел: добрые дела и эмоции ребёнка

Приветы!

Я андроидщик, давно пишу мобильные приложение и тут решил сделать прилу для общения с моими детьми, но с надеждой на что-то большее.

В конце июня сел делать маленькую штуку на вечер и не смог остановиться: 46 коммитов, 13 700 строк, два с половиной месяца вечеров.

Что получилось. Ребёнок вечером рассказывает, что хорошего он сегодня сделал: помог, поделился, поддержал, убрал за собой. Каждое дело растит цветок. Три дела — цветок расцветает, остаётся в саду навсегда, и можно посадить новое семечко. Ещё можно ткнуть пальцем в небо и отметить настроение — сад отвечает погодой: ясно, облачно, дождь, гроза, туман. Все погоды одинаково красивые, грусть тут не хуже радости, и никто не спрашивает «а почему тебе грустно».

Что внутри: Compose Multiplatform, всё хранится локально, без аккаунтов, без интернета, без рекламы и без единой кнопки «купить». Данные ребёнка никуда не утекают, потому что утекать им некуда — бэкенда нет вообще. Только крашлитику подключил, чтобы сбои ловить.

Теперь неприятная часть.

В магазине приложение с конца лета. Установок — кот наплакал (меньше сотни). Отзывов — ноль. Ни одного, даже злого.

Платная реклама дала ориентир около 1000 руб за одну установку. 10 тыс потратил для пробы и увидел как я просто потратил эти деньги без пользы. Значит, пора нести моё приложение на публичный суд.

Заработало приложение ровно 0 ₽: монетизации в нём нет никакой.

На выходных я сел и посчитал, что будет, если монетизацию всё-таки прикрутить — родительский донат, никаких покупок и цен в детском экране. При честных допущениях (1,5% платящих, 400 ₽ в год с платящего) одна установка приносит около 6 ₽. Против 1000 ₽ за платную установку это окупаемость в полпроцента. То есть реклама тут не «дороговата», она невозможна в принципе: чтобы сходилось, установка должна стоить дешевле пятёрки.

Раз рекламу закупать бессмысленно, остаётся идти к живым людям и получать по шапке. Вот, пришёл.

За чем конкретно — можно сразу по всем трём:

1. Не выращиваю ли я лицемерие. Самый честный аргумент против моего приложения: ребёнок начнёт делать добро ради цветка, а не потому что так надо. Я специально не даю ни баллов, ни рейтингов, ни соревнования с другими, и цветок растёт от любой мелочи - но осадок остается. Особенно интересно мнение тех, кто реально работает с детьми.

2. Кому это на самом деле нужно — ребёнку или родителю. Есть подозрение, что настоящий пользователь тут взрослый. Это ему нужен повод вечером поговорить о чём-то кроме «как дела в школе — нормально».

3. Идея, в которую я сейчас тыкаюсь: класс растит общий сад. Учитель, внеклассная работа, тридцать детей и один сад на всех. По деньгам это единственная схема, где хоть что-то сходится. Но я в школе не работал и не понимаю, живая это идея или кабинетная фантазия человека, который школу помнит по своему детству.

Ссылку не даю, чтобы пост не выглядел рекламой: приложение бесплатное, без рекламы и без покупок, называется «Садик Добрых Дел», лежит в RuStore. Скажете, что ссылка уместна — положу в комментарии.

Напихайте в панамку, за этим и пришёл. Два месяца я разговаривал в основном с компилятором, а он на любой вопрос отвечает «BUILD SUCCESSFUL».

Показать полностью 4
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества