The Future of Software: Part I
AI's growing problem-solving capabilities are fundamentally altering traditional software development. Explore its implications for the future of coding.
Table of content
Summary
The traditional concept of software—algorithmic programs run by computers—is transforming. Traditionally, a human coder grasps a problem, develops an algorithm, and translates it into a program for a computer to execute. While effective, this approach is limited to the person's problem-solving capacities.
Artificial Intelligence (AI) is changing the digital landscape. AI’s role is shifting from executing basic tasks to actively identifying and solving problems. The lines between human and machine capabilities blur as we transition from human-led programming to AI-led problem-solving.
The distinction between problem-solving and task completion is central to this shift. Traditional software focuses on task completion. AI introduces a dynamic approach to problem-solving, moving beyond rote tasks to adapting and learning from new situations.
This shift poses a critical question for the future: will traditional software remain relevant? As AI integrates more deeply into our digital infrastructure, the lines between traditional software and AI are blurring. The future of software development hinges on embracing AI's capabilities and understanding its development arc. To remain relevant, software developers must adapt, focusing on areas where AI can enhance problem-solving.
Traditional Software
We understand traditional software as algorithmic programs: a coded set of instructions that a computer executes linearly, similar to a mathematical formula. Programmers (coders) shoulder the responsibility of understanding the problem, finding a solution (an algorithm), and translating it into coded steps (a program) for a computer to execute.
In an ideal world, a programmer has thought of all possible edge cases or unexpected scenarios that may cause issues. They build a program that reliably solves its intended problem. It can be consistently executed with different input data because it follows the same set of precise steps.
How do we get there?
The cornerstone of quality code lies in modularity. That is the ability to split a program into units so basic and simple that a human programmer understands each unit’s function—including all edge cases.
From there, they build upon these robust and well-tested units, combining the functionality of simple units to construct more complex capabilities. Taking this layered approach, the programmer has ensured the code is simple and understandable at each level, and that each unit has been tested for reliability.
Multiple levels of abstraction—or focusing on the essentials by hiding underlying complexities—result in clean architecture. When combined with the DRY (Don’t Repeat Yourself) principle of minimizing redundancy, you get highly reliable code.
The Role of AI
Intelligence, whether human or artificial, plays a pivotal role in identifying and formulating solutions, or "algorithms," to solve problems. This task has traditionally been the domain of humans, thanks to our problem-solving abilities and creative insight.
In contrast to humans, machines excel in executing solutions with remarkable consistency and minimal errors. Hence the phrase, "to err is human”. It’s abundantly clear that machines follow instructions better than we do.
Recent advancements in AI have started to shift these conventional roles. Problem-solving used to be an exclusively human endeavor. Now, AI is encroaching upon this territory, demonstrating the ability to quickly identify solutions. Sometimes, more efficiently than humans.
We’re shifting from an era where humans were the sole creators of programs for machines, to a new age where AI is starting to architect solutions. The traditional dichotomy of "humans programming machines" is giving way to a more integrated approach where intelligence, regardless of its genesis, guides the programming of machines.
In this context, AI shouldn’t be narrowly viewed as just another technological tool or conventional computer. Instead, it should be recognized as a distinct entity; a new form of collaborator, playing a unique role in our interaction with machines.
This paradigm shift redefines the relationship between human intellect and mechanical execution, signifying a profound change in how we approach problem-solving in the digital age.
Problem-Solving vs Task Completion
Problem-solving is a cognitive process used to identify, understand, and resolve complex issues or challenges. Task completion refers to the process of accomplishing a specific duty. Tasks are usually well-defined with a clear set of steps to follow.
If we look at problem-solving versus task completion in the context of traditional software development, humans solve problems by programming machines to complete repetitive tasks.
For the purpose of this discussion, we can classify all traditional software into three groups:
- Applications: anything that interacts with a human user.
- Services: mostly in the backend of applications such as data storage or databases, interfaces with the outside world (e.g. payment systems), and interfaces between software systems.
- System software: the foundations that make a machine run, like operating systems, frameworks, and more.
With a few exceptions (software optimization comes to mind), traditional software handles task completion. One could argue that something simple, like spreadsheets, facilitates problem-solving. While this may be true, problems are still solved by completing a task of running pre-determined formulas or algorithms.
Blurring the Lines Between Problem-Solving and Task Completion
We’ll illustrate how the traditional role of software is changing: let's use a food-ordering app as an example. In this scenario, the defined problem is that we want to have dinner at home. We need to decide what to eat based on availability in the area, whether we want to cook or order in, and what delivery service to use.
Say we narrow this problem down to ordering pizza. We’d check different food ordering apps to see what’s available, compare prices and delivery times, and finally place the order and pay.
Throughout this process, we use apps to complete tasks, like placing an order or making a payment. None of these steps involve problem-solving.
The introduction of Large Action Models (LAMs) changes things. It can understand language and leverage it to perform actions in the real world. Now, we can formulate our problem for AI, and it’ll perform tasks on our behalf, eliminating the need to even touch an app. It simply presents us a confirmation dialogue.
This example demonstrates the potential extinction of applications and user interfaces. It would impact all the tools, skills, jobs, frameworks, and companies that build apps and user interfaces.
A similar situation can occur at the system level, with data centers, CI/CD pipelines, and infrastructure managed by AI through abstraction layers, such as Kubernetes and Terraform APIs.
Will Traditional Software Exist in the Future?
It’s easy to imagine a distant future where user interfaces are no longer programmed by humans, but generated live and on the fly by AI itself—whether it’s audio, video, or virtual reality.
On the backend, there will be a diminishing need to maintain the system side and infrastructure. All data will either reside in neural networks or databases managed by said networks.
Traditional software will evolve towards AI becoming its own architect.
The Future of Software Development
I think it’s self-evident that if there’s no traditional software, there’s also no need for traditional software development. While the world is never black or white—we still have horses and carts to this day—the evolutional trend is abundantly clear.
If software developers are to stay relevant, we need to embrace these trends and seek a deeper understanding of AI’s learning curve to solve problems traditionally reserved for human engineers.
As software developers, we must understand what problems are better solved by AI and where we should put our time and energy to remain relevant. This is a moving target.
Present Day and the Foreseeable Future
To be continued in part II.