Zu "test driven development" hat John Ousterhout einiges geschrieben in "A Philosophy of Software Design".
tl;dr: "test driven development" ist kacke.
Ousterhout nennt das "debugging a system into existence". Man erstellt erst ohne durchgängiges Konzept code mit beliebig vielen Fehlern. Dann testet man ein bisschen und beseitigt die Fehler, auf die man trifft. Fälle, die man nicht testet, werden logischerweise wahrscheinlich wieder in Fehler laufen. Weil dem Code kein solides Konzept zugrunde liegt. Weitere Änderungen macht man dann so, dass wieder mit minimalen Änderungen - kein Design, kein grundsätzliches Refactoring - die gewünschte Funktionalität zu sehen ist.
Und den Code durch ausgiebiges Testen und korrigieren einigermaßen Fehlerfrei zu machen, dauert länger als ihn gleich richtig zu designen.