bookmark_borderThe fundamental problem of software development

If we would ask the question – what a software developer’s job is about? – probably most of the people would answer – it’s about writing source code. Some of them, more familiar with the software industry would reply – requirement analysis, application design, programming, to some extent also testing and deployment. That’s what can be seen. The operational perspective.

What cannot be seen however, at least at first sight, is much more important and entails a plethora of issues.

The world is complex. Almost infinitely complex. Objects consist of elements, elements of materials, materials are made of chemical substances, those are made of molecules, molecules made of atoms, atoms made of elementary particles, so on, so forth. On the other hand objects aggregate to places, places into cities, then we can think of regions, states, continents, planets, planetary systems, galaxies, groups of galaxies, etc.

Human beings simplify things. When we describe a group of people, we say: a few, several, dozen, crowd. We don’t count and say – 27 people. When we see the colors we say light green, warm, cold, gloomy, happy. We don’t describe the colors as a mathematical concept of red, green and blue values.

Computers do operate on numbers, values. We can’t put into machine the human idea of a car or gasoline. We must create a model of these things, simplification of the real world behind the words we use every day, we must choose the values which will describe them (volume, octane number), we must identify relationships between them (a type of fuel for a car).

People and computers are fundamentally different. Software is a bridge between the two worlds. Building software is creating the proxy, the communication layer between two extremely incompatible realities.

The consequences are enormous. This incompatibility makes software creation difficult, long and complex process. Because of it the software engineers quite often can’t communicate with the clients. Because of this barrier, we don’t have smooth conversations with Siri and we don’t see the robots from sci-fi movies on the streets. Because of this the cars on the streets still are driven by humans.

What draws my attention after years of work in the software industry is the human tendency to minimize effort (see: Law of triviality). A tiny fraction of the general population is eager to put the effort to deeply analyze the problem on which they work. Most of the people will stop at the first reasonable solution they can think of. It’s very clearly visible when software developers try to test their programs. They almost never are willing or able to use their software in a different way than the default scenario. It’s the simplest scenario, the one which is known for them very well. Creation requires effort. This constant mental optimization, this effort reduction is visible also in the designs of the business people in the organizations. Almost always it comes out that some scenarios have been missed during the planning stage. At the moment we even assume, industry-wide, that it’s impossible to analyze everything upfront (fundamentally different philosophy has been applied in the space shuttle program software engineering team, which is very well described here).

Software development, unfortunately, requires precision. At every stage of the project, starting from the analysis, through implementation and finally ending with tests and deployment we need to maintain intellectual rigor. It’s dictated by the nature of software itself. We cannot let ourselves to be lazy. We must always, at every moment of work be as precise as possible. Otherwise we will face consequences – bugs, mistakes, security breaches. Compilers are cruel – bugs are always fault of developers, not computers, and the same can be said about software development in general. Whatever we will ignore – it’s going to hit us back, painfully, sometimes deadly.