The Euro pallet December 29, 2024
My wife brought home a Euro pallet from work[1]. She thought we could use it as an elevated platform for stuff in our cellar that shouldn't get wet in case our cellar got flooded. It was a good idea because there actually was a large number of flooded cellars in our neighbourhood this year. (Not ours, though.)
Anyway, we didn't immediately have something to stack on it, so we put in in the garage. Here it is.
![Photo of a Euro pallet in my garage. It is leaning against the side, narrowing the passageway beside my car.](/img/the-euro-pallet-300w.jpeg?v=b9575c595c0d)
It has been leaning there ever since.
So what?
Today, while carrying some boxes into the cellar[2], I was slightly annoyed by the pallet because it was partially blocking the passageway beside the car. This got me thinking about the pallet: maybe I should put it to use? Find space for it in the cellar and stack some boxes on it? Not today. I had other things to do, and the boxes I was carrying went onto the shelves anyway.
The pallet remains in the garage, and I will probably get annoyed at it a few more times. Will we ever put anything on it? Maybe, maybe not. Doing so would require us to reorganize the space in our cellar (and, yes, tidy it up a little). So it is likely that we won't get around to it for some time. Maybe never. Or at least not before something happens that causes us to throw it out, which amounts to the same thing.
But – and this is a big but – if we don't actually put something on it, the pallet does not have any value since its intended purpose was to protect our stuff from flooding. If our cellar were to be flooded now, the pallet would protect exactly … nothing.
Worse, it even has negative value because it gets in my way when I'm doing things like carrying boxes around. This was certainly not what we thought when my wife brought the pallet home. We thought it was a good idea. And it would have been if we had followed through. But we didn't. And right now I am busy writing a blog post when I could be in the cellar instead, realizing the value of the pallet.
On the other hand, I don't really know what specifically I should put on the pallet. So maybe a better action would be to throw it away. This at least would deliver value immediately by reducing my annoyance.
As it is, we put work into a good idea (bringing the pallet home) but failed to get to the point where we would have gotten value out of it (by having stuff protected), resulting in low-grade annoyance and extra work instead (having to lift boxes over the leaning pallet and taking special care lest it trip me up).
Software Euro pallets
Stuff like this happens in software, too. When I joined the team responsible for an internal multi-client capable payment API, the component had a database table that assigned clients to payment service providers. The intention was to simplify changes should they become necessary. Reassignment could be done at runtime by simply changing the rows in the table. In practice, all clients were assigned to the same payment service providers. There was only one exception, and it required extra implementation, so it was not a simple runtime reconfiguration.
Testing the code responsible for the client/provider assignment required us to implement fake payment service provider adapters because we didn't have any alternate payment service providers that could be reasonably substituted, even for test purposes. Implementation, test – and maintenance – of this feature was not zero-cost.
The first situation where we actually could have used it was the replacement of our payment service provider for SEPA direct debit[3]. We could have implemented a new adapter for the new provider and switched our clients over one by one by changing entries in the database table. However, by this time, we had almost half a million customers using SEPA and wanted more control over the migration process. So we implemented a switch per user instead. And removed the client/provider assignment for good.
This feature was the software dev counterpart to the Euro pallet: it was a good idea, but we didn't get any real value out of it and still had to deal with the overhead it introduced, causing low-grade annoyance and extra work (testing, maintenance, additional conceptual work for every other feature to ensure it played well with this one). The best course of action was to remove it.
How about you?
Do you recognize this situation? Did you ever implement something that seemed a good idea but remained unused and thus generated zero or even negative value?
What would you have to do to get the value you originally thought you would? Are you actually going to do it?
Which features are in your software now that would increase the software's value if they were removed?
What is your personal Euro pallet?
Footnotes
It would have been thrown away otherwise, so she was allowed to ‘rescue’ it. ↩︎
You can see part of the door to the cellar in the background of the photo. ↩︎
I spoke about this on last year's WeAreDevelopers DevOps Day in my talk Migrating half a million users to a new payment service provider (free account required to watch). ↩︎