So the way I program is split up my tasks, one for technical design, and the other for code (construction).
In technical design usually starts off with me looking at a goal to achieve and attempting to figure out the minimal features required to achieve it. I then start using notepad to scribble out a draft of program flow and design. Once basic flow is achieved, I use UML to plot out classes and objects. I start prototyping each of the classes (this time I use crimson editor for the tabbing) and their rough implementation in pseudo code.
The problem is I don't realize all the issues I need to address through this system. Sometimes it requires construction/coding to see flaws. I take precautions in the design phase but sometimes something unexpected arises during coding that requires me to go back to the tech design (I try to keep them updated in case I need to look up the design for aged code).
Is there some sort of technical design step I am missing? (sorry if this is a dumb question but I never had formal education in programming)
Um... By doing it a lot? Have you tried reading books?
Sometimes it requires construction/coding to see flaws.
The only things I've seen so far that can handle arbitrary complexity to an arbitrary level of detail aren't running on human brains. If you're looking for a way to predict all possible problems that can arise from design decisions during the design phase, prepare to be very disappointed.
Honestly, I would say that the SOLID principles and TDD have helped my coding more than anything. And they go hand in hand. It is hard to test software that isn't constructed with the SOLID principles. When components are hard to test, I know that I have not designed the components correctly
I've read quite a few books, but maybe there is one I'm missing. I pretty much sleep with "code complete" underneath my pillow and have read it back to back at least 5x within 2 years. Other suggestions for reading material?