Simplify Requirements by Rejecting Boolean Questions
My current big project is a rewrite of a platform that has 3 predecessors, all of which are still running, with implementations on them. The original gig was to dig into 2 of those platforms to get them back to running because all of the existing developers had left. Back in December, we were asked to tackle writing platform number 4.
One of my “rules” of software development on any project where I have a say in such matters is “You don’t get to rewrite it unless you understand it.”
That one made it on my list because of how common it is to watch software developers take a look at code some other developer write for 15 minutes only to declare it “crap” and in need of a complete rewrite. When challenged to explain what the offending library/package/application does, most can’t. That leads to a near 100% certainty that the rewrite will miss some large requirement or miss something subtle but important in how the original works.
So, as we set out to rewrite this mess, we wanted to make sure we understood what those older platforms do. We read all of the original requirements, dug through data structures and code, talked to the people who helped define the requirements on the original, etc.
One of the common threads that went through everything related to all of the implementations was the overly complicated ways that things were done in an obvious attempt to accommodate a wide variety of permutations. However, the complexity actually got in the way of accommodating those same permutations.
As we worked through the features that would be in the initial version of version 4, we pushed back on every assumption we could, hard. It’s something I’ve always done to one degree or another. On this project it’s been with more discipline than in the past.
Now, 4 months later, that has proven to be a critical strategy. That’s because optimizing your thinking about the problem and how you’ll solve it leads to orders of magnitude more productivity than most software tools.
If you add up the time spent actually typing code into an editor or IDE, compared with time spent trying to figure stuff out and otherwise spent thinking, it’s probably 30/70. That means that even if you had tools that could read your mind and instantly do exactly what you wanted, you’d only speed things up by 30%.
In trying to get other people to push back the same way, I’ve struggled to describe it in the kinds of rules that people un-used to doing this kind of thing (beginners in the Dreyfus Model). This week, one common factor in many of these situations popped out at me (Strategic Intuition at work). When subject matter experts asked us questions that would have led to complicated messes, they were almost always expecting a boolean answer.
They were questions like:
- Can this new platform do X?
- Will it have feature Y?
- As a user of this system will I be able to do this specific task?
- Can you guys make it do Z?
While those questions can be answered, often easily, doing so almost universally is the wrong thing to do. Under those kinds of questions are giant piles of assumptions. When you answer these questions without probing deeper, you validate ALL of those assumptions without ever knowing what they are.
If, instead, you play the 3-year-old and ask “Why”, you can drill down into those assumptions. You can discover that many of them can be set aside or rendered moot by a much simpler design. And those that stand up to the incessant “Why” are worth keeping and now you have a much deeper understanding of what’s driving the feature request.
Of course, it’s an added perk that rejecting a black/white view of an issue fits in well with the Glass Too Big philosophy too.



