Mary's company makes an enterprise product. Like many enterprise products, it shipped as a large pile of features that could potentially solve every problem any business could ever have, along with a suite of APIs that allowed customers to patch in their own custom functionality for their business needs. Also like many enterprise products, those features were only turned on or off based on how much the customer paid.
The arithmetic of all of these factors summed up to a set of function calls in the form IsFeatureXAvailable
, with an added twist: the business side of the company was constantly changing the rules. "What the market will bear," and all that, meant that the IsFeature
class of functions were some of the most volatile in the codebase.
One afternoon, Mary got a call from Vince, one of the many project managers. "We're making some changes to widget stamping, and I need to know the business logic for IsWidgetStamperAvailable
," Vince demanded.
"Uh," Mary said, "it tells us if the WidgetStamper feature is enabled for a given customer?"
"I know what it does," Vince snapped. "What I need to know is how it does it."
"Uh, there's a requirements document on the internal server that should have the details." Mary started mousing around to find the link. "I can send that over."
"Those are the requirements! I need to know what the actual implementation is! My project is already behind schedule, and I don't have time to go digging through requirements for past projects."
"I mean, the code is probably your best bet, then-"
"I shouldn't have to look at code to know what it does!" Vince shouted down the phone.
"Wait, you already have a project in flight, with requirements, tasks, and presumably estimates, but you have no idea what you're changing?"
"We're implementing business logic over here, I don't need to look at the current state to come up with task breakdowns or estimates. We know how much every requirement should cost to implement, based on customer needs. More than that, I don't have time to go through the current state, we're already behind schedule."
By this point, Mary had pulled up the function in source control, and was able to quickly paraphrase the behavior of it- it was her (and Vince's) good fortune that it was a relatively simple set of rules based on license tiers. Vince wasn't happy with her summary, but he also didn't have much more to say, so he went off to manage his already behind schedule project while Mary just shook her head. Shockingly, Vince's project only got more behind schedule. It's almost as if estimating based on what you want the level of effort to be versus what the actual level of effort was going to be was a terrible way to run a project.