The “iron triangle” of project management is “Cheap, fast, good: choose two”. This works on the assumption that quality is a metric while time and money are fungible constraints. We can exchange between time and money, and also lower our quality goals to require less of both. Then by LeMond’s law, if you aren’t using much of your resources, you can afford to be more ambitious and put yourself in a place that does demand more from your resources.
It occurs to me that we can flip “quality” around into a constraint by saying is a “shoddiness” is a quantity we can spend to make the product worse. Then time, money, and shoddiness become our three budgets that all work against each other— we can pay shoddiness and time to save money, etc. The three resources are also conceptually independent: most other resources we can think of (favors, scope) fall clearly into one bucket.
That got me wondering what the software iron triangle would look like. Not the development of software, which falls under project management, but the software itself. Are there fundamental constraints that act as universal conflicting budgets? I’m pretty sure I know what two of them are, but the third I’m more uncertain about. They are performance, complexity, and (possibly?) correctness.
Performance also includes other resources like memory or power-use, but the dominant resource in this budget is wall time. Most problems are solveable by brute force; we don’t do that because that’s an unacceptable performance cost. Over time computers become faster and we get more of this budget to work with, which leads to adages like “developer time is more important than CPU time”. But we don’t have an infinite budget, and it’s easy to waste too much of this resource if you’re not paying to it as a constraint.