Когда я увлекаюсь проектом, то могу буквально им жить. Ловлю гиперфиксацию: хочется доделать ещё одну вещь, потом ещё одну в рамках проекта. В это время быт и здоровье уходят на второй план. И когда я наконец отвлекаюсь от проекта, обнаруживаю, что в других сферах тоже накопились дела, либо же имеется напаханное поле.
Мне хотелось сохранить способность увлекаться и при этом вовремя замечать, чему ещё нужно моё внимание. Я стала искать планировщик, в котором можно было бы держать в поле зрения разные сферы жизни, выбирать приоритеты и превращать большие цели в конкретные дела. Удобного для себя варианта я не нашла и решила сделать свой, который назвала «Сферы«.
Что уже есть у планировщиков
Перед тем как начать разработку, я изучила существующие сервисы. Для сравнения возьму три примера: у каждого свой способ помочь человеку решить, чем заняться дальше.
Todoist позволяет собрать задачи в проекты, назначить приоритеты и выбрать нужные дела через фильтры. Если уже понятно, какие списки тебе нужны, можно настроить представление под себя.
TickTick объединяет задачи, календарь и трекер привычек. В нём можно одновременно спланировать неделю и отмечать то, что хочешь делать регулярно.
SingularityApp позволяет смотреть на один проект как на список, календарь, канбан-доску или диаграмму Ганта. Можно выбрать представление под конкретный проект и способ работы.
С помощью проектов, списков или меток в этих сервисах можно организовать и работу, и личные дела. Мне хотелось, чтобы сферы жизни уже были частью интерфейса. Если я давно ничего не записывала про здоровье или быт, в списке задач мне может просто нечего быть видно. А когда у каждой сферы есть своё место, я могу заметить и пустую карточку, и дело, которое давно откладываю.
Как личные наблюдения превратила в ТЗ для приложения
Я сформулировала для себя рабочую гипотезу: если держать разные сферы на виду, а цель доводить до конкретного действия и времени, мне будет проще выбрать, чему уделить внимание сегодня.
Из неё получились четыре вопроса, для которых я спроектировала отдельные экраны:
-
Сферы — что сейчас происходит в разных частях моей жизни?
-
Цели — чего я хочу добиться и с какого шага могу начать?
-
Планер — куда это дело помещается по времени?
-
Сегодня — что из всего этого актуально прямо сейчас?
Для проверки я взяла повседневные сценарии. Записать дело, найти его через несколько дней, переименовать, поставить на конкретное время, увидеть уведомление. Ещё два условия задала для первой версии: пройти основные сценарии без аккаунта и открыть план без интернета. Так стало понятно, что нужно довести до рабочего состояния для первого выпуска.
Экран. Почему я выбрала карточки
Я сделала сетку карточек, чтобы можно было одним взглядом увидеть несколько сфер. У каждой есть название, значок и цвет. Цвет помогает быстро различать карточки, а название объясняет их даже без цвета. Крупное число показывает, сколько дел в сфере. Короткая подпись даёт контекст: например, в Работе есть дело на сегодня, а в Учёбе — дело, которое сегодня выполнять не нужно. Делала приложение сугубо полезным для применения на практике, поэтому добавляла понятные значки и цвета.
Пустые карточки тоже остаются на экране. На скриншоте у Здоровья ноль дел, но сфера видна рядом с Работой. Так я могу сама решить, надо ли записать туда что-то сейчас. Ноль в карточке означает ноль записанных дел. По нему я не оцениваю, насколько хорошо у меня обстоят дела со здоровьем.
Я добавила в поиск контекст родительских разделов и показала путь к записи в результатах. Обзор дел ребёнка собирает записи из вложенных разделов, а при открытии ведёт к исходному делу. Это позволило сохранить вложенность и сократить путь до записи. Для проверки использовали и старые задачи, у которых имя было только в названии раздела.
Экран цели. Что делать после «я хочу»
Я хотела сохранить в карточке цели ответ на вопрос «зачем мне это?» и дать возможность вернуться к нему через несколько недель. Поэтому у цели есть отдельное место для причины, срока и этапов.
В карточке есть блок «Если станет трудно». Его смысл — заранее подумать, что может помешать, и выбрать ответ. Например: «Если вечером устану и не захочу читать главу, прочитаю две страницы». У такого подхода есть параллель в исследованиях implementation intentions. Питер Голлвитцер и Вероника Брандштеттер изучали разницу между намерением достичь цели и планом действия при конкретном условии. Эта работа даёт рамку для объяснения интерфейса. Эффект самого приложения в исследовании на пользователях мы не измеряли. Gollwitzer & Brandstätter, 1997
Вот как может выглядеть весь путь. Я выбираю сферу «Дом», записываю цель «Разобрать вещи перед переездом», добавляю шаг «Разобрать один ящик» и выделяю на него 15 минут в воскресенье. Большая цель остаётся в своём разделе, а в плане дня появляется действие, которое можно выполнить.
Планер и будильник. Как дело доходит до нужного момента
У дела может быть фиксированное время, а может быть только день. Я хотела сохранить эту разницу. Если я знаю, что собираюсь гулять в 21:30, мне нужно видеть время в плане. Если я хочу в воскресенье разобрать ящик, но пока не знаю во сколько, могу оставить дело на этот день и вернуться к нему позже. Экран «Сегодня» сужает обзор до ближайших дел, а в планере можно посмотреть, как выглядит неделя.
Будильник понадобился мне потому, что я могу аккуратно всё записать и снова уйти в проект. Когда наступает время прогулки, я хочу увидеть название дела, ради которого поставила сигнал. И хочу иметь возможность выключить или отложить его прямо из уведомления. Так у будильника появилась связь с задачей и её расписанием.
Технически цепочка разделена на две части:
-
Логика приложения рассчитывает время. Она берёт время из плана, учитывает настройку «напомнить заранее» и пропускает выполненные дела. Для дела на 18:00 с напоминанием за 15 минут могут быть запланированы сигналы на 17:45 и 18:00.
-
Нативный модуль Android отвечает за срабатывание. Модуль написан на Kotlin. При доступе к точным будильникам он использует
AlarmManager.setAlarmClock. Если доступ закрыт, код пробуетsetAndAllowWhileIdle, у которого время доставки менее предсказуемо. Системный планировщик позволяет назначить событие, даже когда экран приложения закрыт.
В процессе аудита мы разделили обработку команд будильника и восстановление расписания. Команды запуска, выключения и откладывания теперь принимает закрытый AlarmReceiver. Восстановление по системным событиям вынесено в отдельный BootReceiver. Так кнопки уведомления продолжают работать через системный PendingIntent, а стороннее приложение не может напрямую отправить команду во внутренний обработчик.
Как я работала с ИИ-ассистентом
Разработка шла небольшими циклами. Я объясняла, что хочу сделать в приложении, и приносила конкретные проблемы. Вместе с ассистентом мы превращали их в сценарии, по которым можно понять, исправилась ли ошибка. Ассистент помогал читать код, искать причины, вносить изменения, готовить проверки и собирать APK. Я решала, какие функции нужны мне в повседневной жизни, и проверяла отдельные сценарии на телефоне.
Один из таких циклов начался с переименования дела. Сценарий оказался точнее, чем «проверить сохранение»: изменить заголовок и сразу нажать «Сделано», пока поле ещё в фокусе. Раньше обработчик мог взять предыдущее значение. Мы сделали так, чтобы сохранение читало актуальный черновик, а новое название и отметка о выполнении записывались одной операцией. Затем проверили повторное открытие карточки и возврат с экрана.
С интерфейсом мы работали похожим способом. Для пробного аудита прошли несколько вымышленных сценариев в узкой веб-вёрстке. Один касался первого запуска, другой — поиска семейного дела, третий — прогресса цели. Так заметили, например, что учебные записи могут смешиваться с личным планом, а переход к детскому делу требует слишком много шагов. Это были проходы ассистента с синтетическими данными. Они помогли найти места для проверки, а удобство для живых новичков ещё предстоит оценить отдельно.
Отдельно мы исследовали идею облачного наставника. На вымышленных примерах сравнивали несколько конфигураций моделей: дают ли они пригодный структурированный ответ, различают ли дату и срок, задают ли уточняющий вопрос в неоднозначной ситуации. В итоговом сравнении было 18 сценариев, два повтора и четыре конфигурации — 144 результата. Один вывод из этой работы оказался особенно практичным: сортировку простых дел можно оставить локальной, а разговор с наставником рассматривать как самостоятельную облачную функцию со своими проверками, квотами и расходами.
Почему первой вышла офлайн-версия
Для первой версии я оставила то, что сама хотела открывать каждый день: сферы, цели, дела, планер, поиск, повторы и будильник. В Beta можно начать без регистрации. Облачный наставник и синхронизация относятся к полной версии.
Интерфейс приложения написан на React Native с Expo и TypeScript. Навигация устроена через Expo Router, состояние хранится через Zustand, а Android-будильник вынесен в нативный модуль. Правила расчёта времени, работы с целями и проверки резервных копий можно проверять отдельно от отрисовки экранов.
Данные Beta хранятся на устройстве. При смене телефона нужен экспорт и ручное восстановление. Поэтому мы проверяли формат резервной копии: приложение читает поддерживаемые старые форматы, валидирует содержимое перед применением и исключает секретные поля из экспорта. Отдельная задача релиза — проверить, что данные остаются на месте при перезапуске и обновлении APK.
Что мы проверили перед выпуском
В отчёте по «Сферы Beta» 1.0.6 зафиксировано 217 пройденных регрессионных тестов. На чистом эмуляторе Android 16 отдельно установили подписанный APK. Открыли основные экраны в авиарежиме, создали русскоязычные дела и цель по локальному шаблону, нашли и переименовали дело, проверили сохранение после принудительного завершения приложения и после обновления APK. Для будильника подтвердили появление локального уведомления и его снятие кнопкой «Выключить».
На своём Huawei я вручную проверила более раннюю сборку: открыла разделы, нашла существующее дело и подтвердила, что сигнал будильника слышен. Это отдельный результат. Финальную Beta проверяли на эмуляторе с выключенным звуком, а длительное фоновое поведение и восстановление сигнала после перезагрузки Huawei в том прогоне не проверяли.
На сайте я сделала короткое демо, чтобы механику можно было попробовать до установки. В нём можно вписать цель, добавить несколько дел и попробовать уложить их в выбранное время. При проверке демо мы поймали баг, которого не было на коротких примерах: длинное название без пробелов растягивало страницу с 390 до 943 пикселей. Исправили перенос текста и повторили проверку на ширинах 320, 390 и 430 пикселей. Этот случай хорошо показывает, зачем в тесте нужен произвольный ввод, даже если сама форма кажется простой.
Каким получилось моё первое приложение
В «Сферах» есть вещи, которые я сделала именно для себя. Мне хочется видеть рядом работу, дом и здоровье, даже когда голова занята одним проектом. Хочется хранить большую цель отдельно от дел на сегодня. И хочется, чтобы в 18:00 телефон напомнил мне о прогулке, которую я сама решила поставить в план.
Это моё первое приложение, и мне было важно довести его до того момента, когда я могу установить его на телефон и записать туда своё настоящее дело.
Если вы тоже делаете планировщик под себя, мне интересно, какую одну деталь вы бы изменили в привычных приложениях и почему.
ссылка на оригинал статьи https://habr.com/ru/articles/1104654/