Yesterday we deployed a major release of Acunote and we'd like to tell you more about it.
We usually deploy new code with feature enhancements and bugfixes couple of times a week. Hosted software model and good development practices give us this luxury, and let us rapidly evolve the application based on user feedback. We take great care to make the experience completely transparent to the users, by preserving backwards compatibility, evolving UI very slowly and even preserving active logins/session during most upgrades.
This release is different. Once again, we worked hard to do what our users need. We tried and mostly succeeded in minimizing UI changes, but underneath that we've changed the entire task management model behind Acunote to make all the things you've asked for possible.
Old Task Model
In the old Acunote the task could only belong to one sprint at a time. If your task wasn't finished in by the end of the sprint, you would copy it to the next sprint to continue there. "Finish Spring" feature used exactly this approach - it took all not-completed tasks from the old sprint and copied them into the new sprint. Upon copying the new task was created in the new sprint duplicating the description and status and adjusting estimate to reflect the work left to do.
That model had its limitations. First, Acunote had no way to know that the new task in the new sprint is actually the old task from the old sprint but just continued in the new sprint. That made per-project reporting and data aggregation problematic because there was no good way to display combined data for the two, essentially the same, tasks. Changes to the original task description, tags, comments, attachments weren't propagated to the copied task and vice versa.
Another limitation was the behavior of tasks in Backlog. Common usecase (especially for people using Agile methodologies) is to create the task in Backlog representing the user story, then break the work into smaller subtasks and split that work between sprints. Acunote allowed you to copy this user story task from the Backlog into individual sprints and add subtasks with concrete work in each of the sprints. But there was no way to gather that information back from all those sprints and display the overall progress of the user story.
And finally, the old model prevented us from ever showing task numbers. The two tasks in our examples, one copied from another, are conceptually the same, hence they should have the same number, and that was not possible before.
New task model allows tasks to span multiple sprints. This is especially useful for parent tasks representing long projects/user stories, with children in multiple sprints. Another common use would be concrete tasks which take more than one sprint to complete.
As usual Acunote allows the user freedom to setup his project as he sees fit: each sprint can have its own hierarchy, concrete task can evolve and become parent, you can schedule sprints as you see fit including overlapping and parallel sprints, etc. The restrictions should come from good development/project management principles, not from the tool.
Existing UI has been extended to take advantage of this. Now, when you copy task you don't copy any task information. Instead copying task to another sprint will just assign the task to the new sprint, in addition to any sprints it was already in. "Finish Sprint" works the same way.
Existing data in all organizations was migrated to take advantage of this functionality. The code looked for "Copy" events and combined source and target tasks provided it was safe, i.e. the user did not change description after copying. Estimate/remaining, tags, comments, attachments, etc. were similarly combined. This was the most complex migration we ever had and (fully automated) it took hours to run over all the organizations in Acunote. That was the reason we had to schedule downtime for this upgrade.
True Task Identity
Task is a fundamental real-life concept, and project management system should reflect this. New Acunote datamodel allows us to view task (user story/task/unit of work) as a first class entity, not just as a part of a sprint (certain timeframe).
So now, task has its own history of estimates, remainings, owners, statuses, etc. It maintains single description, set of comments, attachments, history events, etc. This way both the sprint task list and the task details views make sense, and present appropriate information. There is no longer a compromise necessary to support sprints/time-boxing.
Since task becomes a first class concept, we can assign it an identity in the form of explicit task number. This number is persistent, and can be used to refer to the task. This was the most commonly requested feature for Acunote.
So far we've barely scratched the surface of functionality made possible by the new data model. Now that it has been deployed, we'll be going to back to our usual user feedback-driven incremental development. First, there are also some rough corners left to smooth after this major change, and that's the first priority for us. Beyond that, the new data model allows incredible flexibility and power to represent real-life projects, and to provide visibility into them at any desired level. We have a lot of exciting features being baked to take advantage of this. We don't talk about vaporware, so we'll let the development speak for itself.
Help -- we'll updating it and will cover the underlying task representation, task operations and examples of use in more depth.
Performance -- some operations became slower. We are aware of this, and are actively working to restore the performance. We made good progress on it today (Monday) and have already deployed the results. We'll keep you updated on this very important point.
Edge cases around multi-sprint functionality -- we know about some some edge cases where new functionality can display puzzling results. For these, we are working on better way present this data. If you find anything that surprises you, just send us a feedback and we'll take a look.
You can no longer edit task from the task details page. This will be fixed.