Don’t just satisfy requirements, deliver solutions

  • by

I’ve learned that when I get a call from a client about some new requirements that they’d like implemented, I’ll generally need to ask a few questions. This more important the more urgent the requirement. This is not only to make sure that I understand what they want but also to make sure they understand what they’re really trying to do. Clients, being both the closest to the problem set and the owners of the checkbook want to control exactly what they’re paying for. They’ve been told that to achieve a successful project or iteration they need to have detailed requirements. Unless they’re also experts in software development they’re more than likely wrong.

The client is not wrong in wanting a solution to their problem. They’re generally wrong because in trying to directly address whatever pain they’re feeling, they haven’t considered the various ways that their problems could be solved. This includes simplifying the current solution or leveraging some tried and tested tool. More importantly, they haven’t considered the ramifications of their solution on their long-term administration and maintenance. People generally know that they’re having a problem and what seems like an immediate solution. Thus, they end up spending more money than necessary.

I worked on system for a client that was utilized by one office of the organization. They wanted to expand it’s use to the entire organization. Initially, they gave vague requirements to create solo systems. This would have been a nightmare for their clients and the system admins. It would have entailed multiple logins, databases, and separate account authenticators. The second proposed system was overly complicated that would have required several man years to implement. When we finally talked to them about the end result they wanted and the budget they wanted to spend. We were able to come up with a simple system that allowed us to add a few database tables and fields; rework some of the interface; and expand the account permission system. We were able to deliver a solution to them on time and on their budget. The solution leveraged as much existing code as possible to minimize risks maintain reliability.

“It seems that perfection is attained not when there is nothing more to add, but when there is nothing more to remove.” – Antoine de Saint Exupéry

The value that we as experts in software development isn’t that we’re going use the most advanced philosophies shaped into the most modern and trendy architecture and develop it using the latest languages. Non-software developers don’t care about any of those things. They may be told to care by their boss or someone else. But really, they just want to get their jobs done and move on with their day.

The best solution then is to deliver the minimal solution to the user. Not minimal in the sense that we’re going to be lazy and deliver a crappy solution with the least amount of effort. But, the minimal solution that’s well thought out. It’s generally going to be simpler, faster to deliver, and cheaper. We’ve shrunk the classic triangle of “cheap, fast, or good? Choose two.”

Rather than simply gather requirements, talk to the client about the goals they’re trying to achieve. Talk openly about budgets and how to work within those budgets. Leverage any existing tools, libraries, or code. Clients don’t always know that if they modify a requirement, we can use an off the shelf solution that will save them time and money

When creating solutions, keep in mind that along with development costs there’s also longer-term maintenance and support costs. Creating, robust, resilient, and flexible system will minimize ongoing costs.

Some guidelines for minimizing system running costs are to minimize support costs. Simplify what the user is expected to do. Offer the ability for the user to fix their own mistakes. But let them make those mistakes in case they know more than we do. Make the system as flexible for the system administrators as possible. It’s easier to make systems flexible if they’re kept simple. This allows the administrators to handle weird corner cases without need for complicated overrides or additional development. Try to offer solutions based on a combination of small, simple solutions.

Delivering cost effective simple solutions, doesn’t put you out of a job. There’s always more work to be done. But it’s extremely satisfying having systems that simply run, do what they’re needed to do and flexible enough to accommodate unusual situations.