Skip to content

FrediKats/Tamgly

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Tamgly. Yet another time tracker

Мотивация

image

Цели:

  1. Повысить качество планирования и управления задачами.
  2. Научиться отвечать на вопрос: “Сколько времени нужно на реализацию фичи?”

Задачи:

  1. Выявлять задачи, которые заняли больше времени чем планировалось, и другие проблемы, которые создают расхождение между эстимейтами и реально затраченным временем.
  2. Автоматизация подсчёта необходимого времени на выполнение задачи с учётом порядка выполнения и рабочих часов.
  3. Отслеживание нагрузки на день, неделю и месяц для выявления ситуаций, когда запланировано больше задач, чем есть доступного времени.
  4. Подсчёт суммарных эстимейтов по группе задач с учётом блокировок и возможностей их параллельно выполнять.
  5. Построение зависимости времени выполнения задачи от её приоритета.

План работ (MVP)

  1. Управление задачами и проектами. Возможность создавать в системе задачи, отмечать их как выполненные. Интеграция с MS Todo для возможности просмотра задачи там.
  2. Отслеживание времени выполнения задачи. Интеграция с Clockify.
  3. Возможность задавать эстимейты задачам, просматривать информацию о расхождении эстимейтов и затраченного времени.
  4. Беклоги задач на день, неделю или месяц, отслеживание выпавших задач, ситуаций, когда на задачу уже не хватает времени.
  5. Чеклисты (дейли, викли) со списком задач, которые нужно не забывать выполнить регулярно. Поддержка регулярных событий как задач, учёт их в подсчёте эстимейтов.
  6. Приоритеты задач, блокирующие задачи, подбор задач по приоритетам и блокировка. Возможность указывать, что задача выполняется внешним исполнителем (чтобы явно отметить, что другая задача этим заблокирована).
  7. Возможность задавать количество часов которое должно выделяться на задачу или проект.
  8. Алгоритм оценивания эстимейтов с учётом выбранного приоритета, который позволит понять когда может быть выполнена задача с учётом текущей нагрузки и приоритета задачи.

Реквайременты

Добавление задачи

Требуется поддержать CRUD для задач.

  1. Возможность создавать задачу. Задача должна описываться идентификатором, названием, описанием (вариативно), статусом.
  2. Подключить EF для хранения задач, добавить LazyLoading.

Добавление проектов

Требуется поддержать CRUD для проектов.

  1. Возможность создавать проекты, добавлять в них задачи.
  2. Возможность просматривать задачи проекта, делать выборку задач по проектам.

Реализовать возможность указывать затраченное время и эстимейты

  1. Добавить возможность указывать в таске затраченное время. Время указывается интервалами в которые происходила работа над таской - от и до. Возможность редактировать уже добавленное время.
  2. Добавить возможность указывать эстимейты по таске, определять задачи, которые были выполнены с расхождением эстимейта и затраченного времени (дельту в процентах определять в конфиге).

Интервальные беклоги

  1. Добавить возможность формировать беклог на день, т.е. привязывать задачу к дате выполнения.
  2. Добавить возможность указывать, что задачу нужно выполнить на этой неделе/след неделе/какой-то другой неделе. При получении дейли беклога отдельно отображать задачи, которые нужно выполнить на этой неделе.
  3. Добавить возможность указывать, что задачу нужно выполнить в этом месяце/след месяце/каком-то месяце. При получении дейли и викли беклога отдельно отображать задачи, которые нужно выполнить в этом месяце.
  4. Добавить подсчёт суммарных эстимейтов по беклогу.
    1. Для дейли беклога считать:
      1. Сумму эстимейтов на этот день.
      2. Сумму эстимейтов на этот день + сумму эстимейтов на эту неделю, делённую на кол-во дней, которые остались.
      3. Сумму эстимейтов на этот день + ... + сумму эстимейтов на этот месяц, делённую на кол-во дней, которые остались.
    2. Для викли беклога:
      1. Считать по каждому дню эстимейт.
      2. Эстимейт задач на этой неделе.
      3. Средняя сумма эстимейтов на неделе с учётом/без учёта задач на неделю.

