“It is not only the violin that shapes the violinist, we are all shaped by the tools we train ourselves to use, and in this respect programming languages have a devious influence: they shape our thinking habits.”
– Edsger W. Dijkstra
Object Oriented languages suffer from a forced paradigm that fits more for UI design than solving the large scale data problems we encounter today. Languages like Java force a developer to speak in nouns and create artificial structures that don’t actually represent the systems we encounter. The result is an inheritance tree with more and more abstract ideas being forced into shapes that don’t make sense.
Remember the QuickTime volume control? For anyone who isn’t old enough to remember, Apple QuickTime used to have a scroll-wheel volume control. It was meant to be intuitive to the user so they could easily understand how to adjust volume. The actual results where not what was intended. Most users took their mouse, grabbed the tiny edge of the wheel, moved it a quarter inch up or down, released, and re-grabbed it wheel over and over until they got the volume correct. It was painful, annoying, and substituted 30 seconds of UI training for a lifetime of frustration.
Forcing a bad model on users only works to limit the usefulness of the problem being solved. Worse, instead of accelerating progress it debilitates our understanding of the underlying issue. Software language paradigms multiply this mis-model understanding 100x resulting in overly complex systems, that are harder to change, and even harder to maintain.
There are lots of examples of this kind of round peg, square hole problem. SQL is another example. Large scale scheme enforced structured data is a solved problem. SQL and SQL databases have done an amazing job of getting performance and consistency from data; but those aren’t issues with most startups. Flexibility, velocity, cost, and non-specialization are the primary problems of the success of small startup teams; ACID compliance is not. Developers with deep experience in SQL databases often have the drawback of thinking of most data like it is a table; which limits options and slows the development cycle compared to less structured data.
This has become a bigger problem because of the prevalence of unstructured data and the usefulness of map-reduce in processing that data in ways are particularly useful in web-scale systems.
The point isn’t to suggest that there isn’t a place for things like OOP development or SQL databases, but software shops that rely exclusively on these tools are dramatically limiting themselves. A carpenter that only uses hammers, hand saws, and screw drivers is at a decided disadvantage to one that uses those tools AND a 3D printer. The abstract thinking required to use these tools is definitely a hurdle to overcome, but the payoff is substantial.