Building Effective Software
In over ten years of experience building software, there are patterns and nuances that you pick up on in terms of building effective software systems. Three areas where I believe any software project can benefit from are simplicity, usability and agility. While one or two of these may lead to marginal success as viewed by IT folks, as well as the users they support, striving for all three is a good starting point for any project.
Einstein said “everything should be made as simple as possible, but not simpler”. In software, developers sometimes get caught up in providing as many features as possible to impress users and be competitive. This can quickly get you in trouble because you end up maintaining more code that perhaps is not even actively used or used very little.
In web development, there’s sometimes a compulsion to “fill a page” with content just to make the website seem more relevant and useful for the users. In reality what happens is that the user is distracted and slows them down. When it takes longer than it should to perform tasks while using a software application, is that really useful?
If someone needs a manual to use your application, you’ve failed at providing usable software. If it takes several minutes for a user to find a function in your application because they’ve had to click through several screens looking for it, you’ve failed.
Perhaps a good way to maintain focus on usability is to pretend that you’re writing software for old people. They don’t move as fast as they used to and maybe forget things from time to time. So imagine someone who takes a while to click through screens and dialogs. Then imagine they’re half way to finding the function they want and forget the next two steps to getting there. Are you helping them or are you wasting their time?
Retail websites quickly found out that by decreasing the number of clicks someone had to perform before making a purchase, they were able to decrease the number of abandoned shopping carts. Time is money.
Being able to consistent quality while still cranking out new features for your users is the nirvana of software engineering. If quality slips then the confidence and perceived momentum of everyone involved is lowered. If the momentum continues to slow down it becomes a death march for the system you’ve worked so hard to build.
One way of avoiding the death march is to have constant interaction with the users you’re supporting. If you’re off for several weeks or even several months at a time building what YOU think is needed without input from users along the way, most likely your final product will not be on target.
Another way of keeping a fast pace for your project without sacrificing quality is automation. This is an area that can easily be overlooked because a lot people think that if they have a consistent way of building, packaging and deploying their software, there’s nothing more to do. There’s always a better way to automate and speed up development cycles and the team should challenge itself to seek them out. Taking less time to nurse a build, package and deploy means there’s more time available to implementing new features and writing more tests.
Lastly, testing is another way of increasing agility while maintaining quality. Even if you’re not developing or maintaining software at a break-neck speed, tests can save you endless heartache and time chasing a bug. Worse, a user just found that bug and you realize the bug has been in production for months.
Effective software not only means that your application works without blowing up. It means that you’ve produced something that’s simple but not too simple, it doesn’t waste the time of users, and is able to change frequently without loss of quality.
What are other suggestions for building effective software?