I was searching for “design flexibility” in google today and came across this interview with Martin Fowler. I was looking for general best practices in making the design flexible enough to make maintenance and changes easy. Something like flexible molding material which you can change without much effort. I had read about regenerative systems some time back. Some fantasy about self-healing or intelligent error handling programs. If these errors out, then it can start looking for the actual cause of error by itself, fix that and start running again without manual intervention. Sounds fantastic. It is not a sophisticated idea which sounds good on paper but not good for real life application development. Maybe not in an expansive manner, at least the idea can be implemented.

Following are some quotes from this article.
“We seem to have a notion in the software industry that doing a good job slows you down.”
Yes, I have this opinion some times. Not literally, but pulling off a perfect job takes time. I always work within pre-set time limits and one prime objective is to deliver good quality product within set time lines. If you have unlimited time at your disposal, then making something perfect is just a matter of patience. I have also advised others that don’t tinker with something until you get satisfied, but rather finish it off and proceed with next life cycle. It is not for just finishing the task for the sake of it, but to take care against next cycles getting squeezed because of this. The theory is, if making it 90% perfect took 100% of time, then the rest 10% will take much more.

In this model of working (waterfall) in a one-dimensional manner, there is little choice but to start with coding once you think design is more or less correct. Is this where iterative, agile, extreme methodologies makes a difference? Making a perfect design of a part is easier than designing a complex system at one go. When you have to compromise because of time lines, this axiom is true.

“Planned design's weakness is that creating a well-planned design is actually really tough.”
“Martin Fowler: I don't know. Why is composing symphonies tough? I don't know. It's just very few people in the world can do it well. And I think that's the case with upfront design. It is very hard to do well. “

It is true that making a perfect upfront design is tough. You have to visualize the complex system which you are designing completely. You have to be imaginative enough to see all its flow from start to finish. You are expected to fill in all the loopholes and all the tiny cracks.

I just had a brainwave - let me take the example of cooking. If I decide beforehand that I am going to use a certain amount of vegetables, water, salt, pepper etc and start cooking, chances of it being edible is less. I am least experienced in cooking, but from my limited experience, adding ingredients as needed into a basic mix with multiple iterations helps to test the taste regularly and improve. Final product is always tastier compared to first method. But somehow, I was not able to practice the iterative development in a full-fledged manner so far. So I don’t know the other side of the story.

“focusing on superficial problems can lead to the discovery of substantial problems”
This is true not only in design, but in other areas also. Biggest hurdle when I face new situations or new problems is courage to attempt solving it. Fear of unknown is one big deterrent which makes people believe that it is complex. But scratch the surface, series of small discoveries will add to the confidence for exploring more. The problem will get solved by itself.


Popular posts from this blog

How to take up maintenance of an existing software application?


weekend exploits