Software developers are a unique breed. We get excited about geeky things like science and math. We have fun creating things with our mind. Yet, we don't always take ourselves seriously. We get excited when things work like we expect them to, but have a hard time being criticized when we do something wrong.
We have a hard time telling others that something isn't possible. We can make a computer do so many things, so its in our nature to think that anything is possible. This maybe true, however, but when it comes to making schedules we need to stop thinking this way. The people who are paying us to create things for them need to know the TRUTH. We don't really know how long most development projects are going to take. That is fine and it is fine to say that. We should never set a date or an expected date to our managers. They will then expect this to be the release date which we know we will probably not finish in time.
The other thing we lack is the ability to throw away our code once we've realized that we didn't know enough at the time and now it has become crap. Spaghetti code can be fixed for the most part, but an architect flaw from the beginning will doom any project. Features will not be able to be added and the clients will leave.
Under no circumstances shall we allow ourselves to produce crap code. We created the code. There is no reason for us to hand over the code when the code is still crap. There is nothing stopping us from taking our time and building it correctly, so that we can always add new and interesting features in a timely manner. I know our skill level will vary from developer to developer. As soon as you are aware of ANY issues, they need to be fixed as soon as possible. We need to stop delaying the inevitable and fix our messes.