In my previous post about eating my own dog food I outlined three settings where BugTracker.NET struggles or falls short entirely to be a good fit. In this post I’ll go into detail about one of them, a “big company with hierarchy, division of labor, and rules about who is allowed to do what”.
I’m going to describe a database model that such a setting might demand. I’ll start simple, and then as I add requirements, I’ll revise the model.
I’ll start with a table of “issues”. There are different types of issues: bugs, enhancements, tasks, trouble tickets, so I add a lookup table of “issue types”. Issues can be in various statuses like “new”, “in progress”, “closed”, so I’ll add a lookup table of “statuses”. And of course, there are users. Here’s my simple model so far...
Issues
Issue types
Statuses
Users
It turns out that there are different kinds of users, such as “programmers”, and “testers”. These are “roles”. And it turns out that this company has restrictions about who can change a status from one to another, depending on a person’s role. Maybe only “testers” can change a bug’s status to “passed testing”. Altering the model accordingly...
Issues
Issue types
Statuses
Users
Roles: A user must be associated with a role (just one role).
Roles - Statuses: Defines which roles can use which statuses.
It turns out, that the life cycle of one issue type isn’t the same as another. A “bug” might have statuses like “new”, “assigned”, “ready for testing”, “tested”, “shipped”, “closed”. A “task” might have statuses like “new”, “in progress”, “done”, etc. Altering the model according...
Issues
Issue types
Issue type statuses: Each issue type has its own set of statuses.
Users
Roles
Roles – Issue type statuses: Defines which roles can use which statuses.
It turns out that the people sometimes don’t understand the correct sequence of statuses. If a bug is now in “ready for testing” status, the next status couldn’t be “new”. It would have to be something like “passed testing” or “failed testing”. Altering the model accordingly...
Issues
Issue types
Issue type statuses
Issue type statuses – related statuses: Defines which statuses are valid “pre” and “post” states for any given status.
Users
Roles
Roles – Issue type statuses.
It’s a big company. There isn’t just one project, and different teams want to do things different ways. So, let’s add “Project” and allow everything that’s configurable to vary by Project. Also, the same person might be on more than one project and have different roles on the different projects... (See my "Empathy with Jira" post - this is what Jira's customers want.)
Issues
Project
Project Issue types
Project Issue type statuses: Each issue type has its own set of statuses. Issue types and their statuses are defined per project.
Users
Project Role
User – Project Role: Same person, different roles on different projects.
Project Roles – Issue type statuses: Defines which roles can use which statuses.
Project Issue type statuses – related statuses: Defines which statuses are valid “pre” and “post” states for any given status.
See where I'm going with this? With each new requirement, control and configuration is getting more and more granular. On the one hand, the model is becoming more like the real world, but on the other hand, the model is becoming unwieldy.
Did you ever try to model a contact list, or address book? John and Mary have their home, their summer home, their workplaces, their home phones, their cell phones, the phone in their summer home. If you modeled that like a relational database designer, it would end up being a very complicated model. You might have entities like Person, Location, Location Type, Phone, Person/Phone, Location/Phone, Household, Household/Location. Real world contact lists - like the ones in Yahoo mail or Gmail - flatten out everything. Easier for us to understand.
As a data model becomes more complicated, as there are more "by's", as in status BY item type BY project, the GUI becomes more complicated also. The task of configuration becomes bigger, more time-consuming, more daunting. While I do want BugTracker.NET to be more adaptable, I always want it to remain a good choice for the small, fast, informal, non-hierachical team.
Right now, BugTracker.NET's data model is the first model I described. Very simple. (BugTracker.NET does have "Projects", but item types and statuses are global, not per project). The model is too simple to meet the requirements of a big organization that wants an issue tracker to help enforce hierarchy and division of labor. In the near future - the coming weeks - I will be adding the concept of role to BugTracker.NET in December (it's already implemented in the development codebase), but I don’t have plans in the near future to support different status types for different issue types and no near-term plans for enforcing valid pre/post status transitions. So, because BugTracker.NET lacks the means to enforce hierarchy, division of labor, workflow, I think that large corporations, which tend to be enforcement-minded, would find it lacking.