In keeping with the bug reporting theme, reader Bob was wondering what sort of life cycle a bug report goes through at REAL. Since I'm not part of the testing staff, my answer might be slightly different from what someone like Kyle would say. Also, since I'm a programmer, I figured I'd give a tongue-in-cheek example program (note: it's not a very OOP example!). It's a life cycle, which is just fancy "human talk" for "algorithm", right? ;-)
Sub Main()
while not OutOfMoney
report = GetIncomingReport()
select case report.Type
case Report.kFeatureRequest
ProcessFeatureRequest( report )
case Report.kBugReport
ProcessBugReport( report )
else
HandleError( "Invalid report type" )
end select
wend
End Sub
Sub ProcessFeatureRequest( rep as Report )
if EvaluateValidity( rep ) then
FileReportForLater( rep )
else
CloseReport( rep )
end if
End Sub
Sub ProcessBugReport( rep as Report )
if CanReproduce( rep ) then
AssignForEvaluation( rep )
else
CloseReport( rep )
end if
End Sub
Sub AssignForEvaluation( rep as Report )
if rep.Version = kCurrentVersion then
Assign( rep.OwningEngineer, Report.kHighPriority, kCurrentVersion )
else
Assign( rep.ProperOwner, DeterminePriority( rep ), DetermineFixForVersion( rep ) )
end if
End Sub
Function DeterminePriority( rep as Report ) as ReportPriority
if rep.IsPrioritySupport then
return Report.kHighPriority
else if rep.IsCrashingOrDataLoss then
return Report.kMediumHighPriority
else if rep.IsCommonlyUsed then
return Report.kMediumPriority
else
return Report.kLowPriority
end if
End Function
Function DetermineFixForVersion( rep as Report ) as RelativeVersionNumber
if rep.IsPrioritySupport then
return Report.kVerySoon
elseif rep.IsCrashingOrDataLoss then
return Report.kVerySoon
elseif rep.IsEasyToFix then
return Report.kSoon
elseif rep.IsCommonlyUsed then
return Report.kSoonerOrLater
else
return Report.kSomeday
end if
End Function
Ok, now that I've sort of described how things work at a very high level, I feel I can discuss things in more detail without feeling bad about "hand waving away" some of the procedural elements.
When a bug report comes in, it hits our Inbox. That's basically just a holding pen for any reports that have yet to be looked at, or haven't moved forward in the process. It's someone's job to read each and every report that comes in, so our Inbox rarely stagnates. The first hurdle that a report must jump is whether it's a feature request or a bug report. If the report is a feature request, then it gets evaluated to determine how "interesting" it is. If it's a feature request pertaining to a brand new feature (while the product is still in alpha or beta), then it usually gets assigned to whoever owns the feature for further evaluation. Otherwise, the request is usually assigned to a holding bin that we can look at when it comes time to determine schedules. If the feature has an obvious owner (such as compiler feature requests) it just goes onto someone's schedule for an undetermined release. Either way, it's almost always a "we'll look at this in more depth later" situation. However, one thing which we've been improving upon lately is communicating with customers about things we don't think we'll ever implement. It used to be that requests would go into the system to languish and die. The problem with doing that is: it's wrong, on many levels. It clutters up our feedback system, so it's harder to separate the wheat from the chaff. It provides the user with no clues as to whether we intend to implement the feature or not. It just sucks, and so we've stopped doing it. Now, if we don't think we'll implement your feature, we will tell you that when we close the report. What's more, we'll tell you *why* we don't want to implement it, because there can be many good reasons. Sometimes it's because the feature would cause code to break. Sometimes it's because the feature isn't in line with what we want REALbasic to be. Sometimes the feature is so incredibly huge that we couldn't possibly implement it. So if we close a feature request, we make sure to say why.
So let's say it's not a feature request, but is a bug report. In that case, the next step is to see if we can reproduce the behavior in house. If we're unable to reproduce it, then we close the report and ask the user for further assistance in reproducing the issue. But if we can reproduce the bug, then it gets kicked over to me for scheduling. I prioritize the reports, determine who is best to work on them, and figure out what release they should be worked on. Basically, it depends entirely on the bug as to how that all works. For instance, if it's a newly-introduced bug then it gets a higher priority than one which has been around for ages. If it's a data loss bug, then it's higher than a cosmetic issue. If the bug is very simple to fix, it's scheduled sooner than one which will take a significant refactoring, etc. Another thing which happens at this stage is that sometimes bugs are closed as "won't fix" or "by design." If a report comes in that's behaving as expected, sometimes testing doesn't catch that fact (they just see the user say "when I do X, Y happens" and can reproduce the issue). Also, some bugs are things we won't fix -- they're not by design, but they're also not going to get fixed. A good example of this would be bugs reported against deprecated functionality. Again, if the report gets closed at this stage, then I make sure to put in a personal message explaining why I've closed it.
That's the day to day process that bugs go through, but there is still a bit more to talk about in terms of their life cycle. At release boundaries (as one release is finishing up, and another one is about to begin), we go through all of the bug reports and feature requests which haven't been assigned for a specific release and start to dole them out. (Part of this is also rolling forward bugs which haven't been fixed for the current release that have been assigned.) Basically, we start dishing out schedule fillers and checking to see what FogBugz has to say in terms of likelihood of meeting deadlines.
Another thing I want to talk about is what I mean by "close report." In the old feedback system, this was a way to finalize a report. "Closed" meant "dead, gone, never coming back unless the moons align properly." That's not the case at all in the new system! Closed means "please reply to automatically reopen the report." It's basically a way for us to do housekeeping. We close a report if we feel there's nothing else that can be done unless we get more information from the reporter. So if the reporter never responds, then there's nothing more we could have done anyways. But if the reporter does respond, then we might have something else to do -- and the report may rejoin the process. So "closed" isn't a bad thing, I promise.
Of course, this is still a pretty high-level explanation of how bug reports are handled. But it should give you a good idea as to how reports are handled.
Aaron,
Whilst you are talking about feature requests, I've been thinking about a (big) one. Not sure if it would work, but it would be very impressive if you did do it.
Its for a new platform for the compiler to compile to. I think its a bigger market than all your existing platforms, crazy as this may sound. The platform is apache (or possibly IIS).
I've been wondering if you could abstract out enough of the UI elements to separate them on to a web form. Probably have the code run server side, but it could be either, I guess, but with all the user interface events coming from a web form.
I know its a big task (obviously), but it would make Real Basic a very interesting cross platform solution for apps, including web apps. I suspect that its probably too big to actually happen, but in the long run I doubt that there will be much demand for anything else.
Anyway, you can file this one in the "never to be done" reports, but I thought it was worth mentioning. For someone who develops for a small business type app this would be very attractive - rather than install their app on every workstation, they could install it on the server.
Anyway, just a thought.
Michael
That's a good overview, and much better than before. In the old system it used to tick me off when I'd report a bug and it would be closed because "this should be a feature request". Ughh!! I'd wish y'all would have just re-categorized it.
For me closed is closed and i have no intention to talk to a wall.
Regards,
Andre
Great "RBish" example of the workflow. Thanks for the insight. This leads to questions though. On average, how many feature requests and bug reports do you get per day / week? I imagine they cluster after a new release and trail off afterward. I know it's not an "easy" question, but on average, how much time does it take to fix a typical, average bug? Thanks again.
@Randy - I'm not sure there's such a thing as an "average" bug :P
I've only been with REAL for a short while and some that I initially thought "Oh this will be easy" have taken longer than I expected and some that seemed like they'd be really hard were much easier than expected.
@Andre -- that's certainly your choice, but you wouldn't be talking to a wall.
@Randy -- I'd say we usually get a few reports every day. Some days have none, some days have floods (it really depends on what's happening at the time). In terms of turn around time, that also depends entirely on the bug. I know that for myself, some bugs take 20 minutes, and others take several days. I'd say that the average bug usually takes between 1-4 hours to fix though.
@Michael -- it's a good idea, and one we've explored in the past. I wouldn't say "never be done", but certainly is "way too huge of a job to really attach a feature request to." Generally speaking, when we want to move into a totally different area, that's not a feature request sort of thing. That's more of a business decision, if that makes sense. Feature requests are usually more along the lines of "here's a feature that exists in your current market segment that I'd like you to support", whereas what you're looking for is "you should move into this market segment too."
@Aaron -- Thanks for this, and hopefully this will at least stay in your consideration basket. For now, RB serves my (simple) purposes pretty well, but I can see a time coming when I will want web apps. I think its somewhere that you will ultimately need to go.
Keep up the blogs, they are a very useful source of info for me...
@Michael--does Yuma satisfy this need?
@Aaron--thanks for the insight into the mind of RS.
Tim
I can imagine that working with bugs is a difficult ask from the point of view of priorities. I can imagine anyone thinking that his/her problem is the most important. So I don't complain RB about this priorities in solving bugs.
But it is really uncomfortable to send a report about a bug, see how it is label "verified" and nothing happens months after months. In fact I even don't know if someday it will be solved.
In my opinion there should be a maximum period without notifications. It is exactly as if you are at the airport, your flight is delayed and hours pass without any announcement. At least we would know they have not forgotten our report, what is precisely what I feel now.
My report was classified as "Severity: Incorrect Functionality"
I don't know what this mean to RB. Is it important?
Anyway, thanks for your explanation.