Software development like almost everything else is about balance.
Do I refactor/rewrite or not? Add the extra layer of abstraction? write defensively?
Do I commit a partial solution to keep integrated with mainline?
Should I deploy a partial solution to get real feedback?
Do I make it more complicated to handle some future requirement?
The best software developers have a good sense of balance. You can always learn a new language/technology
you can also learn to do things by-the-book learning balance is tricky.
Joel Spolsky says a developer needs two attributes: "Smart" and "Gets things done"
I am beginning to believe the latter is the more important part.
I always recommend new graduates to take their first position in a big corporate environment and their second (and all future) in fast moving start-ups.
After you have learned the "anal" way of doing things you make much better decisions when cutting corners.