Bug: The Unintended Consequence
Let's talk about hardware and software, convenience, interruption, defects, and the dreaded Unintended Consequence.
Some time ago I bought some cool booster fans that sit in my floor ducts where the vent covers usually are.
Each of these is an identical semi-smart device that monitors the temperature INSIDE the ductwork.
When the AC kicks on, the temperature inside the duct gets rather cold, and the fan detects this. The device then cranks up the fans to boost the AC. It has configuration options to choose how cold the ducts have to be to trigger the fans, and how fast to run the fan (1-10, 10 being full speed).
Likewise, when the heater kicks on, the air in the ducts gets hot and the fans kick on to blow hot air into the room. This is also configurable.
I needed to add something because our HVAC is underdesigned. The house was much smaller when the HVAC system was designed. Now there is a second floor and a dining room and the system needs a little push to get the enlarged space under control.
Also, it's cheaper to buy a couple of these units than to hire an HVAC company to come in and rework the system. Having more people in the house, having the system down for a day or two -- it all sounds like a big disruption.
It's only May, and I live in NE Illinois where spring can be cold. We were lucky and it got warm (71F!) this weekend, so we turned off the HVAC system and opened windows.
Last night it got down to 35F outside, only barely above freezing.
The vents got really cold inside the house, and specifically inside the ductwork.
Both our semi-smart devices detected cold ducting and cranked up the fans to "boost the A/C"! Result: our house was as cold as the inside of our refrigerator.
Everything Working Perfectly Wrong
This is a problem with coping devices and hacks in general: they work the way they work, not the way you want them to work.
That’s one of the ways software goes so wrong.
Notice that the house HVAC system didn't fail. It did exactly what it should. We turned it off, so it didn't interfere with the house's temperature fluctuations. It did not fail any of the tests one might have put it through.
Also, the booster fans worked perfectly. They would not have failed any of their unit tests.
The windows worked too. They opened up, allowed fresh air in, and made the temperature inside the house approximate that outside. It was nicely breezy inside.
Every single component worked and did what it is intended to do within its context.
But then we created a circumstance where working correctly was exactly the wrong thing to do.
Everything worked great within its limited context, which was not the context the designers anticipated.
Hacks All The Way Down
But more importantly, consider that we bought these as a kind of "hack" to get around the HVAC system being insufficient and inconvenient. Because the HVAC is underpowered, we worked around it by buying fans instead of reworking the HVAC system (avoiding inconvenience, causing unintended consequences).
Switching off the heat? We did that because our old-school thermostat has only three settings: Heat, Cool, Off. We used off rather than adjusting the heat lower because the thermostat is a bit miscalibrated so the house is 74 when it reads 70. The miscalibration in the unit isn't a linear function - you have to set it and wait to see what it does, trial-and-error-ing your way to success. We hate messing with it.
A better thermostat requires us to rewire some things in the HVAC system, and I'm loath to do that for fear of messing it up and needing a repairman to fix it.
We avoided inconvenience and error to the point that we caused it.
Maybe we should just invite a professional to come work on our system, huh?
That is how unintended consequences arise in software too.
Nothing terrible happened. Nobody froze to death or anything. It just got unpleasantly cold. That's lucky. Sometimes a compound human-involved failure will have considerable cost or damage.
It's something to think about the next time one comes up with a convenient workaround.
- What assumptions are we making?
- When and how do those assumptions go wrong?
- How will the system perform when the assumptions are incorrect?
- How will we recognize when it goes wrong in time to correct it?