Today, I read the Criminal Over-engineering entry on the coderoom blog (http://coderoom.wordpress.com/2010/06/23/criminal-overengineering/).

I couldn’t agree more.

I believe we not only over-engineer the code, we over-engineer the solution too.  We spend time adding features that aren’t needed or extending features with little bits that aren’t needed.  All this extra code makes things bigger to code, bigger to test, and takes longer to deploy.  I’m purposely ignoring the case where we don’t realize the feature is not needed; that’s a topic for a different blog post.

We also run into problems when these features are needed down the road.  Why?  Because we were usually not 100% right when we added the feature.  If we got 90% of the  feature correct, we need to change 10% of it.  In other words, we are changing code instead of creating code.  And, the code we are changing has never really been used. So we pay the price of adding the feature too early by having to change it to make it useful. And that means we are changing code which is a slower and more error prone exercise (not to mention, a whole lot less exciting too).

How much time would we have saved if we just left it out in the first place?  We need to remember to code only the features needed today.  Don’t code for tomorrow because we don’t know what tomorrow holds.