We are used to translating product intent into requirements for development.
We want to achieve something, so we determine what the product needs to do. Development implements it. Testing gives us evidence that it works. Eventually, we decide that the product is good enough to release.
But development is only a means to an end.
We do not build $shiny_new_function because the world needs another successfully implemented function. We build it because we expect something to happen once people start using it.
Suppose $shiny_new_function has been implemented correctly. It produces the right results, performs well, is secure, handles the expected load and passes all its tests. Development has done an excellent job.
Now suppose that, according to the original intent, success also meant that the function would be used at least 500 times per day.
Three months after release, it is being used 17 times per day.
Is the product good? That is a surprisingly different question from whether it was implemented correctly.
Before release, we could test whether the function can handle 500 uses per day. We could simulate the load and collect evidence that the implementation is capable of doing what we expect.
But no test can establish that real users will actually use it 500 times per day. For that, we need reality.
This suggests that when we translate intent into requirements, we may be doing only half the job.
We are quite accustomed to asking:
What do we need to build to achieve this intent?
Perhaps we should simultaneously ask:
What would we need to observe in operation to know whether we actually achieved it?
The first question gives Development something to realize.
The second gives Operations something to observe.
If the intent is to reduce customer effort through a new self-service capability, we will probably derive requirements describing what that capability must do.
But if reduced customer effort is really what matters, we should also know what we expect to see once the capability is operating. Are customers actually using it? Are they completing the process? Where are they abandoning it? Are fewer customers contacting support? Has customer effort actually decreased?
Those aren’t merely interesting metrics to add to an operational dashboard. They are evidence about whether the product is doing what we created it to do. And that means we may need to think about them before the product reaches production.
If we want to know how $shiny_new_function is being used, we need to make that usage observable. If we want to understand where users abandon a process, we need to capture the relevant events. If we want to know whether self-service reduces support demand, we need some way of connecting those pieces of information.
Otherwise, we may arrive in production and discover that we cannot answer one of the most important questions about the product:
Is it actually working as intended?
Not whether the software is running. Not whether the implementation satisfies its requirements. Whether the thing we built is actually producing the effect for which we built it.
This is where production becomes particularly interesting for quality.
Before release, much of our evidence necessarily concerns what we expect to happen. Requirements, reviews, tests and simulations can give us confidence that our realization is capable of fulfilling the intent.
After release, we get something we did not have before. We get to see what actually happens. And reality may disagree with us.
If $shiny_new_function works perfectly but receives only 17 of the expected 500 uses per day, that does not immediately tell us what is wrong. Perhaps users cannot find it. Perhaps they do not trust it. Perhaps another way of doing the same thing is easier. Perhaps we misunderstood their needs. Perhaps the assumption behind 500 uses per day was wrong. Perhaps 17 uses are actually enough to produce the business outcome we wanted, and we chose the wrong success criterion.
Some of those answers would lead us back to Development. Others would lead us much further back, to our assumptions and even to the original intent.
That is why a production observation should not merely become another defect or improvement ticket. It should become learning.
Quality work has traditionally put enormous effort into determining whether something is good enough to enter production. That remains important. We need evidence that the realization is sufficiently sound before exposing it to reality.
But perhaps we have concentrated too much on the means and not enough on the end.
A product does not become successful because it passed its release assessment. That only means we had sufficient confidence to let it start doing the job for which it exists. The more important assessment begins when it actually does.
So perhaps product intent should point in two directions from the beginning. It should tell Development what needs to be realized. And it should tell Operations what needs to be observed.
One gives us evidence that the product can do what we intended. The other gives us evidence about whether it does.
And the difference between those two is where some of our most valuable learning may be found.