From YAGNI to YDNIY
How do you ship a product on schedule? One useful approach is applying the You Ain’t Gonna Need It principle, or YAGNI for short: leave out all the things that seem nice-to-have, but you have no proof you actually need.
But beyond the things you don’t need, there are still plenty of features you pretty clearly do need… but are not blockers on releasing your product. So beyond YAGNI, there’s also YDNIY: You Don’t Need It Yet.
Let’s see an example of this principle in practice, visualize the principle as a flowchart, and then compare it to another popular acronymed concept, the Minimum Viable Product.
A real world example: shipping a new memory profiler
In March 2020 I shipped the initial release of a new memory profiler for Python, Fil.
Here’s how it changed over time in terms of features, from May to August 2020:
- 0.3.0, initial release: Installable via
pippackaging tool, runs only on Linux, only profiles complete program runs.
- 0.3.3: Support for an additional memory allocation API.
- 0.4.0: Support for out-of-memory situations.
- 0.5.0: macOS support.
- 0.6.0: Support for
- 0.7.0: Support for C++ memory allocation API.
- 0.9.0: Much faster and lower overhead in some use cases, added support for yet another memory allocation API.
- 0.10.0: Support for running inside Jupyter notebooks, and native support for installing via the Conda packaging tool.
All of the features I added in later releases were clearly necessary from the start; YAGNI did not apply. Lots of people use macOS, the target audience of data scientists and scientists often use Conda and Jupyter, all those memory allocation APIs are used in the real world, and so on.
But even a tool that only runs complete programs on Linux, and only tracks the most popular memory allocation APIs, is still useful to some people.
If I had waited until all those features were implemented to ship an initial release, all the people who used the profiler during the first four months of its existence would have had to keep using worse tools. And with every release, the number of people for whom the tool is useful has grown.
Unlike YAGNI, YDNIY doesn’t mean you don’t implement a feature—you just delay it so that you can release something now.
The YAGNI and YDNIY algorithm
Features that are not clearly necessary can be dropped based on the YAGNI principle. And if the product is still useful without the feature, you can delay that feature based on the YDNIY principle.
In flowchart form:
YAGNI and YDNIY vs. MVP
The Minimum Viable Product, or MVP, is another acronym that might seem like it means the same thing as YDNIY. But as defined by its originator, Eric Ries, an MVP has a different goal, and actually adds on more work.
Specifically, Ries defines an MVP as “that version of a new product which allows a team to collect the maximum amount of validated learning about customers with the least effort.” He goes on to explain that a “MVP is quite annoying, because it imposes extra overhead. We have to manage to learn something from our first product iteration. In a lot of cases, this requires a lot of energy invested in talking to customers or metrics and analytics.”
To put it another way, the goal of the MVP is to learn about users or customers, whereas the goal of YAGNI and YDNIY is to get something useful into users’ hands as quickly as possible.