Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

The Life of a Project - Issue Tracking: Day 1

0.00/5 (No votes)
10 Jun 2003 1  
A detailed look at the evolution of a project from concept to product. (This is the first installment of what should be several more articles.)

Read this first, please

This is the first in a series of articles that hopefully will be educational to novices and helpful to more advanced developers alike.  I hope to learn a lot from doing this also.  I am taking the approach of maintaining a journal of the day-to-day process of software development starting from a concept and going to a product.  I hope you enjoy this series of articles.

Introduction

I had surgery on Friday June 6 and as a result am stuck at home until at least the 16th.  I could be reading, watching TV or doing just about anything a person can do while sitting on his/her butt.  Being a programmer, I have decided to take this time to develop a software application.  I have no shortage of ideas for an application, but there is one that I have wanted to write for a long time.  One of the problems I have at work is keeping track of change requests, program changes, ideas, etc.  What I need is an issue tracking system.  Actually, I have an issue tracking package called DevTrack which is not bad and in fact has many great features, but for many reasons I do not use as I should.  The primary reason I do not use it is because I feel that it just adds work, instead of augmenting my work.  I have worked with a few other issue tracking systems and they all seem to have this same common problem.  For this reason, I have chosen to develop my own issue tracking system that I will be less of a burden and more of a benefit.  

What I want is a tool that is almost transparent which allows me to record issues, change requests, bugs, defects, ideas and to-do lists quickly or ideally automatically.  I don't really care if it is integrated with my development tool as much as I care that it is virtually transparent.  I want to be able to easily put data into this tool without jumping through hoops and I want to get it out just as easily.  I don't want a conventional MDI/SDI/whatever application, I want a service that I can call upon to take my requests and deal with them accordingly.  I want to be able to make changes to the system while making requests, instead of having to jump to some other application, do something, then come back and finish my request.  Basically, I want a system that can read my mind, do what I want, when I want and interfere with my life as little as possible while making my life simpler.  Sounds like what most users want, doesn't it.

I am creating a short series of articles entitled "The Life of a Project" to detail my journey from here to the end of this project.  I hope to use these articles as a means to teach some valuable programming techniques (and learn some for myself) as well as to deliver a product that others can use and benefit from.  This is the first in that series and so will probably be somewhat more verbose than most.  I hope you enjoy reading them.

My little diatribe

Somehow, when most applications are designed a process is followed that inevitably leads to one or more nice and neat application programs.  These may be Windows GUI applications, web apps, or whatever, but the scientist in us developers likes to see straight lines and nice and neat boundaries between systems with well defined lines of intersection, union or whatever.  Part of our job is to take what users (managers, bosses, etc) request and turn that into code.  Often this is very simple and we can fit all of the requests into a nice and neat package, but with more complex requests, we end up with more complex designs where the lines are not so neat and the boundaries not so clear.  The reason for this is obvious, computers don't talk human and humans don't talk computer.  Until this changes, there will always be a challenge in software development.  

Some people will argue that we are making real progress in this area because we are adding more and more layers of abstraction which make it easier for developers to make it appear that computers indeed do talk human.  They may be right, maybe abstraction is all that is needed, but we all know that all of this abstraction is adding risk to.  What happens when there is a serious flaw in an abstraction layer way below our applications?  The eternal constant (change) takes over and we are forced to either redesign our applications or pigeon-hole them to work with the underlying changes, or worse some abstraction layer below ours adjusts itself to accommodate the change which means either that later was pigeon-holed or redesigned, forcing more changes down the line.  Where does all of this end?  I guess you could say that we will reach a point where the abstractions will become so stable and standardized that change will not be an issue, but I doubt we are anywhere near that point now.

So where does that leave us?  Well, it leaves us right back where we started, we must take a set of requirements and design an application that leverages as many or as few of these shaky abstractions as we feel necessary to fulfill the requests while trying to balance the risks.  We can choose more control by using fewer abstractions, but this often forces us to either reduce the feature set, increase the amount of code we write, or invent our own abstractions to replace the ones we avoided earlier.  We could take the risks of increased abstractions and hopefully benefit from the productivity gains, code reduction and feature enhancements that these abstractions promise, but we must be careful to choose abstractions that we feel carry the least risk.

OR, maybe the pipe dream that is object oriented programming is just plain wrong.  Maybe it is a house of cards that will ultimately collapse upon its own weight.  OOP has been around a long time and has promised quite a bit, and in truth has delivered some of its promises, but I always have a nagging feeling in the back of my head that says "it just isn't right."  Maybe I misunderstand OOP and maybe all of these abstractions are just illusions any my concerns are misplaced, but I doubt this too.  How can we have a system dependent on so many chances of failure?  How can we have a system that relies on a lack of change when we know that change is not only inevitable, but a daily occurrence?

