Artekork

Artekork

На Пикабу
в топе авторов на 573 месте
100 рейтинг 0 подписчиков 0 подписок 1 пост 0 в горячем
4

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

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

И я подумал: а если наказание за пропуск будет не «сгорел огонёк», а вполне конкретное — у тебя умрёт кот?

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

Кот

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

Посчитайте: восемнадцать процентов в сутки. Со стартовой сотни у вас есть примерно пять с половиной суток, чтобы вспомнить о существовании английского. Потом кот умирает. С анимацией. По-настоящему.

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

Я специально не стал делать смерть понарошку. Если она отменяется одним тапом «продолжить» — это не мотивация, а декорация.

Кот — не картинка

Двадцать пять покадровых спрайтовых анимаций, больше пятисот нарисованных руками кадров. Не Lottie, не CSS-твины — честные пронумерованные PNG, как в играх девяностых.

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

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

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

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

Скучное, без которого всё бессмысленно

В основе — интервальные повторения. Лестница из десяти ступеней: два часа, шесть часов, двенадцать, сутки, трое, неделя, две, четыре, восемь и сто двенадцать дней. Слово, добравшееся до верхней ступени, можно считать выученным.

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

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

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

Словари двух типов: по уровням, обычный CEFR от A1 до C1, и по темам — здоровье, путешествия, деньги и так далее. Каждый словарь помнит свою позицию отдельно: переключился с B1 на «Путешествия», походил там, вернулся — продолжишь с того места, где бросил.

Один переключатель, который меняет обе половины игры

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

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

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

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

С котом можно разговаривать, и он помнит

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

Кот помнит, чем ты занимаешься, спустя несколько сессий после того, как ты это рассказал

Кот помнит, чем ты занимаешься, спустя несколько сессий после того, как ты это рассказал

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

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

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

Домашка от кота

Каждый день в десять утра по твоему локальному времени кот выдаёт домашнее задание. Не «повтори двадцать карточек», а задание под твой уровень, и к нему прилагается словарик, из которого пять-шесть слов одним тапом кидаются в карточки.

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

Мелочи, которых набралось на отдельный пост

Три режима ответа на карточку: свайп, печать и «Авто». Авто — это когда приложение само решает по каждому конкретному слову: два раза подряд угадал свайпом, переводим это слово на печать; забыл на печати, возвращаем на свайп. Лестница хранится персонально для каждого слова.

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

Озвучка слов, гид по транскрипции для тех, кто не понимает закорючки в квадратных скобках, оглавление грамматических тем со статусом по каждой, библиотека с папками и drag and drop, статистика с графиками и выгрузкой в PDF — можно показать репетитору или себе через полгода.

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

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

Портретная ориентация намертво. Это осознанное решение, а не лень: в альбомной клавиатура съедает шестьдесят процентов экрана, и вся раскладка, включая позиционирование кота, рассыпается.

Отдельная боль: клавиатура

Кот сидит внизу экрана, над ним всплывает шторка чата. Тапаешь по полю ввода, поднимается клавиатура, и всё это хозяйство — кот, шторка, фон — должно синхронно уехать вверх одним цельным движением, как будто это физический объект. Звучит как задача на полдня. В истории репозитория сто девять коммитов про клавиатуру и четыре переписывания с нуля.

Не потому что я тупой, хотя и поэтому тоже. А потому что один плагин молча добавлял отступ размером с клавиатуру, из-за чего вся страница перекладывалась в один кадр. Потому что в вебвью на Samsung анимация трансформации вообще не запускается, если её значение зависит от CSS-переменной — вот просто не запускается, и всё. Потому что глобальное правило «уменьшенная анимация» для людей с вестибулярными нарушениями обнуляло длительность всех переходов, включая тот, который отвечал не за красоту, а за функциональное позиционирование. Потому что движок лениво растеризует только что появившуюся разметку и давал фризы ровно в момент подъёма. И потому что два разных механизма анимации на одном элементе начинали гоняться друг за другом, каждый перезапуская другого.

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

Итого

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

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

Единственный побочный эффект: теперь я испытываю настоящую вину, когда пропускаю день. Разработчик, попавшийся в собственную ловушку, — классика.

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

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

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества

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

Теги

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

Сообщества