Almost a decade ago, Marc Andreessen penned the famous “Why Software is Eating the World” essay which was amazingly prescient. His arguments on why every company needs to be a software company becomes even more evident in our post-COVID-19 reality where companies like Amazon, UberEats and DoorDash are now considered essential services.
While I was mapping out the concepts around building software, I noticed a recurring theme across the world of bits and bytes. Almost everything is an abstraction of something else and this I believe, is the reason why software is bound to permeate across every aspect of our lives.
In simple terms, abstraction allows us to ignore certain details to focus on those that we care about. An abstract version of a cat has just enough characteristics (the ears, the whiskers, the body shape etc) for us to still recognize it without being distracted by other less important details.
Similarly, in the world of software and code, you’ll see this pattern repeated over and over again. Assembly language, which is an abstraction of the underlying machine code instructions, is then abstracted by higher-level languages with easier-to-use constructs to encapsulate away the architectural details of the physical microprocessor.
Libraries, packages, frameworks and APIs provide useful abstraction for all sort of capabilities in all sort of domains. There’s also Declarative programming, a paradigm that shifts a software engineer’s focus towards the outcome rather than the steps to achieve it, abstracting the work to the language itself.
Cloud computing which has abstracted the notion of physical servers using virtualisation and containers, is abstracted further by the rise of Infrastructure-as-Code (IaC) allowing your entire cloud infrastructure be managed and provisioned through configuration files. Serverless computing then took it a step further by abstracting away infrastructure concerns so you can focus only on your code.
Even application development isn’t spared, with the No-code movement continuing to gain traction. You can leverage these tools to quickly string together a working application without writing a single line of code.
This isn’t just limited to software development by any means. Uber and Lyft turned the act of hailing a cab into an app, abstracting away the complex orchestration between logistics, scheduling and payments. With just a few clicks, you can get someone to mow your lawn, stock up on groceries and even ensure you have a lifetime supply of socks.
Software companies innately understands the power of abstraction. It allows them to hyper focus on their particular problem domain while leveraging existing technologies and services. Internally, cross-functional autonomous teams are assembled to focus on a particular subset of the problem domain, with the aim of unlocking value that’s greater than the sum of its parts.
Once they themselves are successful, they will then become the abstraction layer of that domain for others to build on. With this moat, they then expand to tackle adjacent problems while fortifying their foothold. This is also why we have startups raising millions of dollars trying solve problems that seems too narrow to the uninitiated.
As consumers, we too reward companies who are able to solve our problems with as little effort from our side, abstracting away all the complexities. Startups in early stages quite often deliver seemingly magical experiences backed by manual work, hoping to eventually codify the process if there’s a product-market fit.
The unintended consequence for turning everything into black boxes is the unfortunate exploitation of the marginalised. Opaque machine learning algorithms turn human labour into variables to be optimized and scrutinized. In fact, in a lot of cases, the existence of a human workforce is merely a placeholder that will eventually be replaced by robots, improving operating margins and efficiency.
Abstraction is a double-edge sword that if wielded wisely, let us solve difficult problems, by focusing our efforts and leveraging each other. At the same time, we need to be mindful the potential ill effects of ignoring certain details, especially when it impacts our livelihood.
Software is supposed to be the great leveller, levelling the playing field for everyone. But if we are not careful, it might end up levelling humanity off the field altogether.
If you are interested in the world of software development, explore my notes on Concepts around Building Software site.
Cover Photo by Simon Marsault on Unsplash