How to Write Good Requirements, Pt. II of III

Marc Oppy | September 15, 2016

Key differences between requirements and specifications, why different levels of requirements are important, and how to establish a clear requirements hierarchy you can use and change to suit any product, version or variant you build.

In the post below—the second of three transcribed from his Writing Good Requirements workshop, with notes and slides from his presentation deck included—Jama Consultant Adrian Rolufs explains common problems teams go through, and how to avoid them. (See Part I here.)

==Start Part II==

These days, products are so complicated they can only be used in specific scenarios and for specific applications, which means that if you don’t build a product right, chances are there’s no home for it.

Potentially millions of dollars of development efforts, not to mention sales, are lost if you’re unable to thoroughly keep track of the requirements all the way through.

So we’re going to talk today about some ways to avoid those problems and really set yourself up for success.

What’s most important is having a systematic process to follow; you want a logical progression that takes you from the high-level to the low-level details in a structured way, because that leads to the best results.

It’s actually more important than how you write the requirements.

So the first key point I want to make concerns differentiating between requirements and specifications, and here the word “specifications” is a nebulous term. It’s used differently in different industries.

In many, “specifications” means a document that contains something, a requirement specification, a verification specification or a list of verification test cases.

By the way, I’m using the term “specification” here as the semiconductor industry does. The specification is a list of the performance, the functionality and the features of the solution; it’s the end result. It documents what you actually produce.

In many cases, there is a document called a datasheet that’s the customer facing version of this. So if you’re familiar with datasheets, think of the specification as the datasheet.

For the purposes of this discussion, here are the differences between requirements and specifications:

Requirements

Requirements reveal what the product needs to do

The tool we use to identify the right product to build and to ensure we’re building it right

The tool we use to communicate internally about what the product needs to do and how it needs to work

Specifications

Specifications detail what the product actually does

Specifications are not useful to identify the right product to build

The tool we use to communicate externally about what the product is and how it works

Typically, requirements are a little higher-level and a less explicit than specifications.

But when you combine the two, what you get is a clear statement of a need and a clear statement of what you’re going to do to satisfy that need.

In doing so, you document exactly what you’re doing and why, and this helps capture the decisions that are made along the way and why they’re made.

However, what I typically see is a document that has intermixed requirements and specifications.

It’s an easy and logical way to write, but it’s very difficult to refer back to afterward for facts and analysis.

So what you end up finding out is, although what you did made sense at the time, you missed some things along the way. There were some high-level requirements that you’d forgotten about.

For example, I was recently working on a product that had only 30 requirements, but discovered that when I wrote the documentation and the specification, I missed one, even though I had written the requirements and solution myself on the same day.

It’s very easy to miss things without a systematic approach in place.

I found what I’d missed only because I’d built the traceability from my specification back to the requirements. I had to prove that I’d met every single requirement and that every one of my specifications was there because of a requirement.

By doing that, it reminded me of something that I missed, so it really saved me some trouble.

This oversight may have come up at some point during reviews, but maybe not, because it’s impossible for anybody to remember every single detail.

Having the requirements separate from the specifications and traceability links between them is critical for making sure you don’t miss anything or end up with features that you don’t need, which add cost or schedules to the product.

Separating the two is difficult if you’re not used to writing that way. Often, I will write, or other people will write, in a traditional kind of document style, and then extract from that what the requirements and the specifications of the solution are.

In other words, you can take an iterative approach to this, and that’s totally valid.

Now, the next question is, how do we get to the right solution? The answer is, by having a clear hierarchy.

So what I’m showing here is a basic hierarchy with market requirements and product requirements. It’s probably the simplest level of requirements you can possibly have in any product development.

The market requirements capture what the customer needs and what the market as a whole needs, and the product requirements say what the requirements are, for the product that we’ve agreed to build.

We can trace back to those customer requirements in such a way that we can prove that the product we’re building is going to satisfy the market requirements, and that we don’t build anything extra.

This is the basic minimum.

You can think of each as a documentation task, but they also follow the phases of your project. When you’re capturing marketing requirements you’re also thinking about what possible solutions you could be developing to satisfy those market requirements.

You’ll likely come up with product concepts, or maybe just one product concept, depending on the situation. And so you would capture, in addition to the requirements, some architectures or concepts that go along with that; that’s the “black box” for all the market requirements.

