Before college: the trick is to be smart enough to figure out the right way to create your program before you start coding. I was never smart enough, and realized my errors after 15 minutes of coding. :-(
After college: estimating time to create software is impossible to do with any accuracy, so there should be no schedules.
After a few years in industry: After consistently failing to get things right the first time, I decided it was impossible. Since I was working on the Visual C++ Debugger, I decided that the key to being a successful programmer is to be really good at debugging. You write whatever you can, then use the debugger to find the problems, then fix them.
After another few years: I switched from the Visual C++ Debugger to the Visual C# Editor. I decided that the debugger doesn't matter, the key to being a great developer is to be great at editing. I also read Fowler's Refactoring. Instead of trying to get it right the first time, or get it wrong the first time and live with it, I decided that to get it wrong the first time, and then improve the design with refactoring.
Further learnings: Simplicity and clarity of code are critical. Get those right, and you every other thing you could want (correctness, performance, ability to add new features) become accessible. Also, whenever you have a bug, don't just fix the bug, don't just fix similar bugs in other places, but change how you do things to guarantee that kind of mistake will never happen again.
As a manager, I led a team according to the values of simplicity, refactoring, clarity, testability, getting feedback quickly, striving for good design, coding practices that eliminate entire classes of mistakes, etc. We were fantastically successful. As an individual developer I continued to follow what I had learned as a manager, and had the greatest productivity of my career (although my former team was much better at it than I was.) My point is that these principles have been tested in the real world.