Once again, I'll go back to my days as an aerospace engineer working on space shuttle launches for some background. Planning and engineering a space shuttle launch is a long, tedious endeavor that takes lots of people time, and money. Everything is mapped out in as much detail as possible at the earliest time possible. The reason for this is obvious - you can't afford to wing it when something as simple as machining an aluminum mounting plate takes 10's of thousands of dollars and several weeks. How long to you think it takes to build a camera that can look back 10 billion years?
And the requirements... so many, many requirements. There is a spec for everything because everything matters. Is the honeycomb panel strong enough to withstand a wayward kick from an astronaut? Will the handrail be too hot for him to touch? Where is the sun anyhow? What about those bolts? What happens if the astronaut can't loosen them? What happens if he can loosen one, but not another, and the first one floats away into space?
Lots and lots of requirements. Lots of planing, and then the work begins. It is a slog. It's slow, expensive, and still doesn't prevent the unexpected. But given the constraints, it's not a bad way to launch a space shuttle.
Back in the "old" days, they made software this way too. Everything was spec'd out in advance. User interface, data structures, performance - everything. Once a project is all planned out, it gets broken up into well defined pieces for developers to work on. Sounds great, right?
In practice, it's not so great. Software is so flexible and so conducive to innovation that you almost never know exactly what you want to build before you get started. You'll have a vision - a vague idea of what the software should do, not a well defined set of specifications. I'll even go as far as to say that if you think you know exactly what you want to build, you are wrong. There is something you think you want that you don't or something you forgot that you really do need. It's just the way it tends to happen.
Aggressive and thorough pre-planning for software development is exactly equivalent to waste.
So what do you do? You use Agile methodologies. What it means in a nutshell:
- Plan and build the smallest chunck of software that actually works, even if it falls way short of what is eventually needed. This entire iteration can be as short as a day or two. The iterations tend to get longer as more developers are added and the software gets more complex, but if they're more than 3-4 weeks, something is wrong.
- Try it out. You, the client (acting on behalf of your customers), need to try the newly functioning software, minimal as it may be. The process of actually clicking and typing in your application will clarify your thinking and help prioritize what needs to be built next. You cannot skip this step - be prepared for a lot of work.
- Repeat until your app solves the problem you set out to solve.
This process eliminates waste because very little effort is spent working on bad ideas before they are exposed and discarded.
As soon as the application is good enough to put in front of customers (more on what this means in a future post), launch it. Even if it's not perfect. If it's perfect, you waited way too long. Perfect is the enemy of progress.
The truth of the matter is that the application you launch won't be quite right. Your insights, no matter how much domain experience you have or how much thought you put into the product, will not be enough to create a great product right out of the chute. Even a paying customer won't help much - customers are terrible at providing specific guidance.
But how can you launch something that's wrong? Isn't that business suicide? No. Not when you're iterating quickly. Your beta application won't be totally wrong - just kind of wrong. As soon as it launches, your users will become your allies in the "Try it out" phase of the cycle. Listen to them, interpret their specific needs, and make a decision on how to improve things. Nothing is that big of a deal because the next release is just a few days away. If your product gains traction, this pattern will never stop - you keep improving and testing and listening. Over and over and over again. Software development is a journey, not a destination.
This is the face of modern software development. Embrace it. It works.
Coming next: Agile Scoping