Software developers are constantly told that they should avoid Technical Debt. But very frequently it is difficult to resist the temptation. Why not implement a good-enough temporary solution that satisfies all the functional requirements? The main problem is that very often this solution ignores completely the non-functional requirements. It is not efficient, nor robust, nor maintainable, nor scalable. I think this problem may be very nicely illustrated with the pictures below.
1) Functional requirement:
The dashboard must have a knob to control the air-conditioning.
2) Functional requirement:
The back-window must have a wiper.
3) Functional requirement:
The door must have a lock.
4) Functional requirement:
The car must have a side-mirror.
5) Functional requirement:
The car must have four tires.
I love the pictures… in this and your other post about emergent design. A good visual helps convey the meaning so much more effectively than words.
One thing I think that needs to be balanced here is that you can quickly get burned if a development team over designs a feature and adds cost for things not being asked for which then creates some level of mistrust. It comes down to talking and educating PMs and dev teams on these topics and why short sighted decisions and adding tech debt is bad.