Pull to refresh

Time management без жестких расписаний, опыт разработки мобильного приложения

Reading time 7 min
Views 8.5K
Планирование времени, контроль, повышение эффективности. Тема заезженная, но осмелюсь предложить ещё одно решение.


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

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

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

Не трудно догадаться, что идея сразу масштабировалась на идею иметь кнопку на каждую задачу в течении дня. И дальше все это трансформировалось в концепцию управления временем.

Концепция


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

Постулат №1


Для управления нужен контроль расхода времени. Чтобы управлять временем нужно уметь его контролировать. Принцип — одним нажатием кнопки (буквально, а не метафорически) выбираем текущую деятельность и автоматически прекращается подсчёт времени на предыдущую деятельность и начинает считаться на текущую.

Постулат №2


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

Постулат №3


Управляемое время означает что план сходится с реальностью. Конечно в ходе дня что-то может поменяться. И возможно получится что план расходится с реальностью. Пусть время запланированное на деятельность Tp (time planed), время реально затраченное на деятельность Tr (time real), разницу между этими временами назовём коэффициентом расхождения Td (time delta). Будем считать качеством планирования Qp (quality of planning) процентное отношение сумм всех коэффициентов расхождения к сумме всего запланированного времени, которое вычтитаем из ста.

$Qp = 100\% - \frac{(Td_{1} + Td_{2} + \ldots + Td_{i} + \ldots + Td_{n})}{(Tp_{1} + Tp_{2} + \ldots + Tp_{i} + \ldots + Tp_{n})}*100\%$

то есть получается что при нулевых коэффициентах расхождения качество планирования будет равняться 100%.

Android приложение


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

Итак.

Реализовано приложение ChessTM.

Реализация по вечерам и выходным в свободное от работы время. Работаю я релиз-менеджером и работа с андроид разработкой никак не связана.

Функции:

  1. Создание пула задач
  2. Планирование времени на задачи на каждый день
  3. Перенос плана предыдущего дня
  4. Простое переключение между задачами
  5. Статистика

    • суммарное затраченное время по отношению к суммарному плану, за произвольный период по жизненным секторам
    • отчёт по задачам, сколько на каждую задачу запланировано и сколько фактически затрачено
    • статистика по переключениям между задачами и по коэффициенту качества планирования за период
  6. Распределение задач по жизненным секторам (работа, семья, друзья и т.п.) и тэгам

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

Реализовано это следующим образом — есть один экран и три таба между которыми можно перемещаться сайпом:

  • пул задач, где имеются все задачи, имеющиеся на текущий момент;
  • дневной план, где задаётся планируемое на задачи время;
  • управление, где переключаемся с задачи на задачу и считаем время.


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

Инфраструктура разработки


Разработку хотелось делать сразу правильно. Чтобы это было что-то долгоиграющее, а не побаловался и бросил. Поэтому хотелось организовать целостную инфраструктуру, включающую:

  • IDE (Integrated Development Environment);
  • репозитарий хранения кода;
  • трекер задач;
  • документирование;
  • тестирование.

IDE


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

Хранение кода


В качестве системы хранения кода был выбран git.

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

В качестве удалённого хранилища был выбран bitbucket:

  • бесплатный;
  • позволяет создавать частные и открытые репозитарии;
  • позволяет создавать команду для совместной работы с различными уровнями прав доступа;
  • имеет свой простой трекер задач.

Трекер задач


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

Документирование


Для документирования решил использовать readthedocs.io:

  • бесплатная система позволяющая публиковать документацию в формате Sphinx;
  • интегрируется с bitbucket (и многими другими), то есть можно хранить исходники документации в bitbucket и она автоматически будет собираться при каждом коммите, можно сказать continuous integration для документации — это крайне удобно;

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

Тестирование


Тестирование тема огромная и можно найти множество материалов на этот счёт.

У меня в приложении есть уровень модели, где выполняется вся математика и вычисления.
Поэтому я решил сосредоточится на тестировании именно этого программного модуля.

Для этого я использую JUnit4. Тесты запускаются на девайсе.

Тесты представляют собой юнит тесты основного класса модели.

Создаётся тестовый набор данных и соответственно вызываются все фукнции класса модели с заранее известным результатом.

По опыту могу сказать следующее:

  • тесты очень помогают ловить регресс;
  • иногда выявляются ошибки дизайна/архитектуры, когда сам начинаешь применять функции, голова начинает работать немного по другому когда функцию применяешь, даже если сам её написал;
  • поддерживайте тесты в актуальном состоянии, я сейчас крайне жалею что этого не делал, потому что объём приложения уже довольно большой, и не все детали можно удержать в памяти, и некоторый регресс, который может быть выявлен на этапе юнит тестов к сожалению попадает в production. Так что с упрямой, тупой настойчивостью — «поддерживайте тесты в актуальном состоянии!!!»

Архитектура и реализация


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

В самом начале пути основная проблема была в том, что непонятно было с чего начать и в каком направлении думать. Как правильно делать и как неправильно.

Для начинающих рекомендую начинать с какой-то книги. Книга хороша тем, что в ней информация систематизирована, а начинать так гораздо проще.

Лично я начинал с «Программирование под Android. Для профессионалов» Б. Харди, Б. Филлипс. В целом могу рекомендовать. Может в настоящее время она местами устарела, но начинать вполне можно.

Ещё могу порекомендовать послушать различные подкасты по теме программирования под андроид. В них конечно не всё понятно, но можно уловить тенденции и понять в какую сторону двигаться. В частности я периодически слушаю androiddev на apptractor.

Что касается самой ахитектуры то я постарался реализовать подход в котором внутренняя логика максимально отделена от отображения. Дело в том, что на начальном этапе не всё досконально продумано и нужно иметь возможность менять «математику» (логику работы), не переписывая весь код.

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

в отдельную структуру классов


Список задач содержится внутри класса ActionsManager и весь доступ к ним осуществляется через функции этого класса. То есть везде в приложении все манипуляции с задачами производятся через класс ActionsManager.

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

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

GUI реализован на базе ActionBarDrawerToggle. Сначала был использован ActionBarSherlock, он конечно всем не плох, но потом у меня возникли проблемы с совместимостью с другими компонентами и я перешёл на стандартные гугловские компоненты (меню, табы, списки с динамической загрузкой данных и т.п.).

В процессе сознания приложения кроме стандартные компоненты android использовались:

  • реализация своих методов обработки событий seekbar;
  • реализация longclick через touch event, так как родной longclick не удалось заставить работать под свои нужды;
  • MPAndroidChart — создание графиков и диаграмм;
  • com.roomorama:caldroid — отображение календаря по месяцам;
  • com.github.paolorotolo:appintro — создание стартового визарда.

Монетизация


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

P.S.:
На последок послание всем начинающим, или желающим начать — не пугайтесь трудностей, не бойтесь, постепенно шаг за шагом у вас всё получится!
Tags:
Hubs:
+7
Comments 10
Comments Comments 10

Articles