Less thinking. More testing.
stevereads.com
stevereads.com
The correct principle is not to "trust" long chains of reasoning which one doesn't understand in their entirety, especially ones with strong conclusions. The problem here isn't long chains of reasoning (we could hardly do without any of those), but rather failure to hold them to high standards in how understandable they are, and failure to put in the effort to understand the whole thing before accepting it.
Two approaches were shown: changing data structure representations to meet requirements and generating class structure/hierarchy. The thesis showed that it is possible to do this and how to do it, but it is a huge topic.
If you're interested, I'll put more effort into making my thesis available online in HTML format. In the meantime, you can get it in a variety of places.
http://duckduckgo.com/?q=Structuring%20Data%20via%20Behaviou...
Incidentally, generating behavioural elements (like entire functions) to pass tests would be very difficult although I have been toying with ways to try it out.
In prototyping sprints, TDD seems to acknowledge that unit-testing slows you down and creates rigidity, and therefore encourages you to just get the basic thing working without unit tests. You can throw it away, or fundamentally change the outcome, or the architecture, or the structure of the code. User-testing is how you test a prototype (including just playing with it yourself).
But in building a codebase that you will live with for sometime, that will be built-on and modified and bug-fixed and tweaked, unit-testing becomes really helpful.
but taking that experience and applying it to history where many things are changing and where you cannot separate everyone into 2 different groups will not necessarily tell you anything about one arbitrarily selected variable.