Then, a little voice in the back of my head says, "what about all those mainframe applications that have been running unchanged for 20 years?".  Hmmm...could it be that these systems prove that OOP is and always has been wrong?  Could it be that COBOL is indeed the language of kings?  Could it be that the evil empire (Microsoft) created OOP to drive sales of its software for the next 100 years?  I doubt it, I suspect that the only reason any of these applications continue to run is because they are batch-oriented systems with well defined inputs that for the most part don't change ever.  I suspect that the interactive portion of these applications has indeed changed quite a bit, that the portion that deals with communicating information (either receiving or sending) has been changed many times while only the core processing engine has remained unchanged.

So where does that leave us?  Well, it leaves us right back where we started, only more confused than before.  Should we use OOP techniques or should we use some other programming technique such as functional programming or structured programming or should we give up and find a nice easy career as an accountant? (Hmmm.  Maybe all of this is just the effect pain medicine has on a programmers mind?) 

I always hate reaching this point in the application design stage because its like walking on a treadmill, you can go a long way and never get anywhere.  The reality is that in today's world, to write an interactive application with any-kind of human usable interface, OOP is the only way to go.  We must accept a certain amount of risk, in-fact we must accept inevitable and uncontrolled change, and we must cope with at least some abstractions.  Our job here is to wisely choose the abstractions we rely upon.  

Getting started

Before we can choose what abstractions we want to use, we need to do a little requirements gathering, some specification writing and put on our creative hat.  We need to understand the project in detail, from the users perspective and from a business needs perspective.  Then we must create a design that takes into consideration all of these needs and solves all of the problems.  So, without further ado, lets take a look at our requirements.

Requirements 

The users of this system have been interrogated and here are their demands:

  • Want to record user change and feature requests
  • Want to record defects and track their progress
  • Want to record Ideas for existing projects, new projects, old projects, etc
  • Want to record to-do lists
  • Want to record change history for projects
  • Want to report on outstanding changes, features, defects
  • Want to update the contents of various items with ease
  • Want to hide old data, but be able to access it when needed
  • Want to report on past changes, defects, etc.
  • Want to organize items for personal ease of navigation
  • Will only use this app if it is dead-easy
  • Will only use this app if they can customize everything as needed, when needed

As usual, the users don't tell us everything we need to know.  There are questions that must be asked and answered.  Here are some of them:

  • Q: What information will be gathered for a change or feature request?
  • A: I told you, I want to customize everything.
     
  • Q: OK, What do you want the reports to look like?
  • A: I told you, I want to customize everything.
     
  • Q: That's great.  How do you see this information being entered?
  • A: I don't know, but I know I don't like any of the tools I have used so far.
     
  • Q: Define "dead-easy"?
  • A: I don't want to do anything, I just want it to do everything for me.
     
  • Q: OK, but obviously you will have to do something.  How much do you see yourself doing?
  • A: I see myself clicking a button, entering the information and clicking OK.
     
  • Q: Do you want to be notified by email when someone-else puts an issue in to the system?
  • A: What?  I don't want anyone but me to use this system.  Anyone else will screw it up.

That's about all we are going to get out of the users for now.  This may seem funny, but is not too far from the truth.  Users sometimes know what they want, but not what they want.  Specifics are hard to come by and sometimes can't be found without a little (lot) more research.  That does not mean that talking to the users was a bad idea, only that we now realize that users aren't software developers, and typically don't think the way we do.  Trying to get a user to decide between a tree control, a list control, or a group bar is like trying to get a 2 year old to pick what career he wants to take when he/she grows up.  It's not that they aren't smart or don't understand their needs, but the question is beyond their scope of understanding.

Requirements - Take 2

We have spoken with the users, asked our follow-up questions and come to the conclusion that we need to do a little more research.  We know that our requirements list is a little light on details so we need to fill it out a little with some educated guesses combined with some well placed research.  

First, lets take a few educated guesses and get them out of the way.

  • Lets assume that keeping track of when items are added/changed is important
  • Lets assume that keeping track of who adds or changes items is important
  • Lets assume that there is some kind of workflow process involved since most jobs have some workflow to them.  This workflow will probably start with opening and issue and end with closing the issue.
  • Lets assume that users should not be allowed to permanently delete anything.
  • Lets assume that a typical GUI application is not enough to satisfy this crowd.
  • Lets assume that certain fields are common such as Title, Comments, Date encountered and Status.
  • Lets assume that we can't assume what other fields the users will want.
  • Lets assume that getting data out will be important so we need to make reporting as powerful as possible with printable as well as viewable reports
  • Lets assume some form of logon is desired

