The abstraction section crystallised for me the concept of starting low level and then abstracting out to higher level and how that can directly relate to the TDD approach of taking the smallest possible step to pass. The abstraction is only necessary to pass the more complex or variable test cases.
I think I was missing the importance of “start constant, then vary” and “start with one, then make many” when writing tests.
You may ask what if I’m not programming for learners? Well unless no one else ever has to see your code (and you don’t have to come back to it later) then we are all writing code for our fellow programmers to learn.