One of the little missions I've set for myself over the coming month is to figure out how to implement pointers. I decided to do that first and get it out of the way, since so much else depends on it.
On glancing back through my code, I realized I hadn't made any plans ahead of time for how to deal with pointers. And then I said to myself: Knock it off, you can't think of everything at once.
The whole point of a project like this is to have it grow into its own needs, and to learn how a project like this grows into its own needs.
Intelligent people often blame themselves for not being able to think of everything at once, because they are very good at cherry-picking situations where not doing that ended badly for someone, themselves included. The point isn't to pre-emptively identify every case where things can go sour, or even identify the major ones -- it's to know what steps to take when you find yourself in newly uncharted territory.
I knew at some point I'd have pointers in there, but I didn't expend too much energy trying to build them in before I had some idea of what else was going on. I did that last time, and the results were an awful mess that I couldn't back out of without scrapping everything anyway. Being burned once that badly gave me a good sense of how not to get burned again when trying to cross the same field of coals. But that's not the same as knowing everything ahead of time, and I decided not to force myself to be perfect the second time around as compensation.