This classic talk by Ian Cooper is a breath of fresh air. Copper quick;y covers Test Driven Development as it is generally practiced, the arguments against TDD and why those arguments feel right, and then goes back to the principles and practices of TDD as described by Kent Beck in Test Driven Development By Example.
The two points that have changed my game:
Test modules, not classes - which means you need to think much more about the design of your system, the actual interfaces that programmers will use, and the flow of data. That eventually leads you to ports and adapters, which Cooper briefly talks about at the end.
Refactoring is the key part of the process. If you properly refactor from working but filthy to working and clean when you intitally develop your system you should be able to continue to maintain your code, making changes to the implementation details without having to change tests.
The talk is an hour long, but it’s well worth it.