If I were to ask you to build a platform on which others will stand, work, and use as a jumping-off point to achieve their goals — here, I am speaking of a literal platform on which real people will stand — what kind of building materials would you use? Likely, you would choose some strong, sturdy material. If you were to pick something flexible (say, rubber) I would send you packing and hire a new contractor.
Yet, as I close in on ten years of Software Engineering (not long in the grand scheme, I know) — where I have primarily engineered Software “platforms” — I have almost always been asked to build flexible platforms.
It seems, perhaps long before my time, something happened in the Software world that associated flexibility with good and rigidity with bad.
I don’t know where the idea came from but I do know it feels backward.
My wife and I recently went on a fun date to a clay spinning workshop. We learned to use a clay wheel and I successfully made a couple of wonky bowls that now house succulents around my office.
As I worked with the clay, I felt a light bulb slowly turn on in my mind.
I started with a hard, square block of clay. I could barely shape it. I definitely couldn’t use it for anything. Anything I tried to use it for, I’m sure I could find another tool that could do the job significantly better. The only thing to do, then, was throw it on the wheel.
Once I had it on the wheel, I added water. As soon as I did, the inflexible clay transformed into a flexible material that I could shape into almost anything. As the flexibility increased, so did the potential. However, it was still useless. All I could do was shape it into something that would eventually be useful.
By the end of the night, after several hours of spinning and a lot of mess, I ended up with two oddball-looking bowls. At this point, they have the shape of something that would be useful (to hold things) except for one problem: they were still too flexible to be useful. It was only a few weeks later after they were fired in the kiln that my bowls became useful. It was only after they lost their flexibility that they gained utility.
We all know about flexible things and rigid things. We see the flexibility of the clay and understand that the clay can, with just a bit of time and pressure, take on the shape of (almost) anything we desire. I believe we connect this to the reality of our daily routine, which for most of us involves being asked to solve a diverse set of problems. We think of the clay and dream of tools that we could just as easily mold to fit the diversity of problems we want to solve.
Let’s imagine a general contractor (the construction kind) for a moment. As they work on the various jobs across many different client’s houses, they find themselves lugging around a truck full of tools. One day, they wish they had fewer tools and ask a friend of theirs to make them a “flexible tool that can handle all of my different problems.” The friend responds, “Sure, I know just the thing.” Returning a day later with a large piece of clay.
Good for a laugh, sure. But not useful.
It turns out, we Software Engineers already have flexible tools. They just aren’t useful tools. Think about it: The operating systems, the networking, even the programming languages. All of these are flexible tools. You can use them to build almost anything.
But that’s the key, you can use them to build useful things. They aren’t useful themselves. I'm not aware of anyone who “uses” the Operating System. But everyone I know uses the applications running on them.
The flexibility of these things also comes at great cost. They are quite abstract and what we might refer to as “low-level” (abstract and low-level, quite the contradiction) because they operate on moving bytes instead of representing businesses, projects, and features. They must also find a way to ensure they work without actually knowing exactly how they will be used. This work is difficult and abstract. Most of us don’t want to — and wouldn’t benefit from — work like that.
I recommend building focused and useful — rather than flexible — things.
When encountering new problems, don’t try to re-shape the useful tool in your hand. Instead, put it down for a moment, and try finding (or making) one suited for the unique task at hand.
Eventually, opportunities for consolidation may appear. I’m sure at some point someone realized they were constantly using their crowbar to pull out the nails their hammer bent and thought “it sure would be nice if these two things went together.”
But, on the other hand, could you imagine the monstrosity of a tool that would arise from someone attempting to imagine every possible problem one would try to solve with it? It would be incredibly difficult to use, let alone produce and maintain.
It may be helpful to see this visually.
First, here’s a chart of a clay mug’s journey (I know it was bowls before but I'm ready to move on).
In its first phase, as unused dry clay, it essentially has no flexibility and no potential (in its current state).
Next, once I add water, it rockets up to the top right; becoming both flexible and full of nearly infinite potential.
Finally, once I shape and fire it in the kiln, it takes on a fixed state (zero flexibility) with a finite amount of potential (basically, holding things).
This is how we often look at things. Flexibility and Potential. And it’s no wonder we prefer flexibility. We see that wet clay scoring high on both counts, so it looks desirable.
But there is another angle we must consider: usefulness.
This chart tells a different story.
Now, we see that the unshaped wet clay scores high on flexibility, but zero on utility.
On the other side, we see the fired clay mug is sky high in utility (it sure is good at holding my morning coffee!) even though it is low flexibility.
I don’t need it to change shape each morning (flexibility) I need it to hold my coffee (utility).
So, next time you are asked (or asking) for flexibility: think about the clay and think about utility.