Long ago, I was attending this training program on Software design and architecture. A very respected Architect was talking about upfront design. He was trying to illustrate the fact that upfront design was very critical and you should always design upfront keeping performance & extensibility in mind. He was giving analogy with the foundation of building which goes like this:
“If you build a five story building, you will never be able to extend it by another 5 story. So you should always prepare for worst”
… At that time, I agreed completely with him. After all, you can’t really extend a building that doesn’t have enough foundation for it, right !
About 5 years later and a couple of completely failed and successful project experience under my belt, I beg to differ. I have seen so many analogy with building houses to developing software! Is it because of Christopher Alexander and his influence in “Design Patterns”? Now a days, I find many of these analogy to be irrelevant, Because, “Software Development is not the same thing as Developing high rise Buildings! Period. “.
Have you ever been in a situation where you did foundation for a 10 story Building and after finishing the first two floor, you realize its not a House you want to develop, its an Airplane that is actually required ! Or even better, after developing a 10 story building, no one wants to live in that area?
Unless you are working on projects like “Facebook-Chat” where you know on the first day of release, you are going to get a million hit, It is always best to take the simple approach first. This is why I love Agile and Lean process. You do only what is necessary and when its necessary. In agile, we are always prepared to refactor, re-evaluate architecture, scrap the existing foundation if it doesn’t work.