The hardest thing in software is predicting the dimensions of extensibility that are important. This ability usually only comes on the third or fourth try building a similarly-classed, similarly architected system. Making all the dimensions extensible is generally a recipe for disaster.