Shipyard
logo
THIS SITE IS NO LONGER MAINTAINED. MOST CONTENT HAS BEEN MIGRATED TO ANCHOR HOSTING WEBSITE.
     
     
Advertising
.au domain names
free transfers, registrations and renewals from $69

Australian web hosting PHP, MySQL, Java
from $198/year

Dedicated servers
Australian, Linux and Windows, $175/month
 

Software Project Management for Programmers

Written by: James Gregory on 12 March 2004

One of the many things that I'm not very good at doing is playing squash. I keep trying though, and meet up with a good friend of mine a couple of times a week to awkwardly run around a squash court missing the ball in exciting and innovative ways over and over again. I don't think I'll be doing any disservice to this friend when I refer to him as a "non-programmer". Indeed, he has devised a neat classification system that everyone in the world fits into: the world is divided into "geeks" and "normals". Geeks are people who pick up his PDA and go straight to the expansion port to see how much memory is in it. Normals are people who ask him if he can make phone calls on it.

I'm sad to say that I fit squarely into the "geek" category. I actually did find the expansion port the first time I saw his PDA and said "wow! 128 megs!". It should come as little surprise to you then that I have led a great number of completely failed software development projects. My concern is that it will come as a surprise to a great many of you. You see, all the programming expertise in the world won't help you if you don't understand what your program needs to do. As a professional programmer you need to find a way to talk the same language as your clients and find a way of keeping them abreast of the challenges you face without trying to draw these poor "normals" into your "geek" universe.

It's taken me a long time to start figuring out what's going wrong, and only now am I starting to find the solutions. I hope this article will at least give you some perspective on what's going on in your own software development projects. I talk here about web development, since it's all the rage, but I hope you can apply the same principles elsewhere.

The Problem

It begins with the phone call. Seemingly innocently it starts off with a "hey! how you doing?", and slowly more menacing "so, are you busy at the moment?" and on to "great! I've got this client that needs to set up a new web shop with streaming videos of his crocodiles dancing to Britney Spears and as soon as I heard about it I thought of you!". Great, you think, some work. Could sure do with some of that. Then there's the meetings. There's lots of them, but even then there's not enough. You get asked to build a "web store", you need to include "streaming video". It needs to "integrate" with the in-store point-of-sale system, it needs to support IE4 and it needs to be done by the end of the month.

So what's so bad about that? Here's some questions that I know will have been left unanswered:

  • How does the point of sale system work?
  • What data formats does it talk?
  • How often will it need to "integrate"?
  • Just what is "integrating" anyway?
  • IE4? Are you for real?
  • Streaming video eh? So who's going to setup the co-located box in America, buy the license for Real (or similar) and set it up?
  • Who's going to maintain it?
  • How is this streaming media going to get there?
  • How many people will be watching this streaming media concurrently? Can you guarantee that?
  • When can I expect to see the designs?
  • Now when can I expect to see the second revision of the designs that bears no resemblence to the first one?

I could go on but I'll save you that agony. In short, there has really been no consideration to the complexity of the project -- the client doesn't have a good understanding of his or her requirements and they definitely don't understand what those kind of requirements cost.

I should point out that these conditions are very like a system I was asked to build just before I started at Anchor. They are in no way contrived. If they sound ridiculous to you, then you are a fortunate developer indeed.

Communication

Essentially what we're seeing here is a communication break-down. The client doesn't understand that a programmer can't program something they don't have full specs for. The designer doesn't understand that they simply can't keep changing their mind on fundamental decisions made weeks ago. No-one understands the point of sale system -- it was purchased off the shelf by the previous acquisition manager.

So who's at fault? The developer. Yep, it's all their fault. Inevitably they will be the only person in that room who understands all the issues at hand -- it's their job to communicate that to all parties concerned. You could argue that it's the project manager's job to do this, but unless your project manager is also a programmer, there's little point expecting him or her to get the job done. At the end of the day it's your neck and you're the only one who can save it.

The solution then is simple enough -- make everyone understand all the technical facets of the project. There's a couple of parts to that, but let's start at the start: to explain the technical aspects of the project you need to understand them yourself.

Understanding the project

Before anything else happens, you need to get a good feel for all of the project. You need to have a meeting with the project manager, and you need to have a meeting with the end client. You don't want to say anything at these meetings; you need to listent to their requirements, and understand their vision for the project. Occasionally you will find that there is disparity between the project manager and the client. As soon as you know about that, raise it with them both and find a solution. Here's some good exercises to use when you're in these meetings:

Use cases

Probably the most important thing at the end of the day is that someone's gotta be able to use this code to get a job done. Ask the client and the project manager to imagine that they're a customer, wanting to use this website (or application) and get them to tell you what they're doing, in detail to achieve their task. Then get them to tell you what business practices they're going to follow in order to make money from whatever transaction the end-user is partaking in.

