Nice post!
I agree with most points, but have to disagree with the absolute statement "don't do X, ever." There's always context and I've definitely at times made things more complex than they need to be. "Overengineering" can be a problem, too, most often because you don't know the requirements of the next two or three needs of a feature, so you're likely going to have to refactor again. Many times, it's better to wait for two or three examples to remove the hard-coded number or refactor the shared logic block/method.
Also, a quick shout out to Martin Fowler's excellent book on refactoring, which is in it's second edition.
Anyhow, keep up the great posts!