I was asked by a friend and ex-colleague yesterday about which process he could use to ensure the success of his development teams project. Like many would-be Project Managers he hears about Agile, RUP, SCRUM, and a million other processes that each assures us will guarantee a smooth project. Well, it’s all lies. Not one of those methodologies will help if you don’t get the basics right. Additionally, most of those methodologies are over-complicated to some degree or another, yes, even the “Agile” ones. So what are some good ways of ensuring project success?
Communication
Without good communication, your project is doomed to a dismal failure. You need good communication from the dev team to the project manager, as well as good communication among the team members. You definitely require a good relationship with the customer, and this is not just the responsibility of the PM, but of the entire team. In fact this part is so critical that I make it a rule never to hire staff unless they have good communication skills. I expect all members of a team to be able to interact both with the end-users as well as the customer sponsors and exude professionalism and competence. I guess you could get by with developers who aren’t good at social graces, and hope that they never have to meet a customer, but I prefer not to take that chance.
I try and ensure that the customer is engaged as much as possible in the project. I don’t go as far as some Agile methodologies and require a customer representative sit with our dev team, but constant feedback, mockups and demos go a long way to keeping customer expectations under control, and making sure your team doesn’t veer too far from the customer’s vision.
Testing
Constant testing is absolutely critical if you want to have a clear idea of where you stand. I’m not necessarily advocating Test Driven Development; I like the idea, but struggle with the discipline myself. However, what you cannot do is leave testing to the end of your project. You need to be thinking about testing from the very first design discussions, and you need to be doing your testing right from the project kickoff. The whole time through your project you need to look at ways to automate and speed up your testing cycle. Continuous Integration is a great start, but usually focuses only on unit tests. Integration tests are also critical, and often much more difficult to set up and prepare for, they usually involve deploying to a test environment, creating databases, setting up users, you name it. However, it makes sense to consider all this as a test of your deployment system, and try and schedule a full integration test each evening if possible so that bugs are waiting for the developers come the morning.
Oh, and most importantly: bugs come first! This is hugely difficult to enforce, there is a massive amount of pushback from customers wanting time spent on scope changes, management wanting the focus to be on completing promised functionality, and developers who want to work on fun new stuff. Nonetheless, the bugs must come first. If you let your bugs pile up, you have absolutely no idea where your project is. Consider the following two teams:
| | Development Progress | Logged Bugs | Overall Progress |
| Team A | 50% | 4 | ~50% |
| Team B | 90% | 400 | No idea |
Which one will finish first? The simple answer is that no-one knows. Team A will be able to give an estimate, as will Team B. However Team A’s estimate will be much more grounded in reality than Team B’s, which will basically just be a thumb suck. Now, which team would you rather be on? Team B sounds like a death march to me.
One of the most important things about forcing the developers to fix bugs as the highest priority is also that the developers who write buggy code will be the ones lagging behind, and the developers who write stable code will be the ones implementing new features. This is an ideal feedback loop that virtually guarantees that the quality of the code will improve as the project progresses, rather than the far too common reductions in quality.
Focus
In any project there is always the question of what to focus on first? Back-end plumbing or front-end goodies? Easy “low hanging fruit” or the main features? In my mind the answer is always simple: the features that your customers care about the most should be the first implemented. Anything that does not directly support those features should not be worked on at all, until you literally have nothing better to do. Support work should not be done unless it is absolutely critical to test the functionality. If for example you need 5 users to be in the system, don’t bother putting in the administration screens for them, just add them manually at first. Granted such screens are important, but not as important as your main functionality. So, you implement the main feature first, then you implement the functionality critical to making the main feature work, then you move on to the next major feature. Once you’ve completed all the major features like this, then look at functionality that is important to the implemented features, and fill in the missing bits. Once all of that is done, then you move on to less important features.
In this way you ensure that the most important parts of the application are completed first. they are thus also tested the most thoroughly. Now contrast that with the approach of writing all the little bits first. In such a case you only finish the main features at the end of the project if you’re lucky, and you test them the least. Instead, by being able to show the customer their most critical portions quickly, you get feedback early, allowing you to make changes the customer deems important. Let’s consider Team A and Team B again:
| | Development Progress | Back End Development | Use Cases Covered |
| Team A | 50% | 30% | 90% |
| Team B | 50% | 90% | 30% |
Team B has a lovely set of back end services and a beautifully designed DAL which encapsulates all the application logic, yet the customer doesn’t care about that. I’m not saying you should ignore back-end in order to screens, I’m just saying that you do the minimum back-end work required in order to implement the feature. Now, sure, it’s possible that Team B will swiftly catch up to Team A, given that it should be easier for them with their wonderful backend. Of course, if the requirements change, as they so often do, they might have to throw away some of their work. Additionally, if the project is stopped or needs to go live early, Team A will have already delivered pretty much all the required functionality, and Team B will be left looking like idiots.
The only problem with this “main features first” approach goes back to communication. It is difficult to explain to a customer why there is still lots of work outstanding when the features they care about most are there. Following this approach involves a little bit of customer education, but you’ll find it’s well worth it down the line.
Up Front Design
You have to do up-front design. Many developers consider Agile methodologies a great way of diving into the coding immediately. In fact, I believe that Agile requires more up-front design than non-Agile projects. Since things are not set in stone, your design must be flexible and malleable. Now, I am not saying up-front specifications, although it’s a bloody good idea to have signed off functional specs before starting development. You do not absolutely require a technical specification (unless your methodology calls for it), but you do need that design. It should incorporate all interfaces to outside systems, including database, configuration, registry, network and so on.
I personally like to have a “high-level” technical specification which basically just provides pointers about how to implement various pieces of functionality indicated by the functional specifications. Of course, I tend to work with quite senior developers, so your mileage may vary. Usually, the more junior the developers, the more detailed the specifications should be.
If you follow the “main features first” approach, up-front design is especially important. Since you do not have the luxury of a working back-end system to tweak and test against, you need to be able to write the required portions of it with the confidence that every piece has it’s place. Otherwise you’ll end up with a nightmare of inconsistent services and methods.
Automation
It’s a sad reality that some of the worst consumers of automation are the very developers who provide it to everyone else. You should never, ever do any of the following things manually:
- Create CRUD stored procedures from a schema
- Write developer documentation for your API
- Deploy your project from DEV to QA to PROD
- Create the installs and CD’s for your system
- Upgrade the database from one version to another
- Add logging and tracing to your code
- Check code for adherence to standards
Powerful automation in your project helps with a wide variety of problems, but most importantly it improves repeatability. I’ve worked on projects where the move from DEV to QA to PROD is a manual process. Now, if someone forgets something from DEV to QA it’s not the end of the world, it just delays your testers. But imagine a scenario where you forget something going from QA to PROD. Ouch! You just brought down the customer and guaranteed yourself a late night.
Quality Team Members
Ever wondered why methodologies that worked so well for one team didn’t work for another? Well, a very likely cause of this is the quality of the members of your team. By the way, I include the customer representatives for the project in this definition of team. A friend of mine has as his email tagline: “If you think it’s expensive hiring a professional, try hiring an amateur”. There are very few industries where that statement is as true as it is in software development. Software development is a profession where negative work is not only possible, but downright easy. Where a developer can write software so badly that it takes more time to resolve the issues than it should have taken to do right in the first place. Don’t think that this is limited just to the developers either. It is a soul destroying moment to deliver functionality that matches the functional specification, but isn’t what the customer wanted.
My best advice about choosing your team members is to be picky. Never accept someone simply because you’re desperate for an extra body. Every new hire changes the team dynamics, sometimes dramatically. If you’re really picky and really lucky, this will usually be for the better. Never take deadlines or pressures into accounts when selecting people. Instead, pretend to yourself that you have plenty of time and a relaxed environment, and don’t really need an extra person when you’re interviewing. Never, ever settle.
Now, I don’t mean you should only hire senior people. You need to look for enthusiasm, intelligence, and self-motivation. Usually if a candidate has those three aspects they will be a good fit. Ambition is good, but be on the lookout for people who see the job merely as a stepping stone. Senior staff absolutely have to be willing and eager to mentor more junior team members, in fact I believe this is one of their most important roles. If you have a senior member who guards their knowledge and skills jealously, get rid of them, immediately. You may think you need their skills, but on average they will hamper your project, not assist it.
Also, a quick word about quality project managers. I’m far less concerned with whether they know the latest project management methodologies or tools. What’s far more important is that they realise that their primary job is to remove obstacles in the way of the team. Everything else must be subservient to this. Too often the project manager is the greatest obstacle to the team getting their work done. In such a case you’d probably be better off without one. However, if you’ve ever worked with a decent PM, you’ll never want to do a project without one. They smooth all the edges, remove irritations, and make sure you don’t let anything slip.
If
(apologies to Rudyard Kipling)
If you focus on your team members and make sure that they’re skilled and enthused…
If you carefully consider your technology to ensure that as much that can be automated is…
If you make sure that you work on the most important features first…
If you keep all lines of communication open, and listen carefully to the customer and end users…
If you aggressively eliminate defects from your code…
Then you’ll likely have a successful software project my friend!
(also credit to Andy Hunt, Dave Thomas, Steve McConnell and Joel Spolsky for their books and articles that strip out the hyperbole and focus on the facts)