The ideas and paradigms of OOP (Object-Oriented-Programming) have been around for quite some time. They have been monumental in helping to produce massive software and has helped programmers use pre-defined constructs, called “design patterns” to build those softwares.
The state of software development has changed. While in the past software was built from the ground up – entire components are built and the construction of each component, its internal structure and the way it communicate with other components, are critical to the success of the project. Therefor a good software must begin with a intensive planning, and OOP thinking help you do just that.
Today, things tend to look different. In the past few years, several technologies became more and more popular in a way that makes us (or at least, me) rethink on how we design software.
The infrastructure on which we run has changed. Cloud providers provide. They provide servers that are easy to setup and maintain through different scripts and configurations. And if a server goes down? Screw it. We’ll setup a new one, in just a few clicks (or none).
This way of doing things, forces our software to be stateless. So our application cannot relay on data in memory or on local disks. What can we use in order for our application to be stateless? Cloud providers provide. They provide ready made software to be used in ours. Queues, NoSQL, YesSQL, Blob storage, anything you need to save data in a centric, replicated safe manner.
But it doesn’t have to be the Cloud provider own platforms. We can pick and choose our queues, NoSQL, SQL etc. and still not having to install each and maintain each with care. Container technologies like docker enable us to have entire solutions can be integrated together with just a few files script files.
I can have Hadoop + Spark + Cassandra + Couchbase + ElasticSearch + Kafka + PostgreSQL up on my laptop, write some code in between, and Poof – I have a solution ready to be deployed in minutes on any scale, doing whatever it is I want it to do.
The last thing that has changed dramatically is the software that we need to write. Bits and pieces of software is available to us, so we can ramp up our software without re-inventing everything. In a world where Maven Repositories, Nuget, NPM, pip and bower exists, who needs to write everything from scratch?
I know that this does not always apply. Some softwares needs to be implemented from scratch. Usually when performance needs to be controlled on every level. What that is the case, it is hard to relay on 3rd party software. But in most cases, relaying on test-proven components from a central repositories will save you hundreds and thousand of lines of code, that you’ll probably just screw up anyway.
In a world that all of this exists, and easy to use, who am I to take 2 months of development to discuss inheritance issues and what classes should inherit from where, and whether or not to declare a field member, an interface or something else. Software is moving fast, and so should mine.