Now, lets do a little research and see what we can come up with.  We are going to look at what the competition has to offer and try and glean some ideas from each of them.  Here is a list of the products we looked at.

We could have looked at many more, and it is clear that this is a market littered with applications.  There are several things we learned from doing this research.  Some of the things we learned are:

  • All of these take an application approach to the problem.  What I mean is that all of these is an application which a user must launch (either as a standalone program or a web app) in order to perform usual tasks.
  • Many are project based allowing for the creation of "projects" to help organize issues.
  • All provide a pre-defined set of fields with pre-defined value lists.
  • Most allow for a high level of field/value list customizations.
  • All provide some form of email notification of new issues/changed statuses.
  • All are clearly targeted at team development.
  • Priority is a common field
  • Attaching of files appears to be common
  • Embedding images is often possible
  • All provide some form of list-view based approach to listing issues.
  • Common statuses include Open, Closed, Under Review, Fixed - Awaiting Review, Cancelled, On-Hold

Requirements - Take 3

We are now armed with some more information on the subject as well as some solid ideas of what features users will really want and use (based on what other applications provide).  Lets go back to our users and examine their workflows and behaviors a bit.  We want to learn how they do their job so that we can best tailor the application to them.   We are going to look over their shoulders for a while to passively observe and we are going to share what we have learned with them to get some feedback from them.  Since I am the only developer available at this time, I am going to examine my own workflow and process.  

Some basic details:

  • I work in the R&D department of a market research firm
  • Most of my work is done in Visual C++ 6.0, though Visual Studio .NET is on the horizon
  • I support several web based (ASP) applications
  • I support several GUI applications
  • I support several Windows NT Services
  • I typically leave Outlook, Developer Studio and IE open at all times.
  • A large part of new code is done in C++.  The rest is ASP and HTML applications.
  • I use Visual Source Safe

How projects/issues/change requests arrive at my desk:

  • We sell a client something which we don't already posses and a sales person passes on that information to me through paper or email.
  • We come up with an idea and choose to build it.  This usually involves discussions over lunches, and during breaks.
  • We discover a problem in an existing application which usually occurs because I review a log and find an issue, or because someone else in the company encounters something and emails or calls me with the issue.
  • A client asks for a change in an existing system which is passed down to me usually through email.

How I currently manage issues, change requests, ideas, to-do lists:

  • I have a product (DevTrack) which I keep long-term issues in such as bugs I don't intend to fix soon, but I don't use it regularly.
  • Typically ideas are passed between myself and my boss through email.
  • When I finish a change, fix a bug, or whatever I put the change into production and notify appropriate people.

What can I tell you about the other issue tracking products that I looked at:

  • The "application" approach works for managing issues, but not recording them which is where I struggle most
  • Project based systems are fine, but I would like to be able to have issues that exist across projects and occasionally are assigned to No project
  • Different types of items require different fields (ie. A Change requests will require fields that a Feature request will not, and idea will require only a few fields, etc)
  • Priority is important, but difficult since everything is a high priority.  I would like a better way to assess the real priority of an item.
  • Attaching files and images is a must.
  • I will allow others to put issues in IF I can control what they can do and where it goes and WHEN I see it.

Vision

Having been through the requirements analysis up-to-this point, I have decided that I need an innovative solution to issue tracking if I (and other developers) are going to use it as an every day tool.  So, here is my vision for this tool.

I see a link on the Start menu (and a tray icon with a popup menu) with specific tasks I want to perform such as "Record change request", "Record bug", "Review open bug list", "Print bug list", "Close issue".

I see these same links available as toolbar icons in my favorite applications such as Developer Studio, Outlook and IE.

I see a dynamically generated form created for each type of task.  These forms should be customizable on-the-spot and I should be able to add new task-types on-the-spot.

I see a special email-recipient which I can forward emails to and have them automatically cataloged within this system.  I would like to have addresses like "issues@mycompany.com", "ideas@mycompany.com", etc" and I would like to be able to forward any email I get or send (or CC) to one or more of these addresses and have it inserted appropriately.

I want to be able to create logical groupings of issues which can overlap and I want to create my virtual email recipient addresses when defining these groupings.

I see an IE namespace extension where I can drag-drop files to that will automatically create entries and attach them to issues.

I see a journaling tool that runs in the background monitoring file changes to .cpp, .h and .asp files (and others) that records day-to-day changes and provides a way for me to comment these changes and to automatically extract comments from the source code itself.  These journaling entries should be part of my issues DB.

I see an application interface that allows for management of issues, but is not used much.

What's next?

Tomorrow, I will review where I am and begin to write a specification for this new application.  I may also create a simple prototype of some of the features, but I will wait and see how the specification goes first.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here