The task of producing software is one of choosing and creating constraints, rules and abstractions inside a system which provides very few a priori. Typically we select a large collection of pre-existing constraints, rules and abstractions upon which to base our own: models of computation, programming and deployment environments, everything from the size of the register file to the way in which text is represented on the display is theoretically up for grabs, but we impose limitations in their freedom upon ourselves when we create a new product.
None of these limitations is essential. Many are conventional, and have become so embedded in the cultural practice of making software that it would be expensive or impractical to choose alternative options. Still others have so much rhetoric surrounding them that the emotional cost of change is too great to bear.
So what are these restrictions? Here’s a list of mine. I accept that they don’t all apply to you. I accept that many of them have alternatives. Indeed I believe that all of them have alternatives, and that enumerating them is the first thing that lets me treat them as assumptions to be challenged.
- Computers use the same memory for programs and data. I know the alternatives exists but wouldn’t know how to start using them.
- Memory is a big blob of uniform storage. Like above, except I know this one isn’t true but that I just ignore that detail.
- Memory and bus wires can be in one of two states.
- There probably is a free-form hierarchical database available.
- There is a thing called a stack and a thing called a heap, and the difference between the two is important.
- There is no point trying to do a better job at multiprocessing than the operating system.
- There is an operating system.
- The operating system, file system, indeed any first system on which my thing is a second system; those first systems are basically interchangeable.
- I can buy a faster thing (except in mobile, where I can’t).
- Whatever processor you gave me behaves correctly.
- Whatever compiler you gave me behaves correctly.
- Whatever library you gave me probably behaves correctly.
- Text is a poor way to represent a computer program but is the best we have.
- The way to write a computer program is to tell the computer what to do.
- The goal of the industry for last few decades has been the DynaBook.
- I still do not need a degree in computer science.
- I should know what my software does before I give it to the people who need to use it.
- The universal runtime environment is the C system.
- Processors today are basically like faster versions of the MC68000.
- Platform vendors no longer see lock-in as a goal, but do see it as a convenient side-effect.
- You will look after drawing pictures, playing videos, and making sounds for me.
- Types are optional.