the only universal principle in software is the one saying that there are no universal principles in software.
Hmmm.
Maybe this was a bit exaggerated. So let me rephrase:
there are very few universal principles in software. The vast majority of principles are not universal.
A careful examination of of "truths" about software would reveal that many of them are not more than a rule of thumb whose applicability is limited. Let's take the Law of Demeter: a principle that is based on a clear distinction between good and bad. In theory, this well defined order seems like an excellent vehicle for taming the usually chaotic structure of software. In practice, this principle often leads to questionable consequences. It is rear to see it widely used other than in toy examples.
[Following Yardena's comment, the OCP example was rewritten as follows]
Another example is the Open-Closed Principle: A class should be open for extension (i.e: subclassing) but closed for modification (i.e.: manipulation of the source code). Here's how Robert C. Martin summarizes this principle:
... you should design modules that never change. When requirements change, you extend the behavior of such modules by adding new code, not by changing old code that already worksGot it? good modules never change. The principle suggests that one can foresee the future to such an extent that one can develop a class up to a point where its source code will never need to change. Ever. I bet that at least 50% of all programmers do not buy this premise. Refactoring, which has gained immense popularity as a highly effective development technique, is based on a completely opposite premise.
How about the Interface Segregation principle? This allegedly universal principle has zero relevance in dynamically typed languages which have no notion of interfaces.
These are just three examples off the top of my head. Similar loopholes can be found in almost every software principle.
The funny thing is that we already know that it is practically impossible to reason about the important aspects of software. Turing and Church had already proven it. Yet, we (hopelessly) keep on trying to formulate "truths" about something that we can hardly reason about.
I think it is much more about psychology than anything else. We want to conquer new frontiers. It is in our genes. Our attempts to formulate software principles are all about taming the wild beast called "software" and making it pleasant and manageable. Sorry, it will not work. There are all sort of notions that are beyond our scope of reasoning. Software is one of them. We'd better accept this fact.
I agree 100% with the claim and the conclusion!
As for the examples, just a matter of refinement perhaps - when we extend a class and use Template Method we do not modify the super-class, we create a new one, so IMO it's not a violation of open-closed principle per se, but I know what you mean. As for interfaces, Smalltalk has this concept of Protocol - it isn't enforced by the language, but still it's sort of interface IMO.
That said, you're right that getting "religious" about any good principle of software is an absolutely bad practice.
Yardena
August 9, 2009 at 6:52 PMI agree. The OCP point was not well argued. Removed it. Once I have the time (god knows when) I'll try to rephrase it.
Unknown
August 10, 2009 at 10:28 AMHarrison@capstone
September 21, 2009 at 8:18 AM