Experience has taught me that software development is a very fluid process. As a product is developed, ideas change about what the product should do and how it should behave. Often this can result in miscommunication and wasted time working on features that don’t really matter. I have discovered several software development methods that mitigate the negative impact of this fluid process. These concepts are central to how I work with clients.
Minimum viable product. Many projects that start off as a great idea evolve into something unmanageable as ideas are constantly added and the scope of the project changes. I believe in defining up front the core essence of a project. What is the bare minimum functionality that comprises the core of what the client wants to deliver? Once that is defined, create that core product and make it rock solid. Get it into production and have real people start using it. This will prove what functionally is really needed and that the product is useful and viable. This has the added benefit of getting feedback from real users during the development process.
Short iterations. Communication is tricky. It’s difficult to make sure two people are talking about the same thing and have the same idea in mind. This is why I like to turn ideas into code or prototypes as quickly as possible. This moves an idea from theoretical to physical. I then have something the client can see and say, “I like X, but change Y.” The idea of “short iterations” is to have small milestones that can be delivered quickly. Shortening the feedback cycle means less time wasted on miscommunication and on features that don’t matter.
Quality first, quantity later. One hour spent improving quality can save 100 hours of work down the road. While it’s not always easy to immediately see tangible results from that one hour, the investment always pays off in the long run. The result is a product that does not require much maintenance, and customers who are happy and confident in the product. Building a quality product should take priority over delivering lots of “nice” features. The extra features can come later, a quality foundation is priceless.