Give Me 3 Minutes and I’ll Make You a Better Software Designer
When designing software there are always things you need to remember; things that impact the developers and things that impact the user and their end user experience. In my mind, these are flexibility, reliability and predictability.
Design for flexibility
Flexibility isn’t something that automatically comes built into any design. It’s something that has to be carefully crafted and planned for. How is this done? Look at parts of your application that are likely to need extending in the future and take note of how behavior around these parts varies.
When you know the areas of your system that need to be extra flexible you can look at the possible use of patterns, interfaces and/or higher level abstractions to achieve this. Create areas where you can hook or plug-in extra features where needed. Consider paramatizing calls to areas that might need to be configured in different ways in the future.
Design for reliability
Reliability plays an important part of the end user’s experience and it also plays an important part in ensuring your software has a long shelf life. Whilst you would like to think that your software always behaves nicely is not always the case. Why? Because you can’t always predict how users are going to use your software. There are many different types of users out there that behave in vastly different ways; from technical and usability standpoints. As such, it is important that under all circumstances your software remains in a consistent and reliable state. This includes graceful handling of errors. So make sure you look closely at exception handling blocks that get or are likely to get hit frequently.
Think about applications that allow you to perform the same operation multiple ways. A classic example would be the cut, copy and paste features found in almost any application today. You can generally access these sorts of features from a file menu, a shortcut; key combination, or by some other means. Ask yourself questions like “Can the user perform any of these combinations in a way that might be unexpected?†or “Is there any way the user can break their experience by performing an action in such a way?†If the answer to any of these types of questions is yes, then you need to pay special attention to those areas because those are the first areas your user will notice if and when they stop working as expected.
Design for predictability
A consistent and predictable design helps bring order and structure to a design by creating an increasing amount of familiarity in the system. When you use a pattern to solve one problem and there is another problem very similar, use the same pattern. Any developer that looks at, and understands the approach taken is instantly going to understand other parts of the system that use this familiar approach. Whilst users cannot directly see your design choices they see the result of it. How easy is it for a user to perform a given task? Should they be able to complete it in fewer steps?
Be consistent with the way you use your objects. Are you using it the way it is meant to be used? Do you always use it the same way? The quickest way to break a design is to use an object in unfamiliar ways and change its behavior or purpose without any real reason.
Remember: flexibility, reliability and predictability are key to a pleasing design for both developers and users. If you think you have an architectural wonder and splendor on your hands than chances are your user will too.

Leave a Reply