Software and Mind by Andrei Sorin — related articles
Replacing minds with software
This article is a copy of the section with this title in chapter 2 of Software and Mind, which is too short to include as a separate book extract. (The book, as well as individual chapters and sections, can be viewed and downloaded free at www.softwareandmind.com.)
The greatest challenge facing us today is to recognize how the mechanistic delusions are shaping the future of our society. And it is the mechanistic mind delusions that are the most dangerous, because how we think of our mental capabilities affects our decisions in all fields where knowledge and skills play a part.
The danger we face when perceiving human minds as a kind of machine is getting to
depend on charlatans who promise us devices that are better than our minds. For,
once we replace knowledge and skills with devices and stop using our non-
I have devoted so much space to mind mechanism because it is more than just another mechanistic delusion. The belief that we can build models of mind leads in practice to the belief that there exist substitutes for knowledge and skills. The delusion that it is possible to embed human intelligence in a device has now gone beyond the speculations of artificial intelligence: it has escaped the academic confines, and is increasingly influencing our business and social decisions. Our belief in mind mechanism has given rise to a phenomenon that may be called the culture of knowledge substitutes.
Thus, instead of developing certain knowledge, we expect a software device to function as a substitute for that knowledge. And it is this fantastic idea that has allowed the software companies to rise to their glamorous and dominating position. These companies cannot provide knowledge substitutes, of course – no one can. But their devices and promises create illusions that act very much like the religious or political illusions of the past, tempting us with promises of salvation, of easy solutions to difficult problems.
* * *
Mind mechanism is the most widespread of our mechanistic delusions, and is a factor in many other delusions, including our language and software theories. Mind mechanism is typical of what I have called the new pseudosciences – the subject of the next chapter.
Scientists who engage in these worthless pursuits can create entire academic disciplines out of nothing more substantial than a mechanistic fantasy. They start by making an extravagant claim and presenting it in the form of a theory: an explanation for a complex phenomenon, or a solution to a complex problem. This generates a great deal of excitement, even though everyone can see that the theory is only a speculation, a wish. Its foundation on mechanistic principles – which principles are accepted unquestioningly – is what makes the theory credible, imparts to it a “scientific” image, and persuades everyone that it will soon be useful.
The theory appears to work in a few cases (as mechanistic approximations always do),
and this gives the scientists additional confidence. Since they are now convinced
that it is an important contribution, a “research program” is initiated: a long series
of modifications, which make the theory increasingly complicated and thereby mask
its shaky foundation. These modifications often result in mechanistic solutions to
isolated problems – problems discovered when trying to apply the theory, and perceived
now to be part of the research. Encouraged by these successes, the scientists are
convinced that they are making progress, that these solutions will be combined one
day into an answer to the original problem. Non-
* * *
Our chief concern in this book is a specific pseudoscience: the belief that knowledge and skills can be replaced with software. In particular, we are concerned with the belief that programming knowledge and skills can be replaced with software – the belief that there exist substitutes for programming expertise.
We hear about innovations like application development environments, object-
Accordingly, a person unacquainted with programming must think that programming substitutes are indispensable for creating applications. This impression would be reinforced by the fact that, for more than forty years, the notion of programming substitutes has been upheld by professors and gurus, taught in famous universities, endorsed by professional associations, approved by renowned experts, and embraced by corporations large and small in their effort to improve programming practices.
Faced with this reality, the lay person must conclude that the need for programming substitutes, and for their perpetual changes and ever increasing complexity, is based on solid theories, or on irrefutable evidence. That person would be surprised, therefore, when he found out that no such theories or evidence exist. He would be surprised to hear that these innovations are totally unnecessary for developing or maintaining software applications; that their sole purpose is to eliminate the need for programming expertise; and that the enormous social and economic structure we have created around them is merely a system of belief – a system founded on the assumption that we can invent substitutes for programming expertise.
In chapter 7 we will see that the programming substitutes are mechanistic delusions: despite their variety, they are all based ultimately on the principles of reductionism and atomism – on the belief that programming tasks can be neatly broken down into simpler and simpler tasks. But we can already see the part played in software delusions by the delusions of mind mechanism. For, the very notion of programming substitutes must assume that the mental processes involved in programming can be precisely specified, represented with rules and methods, and then implemented with software. And this assumption is identical to the assumption of mind mechanism; namely, that human knowledge and skills can be emulated with mechanistic models. Thus, the programming substitutes are in effect models of mind, substitutes for human intelligence.
* * *
The mechanists notice the various processes that make up a software application –
the business practices embodied in it, the subroutines, the database, the flow of
execution, the data entry or display operations – and conclude that each process
can be extracted from the whole act of programming and dealt with separately. Once
this idea is accepted, any number of methodologies, theories, or development tools
can be invented for each isolated process, all claiming great improvements in programming
productivity. Typically, these expedients attempt to simplify programming by providing
higher-
In these concepts, we recognize the two fallacies of mechanistic thinking: reification (the belief that we can separate the simple structures that make up a complex phenomenon) and abstraction (the belief that we can start from higher levels without losing any alternatives at the top level). By reifying complex programming phenomena into simple structures, the software mechanists hope to replace the difficult task of programming a whole application with the easier task of programming separately each one of its processes. This reification also opens the way to abstraction: less work and lower programming skills are required to complete the application if we start from higher levels within each process; in other words, if our starting elements are modules or operations that already incorporate many others. With this method, it is believed, applications of any size and complexity can be created even by inexperienced programmers.
Although useful in domains like manufacturing and construction, this method is inadequate
for software-
* * *
When the mechanists claim that programming methods and devices can reduce or eliminate the need for programming – and can therefore act as substitutes for the programming skills of humans – how are we to understand the claim? Since models of mind can emulate only those mental functions that can be represented mechanistically, the claim is in effect that programming is such an easy challenge that it requires only mechanistic knowledge. But is this true?
Programming methods and devices are based on the assumption that the various activities
in software development can be represented with simple structures; namely, independent
mental acts and independent pieces of software related to one another only through
the precise definition of a hierarchy. We saw, however, that practically everything
we do requires our mind’s capacity for complex structures. Is programming, then,
an exception? Is it simpler than recognizing faces or voices, or driving a car, or
interpreting X-
The software mechanists, of course, do not claim that programming is easy. On the contrary, they say, we need the substitutes precisely because programming is difficult and there is no other way to simplify it. But note the contradiction: their attempt to simplify programming through mechanistic theories is equivalent to claiming that programming is a simple activity – so simple that it can be reduced to exact, fully specifiable structures of things within things. This contradiction stems from the same fallacy that mechanists have being committing for centuries (we will study this fallacy in chapter 4): They see the richness of a complex phenomenon (minds, language, software, etc.), and the simplicity of the hierarchical concept, and they wish to have both: they wish to use simple hierarchical structures to represent the complex phenomenon. They fail to understand that it is precisely the fact that the phenomenon is complex, and hence irreducible to simpler ones, that gives it its richness and potency.
This explains why programming theories, methodologies, tools, and aids, no matter how sophisticated, have so little effect on programming productivity. Programming is one of the most difficult tasks that we have ever had to perform; and it is so difficult precisely because there is no way to reduce it to a mechanistic representation, and we must depend therefore on personal experience. It is similar, in this respect, to our linguistic or visual performance. Like these other acts, programming can only be performed by human minds, because it depends on our capacity for complex knowledge. It involves discovering the right connections between many knowledge structures: the various concepts that make up the application, technical details, business matters, and even personal and social concerns. And, like all intelligent acts, it requires the full capacity of a mind.
So, in the end, the issue is this: Are programming skills a mechanistic phenomenon?
Or are they a complex phenomenon, like our linguistic capability and the many other
skills that cannot be reduced to simpler mental acts? Our software pursuits are based
on the assumption that our software-
Unlike other mechanistic delusions, however, which did not survive for long in the real world, outside academia, the software delusions keep growing and are now spreading throughout society. Thus, the ideology of software mechanism has become the greatest mass delusion in history: a myth more powerful and widespread than all the religious and political systems of belief we had in the past.
* * *
But how did this happen? How was it possible for the software elites, in just a few
years, to reach the point where they practically control society through this myth?
By persuading us to shift our preoccupations from real problems to software-
Typically, the software mechanists start by promising us solutions to real business,
social, or personal concerns. Because of our mechanistic tradition, we fail to see
that only mechanistic problems can have software solutions, so we believe all their
claims. For the simple, mechanistic problems, their solutions work well, and these
successes enhance their credibility. These successes, however, do not guarantee that
software will also solve our complex, non-
Every time we adopt a piece of software, we get to depend on it, instead of depending
on some other expedient or on our own skills. And even if that software does not
solve our real problems, we continue to depend on it and must deal with the problems
it generates. So the software elites control our life simply by persuading us to
accept software solutions. We need more and more software solutions because we have
more and more software-
The more difficult it is to solve our real problems with software, the more software
solutions we will try, and the more software-
It is this shift in preoccupations – from the real problems to the spurious, software-
Since the only thing the elites can offer us is software devices, they must ensure
our dependence on these devices regardless of their degree of usefulness. And the
simplest way to achieve this is by degrading the concept of expertise: from the difficult
skills needed to solve important problems, to the easy skills needed to operate software
devices. This – the prevention of true expertise – is the final goal of the software
elites. For, only in a world where we can no longer use the full capacity of our
minds do the software devices outperform us. The reason it appears to us that the
software elites are indispensable is that we are becoming increasingly dependent
on them for software solutions to the software-
* * *
The programming profession is the only field in which the destruction of knowledge and skills caused by software mechanism is now complete. The incompetence of programmers, therefore, provides the best illustration of the delusion of knowledge substitutes; and the programming theories are the best medium for studying this delusion. (This is the subject of chapter 7.)
It is not hard to see why the programming profession was so easy to destroy: unlike other skills, programming lacks a tradition that could act as standard of expertise. We have centuries of tradition in writing, for example. We already know what good prose is, so if the mechanists claimed that certain language devices can replace the talent and expertise of humans, we would simply compare the results, and recognize the absurdity of their claims. In programming, however, we had no time to attain a similar wisdom before this activity was taken over by incompetents and charlatans.
We have had many opportunities to observe the work of talented programmers. But, while in other professions it was always the performance of the best workers, in programming it was the performance of the mediocre ones, that was taken as the highest level we should expect. From the start, the official doctrine was to avoid relying on exceptional individuals (because they are hard to find) and to degrade programming to an activity that can be performed even by the least experienced practitioners. The software theorists, we were promised, will show us how to replace programming expertise with methods, tools, and aids. Thus, while in other professions education and training took years, and expertise was attained only after decades, programmers were trained in weeks or months, and were not expected to ever attain expertise.
I have stated that the software elites can control our life by inducing us to shift
our preoccupations from real problems to spurious, software-
Thus, if the problem is programming expertise, the answer is a great deal of programming practice – which should not surprise us. But it is a fundamental assumption in our software culture that programming is different from other professions; that creating software applications is akin to the routine work performed by assembly workers when putting together appliances from prefabricated parts; and that the software elites have invented methods and systems which allow us to create applications in this fashion. So, rather than practising for many years to attain programming expertise, it is believed that programmers can accomplish the same tasks merely by using these methods and systems.
And so it is how programming expertise was redefined to mean expertise in the use of substitutes for expertise. The preoccupation of programmers shifted from developing their skills and creating useful applications, to learning how to use programming substitutes. The problem shifted from improving their knowledge of programming to improving their knowledge of ways to avoid programming.
It was evident from the start, though, that the substitutes do not work: applications took too long to develop, or were never completed, or were inadequate. Still, no one wanted to give up the idea of programming substitutes, so the conclusion was that we needed better substitutes, not better programmers. And when the new substitutes also failed to replace expertise, the conclusion was, once again, that we needed different substitutes. Thus, changes in programming theories, methodologies, environments, languages, and tools became the chief preoccupation of all software practitioners.
This is still true today. After more than forty years of failures, the doctrine of programming substitutes continues to define this profession. The substitutes, in fact, are now even more complicated and are changing even more frequently, so programmers are wasting even more time with them. Every software deficiency is blamed on the current programming environment, tools, or methods, and is used to justify the next round of changes. Programming incompetence is never suspected. As in the past, the level of a novice is considered the highest level of knowledge that we can expect from a programmer. No matter how many years of experience they have, programmers are rarely required to perform a task they could not have performed after the first year or two of practice.
A programmer’s expertise is measured, not by his ability to develop and maintain software applications, not by his skills in solving important problems, but by how many methodologies, programming languages, or development environments he is acquainted with, or how many computer periodicals he reads, or how many courses he attended. He must be aware of the latest releases and versions of software products, of announcements and rumours. These are the kind of qualifications that companies are looking for when hiring a programmer; that is, how well he conforms to the mechanistic software ideology. Often, just a few months of experience with a particular system is the only qualification needed.
By degrading the programming profession, by lowering the definition of programming expertise to mean expertise in the use of programming substitutes, the original problem – how to create and maintain applications efficiently and reliably – has been replaced with a multitude of software problems. The work of programmers has been degraded to the point where they are only expected to know a number of facts, rather than possess a body of knowledge and skills recognizable as a profession. We have all but forgotten that programming practice ought to mean simply the solution of business or social problems through software. Only the smallest part of a programmer’s activities is directly related to this objective.
To understand why this inefficiency is seldom evident, we must remember how common it is for programmers to perform activities that, while perceived as important and urgent, are in reality spurious: dealing with the problems generated by programming substitutes. And, even though what I have said applies mainly to application programmers, we must not forget that the work of system programmers consists almost entirely in creating the substitutes needed by the application programmers. Thus, no matter how successful or impressive is the creation of the programming tools, development environments, or database systems themselves, this is a spurious activity.
And so are the other activities engendered by the programming substitutes. Were the application programmers experienced professionals, there would be no need for the programming substitutes, or the organizations that sell them, or the schools that teach how to use them, or the conventions that promote them, or the publications that explain, advertise, and review them. It is only because we have forgotten the real purpose that computers and software ought to have in society that we are not outraged by the stupidity of these preoccupations.
* * *
As our dependence on computers is growing, the cost of programming incompetence is
becoming a social issue that affects us all, because the businesses and governments
that depend on incompetent programmers simply pass the cost to the rest of society.
The cost to society caused by the destruction of programming skills exceeds probably
one trillion dollars a year, globally – money that ultimately ends up in the pockets
of the software elites and the software bureaucrats. We need only recall the so-
The present consequences of programming incompetence, however, while important, are small compared to what the future holds. Programming is only the first type of knowledge to be destroyed by the software elites. Others will follow, as our dependence on software is spreading beyond the dependence on inadequate business applications. We can already recognize similar delusions, for example, in the kind of software known as office productivity systems, which attempts in effect to replace a variety of skills – skills that take many years to acquire – with acts that anyone can learn to perform in a few days. Similarly to what happened in programming, the preoccupation of managers and office workers is shifting: from improving their skills to learning how to use substitutes for these skills, and from providing professional services to searching for solutions to the endless problems generated by the substitutes. The expertise of office workers is increasingly measured, not by their ability to perform important tasks, but by how well they are acquainted with software devices. Valuable knowledge that can only develop in a mind is being destroyed and replaced with inferior substitutes.
Each time we replace human expertise with substitutes that are in fact only illusions,
we lose our capacity to solve the real problems, because we forgo the opportunity
to develop, through practice, the complex knowledge needed to solve those problems.
What is worse, we add to our software-
This makes our study of software mechanism in the domain of programming even more important: not only does it help us understand why knowledge substitutes cannot work, and why we must encourage expertise and responsibility among programmers; not only can it help us derive greater benefits from our computers and at the same time save society trillions of dollars, which can then be directed toward better causes than the support of a software bureaucracy; but it can help us anticipate the consequences of replacing human expertise with mechanistic substitutes in other fields of knowledge. If we understand how the mechanistic fallacies have contributed to our software delusions in the domain of programming, we can perhaps learn to recognize and avoid the formation of software delusions from mechanistic fallacies in other domains.