Every developer runs into a hidden requirement leaving them feeling like a bird who discovered a closed window. Hidden requirements are not new, nor are they exclusive to software development. The first time I recall learning about hidden requirements was many years ago when I was in high school.
My Father owned a couple duplexes which he took good care of. My brother and I spent what seemed like an eternity doing yard work, small repairs, and shoveling the deep Minnesota snow from the sidewalks there. In reality it was was not that much time and when I was old enough to use the snow blower it was even faster; but I digress. Dad did not like paying someone else to do something that he could do himself. So it comes as no surprise that when the branch of a tree in the backyard of one of the duplexes had grown over the power line that he scoffed at what NSP (Northern States Power Company) wanted to charge to remove the offending limb.
The problem- The tree was old, the branch was heavy and when winter came it was possible the weight of the snow and ice on the branch could break branch off and take down the power line. Dad tried to be proactive and fix a problem before it was a problem.
He looked at the branch, the line and the yard before hatching a simple plan. What he needed to do was get the branch off the tree, to the ground, without taking out the power line or wounding himself in the process. Higher up in the tree there was a "Y" formed by the trunk and a heavy branch.
The Plan- Tie a rope around the branch and run it through the "Y" higher up in the tree and down to the his Ford Ranger pickup truck. He could cut the branch off the tree and it would swing around away from the power line. After that, he could simply backup his truck to lower the branch safely to the ground.
So, that is exactly what he did. Now, before I go on allow me to say, no one was in the truck and no one was injured in the process.
He attached and ran the rope securely, got in the tree and cut the branch free. For those of you thinking at this point, "He was standing on the branch and fell.... No, but plenty of people miss that safety tip as shown on youtube.
The branch, as planned, swung safely away from the power line... Now enter the hidden requirement
The Hidden Requirement- The nature of the the plan caused an additional requirement that was hidden. The Ford Ranger was a "half ton" pickup truck. The branch was more than a "half ton" branch. Gravity, which had been accounted for by planning to back the truck up to lower the branch had an equation of it's own to introduce.
The branch, out weighing the truck, begin a slow but steady decent to the ground. This means the unmanned truck was sliding back along the ground and began it's ascent up the tree. The truck came to rest with the front bumper balancing on the ground and the branch sitting not far from it.
The Problem- How to safely get a truck out of a tree?*
A hidden requirement and a missing requirement are not the same thing. Hidden requirements are specific to the solution that may have been over looked, for example: the weight of the truck must be greater than the weight of the branch. Had Dad used a crane (or NSP) the weight of his truck would not have been an issue. A missing requirement is something that is part of the problem in the first place that was overlooked or missed like "Don't break the power line".
A hidden requirement is only a problem if it becomes a "missed requirement". Avoiding the feeling of being the bird hitting the glass with hidden requirements is, in theory, fairly straight forward. When you find a solution step through the use case(s) with the solution and reconsider each step of the solution. If you change the solution slightly, repeat the process.
Hidden requirements will always pop up unexpectedly. Everyone will overlook something at some point. When it happens I cant help but laugh and say,
Well, that looks like a truck in a tree.