At Gearheart, we noticed that the number of hours it takes to complete a task of a certain size depends on:
That’s why we created a system that predicts the number of hours needed to get the task done based on the three statements mentioned above.
Here is what the prediction looks like in our interface:
We’ve just set the M-size to the above task and assigned it to Vladislav Motorin.
According to the system, he can spend a maximum of 9 hours 24 minutes to complete the task and a minimum of 5 hours 29 minutes.
In addition, you can see a breakdown of spent time estimations by activities.
We recalculate task size estimates every time the task status changes to "accepted".
Every time the status of any project task changes to “accepted”, we add this task to a tasks pool. When a new task is added to the pool, the task with the oldest date is removed from the pool. Once the new tasks pool is ready, the system will recalculate and store the new value in the database.
We always use the selection of the last 20 tasks because we want to make predictions based on the most recent data, such as the current stage of the project and the current performance of a particular developer at that particular stage of the project.
Every time any task of the project receives a new t-shirt size or a new assignee, the system takes the last calculated estimate associated with that t-shirt size from the database and shows it to us.
We do not automatically rewrite task estimates for old tasks. It’s important for us to monitor the estimates history as the project goes on.
As of February 1, 2020, the t-shirt estimates for Nikolai Budnikov at the Olivia project for M-size tasks were 3:30 - 6:20 hours (total).
Then Nikolay worked on tasks in the same Olivia project.
As of May 20, 2020, the t-shirt estimates for Nikolay Budnikov for M-size tasks were 5:30 - 8:20 hours (total).
So, we can see an increase in estimation values as the project gets older.
In new projects that do not yet have sufficient data, the default task size values are taken as the basis for interval calculations. They are the following:
The default values for new projects are divided by the type of activity with equal shares.
After there are more than 20 accepted tasks in the project with spent time >= 1 min, the average shares are calculated as follows:
For projects with more than 20 accepted tasks for each developer, we switch to the main logic of prediction intervals calculation.
T-shirt estimates are calculated for each task size and for each activity type separately.
The “Task Estimation in Gearheart: Activity Types (Part 1)” article describes the information about how to get the activity shares.
The average shares of activities for one of our projects are as follows:
Let's make a calculation for an M-size task:
The last 20 tasks with the following parameters should be taken:
Attention should also be paid to:
The following rules apply here:
Let's say a user has completed 20 tasks of size M. Their activity types and elapsed time are shown in the table below.
Then we calculate the Total of spent time and the average spent time per task in the tasks pool:
Activity shares in the tasks pool are calculated below (percentage and absolute value):
Two things are important here:
Look forward to more examples and best practices in the next article in our series.
Story points, dog or fruit scales, T-shirt sizes, dot voting, MAS, and more. There are many different task estimation techniques in Agile. In Gearheart, we went with T-shirt sizes, as we prefer short, iterative cycles to marathon planning sessions.
For local project settings, I use old trick with settings_local file:try:from settings_local import \*except ImportError:passSo in settings_local.py we can override variables from settings.py. I didn't know how to supplement them. For example how to add line to INSTALLED_APPS without copying whole list.Yesterday I finally understood that I can import settings from settings_local:# settings_local.pyfrom settings import \*INSTALLED_APPS += (# ...)