Skip to main content

Quality is Free

Ed Horch commented on an answer I posted on Quora, suggesting I add Quality is Free by Philip B. Crosby to my answer. I have never read that book before, so I went ahead and bought a used copy. This book is stirring up things in my head about quality as it relates to software development, and I want to jot down a few notes, before I forget them.

What is Quality?

According to Crosby
Quality is conformance to requirements 
That's a very simple definition of quality, and at first glance it might not seem revolutionary. And it's in stark contrast to how Prisig tries to define quality in Zen And The Art of Motorcycle Maintenance, driving the main character mad trying to define exactly what quality is. I really like Crosby's definition of quality. I'll try to expand on that a little bit.

Another way quality was book in the book, and I'm paraphrasing here
Quality is when a customer gets what they expect
What are your customers expectations?

Most of what your customer expects is what they have been told. There's what you have promised them. All your marketing materials, demos, product documentation, etc.

There's what they expect from your product that you haven't explicitly told them.  If you're building a better word processor, then your users might expect it to work similar to Microsoft Word. And in the absence of being told, your customers might make up their own requirements, based on past experiences.

And your customers expect your software to work, regardless of how many others are using it, if you're building online software.

What have you promised?

The marketing materials, demos, and product documentation are the explicit things where you make promises to your client, if you provide them. If you have an SLA, that spells out in explicit detail what your clients can expect. Your brand also makes promises of your product - for example, I would expect all Apple products to be well polished and just work, regardless of what product they produce.

How to get Quality for Free in Software Development?

That's an interesting question, and I'm not claiming I have the answer. But I do think there is something to the idea of "Quality is Free", and I think it align's pretty well with the agile / lean development practices. Here's what this means to me.

We can measure quality by executing BDD style tests for use cases. To me, a use case is a promise for how a feature will behave - a promise to our customers.

We need to tests for non-functional requirements to have quality. To do this, we need to plan for usage patterns, and design to support that load.

We can start thinking about testing for quality before writing a single line of code. Imagine that the feature is finished, and you want to demo it to a prospective client. What language would you use? What is your sales pitch? However you want to sell it, those selling points are your promise to your clients, and can be captured in tests, before writing the software!

I'd love to hear about how "Quality is Free" has influenced your software development practices.

Comments

  1. Thank you for sharing this thought-provoking perspective. It's invigorating to encounter a different take on the topic. General Contractor Services

    ReplyDelete

Post a Comment

Popular posts from this blog

Generating Java Mixed Mode Flame Graphs

Overview I've seen Brendan Gregg's talk on generating mixed-mode flame graphs  and I wanted to reproduce those flamegraphs for myself. Setting up the tools is a little bit of work, so I wanted to capture those steps. Check out the Java in Flames post on the Netflix blog for more information. I've created github repo ( github.com/jerometerry/perf )  that contains the scripts used to get this going, including a Vagrantfile, and JMeter Test Plan. Here's a flame graph I generated while applying load (via JMeter) to the basic arithmetic Tomcat sample application. All the green stacks are Java code, red stacks are kernel code, and yellow stacks are C++ code. The big green pile on the right is all the Tomcat Java code that's being run. Tools Here's the technologies I used (I'm writing this on a Mac). VirtualBox 5.1.12 Vagrant 1.9.1 bento/ubuntu-16.04 (kernel 4.4.0-38) Tomcat 7.0.68 JMeter 3.1 OpenJDK 8 1.8.111 linux-tools-4.4.0-38 linux-to...

Basic Web Performance Testing With JMeter and Gatling

Introduction In this post I'll give a quick way to get some basic web performance metrics using both JMeter and Gatling . JMeter is a well known, open source, Java based tool for performance testing. It has a lot of features, and can be a little confusing at first. Scripts (aka Test Plans), are XML documents, edited using the JMeter GUI.  There are lots of options, supports a wide variety of protocols, and produces some OK looking graphs and reports. Gatling is a lesser known tool, but I really like it. It's a Scala based tool, with scripts written in a nice DSL. While the scripts require some basic Scala, they are fairly easy to understand and modify. The output is a nice looking, interactive, HTML page. Metrics   Below are the basic metrics gathered by both JMeter and Gatling . If you are just starting performance testing, these might be a good starting point . Response Time – Difference between time when request was sent and time when response has been fully re...

Multi Threaded NUnit Tests

Recently I needed to reproduce an Entity Framework deadlock issue. The test needed to run in NUnit, and involved firing off two separate threads. The trouble is that in NUnit, exceptions in threads terminate the parent thread without failing the test. For example, here's a test that starts two threads: the first thread simply logs to the console, while the other thread turfs an exception. What I expected was that this test should fail. However, the test actually passes. readonly ThreadStart[] delegates = { () => { Console.WriteLine("Nothing to see here"); }, () => { throw new InvalidOperationException("Blow up"); } }; [Test] public void SimpleMultiThreading() { var threads = delegates.Select(d => new Thread(d)).ToList(); foreach (var t in threads) { t.Start(); } foreach (var t in threads) { t.Join(); } } Peter Provost posted an article that describes how to make this test fail. It...