Same for the product requirements. Once you have them—or while you’re writing them—you’re thinking about the architecture of your solution and the trade-offs you might need to make.

This informs what requirements you can satisfy and which ones you can’t.

By writing the requirements in conjunction with coming up with a design, when you’re done, you have a clear statement of requirements and a solution that can meet them.

Before I came to Jama I was an engineer, coming up with new products, and I sometimes focused only on the product concept and the product design, and skipped a lot of the requirements.

It’s easy to fall into that trap. Engineers love solving problems. We don’t love writing down the requirements for solving those problems. But without those requirements we don’t know whether our solution is the right solution.

Some teams might have, say, only market requirements and no product requirements, or vice versa.

But what they don’t have is a clear distinction between what the customer asked for, or what the market needs and what the team is doing to address both.

As a result, it’s difficult to know whether they’re building the right thing or not.

Now, if your product is complicated you add hierarchy to this model.

Let’s say, for example, I’m doing chip development and my chip has a whole bunch of different internal blocks that are all each fairly complicated in of themselves.

Well, then I can add another level of hierarchy, which I’ll call block-level requirements.

A block requirement would be probably something specific to a chip, or a system where you have a hardware device and it’s made up of sub-circuits.

For example, say I have a digital chip that’s a microcontroller. One block might be a digital interface. Another might be the memory. Another block might be the analog interface.

Or, say I’m building a bigger system, and Engine Control Unit, or ECU, for a car. The ECU is my system. And that ECU is made up of a microcontroller and interfaces; they are components of the system.

Whatever you’re building, you want to break it up into logical pieces; those are your components—which you’ll be wanting to write component requirements for.

So product requirements would describe what is needed from this whole chip overall, and that chip, for the purposes of the requirements, is really best thought of as a “black box.”

But then the block-level requirements say, now that we have a product architecture in mind, what the requirements are for the individual pieces. The designers are going to go and design against those block-level requirements.

For example, product architecture says we’re going to have an ADC, an Analog Digital Converter.

We would then need block-level requirements to say what the performance for this ADC is: What does the power consumption need to be? What does the size need to be it needs to fit into a certain space? What kind of input signals and outputs signals does it need to have?

Things like that.

And then the block design would tell me how this ADC is architecture. What’s the topology? What circuit components are coming together to satisfy those requirements?

Again, having both of those pieces of information is critical.

In this example, what sometimes happens is the product requirements section gets skipped. People already know the architecture, to a certain degree, and so they jump right to the block-level requirements.

The problem with that is market requirements are very high-level and block level requirements are very detailed, so skipping requirements means teams can’t forget a single thing during building.

But the most serious problem is having no traceability back to product requirements; without it, teams can’t confirm the connection between block-level requirements and market requirements.

Without traceability, it’s difficult to know for certain if this block-level requirement traces to that particular market requirement.

You end up missing things, so each of those levels is important.

Now, it could be you are building something even more complicated, so you need to add levels of hierarchy.

Basically,the more complex your build, the more hierarchical structure you want in place.

Here’s a system example; in this case we have both hardware and software, so we have system requirements that describe the overall needs of the system, and then we have an architecture that says, what’s going to happen in hardware, and what’s going to happen in software.

And based on that architecture, we can then write requirements for the hardware and for the software.

We can architect the hardware and the software, and then we can again write low-level requirements for the individual pieces of hardware and the individual pieces of software, and then write the design details that go along with each of those blocks.

So again, you take a systematic approach going from high-level customer needs all the way down to design, and you just adjust this based on the levels of complexity of your product.

And as your products get more complicated, it’s entirely possible that you start off with something simple and you add complexity to the next generation, and maybe you add even more complexity in the next generation, so you have to adjust the model based on your product complexity.

But it’s very unlikely you’ll use the same model forever.

When I was an engineer, we were really more focused on market requirements, product requirements and the block requirements model. Recently I’ve seen a lot more of the system requirements, especially in the chip industry.

Many of the products coming out of chip companies these days are more like systems than ever, so this model ends up being a good place to start.

You can cut out pieces out that you don’t need, but make sure you have accounted for all the pieces that you do need. Having that discussion with your team is really critical to setting up the right model.