You'll often find in working through this that there's a lot of unstated expectations. One response that I commonly hit was when asking the user to describe the ordering process was that I would be told "so I go to the search bar and look up the type of crocodile I'm after, and then...". That means there's got to be search functionality. I found it very rare that people actually said "the site has to be searchable" -- it just seems to be assumed.

At the end of the meeting, read back the list of requirements you've written down. Ask them if there's anything missing from the list, and ask them to have a look at your notes. The purpose of this is two-fold: first it serves as a check that you've been talking the same language and that you've been communicating effectively. The second reason is that it gives the client some feeling for just how much "stuff" they've asked for. It's inevitably more than what they initially envisaged.

Don't talk timeframes. Yet.

It's pretty common practice after clients learn just how many things they've asked for to want to know how long it's going to take. They've got a number in their head and they want to know if this meeting will make that number unachievable. It's almost certain this project will run over-time, no matter what number you give them so what you really need to give them is a bunch of dates and a plan for development. Unfortunately that will take more time and work than will be available at such a meeting, so you just can't give any dates. Tell them you'll look into it and get back to them in a week.

Then what?

After you've spoken to the main stake-holders in the project, you need to talk to any auxilliary parties. This includes people like sysadmins, or vendors for 3rd party software that will be used (such as the point-of-sale system). I won't say too much about this since the process will be very similar to what I just outlined. Make sure though, that you keep the communication channels open with these people. If they are affected by database design decisions that you make, then send them every update to your database schema, and ask for feedback, ask them what effect it will have on them. I assure you that these documents will go ignored unless you maintain a dialogue.

The Spec

In a perfect world, you'd get handed "The Spec" on day 1. "The Spec" would be a complete and authoritive treatise on everything you need to know to finish the project. These documents just don't exist. Trust me. That's not to say that attempting to write them is a fruitless exercise. The unfortunate fact is that the client -- the one who ultimately knows what they want, is hopelessly inequipped to write such a document. Here's what you need to include:

Problem statement

The first part of the spec should contain a few paragraphs concisely explaining the problem that needs to be solved. This is big-picture stuff. If you find it impossible to state the problem in a couple of paragraphs then this is the kind of project where you need a "specifications team" rather than a single author. Everything else you write should be judged against this problem statement; it acts as a test that the system, as imagined by the programmer, will do what it needs to do.

The subsequent sections will vary somewhat from project to project. Generally though, this document will address each logical "component" of the project and explain what abilities it will have, and what constraints (if any) are being assumed in its implementation. Any and all mechanisms for performing some task should be explained. For example -- the issue of dealing with "sales" should be dealt with. What mechanism will you provide to allow the discounting of items? (if any, and if there's not, mention that as a constraint)

We'll come back to the importance of a thorough spec, but for now treat it as "insurance". This will be the one document you will come back to when there are disputes about missing functionality in 5 or 6 months. Refusing to add any functionality the client expects is useless, but defining what will be included in your final price allows you to charge for the privelege of adding this functionality.

The Plan

Detailed implementation plans are almost as illusive as rigorous specs. Inevitably you won't exactly follow any plan that you write, but attempting to write a plan that goes from start to finish means you'll be able to give a good answer to your client when they once again ask you "how long will it take?". Here's my pointers for a good implementation plan:

Small time-slices

I can't honestly remember who originally said it, but when you're considering software implementation, you really need to chop up your activities into portions about 3 hours long. You don't need to mark all these 3 hour chunks on your plan, but make sure you've thought them all through, and be realistic. Your time is worth money, so it pays to get this right.

Milestones and versions

Clients and designers will want to see results imediately, so when you present this plan to your clients you want to give them a list of "milestones" -- functional achievements with tangible results. Milestone 1 (M1) might be a site with the ability to browse products linearly. Milestone 2 might add searching abilities to that. This allows everyone in the project to track the progress of it and feel assured at all points in time that things are getting done. Working in this methodical way through a list of achievements is a good way to program as well -- each stage can be tested and feedback gathered before problems arise that can't be solved later on.

As part of this milestone system, you should commit to weekly rollouts of your code to some testing environment. This increases visibility and lets you get your rollout process perfected long before release date.

It's wise to order your milestones such that after a certain point, the site could go live without any of the rest of the development being done. Of course it's not ideal, but there are always deadlines, and you're rarely aware of them all. Mark a particular milestone as "version 1" -- it will contain the minimum amount of functionality that you could reasonably expect your client to do business with, but without all the bells and whistles.

Invoicing

As part of your plan, you should include a number of sign-off points (such as "version 1") where you will bill the client for the work done so far. Though it may not seem so at first, this benefits everyone:

  • It clears up cash-flow for your client
  • It means you can walk away at any time without having lost all the income you may have received from the project

At each of your sign-off points you should arrange a meeting with your client to demonstrate the current level of functionality and judge the progress so far.

Meeting Two

Having prepared your spec and your implementation plan, you are left only with the problem of getting your client to sign off on them. But that will have to remain the subject of another article.

Happy hacking!

x