What is Software Made Out of?

What is Software Made Out of?

What is Software?? As of today, most devs I know develop using some form of framework. That framework is an abstraction over some programming language. That's an abstraction over assembly code. This in turn is an abstraction layer over a series of 0s and 1s, abstraction over logic gates, over transistors, electric charge in a register, some stuff about physics, etc...

The reason for presenting it like that is to emphasize how all these layers emerged from the previous. We figured out that we could build better, more complex, more interesting stuff if we facilitate the use of specific patterns which are useful and forego some complexity.

With each layer you lose some level of control over the ones below, in favor of better conceptualization of what is happening. You can mentally follow how a few values evolve through a program, but if you had to simultaneously account for every memory address and CPU operation, writing even simple software (by today's standards) would become nearly impossible.

Each layer we add decreases the complexity by orders of magnitude, making us able to produce orders of magnitude more elaborate software.


If you think about it, we've spent the last decades figuring out ways to think as little as possible about the electrons moving around. Figuring out abstraction after abstraction to manipulate them more efficiently and at scale. Coding agents are just the latest update to the meta. You don't even have to learn how to code to move those electrons in a coherent, coordinated way that we'd call "software". You just... Tell the agent what you want.

But just like with previous evolutions, there's still benefit in understanding the deeper layers of how we create software. One big difference between good vs bad software developers is understanding the nuances of how the code actually accomplish what it says it'll do. You can use your ORM's built-in functions to query your database, but if you don't understand the SQL implications of the function you're using, you are limited in how much optimization you'll be able to make.

Things will be no different for coding agents. They make the process of producing code so easy, but sometimes, being able to roll up your sleeves and actually knead that code yourself into the shape you need it to be.


Going forward, coding agents will become more and more ubiquitous. People have started giving the (terrible) advice to not learn to code anymore because agents will do all the work.

I think coding agents are nothing more than a new layer on the stack to manipulate those bits in an abstracted way. Agents reduce the cost of writing code, but not the cost of understanding systems. You will definitely be able to produce software without writing code, just like most programmers don't really interact with assembly code. But having a deep understanding of the programming language you're using will always be the difference between a good and a bad software dev. Until we figure out a new layer over Agents...

Side-thought:

Interestingly, we very rarely think more than one layer below the one we work in. If you're using React, you might think about how Javascript actually performs stuff under the hood - how rendering works, what the runtime is doing - to improve your code further, but you probably won't be looking below that in the assemble code produced. We'd rather accept limitations of the 2 layers we touch than even try to get that deep, it's just way too much complexity for the brain.

I wonder if agents will change that - not by removing complexity, but by making deeper layers navigable again