Here’s a syllogism for you:
- Every technical review process is a queue
- Queues are evil
- Therefore, every review process is evil
Nobody likes a review process. Teams who have to go through the review
look for any way to dodge it. The reviewers inevitably delegate the
task downward and downward.
The only reason we ever create a review process is because we think
someone else is going to feed us a bunch of garbage. They get created
like this:
It starts when someone breaks a thing that they can’t or aren’t
allowed to fix. The responsibility for repair goes to a different
person or group. That party shoulders both responsibility for fixing
the thing and also blame for allowing it to get screwed up in the
first place.
(This is an unclosed feedback loop, but it is very common. Got a
separate development and operations group? Got a separate DBA group
from development or operations? Got a security team?)
As a followup, to ensure “THIS MUST NEVER HAPPEN AGAIN” the
responsible party imposes a review process.
Most of the time, the review process succeeds at preventing the same
kind of failure from recurring. The resulting dynamic looks like this:
The hidden cost is the time lost. Every time that review process has
to go off, the creator must prepare secondary artifacts: some kind of
submission to get on the calendar, a briefing, maybe even a
presentation. All of these are non-value-adding to the end
customer. Muda. Then there’s the delay on the review meeting or email
itself. Consider that there is usually not just one review but several
needed to get a major release out the door and you can see how release
cycles start to stretch out and out.
Is there a way we can get the benefit of the review process without
incurring the waste?
Would I be asking the question if I didn’t have an answer?
The key is to think about what the reviewer actually does. There are
two possibilities:
- It’s purely a paperwork process. I’ll automate this away with a
script that makes PDF and automatically emails it to whomever
necessary. Done.
- The reviewer applied knowledge and experience to look for harmful
situations.
Let’s talk mostly about the latter case. A lot of our technology has
land mines. Sometimes that is because we have very general purpose
tools available. Sometimes we use them in ways that would be OK in a
different situation but fail in the current one. Indexing an RDBMS
schema is a perfect example of this.
Sometimes, it’s also because the creators just lack some experience or
education. Or the technology just has giant, truck-sized holes in it.
Whatever the reason, we expect that the reviewer is adding
intelligence, like so:
This benefits the system, but it could be much better. Let’s look at
some of the downsides:
- Throughput is limited to the reviewer’s bandwidth. If they truly
have a lot of knowledge and experience, then they won’t have much
bandwidth. They’ll be needed elsewhere to solve problems.
- The creator learns from the review meetings… by getting dinged for
everything wrong. Not a rewarding process.
- It is vulnerable to the reviewer’s availability and presence.
I’d much rather see the review codify that knowledge by building it
into automation. Make the automation enforce the practices and
standards. Make it smart enough to help the creator stay out of
trouble. Better still, make it smart enough to help the creator solve
problems successfully instead of just rejecting low quality inputs.
With this structure, you get much more leverage from the responsible
party. Their knowledge gets applied across every invocation of the
process. Because the feedback is immediate, the creator can learn much
faster. This is how you build organizational knowledge.
Some technology is not amenable to this kind of automation. For
example, parsing some developer’s DDL to figure out whether they’ve
indexed things properly is a massive undertaking. To me, that’s a
sufficient reason to either change how you use the technology or just
change technology. With the DDL, you could move to a declarative
framework for database changes (e.g., Liquibase). Or you could use
virtualization to spin up a test database, apply the change, and see
how it performs.
Or you can move to a database where the schema is itself data,
available for query and inspection with ordinary program logic.
The automation may not be able to cover 100% of the cases in
general-purpose programming. That’s why local context is important. As
long as there is at least one way to solve the problem that works with
the local infrastructure and automation, then the problem can be
solved. In other words, we can constrain our languages and tools to
fit the automation, too.
Finally, there may be a need for an exception process, where the
automation can’t decide whether something is viable or not. That’s a
great time to get the responsible party involved. That review will
actually add value because every party involved will learn. Afterward,
the RP may improve the automation or may even improve the target
system itself.
After all, with all the time that you’re not spending in pointless
reviews, you have to find something to do with yourself.
Happy queue hunting!