Поддержка периодических задач

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

Блокировки и приоритеты

  1. Реализовать возможность указывать, что задача блочит другую задачу:
    1. Добавить в задачу свойство “заблокирована”, если есть хоть одна невыполненная задача, которая блочит её.
  2. Возможность указывать, что задача выполняется внешним исполнителем (чтобы явно отметить, что другая задача этим заблокирована).
  3. Добавить возможность указывать приоритеты задачи.
  4. Реализовать подсчёт приоритетов с учётом блокировки:
    1. Если задача блочит более приоритетную задачу, то её приоритет становится таким же как и у более приоритетной задачи.
  5. Во всех списках задач добавить возможность генерировать список задач в порядке приоритета.

Рабочие часы

  1. Возможность задавать количество часов которое должно выделяться на задачу или проект:
    1. Например, 8 часов в день или 40 часов в неделю.
  2. Реализовать алгоритм нахождения ситуаций, когда на день или неделю запланировано больше чем кол-во рабочих часов.

Калькулятор эстимейтов

  1. Реализовать алгоритм, который бы мог посчитать, через сколько дней будет выполнена задача с определённым эстимейтом и приоритетом.
    1. Он должен выстроить все текущие задачи в список по приоритетам и с учётом рабочих часов посчитать сколько будет свободного времени, когда закончится выполненеие, если в это время заниматься этой задачей.
  2. При добавлении новой задачи считать, какие задачи буду выпадать за пределы их изначальных дедлайнов или ожидаемой даты выполнения.

Сущности

Work item track interval

Функционал трекинга времени проведённого за выполнением work item'а является одним из самых фундаментальных. Для упрощения реализации, система просто хранит список пар из времени начала работы над задачей и временем окончания.

Задача (Work item)

Задача - это единица описывания работы. Можно выделить такие свойства:

  • Id - уникальный идентификатор
  • Title - юзер френдли заголовок
  • Description - поле с дополнительным описанием задачи, если такое требуется
  • Creation time - just in case of.
  • State - стэйт задачи, открытая она или закрытая. При создании задачи - Open, а после выполнения переводятся они в Closed.
  • Intervals - список из затреканных интервалов времени, которые были потрачены на задачу.
  • Estimate - эстимейт на задачу. Предположительное время, которое нужно потратить на выполнение задачи.
  • AssignTo - информация о том, на кого назначена задача. Ввиду того, что прототип делается с расчётом на то, что пользователь только один и он управляет своими задачами, в системе есть возможность указать только заранее добавленных пользователей. Для основного пользователя Id будет всегда Guid.Empty.
  • Deadline - дедлайн по задаче. Может задаваться 3 способами:
    • Daily - Определённый день, когда нужно выполнить задачу
    • Weekly - Определённая неделя, в рамках которой нужно выполнить задачу
    • Monthly - Определённый месяц, когда нужно выполнить задачу

Work item backlog

Беклог - это скоуп задач, которые назначены на определённый отрезок времени. Внезапно, существует три типа беклогов:

  • Daily - Содержит все задачи, которые нужно сделать в указанный день. Помимо этого, в этом беклоге также собирается информация о суммарном количестве эстимейтов на эту неделю и месяц, чтобы можно было делать задачи, которые нужно сделать не обязательно сегодня и не оказалось, что все weekly задачи остались на последний день.
  • Weekly - Содержит все задачи, которые нужно сделать в определённую неделю. Аналогично агрегирует эстимейты за неделю и месяц.
  • Monthly - Содержит все задачи, которые нужно сделать в определённый месяц.

Проект

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

