In the last few decades our world has increasingly run on software. Most of the time it's impossible to do anything - shopping, finance, communication - without software being involved somewhere, if not driving the entire process.
As a software developer I'm often asked for my thoughts on this, and my answer is always the same - I'm amazed it works at all.
I've worked in the software industry for a long time. I've seen how software is made, both good and bad, and I've experienced my share of development horror stories that would make any good developer's toes curl. I've also watched alongside everyone else as software fails on the world stage, often due to a tiny oversight or lack of diligence, with disastrous consequences.
As software becomes increasingly ubiquitous and comes bundled as standard with devices that previously didn't need it - cars, phones, fridges, toothbrushes - is our modern world built on a strong foundation? And do we fully understand the impact that software has on our lives and society?
What is bad software?
There are two kinds of bad in the world of software. The first is when software is broken. Broken software is easily recognised by error messages, either in the form of a clean but unhelpful suggestion to try again later, or a messy and incomprehensible scrawl of words, letters and symbols.
The other kind of bad is where software is confusing, misleading or simply hard to use. Confusing software is unfortunately far more common than broken software, and much more difficult to resolve. The software might function correctly, but be so badly designed or unnecessarily complicated to warrant the question - why isn't this easier?
A small example
At work we were made to switch from Google to Microsoft for our email and calendar, etc. Microsoft Outlook has a web interface, but our system used a virtual interface to connect through a browser to a remotely running instance of Windows. Here are the steps I needed to go through once a day to get to my new email.
- Open bookmark in new browser tab
- Accept terms and conditions
- Enter username
- Switch on work phone and load verification app
- Enter code from verification app into browser
- Click on icon (the only option available at that point, without a meaningful name)
- Wait until "[the] desktop take[s] a few minutes to set up. It may take as long as 12 minutes" message disappears
- Dismiss notification about using multiple monitors
- Dismiss message about authorised users only
- Type in password
- Wait for Windows desktop to appear
- Wait for Windows desktop to fully load including automatically loading browser
- Enter code from verification app again
- Click on icon to load email
- Email loads
There's nothing broken about that process, but there were plenty of confusing aspects, notably the sheer number of steps required to get into a web based email system.
To be fair, this was a stop gap for another system, which worked much better. I am sure a lot of time and effort from good people went into making it work as well as it did, but it took so long to complete that I only used it when absolutely necessary.
Why software can be bad
There are plenty more examples where software isn't quite as good as it should be, or simply doesn't work properly. How often have you been frustrated by a bad website or app?
There are lots of reasons for broken software and some of the most common ones relate to all businesses - time and cost constraints, skill and knowledge levels, and corporate requirements. There are also software specific issues like security requirements, integration issues, and the age of the software involved.
Confusing software is usually caused by a lack of user research and involvement. The best software happens through agile development - where the minimum viable product is given to users and feedback gathered to inform further development. Unfortunately this is too often overlooked or omitted for reasons of time, money or convenience. The gap between developers and users is often far too wide, leaving companies to make best guesses about what works, rather than basing decisions on genuine user needs.
Software can also be very, very complicated. Larger things like operating systems can consist of millions of lines of code, written by huge and changing groups of people over long periods of time, often to fit changing requirements. Software isn't just a simple set of instructions, it's a complex web of shifting interactions.
Dependencies
Another aspect that makes software complicated is dependencies. A dependency is another piece of software that your software relies upon. Dependencies are used to save time and effort - if someone has already solved a complex problem, there's little need to write that software again.
Dependencies are very common in software development but represent a challenge all of their own. Active dependencies must be continually updated to get the latest features, improvements and security patches. Sometimes that requires changes to your own code to match changes that have been introduced in the dependency. Inactive dependencies must be monitored carefully and potentially replaced, if vulnerabilities have been discovered. And all dependencies have to be continually checked to make sure nothing malicious has been introduced.
I spend a considerable amount of my time as a software developer updating and managing dependencies. Sometimes weeks or months of work have been required because the developer of a dependency decided to remove a key feature, or significantly restructure their code.
Speed of change
Sometimes software (and technology in general) advances so rapidly that we can't keep up, or we rush to adopt it before fully understanding all the implications and consequences. Social media is a classic example - it's been around for a few decades now, but only now are people and governments starting to recognise the dangers that it can represent.
I once knew someone who owned a Tesla. They had an app on their phone that could control aspects of the car, like unlocking it or seeing its location. After they sold the car they still had the app installed on their phone. Months later they could see where the car was and (presumably) still unlock it remotely.
Clearly if you were the new owner of that car you wouldn't be happy with that situation. This wasn't a failing of the software, but a lack of process around transferring ownership of the vehicle - including the app. We're living in the future, but we're not fully ready for it yet.
To quote Matt Parker, from his excellent 2019 book Humble Pi...
This is a common theme in human progress. We make things beyond what we understand, and we always have done. Steam engines worked before we had a theory of thermodynamics; vaccines were developed before we knew how the immune system works; aircraft continue to fly to this day, despite the many gaps in our understanding of aerodynamics. When theory lags behind application, there will always be mathematical surprises lying in wait.
Our response
As the scale of software use increases and the gap between consumer and company widens, it's becoming harder to raise problems. Impenetrable webs of call centres and chatbots separate us more and more from the people that actually write the software.
We've also grown used to this - if you had a problem with Windows, the first thing most people would do is look online for a solution, rather than try to contact Microsoft directly. Even having a direct line to the developers would be impractical, given how many people would be calling. When software doesn't work well we usually try to live with it and hope it improves.
Unfortunately this can lead to apathy and a lack of desire to prompt change, which in turn emboldens companies to care even less about the quality of their products. They might believe that it doesn't matter how well their software works - as long as the customer keeps paying, nothing needs to change.
Software is often bad, but we shouldn't simply accept that and struggle with the problems that it causes. We need to recognise where software is not good enough and spread that awareness. We should also be more vocal about what's wrong - nothing will start to change until someone knows there's a problem.
Companies and organisations need to understand that if they use software as the primary - or only - way in which users can buy goods and services then that software needs to be good. And it needs to be backed by good tools and processes, so that their employees are properly equipped to understand and respond to our requests.
The future
One aspect I've not mentioned so far is AI - not because I don't think it'll change how we make software, but because I don't think it'll change any of the problems above. Like many tools, AI is an abstraction - it'll help us build things quicker, but at the cost of distancing us from the actual code.
If anything, at least in the short term, I suspect AI will make things worse. It will allow more people who don't understand what good software looks like to produce it more quickly and easily without thinking things through properly or fully understanding what they're building.
As we become increasingly dependent on it I can imagine a future where software is only written and maintained by AI, where no human has an understanding of how it actually works. Whether that is good or bad remains to be seen, but I'm hesitant to embrace a world where no human mind is involved beyond a superficial level.
Maybe eventually AI will solve all of these problems, but right now there are too many stories about it doing unexpectedly bad things for us to be fully confident in an entirely automated future.
Final thoughts
Our use of software has grown dramatically in recent years and we're still only starting to understand the potential harms and benefits of a world run on computing devices for almost every aspect of our lives.
And while the pace of software development seems to be constantly increasing, the quality often falls short of what should be achievable, leaving users with incomprehensible interfaces, show stopping bugs and unexplained errors.
But there is hope. Good software is possible. Agile development, done properly, can make a huge difference. There are plenty of people in key positions who really care about the software they make, and how well it works for users. And users can make a difference, if we raise issues and spread awareness. Software is so prevalent and important now that we must continue to build and improve on what we have.
I quoted Matt Parker earlier, but I omitted the end of what he was saying.
When theory lags behind application, there will always be mathematical surprises lying in wait.
The important thing is that we learn from these inevitable mistakes and don't repeat them.
Whatever the future holds, software is going to be essential. Let's make sure it works.