SingularityApp
Что такого космического в нашем хаос-менеджмент планировщике, помимо дизайна
«Неважно, куда вы записываете свои задачи», — говорил Максим Дорофеев в «Джедайских техниках». Помните? Главное, чтобы это была не голова и чтобы вы доверяли этой системе. Так вот. Отгадайте, куда свои задачи с недавних пор записывает он сам? Да, да, да, да, да, черт возьми! В наш SingularityApp!
Мы разработали планировщик, на который перешел автор книг, тренингов и YouTube-канала о личной эффективности. Это примерно как собрать спорткар, вручить ключи от него известному гонщику, сказать что-нибудь вроде «Надеемся, вам понравится» — и после тест-драйва получить фидбэк в виде чека. Кайф.
Мы разработали планировщик, на который перешел автор книг, тренингов и YouTube-канала о личной эффективности. Это примерно как собрать спорткар, вручить ключи от него известному гонщику, сказать что-нибудь вроде «Надеемся, вам понравится» — и после тест-драйва получить фидбэк в виде чека. Кайф.
Возможности
С самого первого анонса мы позиционируем SingularityApp как хаос-менеджмент планировщик, а не как планировщик задач, таск-менеджер или todo-лист. И это в нас говорит не снобизм. Хотите просто фиксировать, когда у вас следующая тренировка и что купить по дороге домой — пожалуйста.
В SingularityApp есть для этого всё: чек-листы, теги, напоминания, возможность поставить задачу на повтор. Но мы действительно замахнулись на большее — сделать мощный, начиненный крутыми фичами софт для выживания в хаосе (это когда тебя разрывает между бесконечными «надо» и «хочу» и ты не знаешь, за что хвататься и как всё успеть).
И тут неважно, что именно вы практикуете — джедайские техники Дорофеева, GTD Дэвида Аллена, управленческое планирование Фридмана, эссенциализм МакКеона. Всё равно, если когда-нибудь эти парни соберутся на общий слёт и подерутся, то точно не из-за фундаментальных принципов личной эффективности. В них они не противоречат друг другу. А в переводе с языка коучей на язык разработчиков эти принципы звучат так:
В SingularityApp есть для этого всё: чек-листы, теги, напоминания, возможность поставить задачу на повтор. Но мы действительно замахнулись на большее — сделать мощный, начиненный крутыми фичами софт для выживания в хаосе (это когда тебя разрывает между бесконечными «надо» и «хочу» и ты не знаешь, за что хвататься и как всё успеть).
И тут неважно, что именно вы практикуете — джедайские техники Дорофеева, GTD Дэвида Аллена, управленческое планирование Фридмана, эссенциализм МакКеона. Всё равно, если когда-нибудь эти парни соберутся на общий слёт и подерутся, то точно не из-за фундаментальных принципов личной эффективности. В них они не противоречат друг другу. А в переводе с языка коучей на язык разработчиков эти принципы звучат так:
На языке коучей
Головой нужно думать, а задачи лучше хранить во внешней системе — это должен быть инструмент, который всегда под рукой.
Головой нужно думать, а задачи лучше хранить во внешней системе — это должен быть инструмент, который всегда под рукой.
На языке разработчиков
- Поддержка популярными OC;
- Облачная синхронизация;
- Распечатка и распознавание;
- Виджет быстрой постановки задач.
Задачи мало собрать в одном месте — их нужно еще регулярно обозревать, актуализировать и брать в работу.
- Режим проверки;
- Работа в двух окнах;
- Напоминания;
- Виджет списка дел.
Задачи нужно декомпозировать на четкие шаги и формулировать так, чтобы даже человек, который находится не в контексте, понимал, что нужно сделать.
- Бесконечная иерархия задач, проектов, тегов;
- Неограниченное количество символов в названии и описании задачи;
- Чек-листы;
- Теги.
Задачи нужно доводить до конца, а для этого — как можно меньше переключаться на отвлекающие факторы.
- Режим фокуса;
- Помодоро;
- Рекурсии;
- Лонгтап для быстрого доступа к папкам и функциям приложения.
В SingularityApp есть это всё и гораздо больше
Поддержка популярными операционными системами. Облачная синхронизация. Распечатка и распознавание
В разработке хаос-менеджмент планировщика есть одна особенность — такое приложение нельзя выпускать поэтапно: сначала для одной OC, потом для другой и т. д. Иначе это станет серьезным барьером для его использования.
У человека должна быть возможность утром открыть приложение, скажем, на маке, и освежить план на день, потом по дороге на работу ответить на звонок и создать новую задачу уже на айфоне, на работе чекать задачи на винде и т. д. И эти изменения, разумеется, должны синхронизироваться на всех устройствах.
Поэтому разработка шла в четырех параллельных потоках: начали с десктопа и промосайта, а на определенном этапе подключили PWA и кроссплатформенное мобильное приложение.
У человека должна быть возможность утром открыть приложение, скажем, на маке, и освежить план на день, потом по дороге на работу ответить на звонок и создать новую задачу уже на айфоне, на работе чекать задачи на винде и т. д. И эти изменения, разумеется, должны синхронизироваться на всех устройствах.
Поэтому разработка шла в четырех параллельных потоках: начали с десктопа и промосайта, а на определенном этапе подключили PWA и кроссплатформенное мобильное приложение.
И только когда отладили приложение на всех устройствах и синхронизировали его с облаком, выпустили бета-версию.
Тут же оказалось, что у нас для облака избыточно спроектирована структура данных и из-за этого есть проблемы со связями между объектами. Заново переписали структуру, но у SingularityApp уже были первые пользователи и мы не могли им просто сказать: «Ребят, извините, у нас теперь структура покруче, а ваши данные накрылись». Поэтому сделали одновременную поддержку старой версии структуры и новой, а пользователи уже сами решали, обновляться им или нет.
Теперь SingularityApp исправно синхронизировался на всех устройствах, но нам этого было мало — мы хотели в какой-то мере вообще преодолеть его зависимость от гаджетов. Реализовали такую фичу — распечатываешь план на сегодня из SingularityApp и дальше хоть весь день сиди на цифровой диете и не прикасайся ни к одному устройству. Просто отмечай на распечатке, какие задачи выполнил (галочками), какие не выполнил (крестиками), какие выполнил частично (точечками), какие перенес на следующий день (стрелочками). Вечером откроешь камеру в SingularityApp, сфотографируешь распечатку — и все статусы перенесутся в приложение.
Провернули эту штуку сначала на TensorFlow и нейронных сетях, но символы то распознавались некорректно, то не распознавались вообще. В итоге переделали всё на OpenCV, остались довольны.
Тут же оказалось, что у нас для облака избыточно спроектирована структура данных и из-за этого есть проблемы со связями между объектами. Заново переписали структуру, но у SingularityApp уже были первые пользователи и мы не могли им просто сказать: «Ребят, извините, у нас теперь структура покруче, а ваши данные накрылись». Поэтому сделали одновременную поддержку старой версии структуры и новой, а пользователи уже сами решали, обновляться им или нет.
Теперь SingularityApp исправно синхронизировался на всех устройствах, но нам этого было мало — мы хотели в какой-то мере вообще преодолеть его зависимость от гаджетов. Реализовали такую фичу — распечатываешь план на сегодня из SingularityApp и дальше хоть весь день сиди на цифровой диете и не прикасайся ни к одному устройству. Просто отмечай на распечатке, какие задачи выполнил (галочками), какие не выполнил (крестиками), какие выполнил частично (точечками), какие перенес на следующий день (стрелочками). Вечером откроешь камеру в SingularityApp, сфотографируешь распечатку — и все статусы перенесутся в приложение.
Провернули эту штуку сначала на TensorFlow и нейронных сетях, но символы то распознавались некорректно, то не распознавались вообще. В итоге переделали всё на OpenCV, остались довольны.
Бесконечная иерархия задач, проектов и тегов
В SingularityApp есть папка «Входящие» — сюда удобно вносить задачи, как только они приходят в голову, быстро и не раздумывая над формулировками. «Барбершопы в Телеграме»? Ок. Так и записываем. Но оставлять задачу в таком виде можно только до разбора «Входящих», иначе она будет прокрастинироваться месяцами, просто потому, что сформулирована в очень общих чертах и непонятно, с какой стороны к ней подойти.
Поэтому, когда переносим ее из папки «Входящие» в нужный проект, сразу подробно расписываем и декомпозируем на четкие шаги. В итоге получаем дерево с подзадачами на семи уровнях — видим весь флоу, оцениваем объем работы, расставляем даты и устанавливаем крайний срок.
Поэтому, когда переносим ее из папки «Входящие» в нужный проект, сразу подробно расписываем и декомпозируем на четкие шаги. В итоге получаем дерево с подзадачами на семи уровнях — видим весь флоу, оцениваем объем работы, расставляем даты и устанавливаем крайний срок.
Вот так разгуляться нельзя больше ни в одном планировщике — у каждого из них есть ограничения: только N уровней в деревьях, X символов в названиях, Y задач и Z проектов в принципе. Мы избежали этого. В SingularityApp можно создавать бесконечно много задач, проектов и тегов, с неограниченным количеством уровней внутри и такими длинными названиями и описаниями, какие только не лень набрать.
При этом у нас деревья отлично ладят с драг-энд-дропом и умеют с его помощью разбираться и собираться. То есть можно создать дерево с 15 уровнями, а потом взять мышкой седьмую ветку и вытащить ее на первый уровень. Эта ветка со всеми подзадачами станет отдельным деревом. В итоге у нас будет 2 дерева: первое с шестью уровнями, второе с девятью.
Чтобы всё это работало без осечек, писали автотесты и покрывали ими разные кейсы:
Тесты делали интеграционные — с имитацией поведения пользователя. Как будто он прям открывает приложение и, например, драг-энд-дропом перетаскивает какое-то дерево задач к закрепленной задаче вверху проекта. Это только один сценарий. А их было около 1500. Работало это все медленно. Долго ждали каждый коммит на проверке. В итоге построили ферму из четырех серверов, чтобы они у нас проверяли коммиты.
При этом у нас деревья отлично ладят с драг-энд-дропом и умеют с его помощью разбираться и собираться. То есть можно создать дерево с 15 уровнями, а потом взять мышкой седьмую ветку и вытащить ее на первый уровень. Эта ветка со всеми подзадачами станет отдельным деревом. В итоге у нас будет 2 дерева: первое с шестью уровнями, второе с девятью.
Чтобы всё это работало без осечек, писали автотесты и покрывали ими разные кейсы:
- А что, если мы удалим сначала дочернюю задачу, потом — родительскую, а потом восстановим их из корзины? Как они восстановятся?
- А что, если у нас родительская задача назначена на пятницу, а дочерняя — на понедельник? Как они будут выводиться в папке «Планы»?
- А что, если мы сделаем родительскую задачу рекурсивной? И т.д.
Тесты делали интеграционные — с имитацией поведения пользователя. Как будто он прям открывает приложение и, например, драг-энд-дропом перетаскивает какое-то дерево задач к закрепленной задаче вверху проекта. Это только один сценарий. А их было около 1500. Работало это все медленно. Долго ждали каждый коммит на проверке. В итоге построили ферму из четырех серверов, чтобы они у нас проверяли коммиты.
Режим проверки. Работа в двух окнах. Напоминания
Когда декомпозируешь на совесть, планировщик забивается таким количеством проектов и задач, что в какой-то момент просто теряешь над ними контроль. В итоге планы копятся, а дела не делаются.
Чтобы до дестроя не доходило, мы разработали в SingularityApp режим проверки проектов. Устанавливаешь для каждого проекта интервал, с которым готов его проверять: неделя, две, месяц, полгода. И теперь раз в несколько дней переводишь приложение в этот режим — просто нажимаешь на дымящуюся чашечку кофе в верхнем тулбаре. В режиме все проекты маркируются: зелеными точками — те, у которых ещё не подошла дата проверки, красными — те, которые пора проверять.
Чтобы до дестроя не доходило, мы разработали в SingularityApp режим проверки проектов. Устанавливаешь для каждого проекта интервал, с которым готов его проверять: неделя, две, месяц, полгода. И теперь раз в несколько дней переводишь приложение в этот режим — просто нажимаешь на дымящуюся чашечку кофе в верхнем тулбаре. В режиме все проекты маркируются: зелеными точками — те, у которых ещё не подошла дата проверки, красными — те, которые пора проверять.
Проверить проект — значит удалить из него неактуальные задачи, отредактировать актуальные, создать новые, установить задачам даты.
Отдельно писали и отлаживали межоконное взаимодействие, поэтому какие-то вещи можно делать сразу в нескольких окнах. Это удобно, в том числе когда проверяешь проекты. В одном окне открываешь сам проект. В другом — папку «Планы». В третьем — корзину. И раскидываешь мышкой задачи между окнами. Перетащил задачу в корзину — она удалилась из проекта. Перетащил в папку «Планы» на какой-то день — она и в папке «Планы» появилась, и в проекте осталась, только стала отображаться вместе с датой.
Если это задача из разряда «подождите, мне надо подготовиться», для нее можно установить напоминание — чтобы в назначенный момент (за день, час, 30, 15, 5 минут) операционная система сообщила, что задача приближается. На этапе разработки эта фича заставила нас понервничать — нужно было завязаться на механизме каждой операционной системы, а у них у всех свои особенности, прихоти и настроение.
На андроиде и iOS, например, если по умолчанию включен режим энергосбережения, подавляется фоновая активность приложений. При этом каждый андроид в этом случае ведет себя по-своему: Sumsung так, Xiaomi по-другому — и попробуй найди универсальное решение. В итоге мы пришли к тому, что когда пользователь запускает SingularityApp в первый раз после установки, приложение просит его убрать все ограничения по настройкам уведомлений и энергопотреблению, иначе, говорит, могут быть проблемы с напоминаниями.
Отдельно писали и отлаживали межоконное взаимодействие, поэтому какие-то вещи можно делать сразу в нескольких окнах. Это удобно, в том числе когда проверяешь проекты. В одном окне открываешь сам проект. В другом — папку «Планы». В третьем — корзину. И раскидываешь мышкой задачи между окнами. Перетащил задачу в корзину — она удалилась из проекта. Перетащил в папку «Планы» на какой-то день — она и в папке «Планы» появилась, и в проекте осталась, только стала отображаться вместе с датой.
Если это задача из разряда «подождите, мне надо подготовиться», для нее можно установить напоминание — чтобы в назначенный момент (за день, час, 30, 15, 5 минут) операционная система сообщила, что задача приближается. На этапе разработки эта фича заставила нас понервничать — нужно было завязаться на механизме каждой операционной системы, а у них у всех свои особенности, прихоти и настроение.
На андроиде и iOS, например, если по умолчанию включен режим энергосбережения, подавляется фоновая активность приложений. При этом каждый андроид в этом случае ведет себя по-своему: Sumsung так, Xiaomi по-другому — и попробуй найди универсальное решение. В итоге мы пришли к тому, что когда пользователь запускает SingularityApp в первый раз после установки, приложение просит его убрать все ограничения по настройкам уведомлений и энергопотреблению, иначе, говорит, могут быть проблемы с напоминаниями.
Помодоро. Режим Фокуса. Рекурсии
При словах «отвлекающие факторы» в сознании всплывает всем известный набор: социальные сети, мессенджеры, телефонные разговоры, кофе-чай, музыка.
Чтобы увеличить сопротивление этим соблазнам, мы прямо в SingularityApp внедрили помодоро — таймер, в котором можно задать интервалы для работы и отдыха: «Сейчас я 25 минут буду выполнять задачу, а потом 5 минут поговорю по телефону, потом снова 25 минут сконцентрируюсь на задаче, а после этого 5 минут попью чай». Несмотря на то что эта фича крута настолько, что увеличивает производительность в разы, в ее разработке самым сложным оказалось подобрать музыку для сигнала таймера.
Чтобы увеличить сопротивление этим соблазнам, мы прямо в SingularityApp внедрили помодоро — таймер, в котором можно задать интервалы для работы и отдыха: «Сейчас я 25 минут буду выполнять задачу, а потом 5 минут поговорю по телефону, потом снова 25 минут сконцентрируюсь на задаче, а после этого 5 минут попью чай». Несмотря на то что эта фича крута настолько, что увеличивает производительность в разы, в ее разработке самым сложным оказалось подобрать музыку для сигнала таймера.
В какой-то момент не менее опасным отвлекающим фактором становится сам планировщик — серфить в нем так же увлекательно, как в гугле. Перешел с задачи на задачу, с проекта на проект, там дату подправил, там тег добавил, смотришь — а уже 14:20, а не 14:00.
Решили бороться с проблемой с помощью режима фокуса. Это работает так: выделяешь проект, на котором хочешь сконцентрироваться, переходишь в режим фокуса — и все проекты исчезают, остается только выделенный. Теперь, даже если зайти в какую-то системную папку, например, в «Планы», в ней не будет никаких задач, кроме задач этого проекта.
Решили бороться с проблемой с помощью режима фокуса. Это работает так: выделяешь проект, на котором хочешь сконцентрироваться, переходишь в режим фокуса — и все проекты исчезают, остается только выделенный. Теперь, даже если зайти в какую-то системную папку, например, в «Планы», в ней не будет никаких задач, кроме задач этого проекта.
Мы вообще за то, чтобы в SingularityApp как можно меньше времени уходило на организацию задач и как можно больше оставалось на их выполнение. Разработали, например, подробные шаблоны для повтора задач. В них один раз задаешь какое-то условие — «повторять каждый месяц третьего и десятого числа в 15:00» или «повторять каждый год в первую субботу июня и последний четверг декабря» — и дальше SingularityApp сам по этим шаблонам создает задачи.
При этом, когда пользователь настраивает повтор, он просто выбирает в предложенных ячейках значения: 1 нед; Вт; 11:00. А рядом, в сводке, SingularityApp синхронно переводит всё это в понятное предложение: «Повторять каждую неделю по вторникам в 11:00. Следующий раз: завтра, 28 июля, 4 августа». В написании и отладке этой фичи самым сложным было как раз научить приложение говорить вот таким человеческим языком, используя слова «завтра», «послезавтра», «через три дня».
При этом, когда пользователь настраивает повтор, он просто выбирает в предложенных ячейках значения: 1 нед; Вт; 11:00. А рядом, в сводке, SingularityApp синхронно переводит всё это в понятное предложение: «Повторять каждую неделю по вторникам в 11:00. Следующий раз: завтра, 28 июля, 4 августа». В написании и отладке этой фичи самым сложным было как раз научить приложение говорить вот таким человеческим языком, используя слова «завтра», «послезавтра», «через три дня».
В итоге
Зимой мы выпустили релиз — и сразу взяли гран-при как «Золотой сайт» и «Золотое приложение» в ключевом и старейшем в Рунете конкурсе интернет-проектов.
Весной выкатили апдейт, появилась возможность импорта из других планировщиков — и Максим Дорофеев, специалист по продуктивности, перенёс в SingularityApp свои задачи и проекты.
Эти достижения тем более ценны и приятны, что сама разработка SingularityApp — в какой-то мере вызов тому, как создаются приложения. Мы не исследовали рынок, не искали подтверждений, что есть запрос на подобное ПО, не анализировали целевую аудиторию.
Весной выкатили апдейт, появилась возможность импорта из других планировщиков — и Максим Дорофеев, специалист по продуктивности, перенёс в SingularityApp свои задачи и проекты.
Эти достижения тем более ценны и приятны, что сама разработка SingularityApp — в какой-то мере вызов тому, как создаются приложения. Мы не исследовали рынок, не искали подтверждений, что есть запрос на подобное ПО, не анализировали целевую аудиторию.
Владимир Завертайлов
CEO & Founder «Сибирикс»
Прототип SingularityApp складывался естественным образом в течение многих лет. Ты просто в силу специфики профессии пытаешься как-то удержать под контролем огромное количество задач, экспериментируешь с софтом, пробуешь всё, что есть на рынке, тут отмечаешь: «О, это прикольно», там: «А вот это можно было сделать лучше» — и так лет 15, а на шестнадцатый садишься, отрисовываешь уже сложившийся в сознании прототип, собираешь команду и говоришь: «Котят, сейчас мы с вами будем делать огонь».
И тебе в кайф. И команде в кайф. И жюри в кайф. И Дорофееву в кайф. И вам, мы надеемся, тоже будет в кайф.
И тебе в кайф. И команде в кайф. И жюри в кайф. И Дорофееву в кайф. И вам, мы надеемся, тоже будет в кайф.