To the degree that a software system is large and distributed enough that there is no effective single point of control, we must expect evolutionary forces.
There is much to be gained by recognizing and accepting that computational systems resemble naturally evolving systems much more closely than they resemble engineered artifacts such as bridges or buildings.
Specifically, the strategies that we adopt to understand, control, interact with, and influence the design of computational systems will be different once we understand them as ongoing evolutionary processes.
-- D. H. Ackley et al. 2002
Here an example on how TDD practices can be evolutionary forces that help to spot violations of design principles
An interesting quote from Stafford Beer
, a managerial-cybernetics theorist
If you wish to tell someone how to reach the top of a mountain that is shrouded in mist, the heuristic ‘keep going up’ will get him there