But my Achilles heel when developing a new system has always been slowing my brain down and saying “patience”. My default is for my brain to be boiling with ideas and visions for a “perfect” system (for some version of perfect), but you can only pump out code so quickly. When I let myself stay in this mode, I ended up with a mess of half finished code that is moving in 5 different directions because I am constantly thinking ahead way too far. And it is worse if I am collaborating on a team.
When I am able to be disciplined, when I force patience and cadence, things work out much better and I end with better code that can evolve over time.
But injecting that patience is so, so hard. Do others have this problem? If so, do you have strategies to deal with it? How do you force patience to get in a cadence for weeks, months, years of iterating on a system?
Test Driven Development and Behavior Driven Development (TDD/BDD) are probably the most widely used, and a relatively easy sell to other members of your team, but when your brain is really boiling over it may not be enough to keep you from writing tests that are too specific to the implementation you have in mind.
If that's the case, it can help to take a further step back and start by writing DocTests where the motivating narrative is interleaved with a basic exercise of the code as it is intended to be used (additional unit and integration tests are later added to cover corner cases that aren't part of the main narrative). This can productively be pushed further into an actual Documentation Driven Development process, especially if the code in question is intended to be used by external technical stakeholders.
Literate Programming (where a narrative and implementation are intertwined, rather than a narrative and tests) can also resemble this sort of process, but support in toolchains is uncommon.
Why? What limits you from just coding faster? The hard part is figuring out what you want to code, after that you just write it. Just add the features you want, what is stopping you? Writing well architected code goes faster than writing a mess, so that isn't a hindrance, just stop writing messes and you will be faster, messy code is a sign of a messy mind.
Edit: I guess I answered my own question there. Your mind is full of messy ideas, when you try to code them you get messy code, and that is a problem. I'm not sure how to fix that, you'd need to go through the ideas and ensure you learn it properly so you don't have those messy ideas in the future.
I can get into a mind state where I basically just move fast. Don’t worry if the decision is “right” or if the software design is “optimal” just… GO.
It’s produced some bad code and it’s not optimal for times where I have lots of unknowns (ex: using a new technology). But if I’m using existing / understood tech, and need to move fast, I absolutely can at the cost of quality.
And frankly, that cost of quality isn’t actually as big as you think. So just do it.
It's likely either that or you need to become a distinguished leader (dictator) so you can program your ideas through other people, multiplying the speed at which you can operate.