So I thought I'd share the way we've been doing it. I'm going to concentrate here on feature requests only, as bug-reporting is a whole separate issue. The system we've been trying recently at iTrigga has helped us keep on top of our estimates and project mgmt, as well as our daily tasks. So here goes:
1) We agree a formal user story with the requesting person
e.g. don't just record "Ability to get a second opinion on an article", go the extra small step of wording in the form"As a (type of user) I want to (feature) so that (benefit)"in this example, it would be "As an editor, I want to get a second opinion on an article so that when I'm editing an article that requires specialist technical knowledge I don't have, I can get it checked by a domain expert"
We've also found it very useful to agree this with the requesting person. It can be quite trying to get the rest of the business to adopt a standard format for this - the push-back is almost inevitable ("You put it into your system however you like, I don't have time for this!") but you can use it as a double-check ("..so let me just make sure I've got this straight - is it fair to say As a sales manager, you want a report of job progress so that you can estimate your booked revenue for this month?") and if you keep repeating the same format back to them, gradually they'll start using it themselves :)
2) We log a ticket for each user story
- what was requested
- who it was for, and
- why they wanted it
3) We log sub-tasks for each change required to fulfill the user story
- add a button marked "Get a second opinion" on the editing page
- add a way of specifying (or automatically choosing) who to get the second opinion from
- send an email to the second opinion guy telling them that their input is needed
- record their opinion in some way (another form? comments?)
- an email sending their opinion back to the editor who originally requested the second opinion
4) Each sub-task is logged in the form of RSpec examples
"when a second opinion is requested, it should send a SecondOpinionRequested email to the chosen domain expert"
describe "when a second opinion is requested" do
before do
# set up your situation
end
it "generates a message" do
# e.g. something like this:
expect{ subject.save }.to change( Message, :count ).by(1)
end
describe "the generated message" do
let(:msg){ Message.last }
it "is a SecondOpinionRequested mail" do
# your test here
end
it "goes to the chosen recipient" do
# your test here
end
end
end
We use Redmine for our ticketing, and there are a couple of extra plusses when you do it this way in Redmine:
- estimates for the sub-tasks propagate up to the top-level task (the user story)
- you can't complete a parent task until the sub-tasks are complete
- a parent task can't be higher-priority than its lowest-priority sub-task
- if you complete each sub-task as you get the spec to pass, you can easily see from the parent task how much is left to do (see figure)
5) Each top-level user story gets its own git branch
- You're halfway through the ticket when the CEO tells you to drop everything and work on X instead
- You realise that you can't do this until ticket Y is done, and that guy's away
- You have to break off and do an urgent fix
- You have to look at an issue with someone else's unreleased code
in Git, branches are cheap - there's no reason NOT to use them!Putting the ticket number at the start of the branch name helps keep things in a sensible order when you list the branches, and keeping the feature description in there means you don't have to keep referring back to your ticketing system to remember which is which.
It also helps when trying to trace exactly which feature got merged into what, when.
That's probably enough for now - I'm sure there are many alternative systems, this is just one that works for us. All suggestions and comments welcome!