Two articles recently got me thinking about the fact that paradigm shifts can be born out of convenience or necessity.
In his post, Another paradigm change is taking place right now..., Michael Nascimento Santos talks about the paradigm shift from Object-Oriented Programming (OOP) to Aspect-Oriented Programming (AOP) that he sees unfolding. AOP has very interesting features that may well advance the way we think about programming.
It got me thinking back to when I was first introduced to C++ and OOP. At the time, my team and I were all hard-core C programmers. We had already stumbled across the need for dynamic data binding and we so we used a lot of void* and function pointers, along with explicit type variables passed around in parallel to the data values, to simulate the effect you get with base classes and dynamic binding. We even implemented our own exception mechanism. That all seems pretty scary looking back on it now, but it actually worked very well in practice (don’t worry, I’m not recommending it).
When we were exposed to OOP via C++, our initial thinking was that C++ was simply a pre-processor on C that added some features that we had already implemented anyway in straight C, and that the main effect of C++ was to bloat and slow down our ripping fast code. And so we spurned it for a while.
But the industry moved forward and C++ became more widely adopted, and eventually we too started using it seriously. Once we did that, we quickly came to realize that the really interesting part of OOP is not in the specific mechanics of classes, inheritance, polymorphism, etc., but rather in the fact that it gives you a whole new way of thinking about software design and development. Once our minds had made the shift to the OOP way of thinking, there was no turning back. Today, it’s difficult for me to conceive of sitting down to write an application of any complexity using a non-OOP language. So the paradigm shift I experienced with C++ was much subtler but much more powerful than what I had initially imagined, and it took a while to sink in. This was a paradigm shift of ‘convenience’ – we could write software without OOP, but OOP gave us a better way to do it that opened up all sorts of possibilities.
There are also paradigm shifts of ‘necessity’. Water rising in a reservoir is going to experience a sudden paradigm shift when it starts overflowing the dam. The second article I read recently states that if China achieves the growth in individual personal wealth and standard of living that it projects to by 2020, the world’s natural resources would not be able to sustain it. For instance, if every person in China owned a car, the way that every American (on average) does, we would immediately exhaust the Earth’s supplies of metal and oil. If this is true, and accepting for the moment that China actually can reach that standard of living, then it’s clear that a major paradigm shift will have to take place. Either people in 2020 (in the US and Europe as well as in China) won’t have nearly as many cars as they do today, even if they have the same level of personal wealth, or we will have a completely different conception of what a car is. It will have to be something that does not consume metal and oil the way they do today.
So sometimes paradigm shifts take place because they provide excellent marginal benefits, sometimes they take place because there is no other way to address a looming problem.