No Surprises: A framework for Software Quality


Surprise: an unexpected or astonishing event, fact, or thing.

All bugs stem from surprises

You open your editor and can’t find the document you spent 4 hours working on yesterday. You search all nooks and crannies, but it’s gone – poof – vanished into thin air. This surprising reality sinks in and quickly morphs into blinding rage – this editor is crap! @#$#@!@@*((

Yup, the editor surprised you. You don’t expect your hard work to disappear or your confidential data to leak or wait interminably for an operation to complete.

Think of a time some software frustrated you; what did you complain about? Invariably, the reason usually boils down to some unmet expectations; some variant of “I want to do x, but the software does not work”, “I expected XYZ but found ABC” or “It stopped working”.

High-quality items share one common characteristic – they have no shocking defects. They delight users and work.

What does quality mean?

Quality means different things to different folks, common vague examples include:

  1. It should work
  2. It should be fast
  3. It should not lose data
  4. It should be available when needed
  5. It should not leak data

No Surprises: A framework for software quality

“No surprises” is a holistic framework for broadly considering software quality. The use of consistent dimensions facilitates a common vocabulary that simplifies communication across multiple teams.

What users SayWhat it means
It does not workReliability
It is too slowPerformance
I can’t find my workIntegrity, Usability
It crashes all the timeReliability
My data leakedSecurity, Usability
Common quality complaints and associated areas

1. Security

How would you feel if everyone could read your emails? I am pretty sure such an email provider will be a no-go. Security is a must in software – this stems from the human instinct for trust in relationships. We want need to know that security boundaries are established, respected, and enforced.

High-quality software is secure; no one wants to rely on software they can’t trust. How secure is your software? Can it be high quality if it has security holes? What security mechanisms are you bundling in to ensure safety? 

Rather than wait for a security scare, start engaging in proactive fixes rightaway.

2. Usability

Do customers need an advanced degree, eight tomes of documentation, and a coach to get anything done with your app? If so, you have usability challenges.

Inconsistent interfaces confound users. I remember a slide-out pane with an unpredictable layout and design. The buttons did not only come in different shapes, sizes, and colors; they also moved around – they could be at the top or bottom of the pane. That confused the software developers, designers and users in equal measure.

Another common usability issue is background actions with no feedback loop. Such apps are confusing since there is no way to answer the when/who/how/what/why questions. A good example is long-running jobs with no progress reports. That leads to many “I did not know that!” discussions; building working software is already tricky, let’s not include unnecessary challenges in the game.

Observe new customers use the software; their struggles with easy tasks will provide invaluable feedback to accelerate improvements.

Great software just works and is delightfully intuitive. Relevant usability areas include user guides, accessibility, internationalization, localization, clickability, learnability, consistency, and more.

Usable software evokes delight and pleasure.

3. Reliability

Is your application fickle? Does it inspire confidence that it will work when used? Or, like a game of chance, does it work at times and crash at times? 

You expect your car to start up once you turn the key in the ignition; that is reliability. Software should exhibit the same standard – it should deliver desired outcomes whenever, wherever, and however needed. 

If users have to turn their PCs upside-down, bang on some hardware or restart a few times to get anything done, they’ll be pissed off and stop using the software. 

Things to consider here include thoughtful failure modes with clear calls-to-action, inbuilt resiliency to ensure fail-safe actions, and graceful degradation during crises. At times, it might be OK to sacrifice performance for reliability – spare tires allow you to drive at slower speeds for some distance. 

4. Performance

How many times have you given up in disgust when your app freezes and becomes unresponsive? You probably distrust the progress spinners – they might as well be for decoration since nothing seems to work.

A hang is annoying; the software might still be working under the covers; however, that makes no difference to the user. From the user’s viewpoint, the software prevents them from achieving their end goal – another unwanted surprise.

Background batch jobs also have performance expectations – a one-day job should not take three days. 

Software should be responsive; slow software irritates, annoys, and gets folks worked up.

5. Integrity

Can you imagine your reaction if you lost all your favorite settings on restarting your computer? You shudder to imagine that, eh?

Data loss made me reconsider becoming a software developer for a short while in 2009. I had lost over 6 hours of painstaking effort and could not find any traces of my work (talk less of recovering them). I was so dejected that I immediately took a nap.

Integrity is probably one of the most critical aspects of quality; it can make or mar the business. It is difficult to shake off the notoriety from poor integrity; few companies successfully shake off the stigma of lacking data durability or integrity.

Software should be durable; it should not lose information or corrupt data; that is a fast and effective way to lose users and generate an army of detractors.

Make it work, make it right, make it fast

When most teams complain about poor quality, they usually mean reliability woes; however, quality spans a more extensive spectrum and can mean many things. If you complain about your software being of low quality, what dimension do you mean? Use the Maslow quality hierarchy to identify the pertinent challenges and make the right tradeoffs.

This framework helps you identify gaps, focus efforts, and prioritize investments to achieve optimum outcomes on quality initiatives.

A Maslow Hierarchy for Software Quality

A hierarchy for prioritizing quality issues

Using this framework

Several years ago, I led a replat effort onto a new data store. As is typical of v1 software, there were many reliability and performance issues, and the resourcing constraints forced difficult tradeoffs. 

We chose to focus on reliability first before pivoting to performance. After all, if the software was not reliable, what was the point of making it fast? That would only expose users to failures more quickly – guaranteeing more pissed-off folks.

On a different team, the ‘no surprises’ framework established a common vocabulary and facilitated collaboration. This stimulated vigorous discussions, and it immediately became apparent that we had focused on reliability to the detriment of other dimensions.

Why is software quality important?

Only pissed off and passionate customers file support requests; most users give up and move on to other software. Users deserve the best possible experience – after all, they are the reason we are in this profession.

“The bitterness of poor quality remains long after the sweetness of meeting the schedule has been forgotten.”

Anonymous

Ship quality.

Processing…
Awesome!

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.