Repetitive work items

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

  • Daily, каждые N дней
  • Daily, каждый рабочий день
  • Daily, каждые N недель с указанием дней недели
  • Daily, каждый месяц в указанное число
  • Weekly, каждые N недель (без привязки ко дню)
  • Monthly, каждые N месяцев (без привязки ко дню или неделе)

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

Технические детали

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

Что есть время?

Одна из идей - поддержать возможность ставить задачи на интервалы - день, неделя, месяц. Понимать это можно как “я хочу выполнить на этой неделе эту задачу, но не знаю когда точно. Когда будет время свободное - тогда и попробую взять”. Список задач на интервал будем называть интервальным беклогом.

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

С недельными интервалами всё сложнее. Начало и конец определить можно, но как задавать их? Более того, для единообразия хотелось бы уметь задавать дедлайн как пара из (тип дедлайна, значение дедлайна). Текущий вариант состоит в том, чтобы считать недели номером начиная с какой-то даты в прошлом. Такое допущение имеет смысл, если мы запрещаем в прошлое задавать дедлайн. Для этого есть абстракция TamglyWeek. За нулевую дату взят DateTime(2021, 12, 27); как последний понедельник прошлого года. Чтобы посчитать какой сейчас TamglyWeek, нужно отнять от текущей даты нулевую дату и поделить на 7.

С месячным интервалом ситуация аналогичная, как и с недельными. Нужно считать месяц относительно нулевой даты.

Определение блокируемости задачи и приоритетов

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

Помимо блокируемости, на выполнение задачи влияет её приоритет. Для упрощения, будем считать, что приоритет описывается числовым значением от 1 до 5. Но на приоритет задачи влияет также и наличие задач, которые задача блокирует. Например, если задача с приоритетом 3 блокирует задачу с 1 приоритетом, то она тоже является задачей 1 приоритета (т.к. необходима для решения задачи первого приоритета). Чтобы выяснить итоговый приоритет, нужно построить граф зависимостей от этой задачи по указанным блокировкам. В данном случае нужно строить граф по обратным связям.

Калькулятор итоговых эстимейтов

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

UTC and local date

В системе очень много моментов завязаны на датах. А как известно, проблемы с часовыми поясами - это одна из главных проблем. С одной стороны, хочется хранить время в UTC времени, чтобы при смене часового пояса было понятие нулевого часового пояса.

Execution order

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

  1. Формируется список всех невыполненных задач (учитываются даже те, по которым дедлайн просрочен).
  2. Если задача назначена на дату до дня, на который составляется план, то она переносится в очередь.
  3. Начиная с первого дня перебираются задачи. Берутся задачи первого приоритета, добавляются в план на текущий день.
    1. Если свободного времени нет на задачу, то план на текущий день финализируется и начинается формирование задач на следующий день. Задачи при этом будут перемещены в очередь.
  4. Когда задачи первого приоритета на данный день закончилась, алгоритм начинается смотреть задачи первого приоритета, которые назначены на эту неделю.
  5. Когда задачи первого приоритета на день и неделю закончились, алгоритм смотрит задачи первого приоритета на месяц.
  6. Когда задачи первого приоритета закончились, система начинает добавлять в план задачи первого приоритета из очереди.
  7. Когда все задачи первого приоритета закончились, то все шаги повторяются для второго приоритета и так далее пока задачи не закончатся.

Good practice:

  1. Система будет брать задачи, по которым прошёл дедлайн и пытаться вставить их в график. Есть вероятность, что задача было не выполнена ввиду того, что на неё просто не хватило времени и/или она была с низким приоритетом. Такие моменты лучше анализировать и переносить дедлайн (чтобы он не тянул остальные задачи дальше), повышать приоритет или осознавать, что у вас физически не достаточно времени на все задачи.
  2. Задачи лучше декомпозировать т.к. если в какой-то день осталось 3 часа, а задача требует 4, то задача будет перекинута на следующий день по плану.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages