The Importance of Unlearning
Accepting that there might be more than one solution out there for a problem
The world of software is constantly changing at a very fast pace.
Yesterday’s axioms might be tomorrow’s anti-patterns.
Newborn technologies rise to popularity only to become obsolete sooner than expected and hardware advancements make things that were considered science-fiction a few years ago possible.
The only certainty is that we don’t know what the future will bring us.
Here is a partial list of emerging technologies in recent years:
Needless to say that blockchain has a good chance to disrupt the world as we know today
- The machine learning renaissance
The increase of hardware capabilities has brought a new wave of tools and disruption to many industries that take advantage of machine learning
Now it’s much easier to deploy self-contained isolated components to the cloud. Container orchestration infrastructures that only giants like Google previously had in-house are now publicly available for everyone (Kubernetes is the king here for now but the future will surely bring new tools)
The motivation is to have one universal bytecode that will be used not only in browsers but in everything (desktop/smartphones/god knows).
This technology will transform the portability of software between platforms
One of the most innovative programming languages ever invented,
Rust makes system programming a real joy. The most loved programming language in Stack Overflow surveys for the last 4 years
The solution to making Erlang virtual machines (called BEAM) mainstream, mainly thanks to its Ruby-like syntax and great tooling
Why deploy containers to the cloud when we want only a single function that doesn’t need to be up 24x7?
REST API is not ideal for every problem, many data models are actually viewed better as a graph and this protocol plays nicely with them
An innovative key-value database with so many data-structures.
The most loved database in Stack Overflow surveys for the last 3 years
Distributed commit log that serves as the single point of truth of a system data. It makes it very easy to add/remove independent producers/consumers for our system architecture.
Thanks to Kafka it’s easy to select a checkpoint and “re-play” historical data.
On the one hand, it’s an exciting time to be a software developer. On the other, it means that in order to keep up, we can’t stop learning or we’ll become irrelevant.
I’ve always loved (and still do) learning.
I love reading technical books (I own too many).
I love reading beautiful pieces of source code.
I always seek for ways to be more productive and get out of my comfort zone.
But, I think there is one important thing that people often overlook and it is the importance of unlearning things.
Unlearning means we need to accept that there might be more than one solution to a given problem, and this solution might be counterintuitive for us.
It also requires humility and willingness to start over in order to gain a new perspective and extend our toolbox.
Let’s review the above list of technologies:
In order to understand how blockchain technologies work, we must forget about the centralized middleman model.
- Machine Learning
For example, we need to accept here that computer neural networks can output results which are impossible for us to understand exactly where they came from
Containers disrupted the DevOps world and are the key reason for the micro-services architecture explosion. Without them, we’d stay with more monolithic systems.
Will open many opportunities, the obvious is using new programming languages for Frontend Programming. Another world of possibilities will be consuming WebAssembly libraries and using them within our applications. For example, a Rust program that will initiate a WebAssembly runtime hosting other wasm programs that were originally coded in Golang/Swift/other)
Learning the Rust programming language requires us to think of resources differently in terms of borrowing/ownership.
The Let it crash philosophy of Erlang asks us to accept unknowns and that things will break and prepare for them from the beginning
Asks us to stop thinking only about services but also about single functions. It opens new opportunities to save money since we only pay for when the usage of a function (which might not be available 24x7)
Requires us to accept that REST isn’t always the best for every scenario and that sometimes there is actually a graph. (I personally think that starting from a REST API and gradually move towards a GraphQL is less risky for a green-field project)
Requires us to represent data in many more shapes: Key-Value/Hashes/ Set/SortedSets/Lists etc.
Once we start viewing our system data as a log, we can think more about replaceable components on our system. For example, we can easily add a new consumer and make it process data and spill it into a new database and know it won’t interfere with the rest of the system.
Unlearning is a continuous inner fight. If done properly can be a huge enabler and if not, then we risk missing growth opportunities.
A change in perspective is worth 80 IQ points
- Alan Kay