Another requirements related idea I like (which I know you already know about) is Tom Gilb's idea of the requirements "landing zone." Some requirements are binary -- the software meets the requirement or it doesn't. But others are "scalar." These are the requirements that are traditionally called "non-functional requirements" or "quality requirements." The software has "more" of the requirement or "less," but it isn't black and white. The definition of scalar requirements include several elements:
-
The "gist" of the requirement (this is what many organizations are currently treating as "requirements")
-
A "scale" for the requirement, i.e., some way to assess what qualifies as "more" or "less" of the requirement
-
The minimum acceptable level of the requirement
-
A range in which "more" of the requirement is "better"
-
A maximum at which "more" stops providing additional value
The range between the minimum acceptable level and the maximum useful level makes up the "landing zone." (There are a lot more details to Gilb's approach (called Planguage) than I'm describing here, but this should be enough to communicate the basic idea.)
It takes a mental shift to think of requirements this way, but Gilb has convinced me that it truly is possible to define a quantitative scale and a landing zone for every single scalar requirement. (As Gilb says, bad numbers beat good words.) Once you've done it for awhile, it doesn't take much longer than defining requirements in the traditional (aka sloppy) way, and the increase in clarity is striking.
A common example would be response time. You could imagine a system in which a response time greater than 2 seconds is too long. Therefore 2 seconds will be the minimum acceptable. An improvement in response time in the range from 2 seconds to 1/10 second is valuable. But once you get response time of less than 1/10 of a second, there's no additional value. For example, improving response time between 1/10 and 1/100 of a second doesn't add value to the system, so there's no point in developers working beyond that upper limit. This example is hypothetical, and real systems have different worst and best acceptable response times. But the point is that you define is explicitly instead of leaving developers to guess about what's useful.
The great "embrace change" support you get from landing zones is that they inform the development team about how much of each scalar requirement is good enough, how much is better, and how much is a waste of development effort -- and they can do that on their own initiative without further involving the business stakeholders. Moreover, when landing zones are defined across multiple requirements, it allows the developers to make technical tradeoff decisions as new requirementes are added about how to support the set of requirements as a whole, again without necessitating time-consuming back-and-forths about the old requirements with stakeholders outside the immediate dev team.