NearWalden
Dave Douglas' Radio Weblog

What is Software?

This note is the first of a series about the nature of software, what it means to different interested parties, and an amateur's view of how our legal system interacts with software.

The following is a list of ways in which I interact with software. Some of them are fairly obvious, others are more subtle:

  • Text
  • Content or Tool
  • Collection of Algorithms
  • Architecture
  • Interaction

A given piece of software has many potentially interested parties, including the author of the program, the business that funded the program (if there was one), users of the program, relevent companies, and, in some cases, the broader public and it's representatives in government. Needless to say, each of these vested interests may focus on different aspects of a given program, and in some cases, may have different perspectives on the same aspect of a program.

This multi-faceted nature of software also gives rise to the application of a wide range of laws to software products. Contracts, patents, copyrights and licenses are all routinely applied to software. We've also seen anti-trust, product liability, freedom of speech, export law and specially crafted laws such as DCMA all target various aspects of software. This situation is only growing more complex as other businesses become more intertwined with software, it's nature and it's legal implications. The impact of the entertainment industry alone on the current and future states of software and the Internet is difficult to fully comprehend.

The following sections examine some of the particular aspects of each facet of software.

Software as Text ("It's just typing")

One day we were in the office discussing a particularly hairy design for something and one of the architects said "I don't know what you're all so worried about, it's just typing."

In it's basic source form, software is one or more files full of carefully constructed text. Other than when we're developing, we often don't get to see the code in this form, but at some point in it's life, software was the result of a bunch of typing. In this form, software is not much different than text in a book. A snippet of it may contain an good idea or may be relatively meaningless or useless without the context of the rest of the code.

What about binary code? In some ways it's still like text, just translated to a very strange language where single words are broken into a series of precise, but obscure words. The result is that it's much more difficult to understand what the author meant, but with appropriate tools and a little hard work people do it all of the time. However, just like a text translation, it is difficult to get back to the specific text that the author originally wrote.

Software as Content or Tool

When it runs, software can do many wonderful things. Sometimes it grinds through calculations we'd never dream of taking on by hand. Other times it interacts with us through games, music, puzzles, simulations, etc. Sometimes it's best described as a tool, organizing information, moving data around, sending email to someone, etc etc etc.

In many ways this facet of software resembles a CD or DVD. I derive value from the content or action of the software when it operates. Furthermore, it's generally possible (though often not legal) for me to make a copy of the bits, give them to someone else, and we can both derive value from them in parallel, without any reduction in the value I derive.

At the Content or Tool level, the Text level is mostly or totally hidden from view. I only see the effects that the author had in mind, I can't tell how she created those affects. If I carefully observe the actions of a piece of software but can't see it's underlying text, I may be able to write a new piece of software which mimics it exactly at a behavioral level. However, that may get me no closer to interoperating with the original (see Software as Architecture for more discussion).

Software as a Collection of Algoriths

Webster's dictionary describes an algorithm as "a rule of procedure for solving a problem", which leads to a description of a software program as a collection of algorithms, each of which is a procedure for solving a problem. For example, a program that manages addresses may need a procedure for alphabetizing a list of them. As most programmers know, there are many ways to do this. Some of them are brutish, others quite elegant. Some are efficient, others are molasses by comparison.

It's important to put this facet of software in context of the last two we covered. First, I may express the same algorithm with many different collections of source code text. I may do something as simple as use a different programming language, or I may express the same algorithm, but with different language primitives and variable names. Similarly, at a machine code level the programs may be more similar for a given architecture, but two compilers could produce very different code that expressed the same algorithm.

Algorithms have an equally odd relationship with the "tool" nature of software. As our example above illustrates, the fact that my address book is sorted tells me nothing about which sorting algorithm was used. In other words, the function of a program may tell us some information about its algorithmic makeup, but it may be a very slight amount of information.

Finally, this category is an important one to call out from a legal perspective. This will be covered in a future note.


More to come...

Software as Architecture

Software as Interaction

Nearwalden
Weblog Home
Stories
RFID Notes
Odds and Ends
Ozzie
Scripting
Lessig
Udell
Patrick
Allaire
McDowell

Click here to send an email to the editor of this weblog.

Click here to visit the Radio UserLand website.

Click to see the XML version of this web page.

Subscribe to "NearWalden" in Radio UserLand.
© Copyright 2003, David Douglas.
Last update: 11/2/03; 8:59:35 PM.