There really is no such thing as a lone software developer

At the beginning of my career, my mind was preoccupied with technical details. I believed that by learning all about the intricate details of computers, I could become an expert software developer.

But even though my understanding of computers kept growing, many aspects of software development remained a mystery for me.

Eventually, it dawned on me that there’s a lot more to software development than mere technical details. For a long time I had been blind to one aspect in particular: software is made by humans.

That aspect is easy to overlook, because it feels so obvious. I mean: what other living things do you know that program machines? But although this aspect is easy to overlook, it still has widespread implications for the systems we design.

The truth is that our cognitive limits fundamentally shape how we make software. Remember that we can only get our software to behave in the way we want, if we understand how it works. As a result, we often go through a great deal of effort to make the source code comprehensible.

Our minds can only hold a limited amount of information. Anything beyond that will have to be moved to the side temporarily and replaced with a convenient abstraction. This is what abstraction is for. It allows us to simplify and to reduce the amount of detail we have to cope with at once.

There is no purely technical reason to split our source code into multiple components. Likewise, the computer couldn’t care less if we developed our software in Java, Python or in assembly language.

If you don’t believe me, try to imagine an alien species with the ability to grasp an infinite amount of detail in one glance. If you tried to convince them to divide their software into components, they’d look at you puzzled. Why would you obscure details and replace them with something terribly imprecise? For them, abstraction would be nothing but an obstruction.

As human beings, however, we are utterly dependent on abstraction. Without it, we wouldn’t be able to cope with the world around us, let alone develop software. We rely on layers and layers of abstraction to get even the most simple of applications to work.

Do you think anyone would be able to make a “hello world” program, describing it only in terms of electrons flowing through circuits? I don’t think so. There’s only one way to develop programs: by making use of abstraction.

Let’s take a look at an infamous program from the opening chapter of the book “The C Programming Language”:

#include <stdio.h>

main()
{
   printf("hello, world\n");
}

This tiny program appears to be almost trivial. But don’t get fooled by that. A lot of effort was put in to make it look like that.

Most of the complexity is hidden away from you. If you really wanted to understand what is going on all the way to the circuitry, you’d have a plethora of topics to master: compilers, operating systems, computer architecture, logic, and electronics, just to name a few.

There’s so much to learn that you could dedicate your entire life to understanding nothing but this one program - an idea I find strangely intriguing, but which would be utterly uneconomical of course.

This is exactly where abstraction shines. It vastly reduces the amount of stuff one needs to know in order to achieve one’s goals. It allows us to build new systems from old abstractions.

No longer does one need to become an expert in every little detail about computers. In many cases we can get by with a tiny bit of knowledge of some programming language.

This is an amazing accomplishment! And abstraction plays a major role in it. But it’s not the only contributor. It’s the combination of abstraction and specialization that brings all those benefits.

Thanks to specialization we can benefit from the expertise of others.

Are you planning to make a new web application? No need to start from scratch! A framework like Ruby on Rails or Django might be everything you need. In fact, most of the stuff our software depends on has been developed by others. We really do stand on the shoulders of giants.

This, however, brings us to another truth about software development: there really is no such thing as a lone software developer.

Every piece of software we use today is the result of a collaborative undertaking. Even if I write a program entirely on my own using nothing but assembly language, that program still needs to eventually run on a computer which was probably made by someone else.

This is why it is not enough for us developers to focus exclusively on the technical aspects of the job. To become expert software developers, we need to learn about collaboration as well.