Please get comfortable throwing things away
In the world of agile, and lean we are constantly encouraged to not create any wasted documentation/example/specs. In general I agree with this, but as prototypes graduate into maintained production code I think a certain degree of expandability needs to be part of the process. In product design I think there are three things we need to be able to dispose of when things aren’t going correctly
Code --- I am not saying your code should be DRY, everyone knows that. I am talking about Prototypes, tests, and initial iterations of projects. When building a first iteration of a product, or getting to a point to user test an idea the problem won’t be understood. This is impossible to architect. The maintenance cost over handling these issues can either be paid up front to redo the prototype into fully fleshed out code, or it can be paid over the long run as line by line things are rewritten on the poor architecture.
Designs --- design is experimenting, some experiments don’t need iterated on, they need killed. Just because a design was your favorite doesn’t mean you need to tweak it to solve the problems user testing brought to the surface. Sometimes you just need to throw it away and start from square one all over again with your new knowledge.
Knowledge --- The world around is is always changing, and we are always learning because of it. This doesn’t mean that everything we learn is going to be useful for ever. Sometimes we learn we were wrong, and things could and should have been done differently.