| Home | Blog |
Understanding exactly what software is might seem hard, but really, it only is if one confuses the nature of software with how to think about or develop software. The first is actually very simple, the second can be extremely complex.
You might have read that software's distinctive nature is that it's "easy to change" (flying in the face of the reality of difficult to change software); or that software is different because it's not part of the "real world"; or that software is different because, like writing, it's a direct expression of human thought; or that software is actually like thought, as if it were the "mind" part of a computer's "brain".
The nature of software is actually far less esoteric than any of these ideas seem to imply.
A modern computer system exists literally as just a vast set of switches, where each switch is wired such that it can activate other switches or devices (such as the computer monitor). If you can understand a light and its switch, you know in essence what a computer is.
If you have any doubt about the triviality of the basic nature of a computer, look at this Tinker Toy based tic-tac-toe computer built by a couple of MIT students back in 1978. This device vividly demonstrates that there's nothing magical about a computer; no materials with special properties are required, the basic actions that the materials take are mundane. The only reason why high-tech is required for modern computers is because of the vast number of switches and the speed at which they must switch. (The Tinker Toy computer is not a general-purpose computer, but the same principle applies to those as well: see Babbage's Analytical Engine).
But what is software? Take the Tinker Toy computer as an example. Where's the software there? If you think of each part of the computer, the individual movable parts ("switches") could be in any of a number of possible positions. Only a particular set of positions is going to be a valid starting point for the tic-tac-toe game; every time you want to start a new game you must reset the computer back to this state. The right set of starting positions is the computer's "software", and a person who puts these parts in their starting positions is a "programmer".
Based on this we can make all the observations we need to about the "metaphysics" of software:
Software isn't the switches, it's only the positions the switches are in. As such it doesn't exist apart from the computer: there is no such thing as software, if by "thing" we mean an independently existing entity; software can only exist when there's a device that is programmed with that software.
So software is merely an attribute, an aspect of some truly real, self-sufficient thing. It is similar to other attributes such as "hot", which only exists when there is something to be hot; "blue", which can only exist if there is an entity which is blue; or "heavy", which isn't itself something we can see or point to, but only describes a thing which has a relatively large amount of mass.
When we speak of software being "loaded", or of a computer having its software "removed", we don't mean that any part of the computer has been added or taken away - software is an attribute, so it can't be physically added or taken away. The only thing we can do is flip the switches into a different configuration; "removing" the software can only mean flipping the switches differently. So what got removed? Given a computer with no software, what is it exactly that isn't there?
Suppose our Tinker Toy computer takes several minutes to program, i.e., to put all the parts in the starting position for a game. Then, a child comes in and starts playing with it, putting the parts in random positions. He removed our program by reconfiguring the computer in a way contrary to our intent, our purpose.
When human purpose is gone, then the program is gone; software is not just any set of switch positions, it's a purposeful set of switch positions.
Sometimes, the computer state can mostly reflect human purpose, but through human error, may include some deviations from that purpose. We call such deviations "bugs".
Software is a particular configuration or state of a programmable device, where the state is directly or indirectly defined by human beings, in order to achieve some end.
If software is essentially trivial to understand, then why can it be so hard? The answer is obvious: it's not because software as such is difficult, it's because of the massive number of "switches" involved in modern programs.
Anyone can build a simple log cabin. It takes special training and knowledge to build a skyscraper; we call men with such training architects and engineers. Why are skyscrapers so hard? Not because of the materials themselves, but because of the massive amounts of materials involved and their complex arrangements. We need architects and engineers because only they know the precise order and arrangement of building that will create a stable structure that large.
Likewise, anyone can write a program, anyone can be a "programmer". It takes more to be a software architect or engineer, for precisely the same reasons as it takes more to be a building architect or engineer: it's the vast largeness that requires the sophistication of mind and method. That is where the difficulty of software lies, and that will be the main topic of discussion at Thoughts On Software.
Copyright(c) 2004 Shayne Wissler. All Rights Reserved.