All engineering involves trade-offs. Ideally, we'd prefer to have maintainable code that ships on time, but this usually isn't possible.
So you have to look at how much payoff you're getting from maintainable code versus shipping late. I would say that how to manage this tradeoff depends on the type of software being developed - If you're creating throwaway apps for the app stores then shipping fast is probably a more important consideration than having a maintainable codebase. If you're writing banking software for the enterprise the balance probably tips in favor of maintainable code.
You also have to take into account the constantly shifting goalposts in software development. That class you spent all day refactoring gets thrown out tomorrow.
So you have to look at how much payoff you're getting from maintainable code versus shipping late. I would say that how to manage this tradeoff depends on the type of software being developed - If you're creating throwaway apps for the app stores then shipping fast is probably a more important consideration than having a maintainable codebase. If you're writing banking software for the enterprise the balance probably tips in favor of maintainable code.
You also have to take into account the constantly shifting goalposts in software development. That class you spent all day refactoring gets thrown out tomorrow.